create-taserjs 0.0.1 → 0.0.3

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 (123) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/addons/arktype/index.cjs +6 -0
  3. package/dist/cjs/addons/arktype/index.cjs.map +1 -0
  4. package/dist/cjs/addons/drizzle/index.cjs +9 -2
  5. package/dist/cjs/addons/drizzle/index.cjs.map +1 -1
  6. package/dist/cjs/addons/kysely/index.cjs +9 -2
  7. package/dist/cjs/addons/kysely/index.cjs.map +1 -1
  8. package/dist/cjs/addons/pino/index.cjs.map +1 -1
  9. package/dist/cjs/addons/prisma/index.cjs +84 -24
  10. package/dist/cjs/addons/prisma/index.cjs.map +1 -1
  11. package/dist/cjs/addons/registry.cjs +17 -13
  12. package/dist/cjs/addons/registry.cjs.map +1 -1
  13. package/dist/cjs/addons/types.d.cts +1 -1
  14. package/dist/cjs/addons/valibot/index.cjs +6 -0
  15. package/dist/cjs/addons/valibot/index.cjs.map +1 -0
  16. package/dist/cjs/addons/validators.cjs +2 -2
  17. package/dist/cjs/addons/validators.cjs.map +1 -1
  18. package/dist/cjs/addons/winston/index.cjs.map +1 -1
  19. package/dist/cjs/addons/zod/index.cjs.map +1 -1
  20. package/dist/cjs/cli.cjs +7 -0
  21. package/dist/cjs/cli.cjs.map +1 -1
  22. package/dist/cjs/commands/create.cjs +45 -11
  23. package/dist/cjs/commands/create.cjs.map +1 -1
  24. package/dist/cjs/commands/create.d.cts +2 -0
  25. package/dist/cjs/core/json-output.cjs.map +1 -1
  26. package/dist/cjs/core/package-manager.cjs +5 -13
  27. package/dist/cjs/core/package-manager.cjs.map +1 -1
  28. package/dist/cjs/core/package-manager.d.cts +3 -2
  29. package/dist/cjs/core/parse-options.cjs +17 -7
  30. package/dist/cjs/core/parse-options.cjs.map +1 -1
  31. package/dist/cjs/core/parse-options.d.cts +4 -3
  32. package/dist/cjs/core/project-config.cjs +2 -1
  33. package/dist/cjs/core/project-config.cjs.map +1 -1
  34. package/dist/cjs/core/resolve-packages.cjs +41 -7
  35. package/dist/cjs/core/resolve-packages.cjs.map +1 -1
  36. package/dist/cjs/core/resolve-packages.d.cts +2 -2
  37. package/dist/cjs/core/scaffold-engine.cjs +37 -8
  38. package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
  39. package/dist/cjs/core/types.cjs +11 -3
  40. package/dist/cjs/core/types.cjs.map +1 -1
  41. package/dist/cjs/core/types.d.cts +8 -8
  42. package/dist/cjs/core/validate-project-name.cjs.map +1 -1
  43. package/dist/cjs/frameworks/index.cjs +138 -17
  44. package/dist/cjs/frameworks/index.cjs.map +1 -1
  45. package/dist/cjs/frameworks/index.d.cts +3 -3
  46. package/dist/cjs/scaffold.d.cts +1 -1
  47. package/dist/cjs/templates/base.cjs +15 -12
  48. package/dist/cjs/templates/base.cjs.map +1 -1
  49. package/dist/cjs/types.d.cts +1 -1
  50. package/dist/esm/addons/arktype/index.js +7 -0
  51. package/dist/esm/addons/arktype/index.js.map +1 -0
  52. package/dist/esm/addons/drizzle/index.js +9 -2
  53. package/dist/esm/addons/drizzle/index.js.map +1 -1
  54. package/dist/esm/addons/kysely/index.js +9 -2
  55. package/dist/esm/addons/kysely/index.js.map +1 -1
  56. package/dist/esm/addons/pino/index.js.map +1 -1
  57. package/dist/esm/addons/prisma/index.js +84 -24
  58. package/dist/esm/addons/prisma/index.js.map +1 -1
  59. package/dist/esm/addons/registry.js +8 -4
  60. package/dist/esm/addons/registry.js.map +1 -1
  61. package/dist/esm/addons/types.d.ts +1 -1
  62. package/dist/esm/addons/valibot/index.js +7 -0
  63. package/dist/esm/addons/valibot/index.js.map +1 -0
  64. package/dist/esm/addons/validators.js +2 -2
  65. package/dist/esm/addons/validators.js.map +1 -1
  66. package/dist/esm/addons/winston/index.js.map +1 -1
  67. package/dist/esm/addons/zod/index.js.map +1 -1
  68. package/dist/esm/cli.js +7 -0
  69. package/dist/esm/cli.js.map +1 -1
  70. package/dist/esm/commands/create.d.ts +2 -0
  71. package/dist/esm/commands/create.js +47 -13
  72. package/dist/esm/commands/create.js.map +1 -1
  73. package/dist/esm/core/json-output.js.map +1 -1
  74. package/dist/esm/core/package-manager.d.ts +3 -2
  75. package/dist/esm/core/package-manager.js +5 -14
  76. package/dist/esm/core/package-manager.js.map +1 -1
  77. package/dist/esm/core/parse-options.d.ts +4 -3
  78. package/dist/esm/core/parse-options.js +17 -8
  79. package/dist/esm/core/parse-options.js.map +1 -1
  80. package/dist/esm/core/project-config.js +2 -1
  81. package/dist/esm/core/project-config.js.map +1 -1
  82. package/dist/esm/core/resolve-packages.d.ts +2 -2
  83. package/dist/esm/core/resolve-packages.js +41 -7
  84. package/dist/esm/core/resolve-packages.js.map +1 -1
  85. package/dist/esm/core/scaffold-engine.js +38 -9
  86. package/dist/esm/core/scaffold-engine.js.map +1 -1
  87. package/dist/esm/core/types.d.ts +8 -8
  88. package/dist/esm/core/types.js +11 -3
  89. package/dist/esm/core/types.js.map +1 -1
  90. package/dist/esm/core/validate-project-name.js.map +1 -1
  91. package/dist/esm/frameworks/index.d.ts +3 -3
  92. package/dist/esm/frameworks/index.js +138 -17
  93. package/dist/esm/frameworks/index.js.map +1 -1
  94. package/dist/esm/scaffold.d.ts +1 -1
  95. package/dist/esm/templates/base.js +15 -12
  96. package/dist/esm/templates/base.js.map +1 -1
  97. package/dist/esm/types.d.ts +1 -1
  98. package/package.json +13 -13
  99. package/src/addons/arktype/index.ts +2 -2
  100. package/src/addons/drizzle/index.ts +60 -47
  101. package/src/addons/kysely/index.ts +49 -36
  102. package/src/addons/pino/index.ts +12 -12
  103. package/src/addons/prisma/index.ts +128 -55
  104. package/src/addons/registry.ts +39 -35
  105. package/src/addons/types.ts +14 -14
  106. package/src/addons/valibot/index.ts +2 -2
  107. package/src/addons/validators.ts +11 -11
  108. package/src/addons/winston/index.ts +12 -12
  109. package/src/addons/zod/index.ts +2 -2
  110. package/src/cli.ts +28 -25
  111. package/src/commands/create.ts +185 -150
  112. package/src/core/json-output.ts +4 -4
  113. package/src/core/package-manager.ts +39 -35
  114. package/src/core/parse-options.ts +62 -43
  115. package/src/core/project-config.ts +13 -13
  116. package/src/core/resolve-packages.ts +79 -41
  117. package/src/core/scaffold-engine.ts +108 -36
  118. package/src/core/types.ts +61 -36
  119. package/src/core/validate-project-name.ts +40 -40
  120. package/src/frameworks/index.ts +164 -29
  121. package/src/scaffold.ts +3 -3
  122. package/src/templates/base.ts +65 -56
  123. package/src/types.ts +5 -4
