create-taserjs 0.0.0

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.
Files changed (139) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +22 -0
  3. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  4. package/dist/cjs/addons/drizzle/index.cjs +124 -0
  5. package/dist/cjs/addons/drizzle/index.cjs.map +1 -0
  6. package/dist/cjs/addons/drizzle/index.d.cts +2 -0
  7. package/dist/cjs/addons/kysely/index.cjs +96 -0
  8. package/dist/cjs/addons/kysely/index.cjs.map +1 -0
  9. package/dist/cjs/addons/kysely/index.d.cts +2 -0
  10. package/dist/cjs/addons/pino/index.cjs +30 -0
  11. package/dist/cjs/addons/pino/index.cjs.map +1 -0
  12. package/dist/cjs/addons/pino/index.d.cts +2 -0
  13. package/dist/cjs/addons/prisma/index.cjs +66 -0
  14. package/dist/cjs/addons/prisma/index.cjs.map +1 -0
  15. package/dist/cjs/addons/prisma/index.d.cts +2 -0
  16. package/dist/cjs/addons/registry.cjs +52 -0
  17. package/dist/cjs/addons/registry.cjs.map +1 -0
  18. package/dist/cjs/addons/registry.d.cts +5 -0
  19. package/dist/cjs/addons/types.d.cts +16 -0
  20. package/dist/cjs/addons/winston/index.cjs +34 -0
  21. package/dist/cjs/addons/winston/index.cjs.map +1 -0
  22. package/dist/cjs/addons/winston/index.d.cts +2 -0
  23. package/dist/cjs/cli.cjs +56 -0
  24. package/dist/cjs/cli.cjs.map +1 -0
  25. package/dist/cjs/cli.d.cts +2 -0
  26. package/dist/cjs/commands/create.cjs +243 -0
  27. package/dist/cjs/commands/create.cjs.map +1 -0
  28. package/dist/cjs/commands/create.d.cts +11 -0
  29. package/dist/cjs/core/json-output.cjs +16 -0
  30. package/dist/cjs/core/json-output.cjs.map +1 -0
  31. package/dist/cjs/core/json-output.d.cts +4 -0
  32. package/dist/cjs/core/package-manager.cjs +64 -0
  33. package/dist/cjs/core/package-manager.cjs.map +1 -0
  34. package/dist/cjs/core/package-manager.d.cts +7 -0
  35. package/dist/cjs/core/parse-options.cjs +59 -0
  36. package/dist/cjs/core/parse-options.cjs.map +1 -0
  37. package/dist/cjs/core/parse-options.d.cts +18 -0
  38. package/dist/cjs/core/project-config.cjs +18 -0
  39. package/dist/cjs/core/project-config.cjs.map +1 -0
  40. package/dist/cjs/core/project-config.d.cts +2 -0
  41. package/dist/cjs/core/resolve-packages.cjs +52 -0
  42. package/dist/cjs/core/resolve-packages.cjs.map +1 -0
  43. package/dist/cjs/core/resolve-packages.d.cts +5 -0
  44. package/dist/cjs/core/scaffold-engine.cjs +73 -0
  45. package/dist/cjs/core/scaffold-engine.cjs.map +1 -0
  46. package/dist/cjs/core/scaffold-engine.d.cts +2 -0
  47. package/dist/cjs/core/types.cjs +27 -0
  48. package/dist/cjs/core/types.cjs.map +1 -0
  49. package/dist/cjs/core/types.d.cts +37 -0
  50. package/dist/cjs/core/validate-project-name.cjs +45 -0
  51. package/dist/cjs/core/validate-project-name.cjs.map +1 -0
  52. package/dist/cjs/core/validate-project-name.d.cts +1 -0
  53. package/dist/cjs/frameworks/index.cjs +106 -0
  54. package/dist/cjs/frameworks/index.cjs.map +1 -0
  55. package/dist/cjs/frameworks/index.d.cts +3 -0
  56. package/dist/cjs/scaffold.d.cts +3 -0
  57. package/dist/cjs/templates/base.cjs +186 -0
  58. package/dist/cjs/templates/base.cjs.map +1 -0
  59. package/dist/cjs/templates/base.d.cts +12 -0
  60. package/dist/cjs/types.d.cts +1 -0
  61. package/dist/esm/addons/drizzle/index.d.ts +2 -0
  62. package/dist/esm/addons/drizzle/index.js +124 -0
  63. package/dist/esm/addons/drizzle/index.js.map +1 -0
  64. package/dist/esm/addons/kysely/index.d.ts +2 -0
  65. package/dist/esm/addons/kysely/index.js +96 -0
  66. package/dist/esm/addons/kysely/index.js.map +1 -0
  67. package/dist/esm/addons/pino/index.d.ts +2 -0
  68. package/dist/esm/addons/pino/index.js +30 -0
  69. package/dist/esm/addons/pino/index.js.map +1 -0
  70. package/dist/esm/addons/prisma/index.d.ts +2 -0
  71. package/dist/esm/addons/prisma/index.js +66 -0
  72. package/dist/esm/addons/prisma/index.js.map +1 -0
  73. package/dist/esm/addons/registry.d.ts +5 -0
  74. package/dist/esm/addons/registry.js +50 -0
  75. package/dist/esm/addons/registry.js.map +1 -0
  76. package/dist/esm/addons/types.d.ts +16 -0
  77. package/dist/esm/addons/winston/index.d.ts +2 -0
  78. package/dist/esm/addons/winston/index.js +34 -0
  79. package/dist/esm/addons/winston/index.js.map +1 -0
  80. package/dist/esm/cli.d.ts +2 -0
  81. package/dist/esm/cli.js +53 -0
  82. package/dist/esm/cli.js.map +1 -0
  83. package/dist/esm/commands/create.d.ts +11 -0
  84. package/dist/esm/commands/create.js +238 -0
  85. package/dist/esm/commands/create.js.map +1 -0
  86. package/dist/esm/core/json-output.d.ts +4 -0
  87. package/dist/esm/core/json-output.js +14 -0
  88. package/dist/esm/core/json-output.js.map +1 -0
  89. package/dist/esm/core/package-manager.d.ts +7 -0
  90. package/dist/esm/core/package-manager.js +62 -0
  91. package/dist/esm/core/package-manager.js.map +1 -0
  92. package/dist/esm/core/parse-options.d.ts +18 -0
  93. package/dist/esm/core/parse-options.js +56 -0
  94. package/dist/esm/core/parse-options.js.map +1 -0
  95. package/dist/esm/core/project-config.d.ts +2 -0
  96. package/dist/esm/core/project-config.js +16 -0
  97. package/dist/esm/core/project-config.js.map +1 -0
  98. package/dist/esm/core/resolve-packages.d.ts +5 -0
  99. package/dist/esm/core/resolve-packages.js +52 -0
  100. package/dist/esm/core/resolve-packages.js.map +1 -0
  101. package/dist/esm/core/scaffold-engine.d.ts +2 -0
  102. package/dist/esm/core/scaffold-engine.js +71 -0
  103. package/dist/esm/core/scaffold-engine.js.map +1 -0
  104. package/dist/esm/core/types.d.ts +37 -0
  105. package/dist/esm/core/types.js +23 -0
  106. package/dist/esm/core/types.js.map +1 -0
  107. package/dist/esm/core/validate-project-name.d.ts +1 -0
  108. package/dist/esm/core/validate-project-name.js +43 -0
  109. package/dist/esm/core/validate-project-name.js.map +1 -0
  110. package/dist/esm/frameworks/index.d.ts +3 -0
  111. package/dist/esm/frameworks/index.js +105 -0
  112. package/dist/esm/frameworks/index.js.map +1 -0
  113. package/dist/esm/scaffold.d.ts +3 -0
  114. package/dist/esm/templates/base.d.ts +12 -0
  115. package/dist/esm/templates/base.js +178 -0
  116. package/dist/esm/templates/base.js.map +1 -0
  117. package/dist/esm/types.d.ts +1 -0
  118. package/package.json +45 -0
  119. package/src/addons/drizzle/index.ts +145 -0
  120. package/src/addons/kysely/index.ts +111 -0
  121. package/src/addons/pino/index.ts +30 -0
  122. package/src/addons/prisma/index.ts +81 -0
  123. package/src/addons/registry.ts +73 -0
  124. package/src/addons/types.ts +19 -0
  125. package/src/addons/winston/index.ts +34 -0
  126. package/src/cli.ts +57 -0
  127. package/src/commands/create.ts +253 -0
  128. package/src/core/json-output.ts +13 -0
  129. package/src/core/package-manager.ts +68 -0
  130. package/src/core/parse-options.ts +97 -0
  131. package/src/core/project-config.ts +27 -0
  132. package/src/core/resolve-packages.ts +62 -0
  133. package/src/core/scaffold-engine.ts +82 -0
  134. package/src/core/types.ts +51 -0
  135. package/src/core/validate-project-name.ts +59 -0
  136. package/src/frameworks/index.ts +111 -0
  137. package/src/scaffold.ts +3 -0
  138. package/src/templates/base.ts +209 -0
  139. package/src/types.ts +9 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","names":[],"sources":["../../../src/commands/create.ts"],"sourcesContent":["import path from 'node:path'\n\nimport * as p from '@clack/prompts'\nimport color from 'picocolors'\n\nimport { getCapabilitiesCatalog } from '../addons/registry.js'\nimport { printCapabilitiesCatalog, printJsonError, printScaffoldResult } from '../core/json-output.js'\nimport {\n parseDbFlag,\n parseFrameworkFlag,\n parseLoggerFlag,\n type ParsedCreateArgs,\n resolveScaffoldDefaults,\n} from '../core/parse-options.js'\nimport { scaffoldProject } from '../core/scaffold-engine.js'\nimport type { DbDriver, DbOdm, Framework, LoggerId, ScaffoldResult } from '../core/types.js'\nimport { DB_DRIVERS, DB_ODMS, FRAMEWORKS, LOGGERS } from '../core/types.js'\nimport { validateProjectName } from '../core/validate-project-name.js'\nimport { resolveUserAgent, runScript } from '../core/package-manager.js'\n\nfunction isFramework(value: unknown): value is Framework {\n return typeof value === 'string' && (FRAMEWORKS as readonly string[]).includes(value)\n}\n\nfunction isDbOdm(value: unknown): value is DbOdm {\n return typeof value === 'string' && (DB_ODMS as readonly string[]).includes(value)\n}\n\nfunction isDbDriver(value: unknown): value is DbDriver {\n return typeof value === 'string' && (DB_DRIVERS as readonly string[]).includes(value)\n}\n\nfunction isLoggerId(value: unknown): value is LoggerId {\n return typeof value === 'string' && (LOGGERS as readonly string[]).includes(value)\n}\n\nasync function promptInteractiveOptions(\n args: ParsedCreateArgs,\n): Promise<ParsedCreateArgs> {\n const projectName = args.projectName\n ?? await p.text({\n message: 'Project name',\n placeholder: 'my-taser-app',\n defaultValue: 'my-taser-app',\n validate(value) {\n return validateProjectName(value)\n },\n })\n\n if (p.isCancel(projectName)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n\n const framework = args.framework\n ?? await p.select({\n message: 'Framework adapter',\n options: [\n { value: 'node', label: 'Plain Node.js', hint: 'default' },\n { value: 'express', label: 'Express' },\n { value: 'hono', label: 'Hono' },\n { value: 'fastify', label: 'Fastify' },\n ],\n initialValue: 'node',\n })\n\n if (p.isCancel(framework) || !isFramework(framework)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n\n const dbChoice = args.db\n ?? await p.select({\n message: 'Database',\n options: [\n { value: 'none', label: 'None', hint: 'default' },\n { value: 'drizzle', label: 'Drizzle' },\n { value: 'prisma', label: 'Prisma' },\n { value: 'kysely', label: 'Kysely' },\n ],\n initialValue: 'none',\n })\n\n if (p.isCancel(dbChoice)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n\n let db: DbOdm | undefined\n let driver: DbDriver | undefined\n\n if (dbChoice !== 'none' && isDbOdm(dbChoice)) {\n db = dbChoice\n const driverChoice = args.driver\n ?? await p.select({\n message: 'Database driver',\n options: [\n { value: 'sqlite', label: 'SQLite', hint: 'default' },\n { value: 'postgres', label: 'PostgreSQL' },\n { value: 'mysql', label: 'MySQL' },\n ],\n initialValue: 'sqlite',\n })\n\n if (p.isCancel(driverChoice) || !isDbDriver(driverChoice)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n driver = driverChoice\n }\n\n const loggerChoice = args.logger\n ?? await p.select({\n message: 'Logger',\n options: [\n { value: 'none', label: 'None', hint: 'default' },\n { value: 'pino', label: 'Pino' },\n { value: 'winston', label: 'Winston' },\n ],\n initialValue: 'none',\n })\n\n if (p.isCancel(loggerChoice)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n\n const logger = loggerChoice === 'none' ? undefined : isLoggerId(loggerChoice) ? loggerChoice : undefined\n\n return {\n projectName: String(projectName).trim(),\n framework,\n yes: args.yes,\n noInstall: args.noInstall,\n json: args.json,\n ...(db ? { db, driver: driver! } : {}),\n ...(logger ? { logger } : {}),\n }\n}\n\nexport async function runCreateCommand(args: ParsedCreateArgs): Promise<ScaffoldResult | undefined> {\n if (args.json && !args.projectName) {\n printCapabilitiesCatalog(getCapabilitiesCatalog())\n return undefined\n }\n\n const cwd = process.cwd()\n const interactive = !args.yes\n const resolved = interactive\n ? await promptInteractiveOptions(args)\n : {\n ...args,\n projectName: args.projectName?.trim(),\n framework: args.framework ?? 'node',\n }\n\n if (!resolved.projectName) {\n const message = 'Project name is required'\n if (args.json) {\n printJsonError(message)\n process.exit(1)\n }\n throw new Error(message)\n }\n\n const nameError = validateProjectName(resolved.projectName, cwd)\n if (nameError) {\n if (args.json) {\n printJsonError(nameError)\n process.exit(1)\n }\n throw new Error(nameError)\n }\n\n const targetDir = path.resolve(cwd, resolved.projectName)\n const scaffoldCtx = resolveScaffoldDefaults({\n ...resolved,\n projectName: resolved.projectName,\n })\n scaffoldCtx.targetDir = targetDir\n\n if (!args.json) {\n const spinner = p.spinner()\n spinner.start('Scaffolding project')\n try {\n const result = await scaffoldProject({\n ...scaffoldCtx,\n targetDir,\n skipInstall: args.noInstall,\n agent: resolveUserAgent(),\n })\n spinner.stop('Project created')\n const cdPath = path.relative(cwd, targetDir) || '.'\n p.note(\n [\n `cd ${cdPath}`,\n runScript(resolveUserAgent(), 'dev'),\n ].join('\\n'),\n 'Next steps',\n )\n p.outro(color.green('Done.'))\n return result\n }\n catch (error) {\n spinner.stop('Scaffold failed')\n throw error\n }\n }\n\n const result = await scaffoldProject({\n ...scaffoldCtx,\n targetDir,\n skipInstall: args.noInstall,\n agent: resolveUserAgent(),\n })\n printScaffoldResult(result)\n return result\n}\n\nexport function buildParsedArgsFromCli(values: {\n framework?: string\n db?: string\n logger?: string\n y?: boolean\n noInstall?: boolean\n json?: boolean\n}, positionals: string[]): ParsedCreateArgs {\n const args: ParsedCreateArgs = {\n yes: values.y ?? false,\n noInstall: values.noInstall ?? false,\n json: values.json ?? false,\n }\n\n if (positionals[0]) {\n args.projectName = positionals[0]\n }\n\n if (values.framework) {\n args.framework = parseFrameworkFlag(values.framework)\n }\n\n if (values.db) {\n const parsed = parseDbFlag(values.db)\n args.db = parsed.db\n args.driver = parsed.driver\n }\n\n if (values.logger) {\n args.logger = parseLoggerFlag(values.logger)\n }\n\n return args\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { CapabilitiesCatalog, ScaffoldResult } from './types.js';
2
+ export declare function printCapabilitiesCatalog(catalog: CapabilitiesCatalog): void;
3
+ export declare function printScaffoldResult(result: ScaffoldResult): void;
4
+ export declare function printJsonError(message: string): void;
@@ -0,0 +1,14 @@
1
+ //#region src/core/json-output.ts
2
+ function printCapabilitiesCatalog(catalog) {
3
+ console.log(JSON.stringify(catalog, null, 2));
4
+ }
5
+ function printScaffoldResult(result) {
6
+ console.log(JSON.stringify(result, null, 2));
7
+ }
8
+ function printJsonError(message) {
9
+ console.error(JSON.stringify({ error: message }));
10
+ }
11
+ //#endregion
12
+ export { printCapabilitiesCatalog, printJsonError, printScaffoldResult };
13
+
14
+ //# sourceMappingURL=json-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.js","names":[],"sources":["../../../src/core/json-output.ts"],"sourcesContent":["import type { CapabilitiesCatalog, ScaffoldResult } from './types.js'\n\nexport function printCapabilitiesCatalog(catalog: CapabilitiesCatalog): void {\n console.log(JSON.stringify(catalog, null, 2))\n}\n\nexport function printScaffoldResult(result: ScaffoldResult): void {\n console.log(JSON.stringify(result, null, 2))\n}\n\nexport function printJsonError(message: string): void {\n console.error(JSON.stringify({ error: message }))\n}\n"],"mappings":";AAEA,SAAgB,yBAAyB,SAAoC;CAC3E,QAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC9C;AAEA,SAAgB,oBAAoB,QAA8B;CAChE,QAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;AAEA,SAAgB,eAAe,SAAuB;CACpD,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC,CAAC;AAClD"}
@@ -0,0 +1,7 @@
1
+ import { Agent } from 'package-manager-detector';
2
+ export declare function resolveUserAgent(): Agent;
3
+ export declare function installPackages(agent: Agent, cwd: string, { dependencies, devDependencies }: {
4
+ dependencies: string[];
5
+ devDependencies: string[];
6
+ }): Promise<void>;
7
+ export declare function runScript(agent: Agent, script: string): string;
@@ -0,0 +1,62 @@
1
+ import { spawn } from "node:child_process";
2
+ import { resolveCommand } from "package-manager-detector/commands";
3
+ import { getUserAgent } from "package-manager-detector/detect";
4
+ //#region src/core/package-manager.ts
5
+ function resolveUserAgent() {
6
+ return getUserAgent() || "npm";
7
+ }
8
+ function runCommand(command, args, cwd) {
9
+ return new Promise((resolve, reject) => {
10
+ const child = spawn(command, args, {
11
+ cwd,
12
+ stdio: "inherit",
13
+ shell: false,
14
+ env: process.env
15
+ });
16
+ child.on("error", reject);
17
+ child.on("close", (code) => {
18
+ if (code === 0) {
19
+ resolve();
20
+ return;
21
+ }
22
+ reject(/* @__PURE__ */ new Error(`${command} ${args.join(" ")} exited with code ${code}`));
23
+ });
24
+ });
25
+ }
26
+ var fallback = {
27
+ agent: "npm",
28
+ install: (packages, dev) => {
29
+ return [
30
+ "install",
31
+ ...packages,
32
+ dev ? "-D" : ""
33
+ ];
34
+ }
35
+ };
36
+ function resolveInstallCommand(agent, packages, dev) {
37
+ const command = resolveCommand(agent, "install", packages);
38
+ if (command) return command;
39
+ return {
40
+ command: fallback.agent,
41
+ args: fallback.install(packages, dev)
42
+ };
43
+ }
44
+ async function installPackages(agent, cwd, { dependencies, devDependencies }) {
45
+ if (dependencies.length > 0) {
46
+ const { command, args } = resolveInstallCommand(agent, dependencies, false);
47
+ await runCommand(command, args, cwd);
48
+ }
49
+ if (devDependencies.length > 0) {
50
+ const { command, args } = resolveInstallCommand(agent, devDependencies, true);
51
+ await runCommand(command, args, cwd);
52
+ }
53
+ }
54
+ function runScript(agent, script) {
55
+ const resolved = resolveCommand(agent, "run", [script]);
56
+ if (!resolved) throw new Error(`Unable to resolve run command for ${agent}`);
57
+ return `${resolved.command} ${resolved.args.join(" ")}`;
58
+ }
59
+ //#endregion
60
+ export { installPackages, resolveUserAgent, runScript };
61
+
62
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","names":[],"sources":["../../../src/core/package-manager.ts"],"sourcesContent":["import { spawn } from 'node:child_process'\n\nimport type { Agent, ResolvedCommand } from 'package-manager-detector'\nimport { resolveCommand } from 'package-manager-detector/commands'\nimport { getUserAgent } from 'package-manager-detector/detect'\n\nexport function resolveUserAgent(): Agent {\n return getUserAgent() || 'npm'\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell: false,\n env: process.env,\n })\n child.on('error', reject)\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n reject(new Error(`${command} ${args.join(' ')} exited with code ${code}`))\n })\n })\n}\n\nconst fallback = {\n agent: 'npm',\n install: (packages: string[], dev: boolean) => {\n return ['install', ...packages, dev ? '-D' : '']\n },\n}\n\nfunction resolveInstallCommand(agent: Agent, packages: string[], dev: boolean): ResolvedCommand {\n const command = resolveCommand(agent, 'install', packages)\n if (command) return command\n\n return { command: fallback.agent, args: fallback.install(packages, dev) }\n}\n\nexport async function installPackages(\n agent: Agent,\n cwd: string,\n { dependencies, devDependencies }: {\n dependencies: string[]\n devDependencies: string[]\n },\n): Promise<void> {\n if (dependencies.length > 0) {\n const { command, args } = resolveInstallCommand(agent, dependencies, false)\n await runCommand(command, args, cwd)\n }\n if (devDependencies.length > 0) {\n const { command, args } = resolveInstallCommand(agent, devDependencies, true)\n await runCommand(command, args, cwd)\n }\n}\n\nexport function runScript(agent: Agent, script: string): string {\n const resolved = resolveCommand(agent, 'run', [script])\n if (!resolved) {\n throw new Error(`Unable to resolve run command for ${agent}`)\n }\n return `${resolved.command} ${resolved.args.join(' ')}`\n}\n"],"mappings":";;;;AAMA,SAAgB,mBAA0B;CACxC,OAAO,aAAa,KAAK;AAC3B;AAEA,SAAS,WAAW,SAAiB,MAAgB,KAA4B;CAC/E,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,QAAQ,MAAM,SAAS,MAAM;GACjC;GACA,OAAO;GACP,OAAO;GACP,KAAK,QAAQ;EACf,CAAC;EACD,MAAM,GAAG,SAAS,MAAM;EACxB,MAAM,GAAG,UAAU,SAAS;GAC1B,IAAI,SAAS,GAAG;IACd,QAAQ;IACR;GACF;GACA,uBAAO,IAAI,MAAM,GAAG,QAAQ,GAAG,KAAK,KAAK,GAAG,EAAE,oBAAoB,MAAM,CAAC;EAC3E,CAAC;CACH,CAAC;AACH;AAEA,IAAM,WAAW;CACf,OAAO;CACP,UAAU,UAAoB,QAAiB;EAC7C,OAAO;GAAC;GAAW,GAAG;GAAU,MAAM,OAAO;EAAE;CACjD;AACF;AAEA,SAAS,sBAAsB,OAAc,UAAoB,KAA+B;CAC9F,MAAM,UAAU,eAAe,OAAO,WAAW,QAAQ;CACzD,IAAI,SAAS,OAAO;CAEpB,OAAO;EAAE,SAAS,SAAS;EAAO,MAAM,SAAS,QAAQ,UAAU,GAAG;CAAE;AAC1E;AAEA,eAAsB,gBACpB,OACA,KACA,EAAE,cAAc,mBAID;CACf,IAAI,aAAa,SAAS,GAAG;EAC3B,MAAM,EAAE,SAAS,SAAS,sBAAsB,OAAO,cAAc,KAAK;EAC1E,MAAM,WAAW,SAAS,MAAM,GAAG;CACrC;CACA,IAAI,gBAAgB,SAAS,GAAG;EAC9B,MAAM,EAAE,SAAS,SAAS,sBAAsB,OAAO,iBAAiB,IAAI;EAC5E,MAAM,WAAW,SAAS,MAAM,GAAG;CACrC;AACF;AAEA,SAAgB,UAAU,OAAc,QAAwB;CAC9D,MAAM,WAAW,eAAe,OAAO,OAAO,CAAC,MAAM,CAAC;CACtD,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,qCAAqC,OAAO;CAE9D,OAAO,GAAG,SAAS,QAAQ,GAAG,SAAS,KAAK,KAAK,GAAG;AACtD"}
@@ -0,0 +1,18 @@
1
+ import { DbDriver, DbOdm, Framework, LoggerId, ScaffoldContext } from './types.js';
2
+ export type ParsedCreateArgs = {
3
+ projectName?: string;
4
+ framework?: Framework;
5
+ db?: DbOdm;
6
+ driver?: DbDriver;
7
+ logger?: LoggerId;
8
+ yes: boolean;
9
+ noInstall: boolean;
10
+ json: boolean;
11
+ };
12
+ export declare function parseDbFlag(value: string): {
13
+ db: DbOdm;
14
+ driver: DbDriver;
15
+ };
16
+ export declare function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext;
17
+ export declare function parseFrameworkFlag(value: string): Framework;
18
+ export declare function parseLoggerFlag(value: string): LoggerId;
@@ -0,0 +1,56 @@
1
+ import { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, FRAMEWORKS, LOGGERS } from "./types.js";
2
+ //#region src/core/parse-options.ts
3
+ function isFramework(value) {
4
+ return FRAMEWORKS.includes(value);
5
+ }
6
+ function isDbOdm(value) {
7
+ return DB_ODMS.includes(value);
8
+ }
9
+ function isDbDriver(value) {
10
+ return DB_DRIVERS.includes(value);
11
+ }
12
+ function isLoggerId(value) {
13
+ return LOGGERS.includes(value);
14
+ }
15
+ function parseDbFlag(value) {
16
+ const [odm, driver] = value.split(":");
17
+ if (!odm || !isDbOdm(odm)) throw new Error(`Invalid --db value "${value}". Use drizzle, prisma, or kysely (optionally with :postgres, :sqlite, or :mysql).`);
18
+ if (driver === void 0 || driver === "") return {
19
+ db: odm,
20
+ driver: DEFAULT_DB_DRIVER
21
+ };
22
+ if (!isDbDriver(driver)) throw new Error(`Invalid database driver "${driver}". Use postgres, sqlite, or mysql.`);
23
+ return {
24
+ db: odm,
25
+ driver
26
+ };
27
+ }
28
+ function resolveScaffoldDefaults(args) {
29
+ const framework = args.framework ?? "node";
30
+ const db = args.db;
31
+ const logger = args.logger;
32
+ if (!args.projectName) throw new Error("Project name is required");
33
+ const result = {
34
+ projectName: args.projectName.trim(),
35
+ targetDir: "",
36
+ framework
37
+ };
38
+ if (db) {
39
+ result.db = db;
40
+ result.driver = args.driver ?? "sqlite";
41
+ }
42
+ if (logger) result.logger = logger;
43
+ return result;
44
+ }
45
+ function parseFrameworkFlag(value) {
46
+ if (!isFramework(value)) throw new Error(`Invalid --framework "${value}". Use node, express, hono, or fastify.`);
47
+ return value;
48
+ }
49
+ function parseLoggerFlag(value) {
50
+ if (!isLoggerId(value)) throw new Error(`Invalid --logger "${value}". Use pino or winston.`);
51
+ return value;
52
+ }
53
+ //#endregion
54
+ export { parseDbFlag, parseFrameworkFlag, parseLoggerFlag, resolveScaffoldDefaults };
55
+
56
+ //# sourceMappingURL=parse-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-options.js","names":[],"sources":["../../../src/core/parse-options.ts"],"sourcesContent":["import {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n FRAMEWORKS,\n LOGGERS,\n type DbDriver,\n type DbOdm,\n type Framework,\n type LoggerId,\n type ScaffoldContext,\n} from './types.js'\n\nexport type ParsedCreateArgs = {\n projectName?: string\n framework?: Framework\n db?: DbOdm\n driver?: DbDriver\n logger?: LoggerId\n yes: boolean\n noInstall: boolean\n json: boolean\n}\n\nfunction isFramework(value: string): value is Framework {\n return (FRAMEWORKS as readonly string[]).includes(value)\n}\n\nfunction isDbOdm(value: string): value is DbOdm {\n return (DB_ODMS as readonly string[]).includes(value)\n}\n\nfunction isDbDriver(value: string): value is DbDriver {\n return (DB_DRIVERS as readonly string[]).includes(value)\n}\n\nfunction isLoggerId(value: string): value is LoggerId {\n return (LOGGERS as readonly string[]).includes(value)\n}\n\nexport function parseDbFlag(value: string): { db: DbOdm, driver: DbDriver } {\n const [odm, driver] = value.split(':')\n if (!odm || !isDbOdm(odm)) {\n throw new Error(`Invalid --db value \"${value}\". Use drizzle, prisma, or kysely (optionally with :postgres, :sqlite, or :mysql).`)\n }\n\n if (driver === undefined || driver === '') {\n return { db: odm, driver: DEFAULT_DB_DRIVER }\n }\n\n if (!isDbDriver(driver)) {\n throw new Error(`Invalid database driver \"${driver}\". Use postgres, sqlite, or mysql.`)\n }\n\n return { db: odm, driver }\n}\n\nexport function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext {\n const framework = args.framework ?? 'node'\n const db = args.db\n const logger = args.logger\n\n if (!args.projectName) {\n throw new Error('Project name is required')\n }\n\n const result: ScaffoldContext = {\n projectName: args.projectName.trim(),\n targetDir: '',\n framework,\n }\n\n if (db) {\n result.db = db\n result.driver = args.driver ?? DEFAULT_DB_DRIVER\n }\n\n if (logger) {\n result.logger = logger\n }\n\n return result\n}\n\nexport function parseFrameworkFlag(value: string): Framework {\n if (!isFramework(value)) {\n throw new Error(`Invalid --framework \"${value}\". Use node, express, hono, or fastify.`)\n }\n return value\n}\n\nexport function parseLoggerFlag(value: string): LoggerId {\n if (!isLoggerId(value)) {\n throw new Error(`Invalid --logger \"${value}\". Use pino or winston.`)\n }\n return value\n}\n"],"mappings":";;AAwBA,SAAS,YAAY,OAAmC;CACtD,OAAQ,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,QAAQ,OAA+B;CAC9C,OAAQ,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAgB,YAAY,OAAgD;CAC1E,MAAM,CAAC,KAAK,UAAU,MAAM,MAAM,GAAG;CACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,GACtB,MAAM,IAAI,MAAM,uBAAuB,MAAM,mFAAmF;CAGlI,IAAI,WAAW,KAAA,KAAa,WAAW,IACrC,OAAO;EAAE,IAAI;EAAK,QAAQ;CAAkB;CAG9C,IAAI,CAAC,WAAW,MAAM,GACpB,MAAM,IAAI,MAAM,4BAA4B,OAAO,mCAAmC;CAGxF,OAAO;EAAE,IAAI;EAAK;CAAO;AAC3B;AAEA,SAAgB,wBAAwB,MAAyC;CAC/E,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,KAAK,KAAK;CAChB,MAAM,SAAS,KAAK;CAEpB,IAAI,CAAC,KAAK,aACR,MAAM,IAAI,MAAM,0BAA0B;CAG5C,MAAM,SAA0B;EAC9B,aAAa,KAAK,YAAY,KAAK;EACnC,WAAW;EACX;CACF;CAEA,IAAI,IAAI;EACN,OAAO,KAAK;EACZ,OAAO,SAAS,KAAK,UAAA;CACvB;CAEA,IAAI,QACF,OAAO,SAAS;CAGlB,OAAO;AACT;AAEA,SAAgB,mBAAmB,OAA0B;CAC3D,IAAI,CAAC,YAAY,KAAK,GACpB,MAAM,IAAI,MAAM,wBAAwB,MAAM,wCAAwC;CAExF,OAAO;AACT;AAEA,SAAgB,gBAAgB,OAAyB;CACvD,IAAI,CAAC,WAAW,KAAK,GACnB,MAAM,IAAI,MAAM,qBAAqB,MAAM,wBAAwB;CAErE,OAAO;AACT"}
@@ -0,0 +1,2 @@
1
+ import { ScaffoldContext } from './types.js';
2
+ export declare function writeProjectConfig(root: string, ctx: ScaffoldContext): Promise<void>;
@@ -0,0 +1,16 @@
1
+ import path from "node:path";
2
+ import { writeFile } from "node:fs/promises";
3
+ //#region src/core/project-config.ts
4
+ async function writeProjectConfig(root, ctx) {
5
+ const config = { framework: ctx.framework };
6
+ if (ctx.db) {
7
+ config.db = ctx.db;
8
+ if (ctx.driver) config.driver = ctx.driver;
9
+ }
10
+ if (ctx.logger) config.logger = ctx.logger;
11
+ await writeFile(path.join(root, ".taser.json"), `${JSON.stringify(config, null, 2)}\n`, "utf8");
12
+ }
13
+ //#endregion
14
+ export { writeProjectConfig };
15
+
16
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","names":[],"sources":["../../../src/core/project-config.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { ScaffoldContext } from './types.js'\n\nexport async function writeProjectConfig(root: string, ctx: ScaffoldContext): Promise<void> {\n const config: Record<string, string> = {\n framework: ctx.framework,\n }\n\n if (ctx.db) {\n config.db = ctx.db\n if (ctx.driver) {\n config.driver = ctx.driver\n }\n }\n\n if (ctx.logger) {\n config.logger = ctx.logger\n }\n\n await writeFile(\n path.join(root, '.taser.json'),\n `${JSON.stringify(config, null, 2)}\\n`,\n 'utf8',\n )\n}\n"],"mappings":";;;AAKA,eAAsB,mBAAmB,MAAc,KAAqC;CAC1F,MAAM,SAAiC,EACrC,WAAW,IAAI,UACjB;CAEA,IAAI,IAAI,IAAI;EACV,OAAO,KAAK,IAAI;EAChB,IAAI,IAAI,QACN,OAAO,SAAS,IAAI;CAExB;CAEA,IAAI,IAAI,QACN,OAAO,SAAS,IAAI;CAGtB,MAAM,UACJ,KAAK,KAAK,MAAM,aAAa,GAC7B,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,KACnC,MACF;AACF"}
@@ -0,0 +1,5 @@
1
+ import { PackageGroups, ScaffoldContext, Framework } from '../core/types.js';
2
+ export declare function resolvePackages(ctx: ScaffoldContext): PackageGroups;
3
+ export declare function getPackageGroups(framework: Framework): Omit<PackageGroups, 'scripts'> & {
4
+ scripts?: Record<string, string>;
5
+ };
@@ -0,0 +1,52 @@
1
+ import { resolveAddons } from "../addons/registry.js";
2
+ //#region src/core/resolve-packages.ts
3
+ function frameworkPackages(framework) {
4
+ const dependencies = ["@taserjs/router"];
5
+ const devDependencies = [
6
+ "@taserjs/router-cli",
7
+ "npm-run-all2",
8
+ "tsdown",
9
+ "tsx",
10
+ "typescript"
11
+ ];
12
+ const scripts = {};
13
+ switch (framework) {
14
+ case "express":
15
+ dependencies.push("@taserjs/adapter-express", "express");
16
+ devDependencies.push("@types/express");
17
+ break;
18
+ case "hono":
19
+ dependencies.push("@hono/node-server", "hono");
20
+ break;
21
+ case "fastify":
22
+ dependencies.push("@taserjs/adapter-fastify", "fastify");
23
+ break;
24
+ default: dependencies.push("@taserjs/adapter-node");
25
+ }
26
+ return {
27
+ dependencies,
28
+ devDependencies,
29
+ scripts
30
+ };
31
+ }
32
+ function resolvePackages(ctx) {
33
+ const base = frameworkPackages(ctx.framework);
34
+ const addons = resolveAddons(ctx);
35
+ const dependencies = [...base.dependencies];
36
+ const devDependencies = [...base.devDependencies];
37
+ const scripts = { ...base.scripts };
38
+ for (const addon of addons) {
39
+ dependencies.push(...addon.dependencies(ctx));
40
+ devDependencies.push(...addon.devDependencies(ctx));
41
+ if (addon.scripts) Object.assign(scripts, addon.scripts(ctx));
42
+ }
43
+ return {
44
+ dependencies: [...new Set(dependencies)],
45
+ devDependencies: [...new Set(devDependencies)],
46
+ scripts
47
+ };
48
+ }
49
+ //#endregion
50
+ export { resolvePackages };
51
+
52
+ //# sourceMappingURL=resolve-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-packages.js","names":[],"sources":["../../../src/core/resolve-packages.ts"],"sourcesContent":["import { resolveAddons } from '../addons/registry.js'\nimport type { PackageGroups, ScaffoldContext, Framework } from '../core/types.js'\n\nfunction frameworkPackages(framework: Framework): PackageGroups {\n const dependencies = ['@taserjs/router']\n const devDependencies = [\n '@taserjs/router-cli',\n 'npm-run-all2',\n 'tsdown',\n 'tsx',\n 'typescript',\n ]\n const scripts: Record<string, string> = {}\n\n switch (framework) {\n case 'express':\n dependencies.push('@taserjs/adapter-express', 'express')\n devDependencies.push('@types/express')\n break\n case 'hono':\n dependencies.push('@hono/node-server', 'hono')\n break\n case 'fastify':\n dependencies.push('@taserjs/adapter-fastify', 'fastify')\n break\n case 'node':\n default:\n dependencies.push('@taserjs/adapter-node')\n break\n }\n\n return { dependencies, devDependencies, scripts }\n}\n\nexport function resolvePackages(ctx: ScaffoldContext): PackageGroups {\n const base = frameworkPackages(ctx.framework)\n const addons = resolveAddons(ctx)\n\n const dependencies = [...base.dependencies]\n const devDependencies = [...base.devDependencies]\n const scripts = { ...base.scripts }\n\n for (const addon of addons) {\n dependencies.push(...addon.dependencies(ctx))\n devDependencies.push(...addon.devDependencies(ctx))\n if (addon.scripts) {\n Object.assign(scripts, addon.scripts(ctx))\n }\n }\n\n return {\n dependencies: [...new Set(dependencies)],\n devDependencies: [...new Set(devDependencies)],\n scripts,\n }\n}\n\n// Backward-compatible export for tests during migration\nexport function getPackageGroups(framework: Framework): Omit<PackageGroups, 'scripts'> & { scripts?: Record<string, string> } {\n const groups = frameworkPackages(framework)\n return groups\n}\n"],"mappings":";;AAGA,SAAS,kBAAkB,WAAqC;CAC9D,MAAM,eAAe,CAAC,iBAAiB;CACvC,MAAM,kBAAkB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,UAAkC,CAAC;CAEzC,QAAQ,WAAR;EACE,KAAK;GACH,aAAa,KAAK,4BAA4B,SAAS;GACvD,gBAAgB,KAAK,gBAAgB;GACrC;EACF,KAAK;GACH,aAAa,KAAK,qBAAqB,MAAM;GAC7C;EACF,KAAK;GACH,aAAa,KAAK,4BAA4B,SAAS;GACvD;EAEF,SACE,aAAa,KAAK,uBAAuB;CAE7C;CAEA,OAAO;EAAE;EAAc;EAAiB;CAAQ;AAClD;AAEA,SAAgB,gBAAgB,KAAqC;CACnE,MAAM,OAAO,kBAAkB,IAAI,SAAS;CAC5C,MAAM,SAAS,cAAc,GAAG;CAEhC,MAAM,eAAe,CAAC,GAAG,KAAK,YAAY;CAC1C,MAAM,kBAAkB,CAAC,GAAG,KAAK,eAAe;CAChD,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;CAElC,KAAK,MAAM,SAAS,QAAQ;EAC1B,aAAa,KAAK,GAAG,MAAM,aAAa,GAAG,CAAC;EAC5C,gBAAgB,KAAK,GAAG,MAAM,gBAAgB,GAAG,CAAC;EAClD,IAAI,MAAM,SACR,OAAO,OAAO,SAAS,MAAM,QAAQ,GAAG,CAAC;CAE7C;CAEA,OAAO;EACL,cAAc,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC;EACvC,iBAAiB,CAAC,GAAG,IAAI,IAAI,eAAe,CAAC;EAC7C;CACF;AACF"}
@@ -0,0 +1,2 @@
1
+ import { ScaffoldOptions, ScaffoldResult } from './types.js';
2
+ export declare function scaffoldProject(options: ScaffoldOptions): Promise<ScaffoldResult>;
@@ -0,0 +1,71 @@
1
+ import { collectBootBindings, resolveAddons } from "../addons/registry.js";
2
+ import { indexTemplate, taserTsTemplate } from "../frameworks/index.js";
3
+ import { installPackages, resolveUserAgent } from "./package-manager.js";
4
+ import { writeProjectConfig } from "./project-config.js";
5
+ import { resolvePackages } from "./resolve-packages.js";
6
+ import { contextTemplate, gitignoreTemplate, healthRouteTemplate, indexRouteTemplate, packageJsonTemplate, rootLayoutTemplate, starterManifestTemplate, tsconfigTemplate, tsdownConfigTemplate } from "../templates/base.js";
7
+ import path from "node:path";
8
+ import { mkdir, writeFile } from "node:fs/promises";
9
+ //#region src/core/scaffold-engine.ts
10
+ async function write(filePath, contents) {
11
+ await mkdir(path.dirname(filePath), { recursive: true });
12
+ await writeFile(filePath, contents, "utf8");
13
+ }
14
+ async function scaffoldProject(options) {
15
+ const root = options.targetDir;
16
+ const ctx = {
17
+ projectName: options.projectName,
18
+ targetDir: root,
19
+ framework: options.framework,
20
+ ...options.db ? {
21
+ db: options.db,
22
+ driver: options.driver
23
+ } : {},
24
+ ...options.logger ? { logger: options.logger } : {}
25
+ };
26
+ const addons = resolveAddons(ctx);
27
+ const packages = resolvePackages(ctx);
28
+ const bootBindings = collectBootBindings(ctx);
29
+ await write(path.join(root, "package.json"), packageJsonTemplate(options.projectName, packages.scripts));
30
+ await write(path.join(root, "tsconfig.json"), tsconfigTemplate());
31
+ await write(path.join(root, "tsdown.config.ts"), tsdownConfigTemplate());
32
+ await write(path.join(root, ".gitignore"), gitignoreTemplate());
33
+ await write(path.join(root, "src/context.ts"), contextTemplate(bootBindings));
34
+ await write(path.join(root, "src/taser.ts"), taserTsTemplate(options.framework));
35
+ await write(path.join(root, "src/index.ts"), indexTemplate(options.framework));
36
+ await write(path.join(root, "src/routes/$.ts"), rootLayoutTemplate());
37
+ await write(path.join(root, "src/routes/index.get.ts"), indexRouteTemplate());
38
+ await write(path.join(root, "src/routes/health.get.ts"), healthRouteTemplate(ctx));
39
+ await write(path.join(root, "src/routeManifest.gen.ts"), starterManifestTemplate());
40
+ for (const addon of addons) await addon.apply(ctx, (filePath, contents) => write(path.join(root, filePath), contents));
41
+ await writeProjectConfig(root, ctx);
42
+ if (options.skipInstall) return {
43
+ projectName: ctx.projectName,
44
+ targetDir: root,
45
+ framework: ctx.framework,
46
+ ...ctx.db ? {
47
+ db: ctx.db,
48
+ driver: ctx.driver
49
+ } : {},
50
+ ...ctx.logger ? { logger: ctx.logger } : {}
51
+ };
52
+ const agent = options.agent ?? resolveUserAgent();
53
+ await installPackages(agent, root, {
54
+ dependencies: packages.dependencies,
55
+ devDependencies: packages.devDependencies
56
+ });
57
+ return {
58
+ projectName: ctx.projectName,
59
+ targetDir: root,
60
+ framework: ctx.framework,
61
+ ...ctx.db ? {
62
+ db: ctx.db,
63
+ driver: ctx.driver
64
+ } : {},
65
+ ...ctx.logger ? { logger: ctx.logger } : {}
66
+ };
67
+ }
68
+ //#endregion
69
+ export { scaffoldProject };
70
+
71
+ //# sourceMappingURL=scaffold-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-engine.js","names":[],"sources":["../../../src/core/scaffold-engine.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { collectBootBindings, resolveAddons } from '../addons/registry.js'\nimport { indexTemplate, taserTsTemplate } from '../frameworks/index.js'\nimport { installPackages, resolveUserAgent } from './package-manager.js'\nimport { writeProjectConfig } from './project-config.js'\nimport { resolvePackages } from './resolve-packages.js'\nimport type { ScaffoldOptions, ScaffoldResult } from './types.js'\nimport {\n contextTemplate,\n gitignoreTemplate,\n healthRouteTemplate,\n indexRouteTemplate,\n packageJsonTemplate,\n rootLayoutTemplate,\n starterManifestTemplate,\n tsconfigTemplate,\n tsdownConfigTemplate,\n} from '../templates/base.js'\n\nasync function write(filePath: string, contents: string): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true })\n await writeFile(filePath, contents, 'utf8')\n}\n\nexport async function scaffoldProject(options: ScaffoldOptions): Promise<ScaffoldResult> {\n const root = options.targetDir\n const ctx = {\n projectName: options.projectName,\n targetDir: root,\n framework: options.framework,\n ...(options.db ? { db: options.db, driver: options.driver } : {}),\n ...(options.logger ? { logger: options.logger } : {}),\n }\n\n const addons = resolveAddons(ctx)\n const packages = resolvePackages(ctx)\n const bootBindings = collectBootBindings(ctx)\n\n await write(path.join(root, 'package.json'), packageJsonTemplate(options.projectName, packages.scripts))\n await write(path.join(root, 'tsconfig.json'), tsconfigTemplate())\n await write(path.join(root, 'tsdown.config.ts'), tsdownConfigTemplate())\n await write(path.join(root, '.gitignore'), gitignoreTemplate())\n await write(path.join(root, 'src/context.ts'), contextTemplate(bootBindings))\n await write(path.join(root, 'src/taser.ts'), taserTsTemplate(options.framework))\n await write(path.join(root, 'src/index.ts'), indexTemplate(options.framework))\n await write(path.join(root, 'src/routes/$.ts'), rootLayoutTemplate())\n await write(path.join(root, 'src/routes/index.get.ts'), indexRouteTemplate())\n await write(path.join(root, 'src/routes/health.get.ts'), healthRouteTemplate(ctx))\n await write(path.join(root, 'src/routeManifest.gen.ts'), starterManifestTemplate())\n\n for (const addon of addons) {\n await addon.apply(ctx, (filePath, contents) => write(path.join(root, filePath), contents))\n }\n\n await writeProjectConfig(root, ctx)\n\n if (options.skipInstall) {\n return {\n projectName: ctx.projectName,\n targetDir: root,\n framework: ctx.framework,\n ...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),\n ...(ctx.logger ? { logger: ctx.logger } : {}),\n }\n }\n\n const agent = options.agent ?? resolveUserAgent()\n await installPackages(agent, root, {\n dependencies: packages.dependencies,\n devDependencies: packages.devDependencies,\n })\n\n return {\n projectName: ctx.projectName,\n targetDir: root,\n framework: ctx.framework,\n ...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),\n ...(ctx.logger ? { logger: ctx.logger } : {}),\n }\n}\n"],"mappings":";;;;;;;;;AAqBA,eAAe,MAAM,UAAkB,UAAiC;CACtE,MAAM,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;CACvD,MAAM,UAAU,UAAU,UAAU,MAAM;AAC5C;AAEA,eAAsB,gBAAgB,SAAmD;CACvF,MAAM,OAAO,QAAQ;CACrB,MAAM,MAAM;EACV,aAAa,QAAQ;EACrB,WAAW;EACX,WAAW,QAAQ;EACnB,GAAI,QAAQ,KAAK;GAAE,IAAI,QAAQ;GAAI,QAAQ,QAAQ;EAAO,IAAI,CAAC;EAC/D,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;CACrD;CAEA,MAAM,SAAS,cAAc,GAAG;CAChC,MAAM,WAAW,gBAAgB,GAAG;CACpC,MAAM,eAAe,oBAAoB,GAAG;CAE5C,MAAM,MAAM,KAAK,KAAK,MAAM,cAAc,GAAG,oBAAoB,QAAQ,aAAa,SAAS,OAAO,CAAC;CACvG,MAAM,MAAM,KAAK,KAAK,MAAM,eAAe,GAAG,iBAAiB,CAAC;CAChE,MAAM,MAAM,KAAK,KAAK,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;CACvE,MAAM,MAAM,KAAK,KAAK,MAAM,YAAY,GAAG,kBAAkB,CAAC;CAC9D,MAAM,MAAM,KAAK,KAAK,MAAM,gBAAgB,GAAG,gBAAgB,YAAY,CAAC;CAC5E,MAAM,MAAM,KAAK,KAAK,MAAM,cAAc,GAAG,gBAAgB,QAAQ,SAAS,CAAC;CAC/E,MAAM,MAAM,KAAK,KAAK,MAAM,cAAc,GAAG,cAAc,QAAQ,SAAS,CAAC;CAC7E,MAAM,MAAM,KAAK,KAAK,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;CACpE,MAAM,MAAM,KAAK,KAAK,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;CAC5E,MAAM,MAAM,KAAK,KAAK,MAAM,0BAA0B,GAAG,oBAAoB,GAAG,CAAC;CACjF,MAAM,MAAM,KAAK,KAAK,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;CAElF,KAAK,MAAM,SAAS,QAClB,MAAM,MAAM,MAAM,MAAM,UAAU,aAAa,MAAM,KAAK,KAAK,MAAM,QAAQ,GAAG,QAAQ,CAAC;CAG3F,MAAM,mBAAmB,MAAM,GAAG;CAElC,IAAI,QAAQ,aACV,OAAO;EACL,aAAa,IAAI;EACjB,WAAW;EACX,WAAW,IAAI;EACf,GAAI,IAAI,KAAK;GAAE,IAAI,IAAI;GAAI,QAAQ,IAAI;EAAO,IAAI,CAAC;EACnD,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;CAC7C;CAGF,MAAM,QAAQ,QAAQ,SAAS,iBAAiB;CAChD,MAAM,gBAAgB,OAAO,MAAM;EACjC,cAAc,SAAS;EACvB,iBAAiB,SAAS;CAC5B,CAAC;CAED,OAAO;EACL,aAAa,IAAI;EACjB,WAAW;EACX,WAAW,IAAI;EACf,GAAI,IAAI,KAAK;GAAE,IAAI,IAAI;GAAI,QAAQ,IAAI;EAAO,IAAI,CAAC;EACnD,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;CAC7C;AACF"}
@@ -0,0 +1,37 @@
1
+ import { Agent } from 'package-manager-detector';
2
+ export type Framework = 'node' | 'express' | 'hono' | 'fastify';
3
+ export declare const FRAMEWORKS: readonly Framework[];
4
+ export type DbOdm = 'drizzle' | 'prisma' | 'kysely';
5
+ export declare const DB_ODMS: readonly DbOdm[];
6
+ export type DbDriver = 'postgres' | 'sqlite' | 'mysql';
7
+ export declare const DB_DRIVERS: readonly DbDriver[];
8
+ export declare const DEFAULT_DB_DRIVER: DbDriver;
9
+ export type LoggerId = 'pino' | 'winston';
10
+ export declare const LOGGERS: readonly LoggerId[];
11
+ export type PackageGroups = {
12
+ dependencies: string[];
13
+ devDependencies: string[];
14
+ scripts: Record<string, string>;
15
+ };
16
+ export type ScaffoldContext = {
17
+ projectName: string;
18
+ targetDir: string;
19
+ framework: Framework;
20
+ db?: DbOdm;
21
+ driver?: DbDriver;
22
+ logger?: LoggerId;
23
+ };
24
+ export type ScaffoldOptions = ScaffoldContext & {
25
+ skipInstall?: boolean;
26
+ agent?: Agent;
27
+ };
28
+ export type ScaffoldResult = ScaffoldContext;
29
+ export type CapabilitiesCatalog = {
30
+ frameworks: Framework[];
31
+ db: {
32
+ odms: DbOdm[];
33
+ drivers: DbDriver[];
34
+ defaultDriver: DbDriver;
35
+ };
36
+ loggers: LoggerId[];
37
+ };
@@ -0,0 +1,23 @@
1
+ //#region src/core/types.ts
2
+ var FRAMEWORKS = [
3
+ "node",
4
+ "express",
5
+ "hono",
6
+ "fastify"
7
+ ];
8
+ var DB_ODMS = [
9
+ "drizzle",
10
+ "prisma",
11
+ "kysely"
12
+ ];
13
+ var DB_DRIVERS = [
14
+ "postgres",
15
+ "sqlite",
16
+ "mysql"
17
+ ];
18
+ var DEFAULT_DB_DRIVER = "sqlite";
19
+ var LOGGERS = ["pino", "winston"];
20
+ //#endregion
21
+ export { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, FRAMEWORKS, LOGGERS };
22
+
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/core/types.ts"],"sourcesContent":["import type { Agent } from 'package-manager-detector'\n\nexport type Framework = 'node' | 'express' | 'hono' | 'fastify'\n\nexport const FRAMEWORKS: readonly Framework[] = ['node', 'express', 'hono', 'fastify']\n\nexport type DbOdm = 'drizzle' | 'prisma' | 'kysely'\n\nexport const DB_ODMS: readonly DbOdm[] = ['drizzle', 'prisma', 'kysely']\n\nexport type DbDriver = 'postgres' | 'sqlite' | 'mysql'\n\nexport const DB_DRIVERS: readonly DbDriver[] = ['postgres', 'sqlite', 'mysql']\n\nexport const DEFAULT_DB_DRIVER: DbDriver = 'sqlite'\n\nexport type LoggerId = 'pino' | 'winston'\n\nexport const LOGGERS: readonly LoggerId[] = ['pino', 'winston']\n\nexport type PackageGroups = {\n dependencies: string[]\n devDependencies: string[]\n scripts: Record<string, string>\n}\n\nexport type ScaffoldContext = {\n projectName: string\n targetDir: string\n framework: Framework\n db?: DbOdm\n driver?: DbDriver\n logger?: LoggerId\n}\n\nexport type ScaffoldOptions = ScaffoldContext & {\n skipInstall?: boolean\n agent?: Agent\n}\n\nexport type ScaffoldResult = ScaffoldContext\n\nexport type CapabilitiesCatalog = {\n frameworks: Framework[]\n db: {\n odms: DbOdm[]\n drivers: DbDriver[]\n defaultDriver: DbDriver\n }\n loggers: LoggerId[]\n}\n"],"mappings":";AAIA,IAAa,aAAmC;CAAC;CAAQ;CAAW;CAAQ;AAAS;AAIrF,IAAa,UAA4B;CAAC;CAAW;CAAU;AAAQ;AAIvE,IAAa,aAAkC;CAAC;CAAY;CAAU;AAAO;AAE7E,IAAa,oBAA8B;AAI3C,IAAa,UAA+B,CAAC,QAAQ,SAAS"}
@@ -0,0 +1 @@
1
+ export declare function validateProjectName(name: string, cwd?: string): string | undefined;
@@ -0,0 +1,43 @@
1
+ import path from "node:path";
2
+ //#region src/core/validate-project-name.ts
3
+ var RESERVED_WINDOWS_NAMES = /* @__PURE__ */ new Set([
4
+ "CON",
5
+ "PRN",
6
+ "AUX",
7
+ "NVR",
8
+ "NULL",
9
+ "COM1",
10
+ "COM2",
11
+ "COM3",
12
+ "COM4",
13
+ "COM5",
14
+ "COM6",
15
+ "COM7",
16
+ "COM8",
17
+ "COM9",
18
+ "LPT1",
19
+ "LPT2",
20
+ "LPT3",
21
+ "LPT4",
22
+ "LPT5",
23
+ "LPT6",
24
+ "LPT7",
25
+ "LPT8",
26
+ "LPT9"
27
+ ]);
28
+ function validateProjectName(name, cwd = process.cwd()) {
29
+ const trimmed = name.trim();
30
+ if (!trimmed) return "Project name is required";
31
+ if (trimmed.includes("..")) return "Project name cannot contain \"..\"";
32
+ if (trimmed.includes("/") || trimmed.includes("\\")) return "Project name cannot contain path separators";
33
+ if (trimmed.startsWith(".") || trimmed.endsWith(".")) return "Project name cannot start or end with a dot";
34
+ const baseName = trimmed.split(".")[0]?.toUpperCase();
35
+ if (baseName && RESERVED_WINDOWS_NAMES.has(baseName)) return `Project name "${trimmed}" is reserved on Windows`;
36
+ const targetDir = path.resolve(cwd, trimmed);
37
+ const relative = path.relative(cwd, targetDir);
38
+ if (relative.startsWith("..") || path.isAbsolute(relative)) return "Project name resolves outside the current directory";
39
+ }
40
+ //#endregion
41
+ export { validateProjectName };
42
+
43
+ //# sourceMappingURL=validate-project-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-project-name.js","names":[],"sources":["../../../src/core/validate-project-name.ts"],"sourcesContent":["import path from 'node:path'\n\nconst RESERVED_WINDOWS_NAMES = new Set([\n 'CON',\n 'PRN',\n 'AUX',\n 'NVR',\n 'NULL',\n 'COM1',\n 'COM2',\n 'COM3',\n 'COM4',\n 'COM5',\n 'COM6',\n 'COM7',\n 'COM8',\n 'COM9',\n 'LPT1',\n 'LPT2',\n 'LPT3',\n 'LPT4',\n 'LPT5',\n 'LPT6',\n 'LPT7',\n 'LPT8',\n 'LPT9',\n])\n\nexport function validateProjectName(name: string, cwd = process.cwd()): string | undefined {\n const trimmed = name.trim()\n if (!trimmed) {\n return 'Project name is required'\n }\n\n if (trimmed.includes('..')) {\n return 'Project name cannot contain \"..\"'\n }\n\n if (trimmed.includes('/') || trimmed.includes('\\\\')) {\n return 'Project name cannot contain path separators'\n }\n\n if (trimmed.startsWith('.') || trimmed.endsWith('.')) {\n return 'Project name cannot start or end with a dot'\n }\n\n const baseName = trimmed.split('.')[0]?.toUpperCase()\n if (baseName && RESERVED_WINDOWS_NAMES.has(baseName)) {\n return `Project name \"${trimmed}\" is reserved on Windows`\n }\n\n const targetDir = path.resolve(cwd, trimmed)\n const relative = path.relative(cwd, targetDir)\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n return 'Project name resolves outside the current directory'\n }\n\n return undefined\n}\n"],"mappings":";;AAEA,IAAM,yCAAyB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,oBAAoB,MAAc,MAAM,QAAQ,IAAI,GAAuB;CACzF,MAAM,UAAU,KAAK,KAAK;CAC1B,IAAI,CAAC,SACH,OAAO;CAGT,IAAI,QAAQ,SAAS,IAAI,GACvB,OAAO;CAGT,IAAI,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,IAAI,GAChD,OAAO;CAGT,IAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GACjD,OAAO;CAGT,MAAM,WAAW,QAAQ,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,YAAY;CACpD,IAAI,YAAY,uBAAuB,IAAI,QAAQ,GACjD,OAAO,iBAAiB,QAAQ;CAGlC,MAAM,YAAY,KAAK,QAAQ,KAAK,OAAO;CAC3C,MAAM,WAAW,KAAK,SAAS,KAAK,SAAS;CAC7C,IAAI,SAAS,WAAW,IAAI,KAAK,KAAK,WAAW,QAAQ,GACvD,OAAO;AAIX"}
@@ -0,0 +1,3 @@
1
+ import { Framework } from '../core/types.js';
2
+ export declare function indexTemplate(framework: Framework): string;
3
+ export declare function taserTsTemplate(framework?: Framework): string;
@@ -0,0 +1,105 @@
1
+ //#region src/frameworks/index.ts
2
+ function indexTemplate(framework) {
3
+ switch (framework) {
4
+ case "express": return `import express from 'express'
5
+ import { createExpressHandler } from '@taserjs/adapter-express'
6
+
7
+ import { routeManifest } from '#src/routeManifest.gen.js'
8
+ import { t } from '#src/taser.js'
9
+
10
+ const router = t.create(routeManifest)
11
+
12
+ const taser = createExpressHandler(router)
13
+ const app = express()
14
+ taser.mount('/api{/*splat}', app)
15
+
16
+ const port = Number(process.env.PORT ?? 3000)
17
+ app.listen(port, () => {
18
+ console.log(\`Express listening on http://localhost:\${port}\`)
19
+ })
20
+ `;
21
+ case "hono": return `import { serve } from '@hono/node-server'
22
+ import { Hono } from 'hono'
23
+
24
+ import { routeManifest } from '#src/routeManifest.gen.js'
25
+ import { t } from '#src/taser.js'
26
+
27
+ const router = t.create(routeManifest)
28
+
29
+ const app = new Hono()
30
+ const api = router.base('/api')
31
+ app.all('/api/*', c => api.native(c).fetch(c.req.raw))
32
+
33
+ const port = Number(process.env.PORT ?? 3000)
34
+ serve({ fetch: app.fetch, port }, () => {
35
+ console.log(\`Hono listening on http://localhost:\${port}\`)
36
+ })
37
+ `;
38
+ case "fastify": return `import Fastify from 'fastify'
39
+ import { createFastifyHandler } from '@taserjs/adapter-fastify'
40
+
41
+ import { routeManifest } from '#src/routeManifest.gen.js'
42
+ import { t } from '#src/taser.js'
43
+
44
+ const router = t.create(routeManifest)
45
+
46
+ const taser = createFastifyHandler(router)
47
+ const app = Fastify()
48
+ taser.mount('/api/*', app)
49
+
50
+ const port = Number(process.env.PORT ?? 3000)
51
+ await app.listen({ port })
52
+ console.log(\`Fastify listening on http://localhost:\${port}\`)
53
+ `;
54
+ default: return `import { createServer } from 'node:http'
55
+ import { createNodeHandler } from '@taserjs/adapter-node'
56
+
57
+ import { routeManifest } from '#src/routeManifest.gen.js'
58
+ import { t } from '#src/taser.js'
59
+
60
+ const router = t.create(routeManifest)
61
+
62
+ const taser = createNodeHandler(router)
63
+ const app = createServer()
64
+ taser.mount('/api/*', app)
65
+
66
+ const port = Number(process.env.PORT ?? 3000)
67
+ app.listen(port, () => {
68
+ console.log(\`Node listening on http://localhost:\${port}\`)
69
+ })
70
+ `;
71
+ }
72
+ }
73
+ function taserTsTemplate(framework = "node") {
74
+ if (framework === "hono") return `import type { Context } from 'hono'
75
+ import { createTaserApp, type InferAppContext } from '@taserjs/router'
76
+
77
+ import { context } from '#src/context.js'
78
+
79
+ declare module '@taserjs/router' {
80
+ interface RouterRegister {
81
+ NativeContext: Context
82
+ }
83
+ }
84
+
85
+ export const t = createTaserApp({
86
+ response: { validate: true },
87
+ }).context(context)
88
+
89
+ export type AppContext = InferAppContext<typeof context>
90
+ `;
91
+ return `import { createTaserApp, type InferAppContext } from '@taserjs/router'
92
+
93
+ import { context } from '#src/context.js'
94
+
95
+ export const t = createTaserApp({
96
+ response: { validate: true },
97
+ }).context(context)
98
+
99
+ export type AppContext = InferAppContext<typeof context>
100
+ `;
101
+ }
102
+ //#endregion
103
+ export { indexTemplate, taserTsTemplate };
104
+
105
+ //# sourceMappingURL=index.js.map