@routecraft/cli 0.2.0-canary.10 → 0.2.0-canary.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- var[n,i]=process.version.slice(1).split(".").map(Number);n>18||n===18&&i>=19||(console.error(`[routecraft] Node.js ${process.version} is not supported. Routecraft requires Node.js 18.19.0 or later (e.g. 20 or 22). Please upgrade Node or configure your MCP client to use a newer Node.`),process.exit(1));process.env.LOG_LEVEL===void 0&&(process.env.LOG_LEVEL="warn");process.env.CRAFT_LOG_LEVEL===void 0&&(process.env.CRAFT_LOG_LEVEL="warn");for(let o=0;o<process.argv.length;o++){let r=process.argv[o];if(r==="--log-file"&&process.argv[o+1]){let e=process.argv[o+1];process.env.LOG_FILE=e,process.env.CRAFT_LOG_FILE=e;}else if(r.startsWith("--log-file=")){let e=r.slice(11);process.env.LOG_FILE=e,process.env.CRAFT_LOG_FILE=e;}if(r==="--log-level"&&process.argv[o+1]){let e=process.argv[o+1];process.env.LOG_LEVEL=e,process.env.CRAFT_LOG_LEVEL=e;}else if(r.startsWith("--log-level=")){let e=r.slice(12);process.env.LOG_LEVEL=e,process.env.CRAFT_LOG_LEVEL=e;}}var{Command:a}=await import('commander'),{runCommand:l}=await import('./run-XS263DYP.js'),{loadEnvFile:t}=await import('./util-Q5GDRTSI.js'),s=new a;s.name("craft").description("A modern routing framework for TypeScript").version("0.2.0-canary.10").showSuggestionAfterError().showHelpAfterError().exitOverride(o=>{o.code==="commander.unknownCommand"&&process.exit(0);});process.argv.length<=2&&s.help({error:false});s.command("run").description("Run routes from a single TypeScript/JavaScript file").argument("<file>","Path to a file containing routes").option("--env <path>","Load environment variables from a .env file (default: .env)").option("--log-file <path>","Write logs to a file (keeps stdout clear for MCP stdio)").option("--log-level <level>","Log level (e.g. info, warn, error, silent to disable)","warn").action(async(o,r)=>{r.env!==void 0?t(r.env):t();let e=await l(o);e.success||(e.message&&console.error(e.message),process.exit(e.code??1));});s.parse();//# sourceMappingURL=index.js.map
2
+ var[n,a]=process.version.slice(1).split(".").map(Number);n>18||n===18&&a>=19||(console.error(`[routecraft] Node.js ${process.version} is not supported. Routecraft requires Node.js 18.19.0 or later (e.g. 20 or 22). Please upgrade Node or configure your MCP client to use a newer Node.`),process.exit(1));process.env.LOG_LEVEL===void 0&&(process.env.LOG_LEVEL="warn");process.env.CRAFT_LOG_LEVEL===void 0&&(process.env.CRAFT_LOG_LEVEL="warn");for(let o=0;o<process.argv.length;o++){let r=process.argv[o];if(r==="--log-file"&&process.argv[o+1]){let e=process.argv[o+1];process.env.LOG_FILE=e,process.env.CRAFT_LOG_FILE=e;}else if(r.startsWith("--log-file=")){let e=r.slice(11);process.env.LOG_FILE=e,process.env.CRAFT_LOG_FILE=e;}if(r==="--log-level"&&process.argv[o+1]){let e=process.argv[o+1];process.env.LOG_LEVEL=e,process.env.CRAFT_LOG_LEVEL=e;}else if(r.startsWith("--log-level=")){let e=r.slice(12);process.env.LOG_LEVEL=e,process.env.CRAFT_LOG_LEVEL=e;}}var{Command:c}=await import('commander'),{runCommand:l}=await import('./run-C7JCXC7X.js'),{loadEnvFile:t}=await import('./util-Q5GDRTSI.js'),s=new c;s.name("craft").description("A modern routing framework for TypeScript").version("0.2.0-canary.12").showSuggestionAfterError().showHelpAfterError().exitOverride(o=>{o.code==="commander.unknownCommand"&&process.exit(0);});process.argv.length<=2&&s.help({error:false});s.command("run").description("Run routes from a single TypeScript/JavaScript file").argument("<file>","Path to a file containing routes").option("--env <path>","Load environment variables from a .env file (default: .env)").option("--log-file <path>","Write logs to a file (keeps stdout clear for MCP stdio)").option("--log-level <level>","Log level (e.g. info, warn, error, silent to disable)","warn").action(async(o,r)=>{r.env!==void 0?t(r.env):t();let e=await l(o);if(!e.success){e.message&&console.error(e.message);let i=e.code??1;setImmediate(()=>process.exit(i));return}});s.parse();//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["major","minor","i","arg","path","level","Command","runCommand","loadEnvFile","program","err","filePath","options","result"],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\n\n/**\n * Routecraft CLI — single entry point.\n *\n * 1. Check Node version (Pino 10 needs Node 18.19+)\n * 2. Set LOG_FILE / LOG_LEVEL from argv before any import touches pino\n * 3. Dynamically import the rest so env is ready when the logger initialises\n */\n\n// ── 1. Node version gate ────────────────────────────────────────────\nconst [major, minor] = process.version.slice(1).split(\".\").map(Number) as [\n number,\n number,\n];\n\nif (!(major > 18 || (major === 18 && minor >= 19))) {\n // eslint-disable-next-line no-console\n console.error(\n `[routecraft] Node.js ${process.version} is not supported. ` +\n `Routecraft requires Node.js 18.19.0 or later (e.g. 20 or 22). ` +\n `Please upgrade Node or configure your MCP client to use a newer Node.`,\n );\n process.exit(1);\n}\n\n// ── 2. Early argv scan for log options (before loadEnvFile/runCommand) ─\n// Default level so logger sees \"warn\" if nothing else is set\nif (process.env[\"LOG_LEVEL\"] === undefined) {\n process.env[\"LOG_LEVEL\"] = \"warn\";\n}\nif (process.env[\"CRAFT_LOG_LEVEL\"] === undefined) {\n process.env[\"CRAFT_LOG_LEVEL\"] = \"warn\";\n}\nfor (let i = 0; i < process.argv.length; i++) {\n const arg = process.argv[i];\n if (arg === \"--log-file\" && process.argv[i + 1]) {\n const path = process.argv[i + 1];\n process.env[\"LOG_FILE\"] = path;\n process.env[\"CRAFT_LOG_FILE\"] = path;\n } else if (arg.startsWith(\"--log-file=\")) {\n const path = arg.slice(\"--log-file=\".length);\n process.env[\"LOG_FILE\"] = path;\n process.env[\"CRAFT_LOG_FILE\"] = path;\n }\n if (arg === \"--log-level\" && process.argv[i + 1]) {\n const level = process.argv[i + 1];\n process.env[\"LOG_LEVEL\"] = level;\n process.env[\"CRAFT_LOG_LEVEL\"] = level;\n } else if (arg.startsWith(\"--log-level=\")) {\n const level = arg.slice(\"--log-level=\".length);\n process.env[\"LOG_LEVEL\"] = level;\n process.env[\"CRAFT_LOG_LEVEL\"] = level;\n }\n}\n\n// ── 3. Dynamic imports (pino is loaded here, sees env vars above) ───\nconst { Command } = await import(\"commander\");\nconst { runCommand } = await import(\"./run.js\");\nconst { loadEnvFile } = await import(\"./util.js\");\n\n// ── 4. CLI definition ──────────────────────────────────────────────\nconst program = new Command();\n\nprogram\n .name(\"craft\")\n .description(\"A modern routing framework for TypeScript\")\n .version(\"0.2.0-canary.10\")\n .showSuggestionAfterError()\n .showHelpAfterError()\n .exitOverride((err) => {\n if (err.code === \"commander.unknownCommand\") {\n process.exit(0);\n }\n });\n\n// Show help by default if no arguments provided\nif (process.argv.length <= 2) {\n program.help({ error: false });\n}\n\n/**\n * The 'run' command executes routes from a single file.\n *\n * Example:\n * craft run ./my-routes.ts\n */\nprogram\n .command(\"run\")\n .description(\"Run routes from a single TypeScript/JavaScript file\")\n .argument(\"<file>\", \"Path to a file containing routes\")\n .option(\n \"--env <path>\",\n \"Load environment variables from a .env file (default: .env)\",\n )\n .option(\n \"--log-file <path>\",\n \"Write logs to a file (keeps stdout clear for MCP stdio)\",\n )\n .option(\n \"--log-level <level>\",\n \"Log level (e.g. info, warn, error, silent to disable)\",\n \"warn\",\n )\n .action(async (filePath, options) => {\n // Load environment variables if specified or use default .env\n if (options.env !== undefined) {\n loadEnvFile(options.env);\n } else {\n loadEnvFile();\n }\n\n const result = await runCommand(filePath);\n if (!result.success) {\n if (result.message) {\n // eslint-disable-next-line no-console\n console.error(result.message);\n }\n process.exit(result.code ?? 1);\n }\n });\n\n// Parse the command line arguments and execute the appropriate command\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["major","minor","i","arg","path","level","Command","runCommand","loadEnvFile","program","err","filePath","options","result","code"],"mappings":"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","file":"index.js","sourcesContent":["#!/usr/bin/env node\n\n/**\n * Routecraft CLI — single entry point.\n *\n * 1. Check Node version (Pino 10 needs Node 18.19+)\n * 2. Set LOG_FILE / LOG_LEVEL from argv before any import touches pino\n * 3. Dynamically import the rest so env is ready when the logger initialises\n */\n\n// ── 1. Node version gate ────────────────────────────────────────────\nconst [major, minor] = process.version.slice(1).split(\".\").map(Number) as [\n number,\n number,\n];\n\nif (!(major > 18 || (major === 18 && minor >= 19))) {\n // eslint-disable-next-line no-console\n console.error(\n `[routecraft] Node.js ${process.version} is not supported. ` +\n `Routecraft requires Node.js 18.19.0 or later (e.g. 20 or 22). ` +\n `Please upgrade Node or configure your MCP client to use a newer Node.`,\n );\n process.exit(1);\n}\n\n// ── 2. Early argv scan for log options (before loadEnvFile/runCommand) ─\n// Default level so logger sees \"warn\" if nothing else is set\nif (process.env[\"LOG_LEVEL\"] === undefined) {\n process.env[\"LOG_LEVEL\"] = \"warn\";\n}\nif (process.env[\"CRAFT_LOG_LEVEL\"] === undefined) {\n process.env[\"CRAFT_LOG_LEVEL\"] = \"warn\";\n}\nfor (let i = 0; i < process.argv.length; i++) {\n const arg = process.argv[i];\n if (arg === \"--log-file\" && process.argv[i + 1]) {\n const path = process.argv[i + 1];\n process.env[\"LOG_FILE\"] = path;\n process.env[\"CRAFT_LOG_FILE\"] = path;\n } else if (arg.startsWith(\"--log-file=\")) {\n const path = arg.slice(\"--log-file=\".length);\n process.env[\"LOG_FILE\"] = path;\n process.env[\"CRAFT_LOG_FILE\"] = path;\n }\n if (arg === \"--log-level\" && process.argv[i + 1]) {\n const level = process.argv[i + 1];\n process.env[\"LOG_LEVEL\"] = level;\n process.env[\"CRAFT_LOG_LEVEL\"] = level;\n } else if (arg.startsWith(\"--log-level=\")) {\n const level = arg.slice(\"--log-level=\".length);\n process.env[\"LOG_LEVEL\"] = level;\n process.env[\"CRAFT_LOG_LEVEL\"] = level;\n }\n}\n\n// ── 3. Dynamic imports (pino is loaded here, sees env vars above) ───\nconst { Command } = await import(\"commander\");\nconst { runCommand } = await import(\"./run.js\");\nconst { loadEnvFile } = await import(\"./util.js\");\n\n// ── 4. CLI definition ──────────────────────────────────────────────\nconst program = new Command();\n\nprogram\n .name(\"craft\")\n .description(\"A modern routing framework for TypeScript\")\n .version(\"0.2.0-canary.12\")\n .showSuggestionAfterError()\n .showHelpAfterError()\n .exitOverride((err) => {\n if (err.code === \"commander.unknownCommand\") {\n process.exit(0);\n }\n });\n\n// Show help by default if no arguments provided\nif (process.argv.length <= 2) {\n program.help({ error: false });\n}\n\n/**\n * The 'run' command executes routes from a single file.\n *\n * Example:\n * craft run ./my-routes.ts\n */\nprogram\n .command(\"run\")\n .description(\"Run routes from a single TypeScript/JavaScript file\")\n .argument(\"<file>\", \"Path to a file containing routes\")\n .option(\n \"--env <path>\",\n \"Load environment variables from a .env file (default: .env)\",\n )\n .option(\n \"--log-file <path>\",\n \"Write logs to a file (keeps stdout clear for MCP stdio)\",\n )\n .option(\n \"--log-level <level>\",\n \"Log level (e.g. info, warn, error, silent to disable)\",\n \"warn\",\n )\n .action(async (filePath, options) => {\n // Load environment variables if specified or use default .env\n if (options.env !== undefined) {\n loadEnvFile(options.env);\n } else {\n loadEnvFile();\n }\n\n const result = await runCommand(filePath);\n if (!result.success) {\n if (result.message) {\n // eslint-disable-next-line no-console\n console.error(result.message);\n }\n // Defer exit so pino/sonic-boom can finish initializing and avoid \"sonic boom is not ready yet\"\n const code = result.code ?? 1;\n setImmediate(() => process.exit(code));\n return;\n }\n });\n\n// Parse the command line arguments and execute the appropriate command\nprogram.parse();\n"]}
@@ -0,0 +1,2 @@
1
+ import {b}from'./chunk-5NEKGUV3.js';import {resolve,extname}from'path';import {configureLogger,logger,ContextBuilder}from'@routecraft/routecraft';var l=[".mjs",".js",".cjs"];async function v(t){let r=resolve(process.cwd(),t),n=extname(r);if(n===".ts"||n===".tsx")return {success:false,code:1,message:"TypeScript files are not supported by 'craft run'. Compile to .js or use .mjs/.js/.cjs."};if(!l.includes(n))return {success:false,code:1,message:`Error: Only the following file types are supported: ${l.join(", ")}`};try{let s=await import(r),e=s.craftConfig,u=process.env.LOG_FILE??process.env.CRAFT_LOG_FILE??e?.log?.file,d={level:process.env.LOG_LEVEL??process.env.CRAFT_LOG_LEVEL??e?.log?.level??"warn",...u!==void 0&&{logFile:u},...e?.log?.redact!==void 0&&{redact:e.log.redact}};configureLogger(d),logger.info(`Loading file: ${r}`);let i=new ContextBuilder;e&&(logger.info("Found craftConfig export, applying configuration"),i.with(e));let c=R(i,s.default);if(!c.success)return c;let a=await i.build();return b(a),await a.start(),{success:!0}}catch(s){return s instanceof Error?(logger.error(`Failed to run ${r}: ${s.message}`),{success:false,code:1,message:s.message}):(logger.error(`Failed to run ${r}: Unknown error occurred`),{success:false,code:1,message:"Unknown error"})}}function R(t,r){let n=e=>typeof e=="object"&&e!==null&&typeof e.build=="function",s=e=>typeof e=="object"&&e!==null&&"id"in e&&typeof e.id=="string"&&"source"in e&&"steps"in e&&"consumer"in e;return r?n(r)?(t.routes(r),logger.info("Loaded single RouteBuilder from default export"),{success:true}):s(r)?(t.routes(r),logger.info("Loaded single route from default export"),{success:true}):Array.isArray(r)?r.every(e=>n(e)||s(e))?(r.forEach(e=>t.routes(e)),logger.info(`Loaded ${r.length} routes from default export array`),{success:true}):(logger.error("All items in default export array must be RouteDefinition or RouteBuilder"),{success:false,code:1,message:"Invalid items in default export array"}):(logger.error("Invalid default export. Expected: RouteDefinition, RouteBuilder, or array of those."),{success:false,code:1,message:"Invalid default export. Expected: RouteDefinition, RouteBuilder, or array of those."}):(logger.error("No default export found. Expected routes as default export."),{success:false,code:1,message:"No default export found"})}export{v as runCommand};//# sourceMappingURL=run-C7JCXC7X.js.map
2
+ //# sourceMappingURL=run-C7JCXC7X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/run.ts"],"names":["SUPPORTED_EXTENSIONS","runCommand","filePath","absFilePath","resolve","ext","extname","module","craftConfig","logFile","mergedLog","configureLogger","logger","contextBuilder","ContextBuilder","configured","configureRoutes","context","registerContextSignalHandlers","error","defaultExport","isRouteBuilder","obj","isRouteDefinition","item","routeOrBuilder"],"mappings":"kJAWA,IAAMA,EAAuB,CAAC,MAAA,CAAQ,MAAO,MAAM,CAAA,CAMnD,eAAsBC,CAAAA,CAAWC,EAAsC,CACrE,IAAMC,EAAcC,OAAAA,CAAQ,OAAA,CAAQ,KAAI,CAAGF,CAAQ,CAAA,CAC7CG,CAAAA,CAAMC,QAAQH,CAAW,CAAA,CAG/B,GAAIE,CAAAA,GAAQ,KAAA,EAASA,IAAQ,MAAA,CAC3B,OAAO,CACL,OAAA,CAAS,MACT,IAAA,CAAM,CAAA,CACN,QACE,yFACJ,CAAA,CAIF,GACE,CAACL,CAAAA,CAAqB,QAAA,CAASK,CAA4C,EAE3E,OAAO,CACL,QAAS,KAAA,CACT,IAAA,CAAM,EACN,OAAA,CAAS,CAAA,oDAAA,EAAuDL,CAAAA,CAAqB,IAAA,CAAK,IAAI,CAAC,CAAA,CACjG,EAGF,GAAI,CAEF,IAAMO,CAAAA,CAAS,MAAM,OAAOJ,CAAAA,CAAAA,CACtBK,EAAcD,CAAAA,CAAO,WAAA,CAGrBE,EACJ,OAAA,CAAQ,GAAA,CAAI,UACZ,OAAA,CAAQ,GAAA,CAAI,cAAA,EACZD,CAAAA,EAAa,KAAK,IAAA,CACdE,CAAAA,CAAmD,CACvD,KAAA,CACE,OAAA,CAAQ,IAAI,SAAA,EACZ,OAAA,CAAQ,GAAA,CAAI,eAAA,EACZF,GAAa,GAAA,EAAK,KAAA,EAClB,OACF,GAAIC,CAAAA,GAAY,QAAa,CAAE,OAAA,CAAAA,CAAQ,CAAA,CACvC,GAAID,CAAAA,EAAa,GAAA,EAAK,SAAW,KAAA,CAAA,EAAa,CAC5C,OAAQA,CAAAA,CAAY,GAAA,CAAI,MAC1B,CACF,EACAG,eAAAA,CAAgBD,CAAS,EAEzBE,MAAAA,CAAO,IAAA,CAAK,iBAAiBT,CAAW,CAAA,CAAE,CAAA,CAG1C,IAAMU,EAAiB,IAAIC,cAAAA,CAGvBN,IACFI,MAAAA,CAAO,IAAA,CAAK,kDAAkD,CAAA,CAC9DC,CAAAA,CAAe,IAAA,CAAKL,CAAW,GAIjC,IAAMO,CAAAA,CAAaC,EAAgBH,CAAAA,CAAgBN,CAAAA,CAAO,OAAO,CAAA,CACjE,GAAI,CAACQ,CAAAA,CAAW,QACd,OAAOA,CAAAA,CAIT,IAAME,CAAAA,CAAU,MAAMJ,EAAe,KAAA,EAAM,CAC3C,OAAAK,CAAAA,CAA8BD,CAAO,EACrC,MAAMA,CAAAA,CAAQ,OAAM,CAEb,CAAE,QAAS,CAAA,CAAK,CACzB,CAAA,MAASE,CAAAA,CAAgB,CACvB,OAAIA,CAAAA,YAAiB,OACnBP,MAAAA,CAAO,KAAA,CAAM,iBAAiBT,CAAW,CAAA,EAAA,EAAKgB,CAAAA,CAAM,OAAO,EAAE,CAAA,CACtD,CAAE,QAAS,KAAA,CAAO,IAAA,CAAM,EAAG,OAAA,CAASA,CAAAA,CAAM,OAAQ,CAAA,GAE3DP,OAAO,KAAA,CAAM,CAAA,cAAA,EAAiBT,CAAW,CAAA,wBAAA,CAA0B,CAAA,CAC5D,CAAE,OAAA,CAAS,KAAA,CAAO,IAAA,CAAM,CAAA,CAAG,QAAS,eAAgB,CAAA,CAC7D,CACF,CAEA,SAASa,EACPH,CAAAA,CACAO,CAAAA,CACW,CAEX,IAAMC,EACJC,CAAAA,EAEA,OAAOA,GAAQ,QAAA,EACfA,CAAAA,GAAQ,MACR,OAAQA,CAAAA,CAA4B,KAAA,EAAU,UAAA,CAE1CC,EAAqBD,CAAAA,EACzB,OAAOA,GAAQ,QAAA,EACfA,CAAAA,GAAQ,MACR,IAAA,GAAQA,CAAAA,EACR,OAAOA,CAAAA,CAAI,IAAO,QAAA,EAClB,QAAA,GAAYA,GACZ,OAAA,GAAWA,CAAAA,EACX,aAAcA,CAAAA,CAEhB,OAAKF,EAODC,CAAAA,CAAeD,CAAa,GAC9BP,CAAAA,CAAe,MAAA,CAAOO,CAAa,CAAA,CACnCR,MAAAA,CAAO,KAAK,gDAAgD,CAAA,CACrD,CAAE,OAAA,CAAS,IAAK,CAAA,EAGrBW,CAAAA,CAAkBH,CAAa,CAAA,EACjCP,CAAAA,CAAe,OAAOO,CAAa,CAAA,CACnCR,MAAAA,CAAO,IAAA,CAAK,yCAAyC,CAAA,CAC9C,CAAE,QAAS,IAAK,CAAA,EAIrB,MAAM,OAAA,CAAQQ,CAAa,CAAA,CAG1BA,CAAAA,CAAc,MACZI,CAAAA,EAASH,CAAAA,CAAeG,CAAI,CAAA,EAAKD,CAAAA,CAAkBC,CAAI,CAC1D,CAAA,EAYFJ,CAAAA,CAAc,OAAA,CAASK,GACrBZ,CAAAA,CAAe,MAAA,CACbY,CACF,CACF,CAAA,CACAb,OAAO,IAAA,CACL,CAAA,OAAA,EAAUQ,CAAAA,CAAc,MAAM,mCAChC,CAAA,CACO,CAAE,QAAS,IAAK,CAAA,GAlBrBR,OAAO,KAAA,CACL,2EACF,CAAA,CACO,CACL,QAAS,KAAA,CACT,IAAA,CAAM,EACN,OAAA,CAAS,uCACX,IAeJA,MAAAA,CAAO,KAAA,CACL,qFACF,CAAA,CACO,CACL,OAAA,CAAS,KAAA,CACT,KAAM,CAAA,CACN,OAAA,CACE,qFACJ,CAAA,CAAA,EAxDEA,MAAAA,CAAO,MAAM,6DAA6D,CAAA,CACnE,CAAE,OAAA,CAAS,KAAA,CAAO,KAAM,CAAA,CAAG,OAAA,CAAS,yBAA0B,CAAA,CAwDzE","file":"run-C7JCXC7X.js","sourcesContent":["import { resolve, extname } from \"node:path\";\nimport {\n ContextBuilder,\n type RouteDefinition,\n type CraftConfig,\n configureLogger,\n logger,\n RouteBuilder,\n} from \"@routecraft/routecraft\";\nimport { registerContextSignalHandlers } from \"./util\";\n\nconst SUPPORTED_EXTENSIONS = [\".mjs\", \".js\", \".cjs\"] as const;\n\ntype RunResult =\n | { success: true }\n | { success: false; code?: number; message: string };\n\nexport async function runCommand(filePath: string): Promise<RunResult> {\n const absFilePath = resolve(process.cwd(), filePath);\n const ext = extname(absFilePath);\n\n // Reject TypeScript files explicitly (before generic extension check)\n if (ext === \".ts\" || ext === \".tsx\") {\n return {\n success: false,\n code: 1,\n message:\n \"TypeScript files are not supported by 'craft run'. Compile to .js or use .mjs/.js/.cjs.\",\n };\n }\n\n // Validate file extension\n if (\n !SUPPORTED_EXTENSIONS.includes(ext as (typeof SUPPORTED_EXTENSIONS)[number])\n ) {\n return {\n success: false,\n code: 1,\n message: `Error: Only the following file types are supported: ${SUPPORTED_EXTENSIONS.join(\", \")}`,\n };\n }\n\n try {\n // Load the module first so we can read craftConfig and set up logging before any logger use.\n const module = await import(absFilePath);\n const craftConfig = module.craftConfig as CraftConfig | undefined;\n\n // Merge log options: CLI env over craft config over defaults, then configure once.\n const logFile =\n process.env[\"LOG_FILE\"] ??\n process.env[\"CRAFT_LOG_FILE\"] ??\n craftConfig?.log?.file;\n const mergedLog: Parameters<typeof configureLogger>[0] = {\n level:\n process.env[\"LOG_LEVEL\"] ??\n process.env[\"CRAFT_LOG_LEVEL\"] ??\n craftConfig?.log?.level ??\n \"warn\",\n ...(logFile !== undefined && { logFile }),\n ...(craftConfig?.log?.redact !== undefined && {\n redact: craftConfig.log.redact,\n }),\n };\n configureLogger(mergedLog);\n\n logger.info(`Loading file: ${absFilePath}`);\n\n // Create context builder\n const contextBuilder = new ContextBuilder();\n\n // Apply craftConfig (routes, plugins, etc.); log was already applied above.\n if (craftConfig) {\n logger.info(\"Found craftConfig export, applying configuration\");\n contextBuilder.with(craftConfig);\n }\n\n // Handle routes from the default export\n const configured = configureRoutes(contextBuilder, module.default);\n if (!configured.success) {\n return configured;\n }\n\n // Build and start the context\n const context = await contextBuilder.build();\n registerContextSignalHandlers(context);\n await context.start();\n\n return { success: true };\n } catch (error: unknown) {\n if (error instanceof Error) {\n logger.error(`Failed to run ${absFilePath}: ${error.message}`);\n return { success: false, code: 1, message: error.message };\n }\n logger.error(`Failed to run ${absFilePath}: Unknown error occurred`);\n return { success: false, code: 1, message: \"Unknown error\" };\n }\n}\n\nfunction configureRoutes(\n contextBuilder: InstanceType<typeof ContextBuilder>,\n defaultExport: unknown,\n): RunResult {\n // Type guards (duck-typing so routes from user file's routecraft are accepted)\n const isRouteBuilder = (\n obj: unknown,\n ): obj is InstanceType<typeof RouteBuilder> =>\n typeof obj === \"object\" &&\n obj !== null &&\n typeof (obj as { build?: unknown }).build === \"function\";\n\n const isRouteDefinition = (obj: unknown): obj is RouteDefinition =>\n typeof obj === \"object\" &&\n obj !== null &&\n \"id\" in obj &&\n typeof obj.id === \"string\" && // Ensure id is a string, not a method\n \"source\" in obj &&\n \"steps\" in obj &&\n \"consumer\" in obj;\n\n if (!defaultExport) {\n logger.error(\"No default export found. Expected routes as default export.\");\n return { success: false, code: 1, message: \"No default export found\" };\n }\n\n // Handle single RouteBuilder or RouteDefinition\n // Check RouteBuilder first since it also has an 'id' property (as a method)\n if (isRouteBuilder(defaultExport)) {\n contextBuilder.routes(defaultExport);\n logger.info(\"Loaded single RouteBuilder from default export\");\n return { success: true };\n }\n\n if (isRouteDefinition(defaultExport)) {\n contextBuilder.routes(defaultExport);\n logger.info(\"Loaded single route from default export\");\n return { success: true };\n }\n\n // Handle array of routes\n if (Array.isArray(defaultExport)) {\n // Check each item, prioritizing RouteBuilder check\n if (\n !defaultExport.every(\n (item) => isRouteBuilder(item) || isRouteDefinition(item),\n )\n ) {\n logger.error(\n \"All items in default export array must be RouteDefinition or RouteBuilder\",\n );\n return {\n success: false,\n code: 1,\n message: \"Invalid items in default export array\",\n };\n }\n\n defaultExport.forEach((routeOrBuilder) =>\n contextBuilder.routes(\n routeOrBuilder as RouteDefinition | InstanceType<typeof RouteBuilder>,\n ),\n );\n logger.info(\n `Loaded ${defaultExport.length} routes from default export array`,\n );\n return { success: true };\n }\n\n // Invalid default export\n logger.error(\n \"Invalid default export. Expected: RouteDefinition, RouteBuilder, or array of those.\",\n );\n return {\n success: false,\n code: 1,\n message:\n \"Invalid default export. Expected: RouteDefinition, RouteBuilder, or array of those.\",\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@routecraft/cli",
3
- "version": "0.2.0-canary.10",
3
+ "version": "0.2.0-canary.12",
4
4
  "description": "CLI for running RouteCraft routes",