@@ -7,14 +7,14 @@ function packageJsonTemplate(projectName, scripts = {}) {
7
7
  type: "module",
8
8
  imports: { "#src/*": "./src/*" },
9
9
  scripts: {
10
- "dev": "run-p dev:server dev:taser",
10
+ dev: "run-p dev:server dev:taser",
11
11
  "dev:server": "tsx watch src/index.ts",
12
12
  "dev:taser": "taser watch",
13
- "start": "tsx src/index.ts",
14
- "generate": "taser generate",
15
- "build": "taser generate && tsdown",
16
- "serve": "node dist/index.mjs",
17
- "typecheck": "tsc --noEmit -p tsconfig.json",
13
+ start: "tsx src/index.ts",
14
+ generate: "taser generate",
15
+ build: "taser generate && tsdown",
16
+ serve: "node dist/index.mjs",
17
+ typecheck: "tsc --noEmit -p tsconfig.json",
18
18
  ...scripts
19
19
  }
20
20
  };
@@ -84,10 +84,11 @@ export const Middleware = t.middleware('/$')
84
84
  `;
85
85
  }
86
86
  function indexRouteTemplate() {
87
- return `import { t } from '#src/taser.js'
87
+ return `import { reply } from '@taserjs/router'
88
+ import { t } from '#src/taser.js'
88
89
 
89
- export const Route = t.get('/').handler((ctx) => {
90
- return ctx.reply.json({ message: 'Welcome to Taser' })
90
+ export const Route = t.get('/').handler(() => {
91
+ return reply.json({ message: 'Welcome to Taser' })
91
92
  })
92
93
  `;
93
94
  }
