UNPKG

typescript-scaffolder

Version:

![npm version](https://img.shields.io/npm/v/typescript-scaffolder) ![coverage](https://img.shields.io/badge/coverage-97.38%25-green)

148 lines (147 loc) 9.45 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = require("commander"); const path_1 = __importDefault(require("path")); const logger_1 = require("./utils/logger"); const generate_interfaces_1 = require("./features/generate-interfaces"); const generate_enums_1 = require("./features/generate-enums"); const generate_factories_1 = require("./features/generate-factories"); const generate_env_loader_1 = require("./features/generate-env-loader"); const generate_api_client_1 = require("./features/api-client/generate-api-client"); const generate_api_client_registry_1 = require("./features/api-client/generate-api-client-registry"); const generate_webhook_app_1 = require("./features/webhooks/generate-webhook-app"); const generate_webhook_app_registry_1 = require("./features/webhooks/generate-webhook-app-registry"); const generate_sequence_runner_1 = require("./features/api-client/generate-sequence-runner"); const program = new commander_1.Command(); program .command("interfaces") .description("Generate TypeScript interfaces from JSON schemas") .requiredOption("-i, --input <dir>", "Input directory") .requiredOption("-o, --output <dir>", "Output directory") .action(async (options) => { logger_1.Logger.info("cli", `Generating interfaces from "${options.input}" to "${options.output}"`); await (0, generate_interfaces_1.generateInterfacesFromPath)(path_1.default.resolve(options.input), path_1.default.resolve(options.output)); }); program .command("enums") .description("Generate enums from TypeScript interface files") .requiredOption("-i, --input <dir>", "Input directory") .requiredOption("-o, --output <dir>", "Output directory") .option("-e, --ext <extension>", "File extension to filter", ".ts") .action(async (options) => { logger_1.Logger.info("cli", `Generating enums from "${options.input}" to "${options.output}" with ext "${options.ext}"`); await (0, generate_enums_1.generateEnumsFromPath)(path_1.default.resolve(options.input), path_1.default.resolve(options.output), options.ext); }); program .command("factories") .description("Generate factory classes from TypeScript interface files") .requiredOption("-i, --input <dir>", "Input directory containing interface files") .requiredOption("-o, --output <dir>", "Output directory for generated factories") .option("--faker", "Use faker-based mock defaults", false) .action(async (options) => { logger_1.Logger.info("cli", `Generating factories from "${options.input}" to "${options.output}" (faker=${options.faker})`); await (0, generate_factories_1.generateFactoriesFromPath)(path_1.default.resolve(options.input), path_1.default.resolve(options.output), options.faker); }); program .command("envloader") .description("Generate TypeScript env loader from .env file") .requiredOption("-e, --env-file <file>", "Path to .env file") .requiredOption("-o, --output-dir <dir>", "Output directory") .requiredOption("-f, --output-file <filename>", "Output filename (e.g. env.ts)") .option("--class-name <name>", "Env class name", "EnvConfig") .option("--enum-name <name>", "Env enum name", "EnvKeys") .action((options) => { logger_1.Logger.info("cli", `Generating env loader from "${options.envFile}" to "${options.outputDir}/${options.outputFile}"`); (0, generate_env_loader_1.generateEnvLoader)(path_1.default.resolve(options.envFile), path_1.default.resolve(options.outputDir), options.outputFile, options.className, options.enumName); }); program .command("apiclient-file") .description("Generate an API client from a single JSON config file") .requiredOption("-c, --config <file>", "Path to JSON config file") .requiredOption("-i, --interfaces <dir>", "Path to interfaces directory") .requiredOption("-o, --output <dir>", "Output directory") .action(async (options) => { logger_1.Logger.info("cli", `Generating API client from file "${options.config}"`); await (0, generate_api_client_1.generateApiClientFromFile)(path_1.default.resolve(options.config), path_1.default.resolve(options.interfaces), path_1.default.resolve(options.output)); }); program .command("apiclient-dir") .description("Generate API clients from multiple JSON config files in a directory") .requiredOption("-c, --config-dir <dir>", "Directory with JSON config files") .requiredOption("-i, --interfaces-root <dir>", "Root interfaces directory") .requiredOption("-o, --output-root <dir>", "Root output directory") .action(async (options) => { logger_1.Logger.info("cli", `Generating API clients from directory "${options.configDir}"`); await (0, generate_api_client_1.generateApiClientsFromPath)(path_1.default.resolve(options.configDir), path_1.default.resolve(options.interfacesRoot), path_1.default.resolve(options.outputRoot)); }); program .command("apiclient-registry") .description("Generate API client registry from API client files") .requiredOption("-a, --api-root <dir>", "Root directory containing API client files") .option("-r, --registry-file <filename>", "Name of the registry file", "registry.ts") .action(async (options) => { logger_1.Logger.info("cli", `Generating API client registry in "${options.apiRoot}" with filename "${options.registryFile}"`); await (0, generate_api_client_registry_1.generateApiRegistry)(path_1.default.resolve(options.apiRoot), options.registryFile); }); program .command("webhooks") .description("Generate webhook app and registry from config file") .requiredOption("-c, --config <file>", "path to config file") .requiredOption("-i, --interfaces <dir>", "path to interfaces directory") .requiredOption("-o, --output <dir>", "output directory") .action(async (options) => { logger_1.Logger.info("cli", `Generating webhook app and registry from config "${options.config}", interfaces "${options.interfaces}", output "${options.output}"`); await (0, generate_webhook_app_registry_1.generateWebhookAppRegistry)(path_1.default.resolve(options.output)); await (0, generate_webhook_app_1.generateWebhookAppFromPath)(path_1.default.resolve(options.config), path_1.default.resolve(options.interfaces), path_1.default.resolve(options.output)); }); program .command("sequences") .description("Generate sequence runners from JSON config files") .requiredOption("-c, --config-dir <dir>", "Directory with sequence JSON config files") .requiredOption("-o, --output <dir>", "Output directory for generated runners") .action(async (options) => { logger_1.Logger.info("cli", `Generating sequence runners from "${options.configDir}" to "${options.output}"`); await (0, generate_sequence_runner_1.generateSequencesFromPath)(path_1.default.resolve(options.configDir), path_1.default.resolve(options.output)); }); program .command("full") .description("Run full scaffold pipeline from raw JSON and env file") .requiredOption("--json <dir>", "Directory of input JSON files for interface generation") .requiredOption("--env <file>", "Path to .env file") .requiredOption("--output <dir>", "Root output directory (e.g. src/codegen)") .action(async (options) => { const jsonDir = path_1.default.resolve(options.json); const envFile = path_1.default.resolve(options.env); const outputRoot = path_1.default.resolve(options.output); const interfaceOutput = path_1.default.resolve(outputRoot, "interfaces"); const enumOutput = path_1.default.resolve(outputRoot, "enums"); const factoryOutput = path_1.default.resolve(outputRoot, "factories"); const clientOutput = path_1.default.resolve(outputRoot, "apis"); const webhookOutput = path_1.default.resolve(outputRoot, "webhooks"); const envOutputDir = path_1.default.resolve(outputRoot, "config"); const envOutputFile = "env-config.ts"; const endpointConfig = path_1.default.resolve("config/endpoint-configs"); const sequenceConfig = path_1.default.resolve("config/sequence-configs"); const webhookConfig = path_1.default.resolve("config/webhook-configs"); logger_1.Logger.info("cli", `🔁 Starting full scaffold pipeline from "${jsonDir}" → "${outputRoot}"`); (0, generate_env_loader_1.generateEnvLoader)(envFile, envOutputDir, envOutputFile); await (0, generate_interfaces_1.generateInterfacesFromPath)(jsonDir, interfaceOutput); await (0, generate_enums_1.generateEnumsFromPath)(interfaceOutput, enumOutput); await (0, generate_factories_1.generateFactoriesFromPath)(interfaceOutput, factoryOutput); await (0, generate_api_client_1.generateApiClientsFromPath)(endpointConfig, interfaceOutput, clientOutput); await (0, generate_api_client_registry_1.generateApiRegistry)(clientOutput); await (0, generate_sequence_runner_1.generateSequencesFromPath)(sequenceConfig, clientOutput); await (0, generate_webhook_app_registry_1.generateWebhookAppRegistry)(webhookOutput); await (0, generate_webhook_app_1.generateWebhookAppFromPath)(webhookConfig, interfaceOutput, webhookOutput); }); program .command("help") .description("Display help information") .action(() => { program.outputHelp(); }); program.parse(process.argv);