5
5
  "private": false,
6
6
  "type": "module",
@@ -22,9 +22,9 @@
22
22
  "prepublishOnly": "pnpm run build"
23
23
  },
24
24
  "dependencies": {
25
- "@routecraft/routecraft": "^0.2.0-canary.10",
25
+ "@routecraft/routecraft": "^0.2.0-canary.12",
26
26
  "commander": "^14.0.3",
27
- "dotenv": "^17.2.3"
27
+ "dotenv": "^17.3.1"
28
28
  },
29
29
  "publishConfig": {
30
30
  "access": "public"
@@ -1,2 +0,0 @@
1
- import {b}from'./chunk-5NEKGUV3.js';import {resolve,extname}from'path';import {logger,ContextBuilder}from'@routecraft/routecraft';var a=[".mjs",".js",".cjs"];async function w(n){let r=resolve(process.cwd(),n),t=extname(r);if(t===".ts"||t===".tsx")return {success:false,code:1,message:"TypeScript files are not supported by 'craft run'. Compile to .js or use .mjs/.js/.cjs."};if(!a.includes(t))return {success:false,code:1,message:`Error: Only the following file types are supported: ${a.join(", ")}`};try{logger.info(`Loading file: ${r}`);let s=await import(r),e=new ContextBuilder;s.craftConfig&&(logger.info("Found craftConfig export, applying configuration"),e.with(s.craftConfig));let i=p(e,s.default);if(!i.success)return i;let u=await e.build();return b(u),await u.start(),{success:!0}}catch(s){return s instanceof Error?(logger.error(`Failed to run ${r}: ${s.message}`),{success:false,code:1,message:s.message}):(logger.error(`Failed to run ${r}: Unknown error occurred`),{success:false,code:1,message:"Unknown error"})}}function p(n,r){let t=e=>typeof e=="object"&&e!==null&&typeof e.build=="function",s=e=>typeof e=="object"&&e!==null&&"id"in e&&typeof e.id=="string"&&"source"in e&&"steps"in e&&"consumer"in e;return r?t(r)?(n.routes(r),logger.info("Loaded single RouteBuilder from default export"),{success:true}):s(r)?(n.routes(r),logger.info("Loaded single route from default export"),{success:true}):Array.isArray(r)?r.every(e=>t(e)||s(e))?(r.forEach(e=>n.routes(e)),logger.info(`Loaded ${r.length} routes from default export array`),{success:true}):(logger.error("All items in default export array must be RouteDefinition or RouteBuilder"),{success:false,code:1,message:"Invalid items in default export array"}):(logger.error("Invalid default export. Expected: RouteDefinition, RouteBuilder, or array of those."),{success:false,code:1,message:"Invalid default export. Expected: RouteDefinition, RouteBuilder, or array of those."}):(logger.error("No default export found. Expected routes as default export."),{success:false,code:1,message:"No default export found"})}export{w as runCommand};//# sourceMappingURL=run-XS263DYP.js.map
2
- //# sourceMappingURL=run-XS263DYP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/run.ts"],"names":["SUPPORTED_EXTENSIONS","runCommand","filePath","absFilePath","resolve","ext","extname","logger","module","contextBuilder","ContextBuilder","configured","configureRoutes","context","registerContextSignalHandlers","error","defaultExport","isRouteBuilder","obj","isRouteDefinition","item","routeOrBuilder"],"mappings":"kIAUA,IAAMA,CAAAA,CAAuB,CAAC,OAAQ,KAAA,CAAO,MAAM,CAAA,CAMnD,eAAsBC,CAAAA,CAAWC,CAAAA,CAAsC,CACrE,IAAMC,EAAcC,OAAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,CAAGF,CAAQ,CAAA,CAC7CG,CAAAA,CAAMC,OAAAA,CAAQH,CAAW,EAG/B,GAAIE,CAAAA,GAAQ,KAAA,EAASA,CAAAA,GAAQ,MAAA,CAC3B,OAAO,CACL,OAAA,CAAS,MACT,IAAA,CAAM,CAAA,CACN,OAAA,CACE,yFACJ,EAIF,GACE,CAACL,CAAAA,CAAqB,QAAA,CAASK,CAA4C,CAAA,CAE3E,OAAO,CACL,OAAA,CAAS,KAAA,CACT,IAAA,CAAM,CAAA,CACN,OAAA,CAAS,uDAAuDL,CAAAA,CAAqB,IAAA,CAAK,IAAI,CAAC,EACjG,CAAA,CAGF,GAAI,CACFO,MAAAA,CAAO,KAAK,CAAA,cAAA,EAAiBJ,CAAW,CAAA,CAAE,CAAA,CAG1C,IAAMK,CAAAA,CAAS,MAAM,OAAOL,GAGtBM,CAAAA,CAAiB,IAAIC,cAAAA,CAGvBF,CAAAA,CAAO,cACTD,MAAAA,CAAO,IAAA,CAAK,kDAAkD,CAAA,CAC9DE,EAAe,IAAA,CAAKD,CAAAA,CAAO,WAA0B,CAAA,CAAA,CAIvD,IAAMG,CAAAA,CAAaC,CAAAA,CAAgBH,CAAAA,CAAgBD,EAAO,OAAO,CAAA,CACjE,GAAI,CAACG,EAAW,OAAA,CACd,OAAOA,CAAAA,CAIT,IAAME,EAAU,MAAMJ,CAAAA,CAAe,KAAA,EAAM,CAC3C,OAAAK,CAAAA,CAA8BD,CAAO,CAAA,CACrC,MAAMA,CAAAA,CAAQ,KAAA,EAAM,CAEb,CAAE,QAAS,CAAA,CAAK,CACzB,CAAA,MAASE,CAAAA,CAAgB,CACvB,OAAIA,CAAAA,YAAiB,KAAA,EACnBR,MAAAA,CAAO,MAAM,CAAA,cAAA,EAAiBJ,CAAW,CAAA,EAAA,EAAKY,CAAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CACtD,CAAE,OAAA,CAAS,MAAO,IAAA,CAAM,CAAA,CAAG,OAAA,CAASA,CAAAA,CAAM,OAAQ,CAAA,GAE3DR,MAAAA,CAAO,KAAA,CAAM,CAAA,cAAA,EAAiBJ,CAAW,CAAA,wBAAA,CAA0B,CAAA,CAC5D,CAAE,QAAS,KAAA,CAAO,IAAA,CAAM,CAAA,CAAG,OAAA,CAAS,eAAgB,CAAA,CAC7D,CACF,CAEA,SAASS,EACPH,CAAAA,CACAO,CAAAA,CACW,CAEX,IAAMC,CAAAA,CACJC,CAAAA,EAEA,OAAOA,CAAAA,EAAQ,UACfA,CAAAA,GAAQ,IAAA,EACR,OAAQA,CAAAA,CAA4B,OAAU,UAAA,CAE1CC,CAAAA,CAAqBD,CAAAA,EACzB,OAAOA,GAAQ,QAAA,EACfA,CAAAA,GAAQ,IAAA,EACR,IAAA,GAAQA,CAAAA,EACR,OAAOA,CAAAA,CAAI,EAAA,EAAO,UAClB,QAAA,GAAYA,CAAAA,EACZ,OAAA,GAAWA,CAAAA,EACX,aAAcA,CAAAA,CAEhB,OAAKF,CAAAA,CAODC,CAAAA,CAAeD,CAAa,CAAA,EAC9BP,CAAAA,CAAe,MAAA,CAAOO,CAAa,CAAA,CACnCT,MAAAA,CAAO,IAAA,CAAK,gDAAgD,EACrD,CAAE,OAAA,CAAS,IAAK,CAAA,EAGrBY,EAAkBH,CAAa,CAAA,EACjCP,CAAAA,CAAe,MAAA,CAAOO,CAAa,CAAA,CACnCT,MAAAA,CAAO,IAAA,CAAK,yCAAyC,CAAA,CAC9C,CAAE,OAAA,CAAS,IAAK,GAIrB,KAAA,CAAM,OAAA,CAAQS,CAAa,CAAA,CAG1BA,EAAc,KAAA,CACZI,CAAAA,EAASH,CAAAA,CAAeG,CAAI,GAAKD,CAAAA,CAAkBC,CAAI,CAC1D,CAAA,EAYFJ,CAAAA,CAAc,OAAA,CAASK,CAAAA,EACrBZ,CAAAA,CAAe,OACbY,CACF,CACF,CAAA,CACAd,MAAAA,CAAO,KACL,CAAA,OAAA,EAAUS,CAAAA,CAAc,MAAM,CAAA,iCAAA,CAChC,EACO,CAAE,OAAA,CAAS,IAAK,CAAA,GAlBrBT,MAAAA,CAAO,KAAA,CACL,2EACF,CAAA,CACO,CACL,OAAA,CAAS,KAAA,CACT,IAAA,CAAM,CAAA,CACN,QAAS,uCACX,CAAA,CAAA,EAeJA,MAAAA,CAAO,KAAA,CACL,qFACF,CAAA,CACO,CACL,OAAA,CAAS,KAAA,CACT,KAAM,CAAA,CACN,OAAA,CACE,qFACJ,CAAA,CAAA,EAxDEA,OAAO,KAAA,CAAM,6DAA6D,CAAA,CACnE,CAAE,QAAS,KAAA,CAAO,IAAA,CAAM,CAAA,CAAG,OAAA,CAAS,yBAA0B,CAAA,CAwDzE","file":"run-XS263DYP.js","sourcesContent":["import { resolve, extname } from \"node:path\";\nimport {\n ContextBuilder,\n type RouteDefinition,\n type CraftConfig,\n logger,\n RouteBuilder,\n} from \"@routecraft/routecraft\";\nimport { registerContextSignalHandlers } from \"./util\";\n\nconst SUPPORTED_EXTENSIONS = [\".mjs\", \".js\", \".cjs\"] as const;\n\ntype RunResult =\n | { success: true }\n | { success: false; code?: number; message: string };\n\nexport async function runCommand(filePath: string): Promise<RunResult> {\n const absFilePath = resolve(process.cwd(), filePath);\n const ext = extname(absFilePath);\n\n // Reject TypeScript files explicitly (before generic extension check)\n if (ext === \".ts\" || ext === \".tsx\") {\n return {\n success: false,\n code: 1,\n message:\n \"TypeScript files are not supported by 'craft run'. Compile to .js or use .mjs/.js/.cjs.\",\n };\n }\n\n // Validate file extension\n if (\n !SUPPORTED_EXTENSIONS.includes(ext as (typeof SUPPORTED_EXTENSIONS)[number])\n ) {\n return {\n success: false,\n code: 1,\n message: `Error: Only the following file types are supported: ${SUPPORTED_EXTENSIONS.join(\", \")}`,\n };\n }\n\n try {\n logger.info(`Loading file: ${absFilePath}`);\n\n // Load the module with both default and named exports\n const module = await import(absFilePath);\n\n // Create context builder\n const contextBuilder = new ContextBuilder();\n\n // Check for optional craftConfig named export\n if (module.craftConfig) {\n logger.info(\"Found craftConfig export, applying configuration\");\n contextBuilder.with(module.craftConfig as CraftConfig);\n }\n\n // Handle routes from the default export\n const configured = configureRoutes(contextBuilder, module.default);\n if (!configured.success) {\n return configured;\n }\n\n // Build and start the context\n const context = await contextBuilder.build();\n registerContextSignalHandlers(context);\n await context.start();\n\n return { success: true };\n } catch (error: unknown) {\n if (error instanceof Error) {\n logger.error(`Failed to run ${absFilePath}: ${error.message}`);\n return { success: false, code: 1, message: error.message };\n }\n logger.error(`Failed to run ${absFilePath}: Unknown error occurred`);\n return { success: false, code: 1, message: \"Unknown error\" };\n }\n}\n\nfunction configureRoutes(\n contextBuilder: InstanceType<typeof ContextBuilder>,\n defaultExport: unknown,\n): RunResult {\n // Type guards\n const isRouteBuilder = (\n obj: unknown,\n ): obj is InstanceType<typeof RouteBuilder> =>\n typeof obj === \"object\" &&\n obj !== null &&\n typeof (obj as { build?: unknown }).build === \"function\";\n\n const isRouteDefinition = (obj: unknown): obj is RouteDefinition =>\n typeof obj === \"object\" &&\n obj !== null &&\n \"id\" in obj &&\n typeof obj.id === \"string\" && // Ensure id is a string, not a method\n \"source\" in obj &&\n \"steps\" in obj &&\n \"consumer\" in obj;\n\n if (!defaultExport) {\n logger.error(\"No default export found. Expected routes as default export.\");\n return { success: false, code: 1, message: \"No default export found\" };\n }\n\n // Handle single RouteBuilder or RouteDefinition\n // Check RouteBuilder first since it also has an 'id' property (as a method)\n if (isRouteBuilder(defaultExport)) {\n contextBuilder.routes(defaultExport);\n logger.info(\"Loaded single RouteBuilder from default export\");\n return { success: true };\n }\n\n if (isRouteDefinition(defaultExport)) {\n contextBuilder.routes(defaultExport);\n logger.info(\"Loaded single route from default export\");\n return { success: true };\n }\n\n // Handle array of routes\n if (Array.isArray(defaultExport)) {\n // Check each item, prioritizing RouteBuilder check\n if (\n !defaultExport.every(\n (item) => isRouteBuilder(item) || isRouteDefinition(item),\n )\n ) {\n logger.error(\n \"All items in default export array must be RouteDefinition or RouteBuilder\",\n );\n return {\n success: false,\n code: 1,\n message: \"Invalid items in default export array\",\n };\n }\n\n defaultExport.forEach((routeOrBuilder) =>\n contextBuilder.routes(\n routeOrBuilder as RouteDefinition | InstanceType<typeof RouteBuilder>,\n ),\n );\n logger.info(\n `Loaded ${defaultExport.length} routes from default export array`,\n );\n return { success: true };\n }\n\n // Invalid default export\n logger.error(\n \"Invalid default export. Expected: RouteDefinition, RouteBuilder, or array of those.\",\n );\n return {\n success: false,\n code: 1,\n message:\n \"Invalid default export. Expected: RouteDefinition, RouteBuilder, or array of those.\",\n };\n}\n"]}