@@ -95,10 +96,12 @@ function healthRouteTemplate(ctx) {
95
96
  const lines = [];
96
97
  if (ctx.logger) lines.push(" ctx.logger.info('health check')");
97
98
  if (ctx.db) lines.push(" // ctx.db is available from context boot");
98
- return `import { t } from '#src/taser.js'
99
+ const body = lines.length > 0 ? `${lines.join("\n")}\n` : "";
100
+ return `import { reply } from '@taserjs/router'
101
+ import { t } from '#src/taser.js'
99
102
 
100
- export const Route = t.get('/health').handler((ctx) => {
101
- ${lines.length > 0 ? `${lines.join("\n")}\n` : ""} return ctx.reply.json({ ok: true })
103
+ export const Route = t.get('/health').handler(${lines.length > 0 ? "(ctx)" : "()"} => {
104
+ ${body} return reply.json({ ok: true })
102
105
  })
103
106
  `;
104
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","names":[],"sources":["../../../src/templates/base.ts"],"sourcesContent":["import type { BootBinding } from '../addons/types.js'\nimport type { ScaffoldContext } from '../core/types.js'\n\nexport function packageJsonTemplate(projectName: string, scripts: Record<string, string> = {}): string {\n const pkg = {\n name: projectName,\n version: '1.0.0',\n private: true,\n type: 'module',\n imports: {\n '#src/*': './src/*',\n },\n scripts: {\n 'dev': 'run-p dev:server dev:taser',\n 'dev:server': 'tsx watch src/index.ts',\n 'dev:taser': 'taser watch',\n 'start': 'tsx src/index.ts',\n 'generate': 'taser generate',\n 'build': 'taser generate && tsdown',\n 'serve': 'node dist/index.mjs',\n 'typecheck': 'tsc --noEmit -p tsconfig.json',\n ...scripts,\n },\n }\n\n return `${JSON.stringify(pkg, null, 2)}\\n`\n}\n\nexport function tsdownConfigTemplate(): string {\n return `import { defineConfig } from 'tsdown'\n\nexport default defineConfig({\n entry: ['./src/index.ts'],\n platform: 'node',\n outDir: 'dist',\n clean: true,\n sourcemap: true,\n})\n`\n}\n\nexport function tsconfigTemplate(): string {\n return `${JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n paths: {\n '#src/*': ['./src/*'],\n },\n strict: true,\n skipLibCheck: true,\n verbatimModuleSyntax: true,\n isolatedModules: true,\n noEmit: true,\n types: ['node'],\n },\n include: ['src'],\n }, null, 2)}\\n`\n}\n\nexport function gitignoreTemplate(): string {\n return `node_modules\ndist\n.DS_Store\n*.log\n.env\nlocal.db\ndrizzle\n`\n}\n\nexport function contextTemplate(bindings: BootBinding[]): string {\n const imports = bindings.map(\n binding => `import { ${binding.factoryName} } from '${binding.importPath}'`,\n )\n\n const bootBody = bindings.length > 0\n ? bindings.map(binding => ` ${binding.key}: ${binding.factoryName}(),`).join('\\n')\n : ''\n\n const bootBlock = bindings.length > 0\n ? ` boot: () => ({\\n${bootBody}\\n }),`\n : ''\n\n const importBlock = imports.length > 0 ? `${imports.join('\\n')}\\n\\n` : ''\n\n return `${importBlock}import { createContext } from '@taserjs/router'\n\nexport const context = createContext({\n${bootBlock}\n request: () => ({\n requestId: crypto.randomUUID(),\n }),\n})\n`\n}\n\nexport function rootLayoutTemplate(): string {\n return `import { bodyLimit } from '@taserjs/router/body-limit'\nimport { secureHeaders } from '@taserjs/router/secure-headers'\n\nimport { t } from '#src/taser.js'\n\nexport const Middleware = t.middleware('/$')\n .use(secureHeaders())\n .use(bodyLimit({ maxSize: 1_000_000 }))\n`\n}\n\nexport function indexRouteTemplate(): string {\n return `import { t } from '#src/taser.js'\n\nexport const Route = t.get('/').handler((ctx) => {\n return ctx.reply.json({ message: 'Welcome to Taser' })\n})\n`\n}\n\nexport function healthRouteTemplate(ctx: ScaffoldContext): string {\n const lines: string[] = []\n\n if (ctx.logger) {\n lines.push(' ctx.logger.info(\\'health check\\')')\n }\n\n if (ctx.db) {\n lines.push(' // ctx.db is available from context boot')\n }\n\n const body = lines.length > 0 ? `${lines.join('\\n')}\\n` : ''\n\n return `import { t } from '#src/taser.js'\n\nexport const Route = t.get('/health').handler((ctx) => {\n${body} return ctx.reply.json({ ok: true })\n})\n`\n}\n\n/** Minimal placeholder until `taser generate` runs. */\nexport function starterManifestTemplate(): string {\n return `/* eslint-disable */\n// Run \\`pnpm generate\\` (taser generate) to replace this file.\nimport { Middleware as RootSplatLayoutImport } from './routes/$.js'\nimport { Route as RootIndexGetRouteImport } from './routes/index.get.js'\nimport { Route as HealthGetRouteImport } from './routes/health.get.js'\n\nexport const routeManifest = {\n layouts: {\n '/$': {\n middlewares: RootSplatLayoutImport,\n },\n },\n routes: {\n '/': {\n GET: {\n layoutChain: ['/$'],\n route: RootIndexGetRouteImport,\n },\n },\n '/health': {\n GET: {\n layoutChain: ['/$'],\n route: HealthGetRouteImport,\n },\n },\n },\n} as const\n\nexport type RoutePathGen = '/' | '/health'\nexport type LayoutIdGen = '/$'\nexport type LayoutTreeGen = {\n '/$': {\n parent: null\n middlewares: typeof RootSplatLayoutImport\n }\n}\nexport type RouteByPathMethodGen = {\n '/': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof RootIndexGetRouteImport\n }\n }\n '/health': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof HealthGetRouteImport\n }\n }\n}\nexport type RouteManifest = typeof routeManifest\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n RoutePath: RoutePathGen\n LayoutId: LayoutIdGen\n LayoutTree: LayoutTreeGen\n RouteByPathMethod: RouteByPathMethodGen\n }\n}\n`\n}\n"],"mappings":";AAGA,SAAgB,oBAAoB,aAAqB,UAAkC,CAAC,GAAW;CACrG,MAAM,MAAM;EACV,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM;EACN,SAAS,EACP,UAAU,UACZ;EACA,SAAS;GACP,OAAO;GACP,cAAc;GACd,aAAa;GACb,SAAS;GACT,YAAY;GACZ,SAAS;GACT,SAAS;GACT,aAAa;GACb,GAAG;EACL;CACF;CAEA,OAAO,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE;AACzC;AAEA,SAAgB,uBAA+B;CAC7C,OAAO;;;;;;;;;;AAUT;AAEA,SAAgB,mBAA2B;CACzC,OAAO,GAAG,KAAK,UAAU;EACvB,iBAAiB;GACf,QAAQ;GACR,QAAQ;GACR,OAAO,EACL,UAAU,CAAC,SAAS,EACtB;GACA,QAAQ;GACR,cAAc;GACd,sBAAsB;GACtB,iBAAiB;GACjB,QAAQ;GACR,OAAO,CAAC,MAAM;EAChB;EACA,SAAS,CAAC,KAAK;CACjB,GAAG,MAAM,CAAC,EAAE;AACd;AAEA,SAAgB,oBAA4B;CAC1C,OAAO;;;;;;;;AAQT;AAEA,SAAgB,gBAAgB,UAAiC;CAC/D,MAAM,UAAU,SAAS,KACvB,YAAW,YAAY,QAAQ,YAAY,WAAW,QAAQ,WAAW,EAC3E;CAEA,MAAM,WAAW,SAAS,SAAS,IAC/B,SAAS,KAAI,YAAW,OAAO,QAAQ,IAAI,IAAI,QAAQ,YAAY,IAAI,CAAC,CAAC,KAAK,IAAI,IAClF;CAEJ,MAAM,YAAY,SAAS,SAAS,IAChC,qBAAqB,SAAS,WAC9B;CAIJ,OAAO,GAFa,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,IAAI,EAAE,QAAQ,GAEjD;;;EAGtB,UAAU;;;;;;AAMZ;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;;;AAST;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;AAMT;AAEA,SAAgB,oBAAoB,KAA8B;CAChE,MAAM,QAAkB,CAAC;CAEzB,IAAI,IAAI,QACN,MAAM,KAAK,mCAAqC;CAGlD,IAAI,IAAI,IACN,MAAM,KAAK,4CAA4C;CAKzD,OAAO;;;EAFM,MAAM,SAAS,IAAI,GAAG,MAAM,KAAK,IAAI,EAAE,MAAM,GAKrD;;;AAGP;;AAGA,SAAgB,0BAAkC;CAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DT"}
1
+ {"version":3,"file":"base.js","names":[],"sources":["../../../src/templates/base.ts"],"sourcesContent":["import type { BootBinding } from \"../addons/types.js\";\nimport type { ScaffoldContext } from \"../core/types.js\";\n\nexport function packageJsonTemplate(\n projectName: string,\n scripts: Record<string, string> = {},\n): string {\n const pkg = {\n name: projectName,\n version: \"1.0.0\",\n private: true,\n type: \"module\",\n imports: {\n \"#src/*\": \"./src/*\",\n },\n scripts: {\n dev: \"run-p dev:server dev:taser\",\n \"dev:server\": \"tsx watch src/index.ts\",\n \"dev:taser\": \"taser watch\",\n start: \"tsx src/index.ts\",\n generate: \"taser generate\",\n build: \"taser generate && tsdown\",\n serve: \"node dist/index.mjs\",\n typecheck: \"tsc --noEmit -p tsconfig.json\",\n ...scripts,\n },\n };\n\n return `${JSON.stringify(pkg, null, 2)}\\n`;\n}\n\nexport function tsdownConfigTemplate(): string {\n return `import { defineConfig } from 'tsdown'\n\nexport default defineConfig({\n entry: ['./src/index.ts'],\n platform: 'node',\n outDir: 'dist',\n clean: true,\n sourcemap: true,\n})\n`;\n}\n\nexport function tsconfigTemplate(): string {\n return `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"NodeNext\",\n paths: {\n \"#src/*\": [\"./src/*\"],\n },\n strict: true,\n skipLibCheck: true,\n verbatimModuleSyntax: true,\n isolatedModules: true,\n noEmit: true,\n types: [\"node\"],\n },\n include: [\"src\"],\n },\n null,\n 2,\n )}\\n`;\n}\n\nexport function gitignoreTemplate(): string {\n return `node_modules\ndist\n.DS_Store\n*.log\n.env\nlocal.db\ndrizzle\n`;\n}\n\nexport function contextTemplate(bindings: BootBinding[]): string {\n const imports = bindings.map(\n (binding) => `import { ${binding.factoryName} } from '${binding.importPath}'`,\n );\n\n const bootBody =\n bindings.length > 0\n ? bindings.map((binding) => ` ${binding.key}: ${binding.factoryName}(),`).join(\"\\n\")\n : \"\";\n\n const bootBlock = bindings.length > 0 ? ` boot: () => ({\\n${bootBody}\\n }),` : \"\";\n\n const importBlock = imports.length > 0 ? `${imports.join(\"\\n\")}\\n\\n` : \"\";\n\n return `${importBlock}import { createContext } from '@taserjs/router'\n\nexport const context = createContext({\n${bootBlock}\n request: () => ({\n requestId: crypto.randomUUID(),\n }),\n})\n`;\n}\n\nexport function rootLayoutTemplate(): string {\n return `import { bodyLimit } from '@taserjs/router/body-limit'\nimport { secureHeaders } from '@taserjs/router/secure-headers'\n\nimport { t } from '#src/taser.js'\n\nexport const Middleware = t.middleware('/$')\n .use(secureHeaders())\n .use(bodyLimit({ maxSize: 1_000_000 }))\n`;\n}\n\nexport function indexRouteTemplate(): string {\n return `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n\nexport const Route = t.get('/').handler(() => {\n return reply.json({ message: 'Welcome to Taser' })\n})\n`;\n}\n\nexport function healthRouteTemplate(ctx: ScaffoldContext): string {\n const lines: string[] = [];\n\n if (ctx.logger) {\n lines.push(\" ctx.logger.info('health check')\");\n }\n\n if (ctx.db) {\n lines.push(\" // ctx.db is available from context boot\");\n }\n\n const body = lines.length > 0 ? `${lines.join(\"\\n\")}\\n` : \"\";\n const ctxArg = lines.length > 0 ? \"(ctx)\" : \"()\";\n\n return `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n\nexport const Route = t.get('/health').handler(${ctxArg} => {\n${body} return reply.json({ ok: true })\n})\n`;\n}\n\n/** Minimal placeholder until `taser generate` runs. */\nexport function starterManifestTemplate(): string {\n return `/* eslint-disable */\n// Run \\`pnpm generate\\` (taser generate) to replace this file.\nimport { Middleware as RootSplatLayoutImport } from './routes/$.js'\nimport { Route as RootIndexGetRouteImport } from './routes/index.get.js'\nimport { Route as HealthGetRouteImport } from './routes/health.get.js'\n\nexport const routeManifest = {\n layouts: {\n '/$': {\n middlewares: RootSplatLayoutImport,\n },\n },\n routes: {\n '/': {\n GET: {\n layoutChain: ['/$'],\n route: RootIndexGetRouteImport,\n },\n },\n '/health': {\n GET: {\n layoutChain: ['/$'],\n route: HealthGetRouteImport,\n },\n },\n },\n} as const\n\nexport type RoutePathGen = '/' | '/health'\nexport type LayoutIdGen = '/$'\nexport type LayoutTreeGen = {\n '/$': {\n parent: null\n middlewares: typeof RootSplatLayoutImport\n }\n}\nexport type RouteByPathMethodGen = {\n '/': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof RootIndexGetRouteImport\n }\n }\n '/health': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof HealthGetRouteImport\n }\n }\n}\nexport type RouteManifest = typeof routeManifest\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n RoutePath: RoutePathGen\n LayoutId: LayoutIdGen\n LayoutTree: LayoutTreeGen\n RouteByPathMethod: RouteByPathMethodGen\n }\n}\n`;\n}\n"],"mappings":";AAGA,SAAgB,oBACd,aACA,UAAkC,CAAC,GAC3B;CACR,MAAM,MAAM;EACV,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM;EACN,SAAS,EACP,UAAU,UACZ;EACA,SAAS;GACP,KAAK;GACL,cAAc;GACd,aAAa;GACb,OAAO;GACP,UAAU;GACV,OAAO;GACP,OAAO;GACP,WAAW;GACX,GAAG;EACL;CACF;CAEA,OAAO,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE;AACzC;AAEA,SAAgB,uBAA+B;CAC7C,OAAO;;;;;;;;;;AAUT;AAEA,SAAgB,mBAA2B;CACzC,OAAO,GAAG,KAAK,UACb;EACE,iBAAiB;GACf,QAAQ;GACR,QAAQ;GACR,OAAO,EACL,UAAU,CAAC,SAAS,EACtB;GACA,QAAQ;GACR,cAAc;GACd,sBAAsB;GACtB,iBAAiB;GACjB,QAAQ;GACR,OAAO,CAAC,MAAM;EAChB;EACA,SAAS,CAAC,KAAK;CACjB,GACA,MACA,CACF,EAAE;AACJ;AAEA,SAAgB,oBAA4B;CAC1C,OAAO;;;;;;;;AAQT;AAEA,SAAgB,gBAAgB,UAAiC;CAC/D,MAAM,UAAU,SAAS,KACtB,YAAY,YAAY,QAAQ,YAAY,WAAW,QAAQ,WAAW,EAC7E;CAEA,MAAM,WACJ,SAAS,SAAS,IACd,SAAS,KAAK,YAAY,OAAO,QAAQ,IAAI,IAAI,QAAQ,YAAY,IAAI,CAAC,CAAC,KAAK,IAAI,IACpF;CAEN,MAAM,YAAY,SAAS,SAAS,IAAI,qBAAqB,SAAS,WAAW;CAIjF,OAAO,GAFa,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,IAAI,EAAE,QAAQ,GAEjD;;;EAGtB,UAAU;;;;;;AAMZ;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;;;AAST;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;AAOT;AAEA,SAAgB,oBAAoB,KAA8B;CAChE,MAAM,QAAkB,CAAC;CAEzB,IAAI,IAAI,QACN,MAAM,KAAK,mCAAmC;CAGhD,IAAI,IAAI,IACN,MAAM,KAAK,4CAA4C;CAGzD,MAAM,OAAO,MAAM,SAAS,IAAI,GAAG,MAAM,KAAK,IAAI,EAAE,MAAM;CAG1D,OAAO;;;gDAFQ,MAAM,SAAS,IAAI,UAAU,KAKS;EACrD,KAAK;;;AAGP;;AAGA,SAAgB,0BAAkC;CAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DT"}
@@ -1 +1 @@
1
- export type { Framework, DbOdm, DbDriver, LoggerId, ScaffoldOptions, ScaffoldResult, PackageGroups, } from './core/types.js';
1
+ export type { DbDriver, DbOdm, LoggerId, PackageGroups, ProjectType, ScaffoldOptions, ScaffoldResult, ValidatorId, } from './core/types.js';
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "create-taserjs",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Scaffold a new Taser application",
5
- "type": "module",
6
- "sideEffects": false,
5
+ "license": "ISC",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/taserjs/taserjs.git",
9
+ "directory": "packages/create-taserjs"
10
+ },
7
11
  "bin": {
8
12
  "create-taserjs": "./dist/esm/cli.js"
9
13
  },
@@ -11,6 +15,12 @@
11
15
  "dist",
12
16
  "src"
13
17
  ],
18
+ "type": "module",
19
+ "sideEffects": false,
20
+ "publishConfig": {
21
+ "access": "public",
22
+ "registry": "https://registry.npmjs.org"
23
+ },
14
24
  "dependencies": {
15
25
  "@clack/prompts": "^0.11.0",
16
26
  "package-manager-detector": "^1.8.0",
@@ -26,16 +36,6 @@
26
36
  "engines": {
27
37
  "node": ">=20.19"
28
38
  },
29
- "license": "ISC",
30
- "repository": {
31
- "type": "git",
32
- "url": "git+https://github.com/taserjs/taserjs.git",
33
- "directory": "packages/create-taserjs"
34
- },
35
- "publishConfig": {
36
- "access": "public",
37
- "registry": "https://registry.npmjs.org"
38
- },
39
39
  "scripts": {
40
40
  "clean": "rimraf dist",
41
41
  "build": "vite build && publint --strict",
@@ -1,3 +1,3 @@
1
- import { ValidatorAddon } from '../validators.js'
1
+ import { ValidatorAddon } from "../validators.js";
2
2
 
3
- export const arktypeAddon = ValidatorAddon('arktype')
3
+ export const arktypeAddon = ValidatorAddon("arktype");
@@ -1,25 +1,25 @@
1
- import type { AddonDefinition } from '../types.js'
2
- import type { DbDriver } from '../../core/types.js'
1
+ import type { AddonDefinition } from "../types.js";
2
+ import type { DbDriver } from "../../core/types.js";
3
3
 
4
4
  function schemaSource(driver: DbDriver): string {
5
5
  switch (driver) {
6
- case 'postgres':
6
+ case "postgres":
7
7
  return `import { pgTable, serial, text } from 'drizzle-orm/pg-core'
8
8
 
9
9
  export const users = pgTable('users', {
10
10
  id: serial('id').primaryKey(),
11
11
  email: text('email').notNull(),
12
12
  })
13
- `
14
- case 'mysql':
13
+ `;
14
+ case "mysql":
15
15
  return `import { mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core'
16
16
 
17
17
  export const users = mysqlTable('users', {
18
18
  id: serial('id').primaryKey(),
19
19
  email: varchar('email', { length: 255 }).notNull(),
20
20
  })
21
- `
22
- case 'sqlite':
21
+ `;
22
+ case "sqlite":
23
23
  default:
24
24
  return `import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core'
25
25
 
@@ -27,13 +27,13 @@ export const users = sqliteTable('users', {
27
27
  id: integer('id').primaryKey({ autoIncrement: true }),
28
28
  email: text('email').notNull(),
29
29
  })
30
- `
30
+ `;
31
31
  }
32
32
  }
33
33
 
34
34
  function dbIndexSource(driver: DbDriver): string {
35
35
  switch (driver) {
36
- case 'postgres':
36
+ case "postgres":
37
37
  return `import { drizzle } from 'drizzle-orm/node-postgres'
38
38
  import pg from 'pg'
39
39
 
@@ -45,8 +45,8 @@ export function createDb() {
45
45
  })
46
46
  return drizzle(pool, { schema })
47
47
  }
48
- `
49
- case 'mysql':
48
+ `;
49
+ case "mysql":
50
50
  return `import { drizzle } from 'drizzle-orm/mysql2'
51
51
  import mysql from 'mysql2/promise'
52
52
 
@@ -56,8 +56,8 @@ export function createDb() {
56
56
  const pool = mysql.createPool(process.env.DATABASE_URL ?? '')
57
57
  return drizzle(pool, { schema, mode: 'default' })
58
58
  }
59
- `
60
- case 'sqlite':
59
+ `;
60
+ case "sqlite":
61
61
  default:
62
62
  return `import Database from 'better-sqlite3'
63
63
  import { drizzle } from 'drizzle-orm/better-sqlite3'
@@ -69,12 +69,12 @@ export function createDb() {
69
69
  const client = new Database(filePath)
70
70
  return drizzle(client, { schema })
71
71
  }
72
- `
72
+ `;
73
73
  }
74
74
  }
75
75
 
76
76
  function drizzleConfigSource(driver: DbDriver): string {
77
- const dialect = driver === 'postgres' ? 'postgresql' : driver === 'mysql' ? 'mysql' : 'sqlite'
77
+ const dialect = driver === "postgres" ? "postgresql" : driver === "mysql" ? "mysql" : "sqlite";
78
78
  return `import { defineConfig } from 'drizzle-kit'
79
79
 
80
80
  export default defineConfig({
@@ -85,61 +85,74 @@ export default defineConfig({
85
85
  url: process.env.DATABASE_URL ?? '',
86
86
  },
87
87
  })
88
- `
88
+ `;
89
89
  }
90
90
 
91
91
  function envExample(driver: DbDriver): string {
92
92
  switch (driver) {
93
- case 'postgres':
94
- return 'DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n'
95
- case 'mysql':
96
- return 'DATABASE_URL=mysql://user:password@localhost:3306/mydb\n'
97
- case 'sqlite':
93
+ case "postgres":
94
+ return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
95
+ case "mysql":
96
+ return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
97
+ case "sqlite":
98
98
  default:
99
- return 'DATABASE_URL=file:./local.db\n'
99
+ return "DATABASE_URL=file:./local.db\n";
100
100
  }
101
101
  }
102
102
 
103
103
  function driverPackages(driver: DbDriver): string[] {
104
104
  switch (driver) {
105
- case 'postgres':
106
- return ['pg']
107
- case 'mysql':
108
- return ['mysql2']
109
- case 'sqlite':
105
+ case "postgres":
106
+ return ["pg"];
107
+ case "mysql":
108
+ return ["mysql2"];
109
+ case "sqlite":
110
110
  default:
111
- return ['better-sqlite3']
111
+ return ["better-sqlite3"];
112
+ }
113
+ }
114
+
115
+ function driverDevPackages(driver: DbDriver): string[] {
116
+ switch (driver) {
117
+ case "postgres":
118
+ return ["@types/pg"];
119
+ case "sqlite":
120
+ return ["@types/better-sqlite3"];
121
+ case "mysql":
122
+ default:
123
+ return [];
112
124
  }
113
125
  }
114
126
 
115
127
  export const drizzleAddon: AddonDefinition = {
116
- id: 'drizzle',
117
- category: 'database',
128
+ id: "drizzle",
129
+ category: "database",
118
130
  dependencies(ctx) {
119
- const driver = ctx.driver ?? 'sqlite'
120
- return ['drizzle-orm', ...driverPackages(driver)]
131
+ const driver = ctx.driver ?? "sqlite";
132
+ return ["drizzle-orm", ...driverPackages(driver)];
121
133
  },
122
- devDependencies() {
123
- return ['drizzle-kit']
134
+ devDependencies(ctx) {
135
+ const driver = ctx.driver ?? "sqlite";
136
+ return ["drizzle-kit", ...driverDevPackages(driver)];
124
137
  },
125
138
  scripts() {
126
139
  return {
127
- 'db:generate': 'drizzle-kit generate',
128
- 'db:push': 'drizzle-kit push',
129
- }
140
+ "db:generate": "drizzle-kit generate",
141
+ "db:push": "drizzle-kit push",
142
+ };
130
143
  },
131
144
  bootBinding() {
132
145
  return {
133
- key: 'db',
134
- importPath: './db/index.js',
135
- factoryName: 'createDb',
136
- }
146
+ key: "db",
147
+ importPath: "./db/index.js",
148
+ factoryName: "createDb",
149
+ };
137
150
  },
138
151
  async apply(ctx, write) {
139
- const driver = ctx.driver ?? 'sqlite'
140
- await write('src/db/schema.ts', schemaSource(driver))
141
- await write('src/db/index.ts', dbIndexSource(driver))
142
- await write('drizzle.config.ts', drizzleConfigSource(driver))
143
- await write('.env.example', envExample(driver))
152
+ const driver = ctx.driver ?? "sqlite";
153
+ await write("src/db/schema.ts", schemaSource(driver));
154
+ await write("src/db/index.ts", dbIndexSource(driver));
155
+ await write("drizzle.config.ts", drizzleConfigSource(driver));
156
+ await write(".env.example", envExample(driver));
144
157
  },
145
- }
158
+ };
@@ -1,5 +1,5 @@
1
- import type { AddonDefinition } from '../types.js'
2
- import type { DbDriver } from '../../core/types.js'
1
+ import type { AddonDefinition } from "../types.js";
2
+ import type { DbDriver } from "../../core/types.js";
3
3
 
4
4
  function schemaTypesSource(): string {
5
5
  return `export interface UserTable {
@@ -10,12 +10,12 @@ function schemaTypesSource(): string {
10
10
  export interface DB {
11
11
  users: UserTable
12
12
  }
13
- `
13
+ `;
14
14
  }
15
15
 
16
16
  function dbIndexSource(driver: DbDriver): string {
17
17
  switch (driver) {
18
- case 'postgres':
18
+ case "postgres":
19
19
  return `import { Kysely, PostgresDialect } from 'kysely'
20
20
  import pg from 'pg'
21
21
 
@@ -29,8 +29,8 @@ export function createDb() {
29
29
  dialect: new PostgresDialect({ pool }),
30
30
  })
31
31
  }
32
- `
33
- case 'mysql':
32
+ `;
33
+ case "mysql":
34
34
  return `import { Kysely, MysqlDialect } from 'kysely'
35
35
  import { createPool } from 'mysql2'
36
36
 
@@ -42,8 +42,8 @@ export function createDb() {
42
42
  dialect: new MysqlDialect({ pool }),
43
43
  })
44
44
  }
45
- `
46
- case 'sqlite':
45
+ `;
46
+ case "sqlite":
47
47
  default:
48
48
  return `import Database from 'better-sqlite3'
49
49
  import { Kysely, SqliteDialect } from 'kysely'
@@ -57,55 +57,68 @@ export function createDb() {
57
57
  dialect: new SqliteDialect({ database }),
58
58
  })
59
59
  }
60
- `
60
+ `;
61
61
  }
62
62
  }
63
63
 
64
64
  function driverPackages(driver: DbDriver): string[] {
65
65
  switch (driver) {
66
- case 'postgres':
67
- return ['pg']
68
- case 'mysql':
69
- return ['mysql2']
70
- case 'sqlite':
66
+ case "postgres":
67
+ return ["pg"];
68
+ case "mysql":
69
+ return ["mysql2"];
70
+ case "sqlite":
71
71
  default:
72
- return ['better-sqlite3']
72
+ return ["better-sqlite3"];
73
+ }
74
+ }
75
+
76
+ function driverDevPackages(driver: DbDriver): string[] {
77
+ switch (driver) {
78
+ case "postgres":
79
+ return ["@types/pg"];
80
+ case "sqlite":
81
+ return ["@types/better-sqlite3"];
82
+ case "mysql":
83
+ default:
84
+ return [];
73
85
  }
74
86
  }
75
87
 
76
88
  function envExample(driver: DbDriver): string {
77
89
  switch (driver) {
78
- case 'postgres':
79
- return 'DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n'
80
- case 'mysql':
81
- return 'DATABASE_URL=mysql://user:password@localhost:3306/mydb\n'
82
- case 'sqlite':
90
+ case "postgres":
91
+ return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
92
+ case "mysql":
93
+ return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
94
+ case "sqlite":
83
95
  default:
84
- return 'DATABASE_URL=file:./local.db\n'
96
+ return "DATABASE_URL=file:./local.db\n";
85
97
  }
86
98
  }
87
99
 
88
100
  export const kyselyAddon: AddonDefinition = {
89
- id: 'kysely',
90
- category: 'database',
101
+ id: "kysely",
102
+ category: "database",
91
103
  dependencies(ctx) {
92
- const driver = ctx.driver ?? 'sqlite'
93
- return ['kysely', ...driverPackages(driver)]
104
+ const driver = ctx.driver ?? "sqlite";
105
+ return ["kysely", ...driverPackages(driver)];
94
106
  },
95
- devDependencies() {
96
- return []
107
+ devDependencies(ctx) {
108
+ const driver = ctx.driver ?? "sqlite";
109
+ return driverDevPackages(driver);
97
110
  },
98
111
  bootBinding() {
99
112
  return {
100
- key: 'db',
101
- importPath: './db/index.js',
102
- factoryName: 'createDb',
103
- }
113
+ key: "db",
114
+ importPath: "./db/index.js",
115
+ factoryName: "createDb",
116
+ };
104
117
  },
105
118
  async apply(ctx, write) {
106
- const driver = ctx.driver ?? 'sqlite'
107
- await write('src/db/schema.ts', schemaTypesSource())
108
- await write('src/db/index.ts', dbIndexSource(driver))
109
- await write('.env.example', envExample(driver))
119
+ const driver = ctx.driver ?? "sqlite";
120
+ await write("src/db/schema.ts", schemaTypesSource());
121
+ await write("src/db/index.ts", dbIndexSource(driver));
122
+ await write(".env.example", envExample(driver));
110
123
  },
111
- }
124
+ };
@@ -1,30 +1,30 @@
1
- import type { AddonDefinition } from '../types.js'
1
+ import type { AddonDefinition } from "../types.js";
2
2
 
3
3
  export const pinoAddon: AddonDefinition = {
4
- id: 'pino',
5
- category: 'logger',
4
+ id: "pino",
5
+ category: "logger",
6
6
  dependencies() {
7
- return ['pino']
7
+ return ["pino"];
8
8
  },
9
9
  devDependencies() {
10
- return []
10
+ return [];
11
11
  },
12
12
  bootBinding() {
13
13
  return {
14
- key: 'logger',
15
- importPath: './logger.js',
16
- factoryName: 'createLogger',
17
- }
14
+ key: "logger",
15
+ importPath: "./logger.js",
16
+ factoryName: "createLogger",
17
+ };
18
18
  },
19
19
  async apply(_ctx, write) {
20
20
  await write(
21
- 'src/logger.ts',
21
+ "src/logger.ts",
22
22
  `import pino from 'pino'
23
23
 
24
24
  export function createLogger() {
25
25
  return pino({ level: process.env.LOG_LEVEL ?? 'info' })
26
26
  }
27
27
  `,
28
- )
28
+ );
29
29
  },
30
- }
30
+ };