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
@@ -1 +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"}
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 type: ctx.type,\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 if (ctx.validator) {\n config.validator = ctx.validator;\n }\n\n await writeFile(path.join(root, \".taser.json\"), `${JSON.stringify(config, null, 2)}\\n`, \"utf8\");\n}\n"],"mappings":";;;AAKA,eAAsB,mBAAmB,MAAc,KAAqC;CAC1F,MAAM,SAAiC,EACrC,MAAM,IAAI,KACZ;CAEA,IAAI,IAAI,IAAI;EACV,OAAO,KAAK,IAAI;EAChB,IAAI,IAAI,QACN,OAAO,SAAS,IAAI;CAExB;CAEA,IAAI,IAAI,QACN,OAAO,SAAS,IAAI;CAGtB,IAAI,IAAI,WACN,OAAO,YAAY,IAAI;CAGzB,MAAM,UAAU,KAAK,KAAK,MAAM,aAAa,GAAG,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,KAAK,MAAM;AAChG"}
@@ -1,5 +1,5 @@
1
- import { PackageGroups, ScaffoldContext, Framework } from '../core/types.js';
1
+ import { PackageGroups, ProjectType, ScaffoldContext } from '../core/types.js';
2
2
  export declare function resolvePackages(ctx: ScaffoldContext): PackageGroups;
3
- export declare function getPackageGroups(framework: Framework): Omit<PackageGroups, 'scripts'> & {
3
+ export declare function getPackageGroups(type: ProjectType): Omit<PackageGroups, "scripts"> & {
4
4
  scripts?: Record<string, string>;
5
5
  };
@@ -1,7 +1,7 @@
1
1
  import { resolveAddons } from "../addons/registry.js";
2
2
  //#region src/core/resolve-packages.ts
3
- function frameworkPackages(framework) {
4
- const dependencies = ["@taserjs/router"];
3
+ function typePackages(type) {
4
+ const dependencies = ["@taserjs/router", "dotenv"];
5
5
  const devDependencies = [
6
6
  "@taserjs/router-cli",
7
7
  "npm-run-all2",
@@ -11,18 +11,52 @@ function frameworkPackages(framework) {
11
11
  "@types/node"
12
12
  ];
13
13
  const scripts = {};
14
- switch (framework) {
14
+ switch (type) {
15
15
  case "express":
16
16
  dependencies.push("@taserjs/adapter-express", "express");
17
17
  devDependencies.push("@types/express");
18
18
  break;
19
+ case "fastify":
20
+ dependencies.push("@taserjs/adapter-fastify", "fastify");
21
+ break;
19
22
  case "hono":
20
23
  dependencies.push("@hono/node-server", "hono");
21
24
  break;
22
- case "fastify":
23
- dependencies.push("@taserjs/adapter-fastify", "fastify");
25
+ case "bun":
26
+ devDependencies.push("@types/bun");
27
+ scripts["dev:server"] = "bun --watch src/index.ts";
28
+ scripts.start = "bun src/index.ts";
29
+ scripts.serve = "bun dist/index.mjs";
30
+ break;
31
+ case "deno":
32
+ scripts["dev:server"] = "deno run --watch --allow-net --allow-env --allow-read src/index.ts";
33
+ scripts.start = "deno run --allow-net --allow-env --allow-read src/index.ts";
34
+ scripts.serve = "deno run --allow-net --allow-env --allow-read dist/index.mjs";
35
+ break;
36
+ case "aws-lambda":
37
+ dependencies.push("hono");
38
+ devDependencies.push("@types/aws-lambda");
39
+ break;
40
+ case "cloudflare-workers": {
41
+ const cfDevDeps = devDependencies.filter((d) => d !== "tsx");
42
+ cfDevDeps.push("wrangler", "@cloudflare/workers-types");
43
+ devDependencies.length = 0;
44
+ devDependencies.push(...cfDevDeps);
45
+ scripts["dev:server"] = "wrangler dev";
46
+ scripts.deploy = "wrangler deploy";
47
+ break;
48
+ }
49
+ case "netlify":
50
+ dependencies.push("hono", "@netlify/functions");
51
+ break;
52
+ case "vercel":
53
+ dependencies.push("hono");
54
+ devDependencies.push("@vercel/node");
55
+ break;
56
+ case "azure-functions":
57
+ dependencies.push("hono", "@azure/functions", "@marplex/hono-azurefunc-adapter");
24
58
  break;
25
- default: dependencies.push("@taserjs/adapter-node");
59
+ default: dependencies.push("@hono/node-server");
26
60
  }
27
61
  return {
28
62
  dependencies,
@@ -31,7 +65,7 @@ function frameworkPackages(framework) {
31
65
  };
32
66
  }
33
67
  function resolvePackages(ctx) {
34
- const base = frameworkPackages(ctx.framework);
68
+ const base = typePackages(ctx.type);
35
69
  const addons = resolveAddons(ctx);
36
70
  const dependencies = [...base.dependencies];
37
71
  const devDependencies = [...base.devDependencies];
@@ -1 +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 '@types/node',\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;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"}
1
+ {"version":3,"file":"resolve-packages.js","names":[],"sources":["../../../src/core/resolve-packages.ts"],"sourcesContent":["import { resolveAddons } from \"../addons/registry.js\";\nimport type { PackageGroups, ProjectType, ScaffoldContext } from \"../core/types.js\";\n\nfunction typePackages(type: ProjectType): PackageGroups {\n const dependencies = [\"@taserjs/router\", \"dotenv\"];\n const devDependencies = [\n \"@taserjs/router-cli\",\n \"npm-run-all2\",\n \"tsdown\",\n \"tsx\",\n \"typescript\",\n \"@types/node\",\n ];\n const scripts: Record<string, string> = {};\n\n switch (type) {\n case \"express\":\n dependencies.push(\"@taserjs/adapter-express\", \"express\");\n devDependencies.push(\"@types/express\");\n break;\n case \"fastify\":\n dependencies.push(\"@taserjs/adapter-fastify\", \"fastify\");\n break;\n case \"hono\":\n dependencies.push(\"@hono/node-server\", \"hono\");\n break;\n case \"bun\":\n // Bun has native TypeScript and runtime execution\n devDependencies.push(\"@types/bun\");\n scripts[\"dev:server\"] = \"bun --watch src/index.ts\";\n scripts.start = \"bun src/index.ts\";\n scripts.serve = \"bun dist/index.mjs\";\n break;\n case \"deno\":\n scripts[\"dev:server\"] = \"deno run --watch --allow-net --allow-env --allow-read src/index.ts\";\n scripts.start = \"deno run --allow-net --allow-env --allow-read src/index.ts\";\n scripts.serve = \"deno run --allow-net --allow-env --allow-read dist/index.mjs\";\n break;\n case \"aws-lambda\":\n dependencies.push(\"hono\");\n devDependencies.push(\"@types/aws-lambda\");\n break;\n case \"cloudflare-workers\": {\n // Cloudflare workers uses wrangler\n const cfDevDeps = devDependencies.filter((d) => d !== \"tsx\");\n cfDevDeps.push(\"wrangler\", \"@cloudflare/workers-types\");\n devDependencies.length = 0;\n devDependencies.push(...cfDevDeps);\n scripts[\"dev:server\"] = \"wrangler dev\";\n scripts.deploy = \"wrangler deploy\";\n break;\n }\n case \"netlify\":\n dependencies.push(\"hono\", \"@netlify/functions\");\n break;\n case \"vercel\":\n dependencies.push(\"hono\");\n devDependencies.push(\"@vercel/node\");\n break;\n case \"azure-functions\":\n dependencies.push(\"hono\", \"@azure/functions\", \"@marplex/hono-azurefunc-adapter\");\n break;\n case \"google-cloud-run\":\n case \"node\":\n default:\n dependencies.push(\"@hono/node-server\");\n break;\n }\n\n return { dependencies, devDependencies, scripts };\n}\n\nexport function resolvePackages(ctx: ScaffoldContext): PackageGroups {\n const base = typePackages(ctx.type);\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\nexport function getPackageGroups(\n type: ProjectType,\n): Omit<PackageGroups, \"scripts\"> & { scripts?: Record<string, string> } {\n const groups = typePackages(type);\n return groups;\n}\n"],"mappings":";;AAGA,SAAS,aAAa,MAAkC;CACtD,MAAM,eAAe,CAAC,mBAAmB,QAAQ;CACjD,MAAM,kBAAkB;EACtB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,UAAkC,CAAC;CAEzC,QAAQ,MAAR;EACE,KAAK;GACH,aAAa,KAAK,4BAA4B,SAAS;GACvD,gBAAgB,KAAK,gBAAgB;GACrC;EACF,KAAK;GACH,aAAa,KAAK,4BAA4B,SAAS;GACvD;EACF,KAAK;GACH,aAAa,KAAK,qBAAqB,MAAM;GAC7C;EACF,KAAK;GAEH,gBAAgB,KAAK,YAAY;GACjC,QAAQ,gBAAgB;GACxB,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB;EACF,KAAK;GACH,QAAQ,gBAAgB;GACxB,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB;EACF,KAAK;GACH,aAAa,KAAK,MAAM;GACxB,gBAAgB,KAAK,mBAAmB;GACxC;EACF,KAAK,sBAAsB;GAEzB,MAAM,YAAY,gBAAgB,QAAQ,MAAM,MAAM,KAAK;GAC3D,UAAU,KAAK,YAAY,2BAA2B;GACtD,gBAAgB,SAAS;GACzB,gBAAgB,KAAK,GAAG,SAAS;GACjC,QAAQ,gBAAgB;GACxB,QAAQ,SAAS;GACjB;EACF;EACA,KAAK;GACH,aAAa,KAAK,QAAQ,oBAAoB;GAC9C;EACF,KAAK;GACH,aAAa,KAAK,MAAM;GACxB,gBAAgB,KAAK,cAAc;GACnC;EACF,KAAK;GACH,aAAa,KAAK,QAAQ,oBAAoB,iCAAiC;GAC/E;EAGF,SACE,aAAa,KAAK,mBAAmB;CAEzC;CAEA,OAAO;EAAE;EAAc;EAAiB;CAAQ;AAClD;AAEA,SAAgB,gBAAgB,KAAqC;CACnE,MAAM,OAAO,aAAa,IAAI,IAAI;CAClC,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"}
@@ -5,7 +5,7 @@ import { writeProjectConfig } from "./project-config.js";
5
5
  import { resolvePackages } from "./resolve-packages.js";
6
6
  import { contextTemplate, gitignoreTemplate, healthRouteTemplate, indexRouteTemplate, packageJsonTemplate, rootLayoutTemplate, starterManifestTemplate, tsconfigTemplate, tsdownConfigTemplate } from "../templates/base.js";
7
7
  import path from "node:path";
8
- import { mkdir, writeFile } from "node:fs/promises";
8
+ import { copyFile, mkdir, writeFile } from "node:fs/promises";
9
9
  //#region src/core/scaffold-engine.ts
10
10
  async function write(filePath, contents) {
11
11
  await mkdir(path.dirname(filePath), { recursive: true });
@@ -16,7 +16,7 @@ async function scaffoldProject(options) {
16
16
  const ctx = {
17
17
  projectName: options.projectName,
18
18
  targetDir: root,
19
- framework: options.framework,
19
+ type: options.type,
20
20
  ...options.db ? {
21
21
  db: options.db,
22
22
  driver: options.driver
@@ -32,23 +32,51 @@ async function scaffoldProject(options) {
32
32
  await write(path.join(root, "tsdown.config.ts"), tsdownConfigTemplate());
33
33
  await write(path.join(root, ".gitignore"), gitignoreTemplate());
34
34
  await write(path.join(root, "src/context.ts"), contextTemplate(bootBindings));
35
- await write(path.join(root, "src/taser.ts"), taserTsTemplate(options.framework));
36
- await write(path.join(root, "src/index.ts"), indexTemplate(options.framework));
35
+ await write(path.join(root, "src/taser.ts"), taserTsTemplate(options.type));
36
+ await write(path.join(root, "src/index.ts"), indexTemplate(options.type));
37
37
  await write(path.join(root, "src/routes/$.ts"), rootLayoutTemplate());
38
38
  await write(path.join(root, "src/routes/index.get.ts"), indexRouteTemplate());
39
39
  await write(path.join(root, "src/routes/health.get.ts"), healthRouteTemplate(ctx));
40
40
  await write(path.join(root, "src/routeManifest.gen.ts"), starterManifestTemplate());
41
- for (const addon of addons) await addon.apply(ctx, (filePath, contents) => write(path.join(root, filePath), contents));
41
+ if (options.type === "cloudflare-workers") await write(path.join(root, "wrangler.jsonc"), JSON.stringify({
42
+ $schema: "node_modules/wrangler/config-schema.json",
43
+ name: options.projectName,
44
+ main: "src/index.ts",
45
+ compatibility_date: "2024-11-01"
46
+ }, null, 2) + "\n");
47
+ if (options.type === "vercel") await write(path.join(root, "vercel.json"), JSON.stringify({ rewrites: [{
48
+ source: "/(.*)",
49
+ destination: "/src/index.ts"
50
+ }] }, null, 2) + "\n");
51
+ if (options.type === "azure-functions") await write(path.join(root, "host.json"), JSON.stringify({
52
+ version: "2.0",
53
+ logging: { applicationInsights: { samplingSettings: {
54
+ isEnabled: true,
55
+ excludedTypes: "Request"
56
+ } } },
57
+ extensionBundle: {
58
+ id: "Microsoft.Azure.Functions.ExtensionBundle",
59
+ version: "[4.*, 5.0.0)"
60
+ },
61
+ extensions: { http: { routePrefix: "" } }
62
+ }, null, 2) + "\n");
63
+ await Promise.all(addons.map(async (addon) => {
64
+ await addon.apply(ctx, (filePath, contents) => write(path.join(root, filePath), contents));
65
+ }));
66
+ try {
67
+ await copyFile(path.join(root, ".env.example"), path.join(root, ".env"));
68
+ } catch {}
42
69
  await writeProjectConfig(root, ctx);
43
70
  if (options.skipInstall) return {
44
71
  projectName: ctx.projectName,
45
72
  targetDir: root,
46
- framework: ctx.framework,
73
+ type: ctx.type,
47
74
  ...ctx.db ? {
48
75
  db: ctx.db,
49
76
  driver: ctx.driver
50
77
  } : {},
51
- ...ctx.logger ? { logger: ctx.logger } : {}
78
+ ...ctx.logger ? { logger: ctx.logger } : {},
79
+ ...ctx.validator ? { validator: ctx.validator } : {}
52
80
  };
53
81
  const agent = options.agent ?? resolveUserAgent();
54
82
  await installPackages(agent, root, {
@@ -58,12 +86,13 @@ async function scaffoldProject(options) {
58
86
  return {
59
87
  projectName: ctx.projectName,
60
88
  targetDir: root,
61
- framework: ctx.framework,
89
+ type: ctx.type,
62
90
  ...ctx.db ? {
63
91
  db: ctx.db,
64
92
  driver: ctx.driver
65
93
  } : {},
66
- ...ctx.logger ? { logger: ctx.logger } : {}
94
+ ...ctx.logger ? { logger: ctx.logger } : {},
95
+ ...ctx.validator ? { validator: ctx.validator } : {}
67
96
  };
68
97
  }
69
98
  //#endregion
@@ -1 +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 ...(options.validator ? { validator: options.validator } : {}),\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;EACnD,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;CAC9D;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"}
1
+ {"version":3,"file":"scaffold-engine.js","names":[],"sources":["../../../src/core/scaffold-engine.ts"],"sourcesContent":["import { copyFile, 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 type: options.type,\n ...(options.db ? { db: options.db, driver: options.driver } : {}),\n ...(options.logger ? { logger: options.logger } : {}),\n ...(options.validator ? { validator: options.validator } : {}),\n };\n\n const addons = resolveAddons(ctx);\n const packages = resolvePackages(ctx);\n const bootBindings = collectBootBindings(ctx);\n\n await write(\n path.join(root, \"package.json\"),\n packageJsonTemplate(options.projectName, packages.scripts),\n );\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.type));\n await write(path.join(root, \"src/index.ts\"), indexTemplate(options.type));\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 if (options.type === \"cloudflare-workers\") {\n await write(\n path.join(root, \"wrangler.jsonc\"),\n JSON.stringify(\n {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: options.projectName,\n main: \"src/index.ts\",\n compatibility_date: \"2024-11-01\",\n },\n null,\n 2,\n ) + \"\\n\",\n );\n }\n\n if (options.type === \"vercel\") {\n await write(\n path.join(root, \"vercel.json\"),\n JSON.stringify(\n {\n rewrites: [{ source: \"/(.*)\", destination: \"/src/index.ts\" }],\n },\n null,\n 2,\n ) + \"\\n\",\n );\n }\n\n if (options.type === \"azure-functions\") {\n await write(\n path.join(root, \"host.json\"),\n JSON.stringify(\n {\n version: \"2.0\",\n logging: {\n applicationInsights: {\n samplingSettings: {\n isEnabled: true,\n excludedTypes: \"Request\",\n },\n },\n },\n extensionBundle: {\n id: \"Microsoft.Azure.Functions.ExtensionBundle\",\n version: \"[4.*, 5.0.0)\",\n },\n extensions: {\n http: {\n routePrefix: \"\",\n },\n },\n },\n null,\n 2,\n ) + \"\\n\",\n );\n }\n\n await Promise.all(\n addons.map(async (addon) => {\n await addon.apply(ctx, (filePath, contents) => write(path.join(root, filePath), contents));\n }),\n );\n\n try {\n await copyFile(path.join(root, \".env.example\"), path.join(root, \".env\"));\n } catch {\n // .env.example was not created\n }\n\n await writeProjectConfig(root, ctx);\n\n if (options.skipInstall) {\n return {\n projectName: ctx.projectName,\n targetDir: root,\n type: ctx.type,\n ...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),\n ...(ctx.logger ? { logger: ctx.logger } : {}),\n ...(ctx.validator ? { validator: ctx.validator } : {}),\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 type: ctx.type,\n ...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),\n ...(ctx.logger ? { logger: ctx.logger } : {}),\n ...(ctx.validator ? { validator: ctx.validator } : {}),\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,MAAM,QAAQ;EACd,GAAI,QAAQ,KAAK;GAAE,IAAI,QAAQ;GAAI,QAAQ,QAAQ;EAAO,IAAI,CAAC;EAC/D,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACnD,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;CAC9D;CAEA,MAAM,SAAS,cAAc,GAAG;CAChC,MAAM,WAAW,gBAAgB,GAAG;CACpC,MAAM,eAAe,oBAAoB,GAAG;CAE5C,MAAM,MACJ,KAAK,KAAK,MAAM,cAAc,GAC9B,oBAAoB,QAAQ,aAAa,SAAS,OAAO,CAC3D;CACA,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,IAAI,CAAC;CAC1E,MAAM,MAAM,KAAK,KAAK,MAAM,cAAc,GAAG,cAAc,QAAQ,IAAI,CAAC;CACxE,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,IAAI,QAAQ,SAAS,sBACnB,MAAM,MACJ,KAAK,KAAK,MAAM,gBAAgB,GAChC,KAAK,UACH;EACE,SAAS;EACT,MAAM,QAAQ;EACd,MAAM;EACN,oBAAoB;CACtB,GACA,MACA,CACF,IAAI,IACN;CAGF,IAAI,QAAQ,SAAS,UACnB,MAAM,MACJ,KAAK,KAAK,MAAM,aAAa,GAC7B,KAAK,UACH,EACE,UAAU,CAAC;EAAE,QAAQ;EAAS,aAAa;CAAgB,CAAC,EAC9D,GACA,MACA,CACF,IAAI,IACN;CAGF,IAAI,QAAQ,SAAS,mBACnB,MAAM,MACJ,KAAK,KAAK,MAAM,WAAW,GAC3B,KAAK,UACH;EACE,SAAS;EACT,SAAS,EACP,qBAAqB,EACnB,kBAAkB;GAChB,WAAW;GACX,eAAe;EACjB,EACF,EACF;EACA,iBAAiB;GACf,IAAI;GACJ,SAAS;EACX;EACA,YAAY,EACV,MAAM,EACJ,aAAa,GACf,EACF;CACF,GACA,MACA,CACF,IAAI,IACN;CAGF,MAAM,QAAQ,IACZ,OAAO,IAAI,OAAO,UAAU;EAC1B,MAAM,MAAM,MAAM,MAAM,UAAU,aAAa,MAAM,KAAK,KAAK,MAAM,QAAQ,GAAG,QAAQ,CAAC;CAC3F,CAAC,CACH;CAEA,IAAI;EACF,MAAM,SAAS,KAAK,KAAK,MAAM,cAAc,GAAG,KAAK,KAAK,MAAM,MAAM,CAAC;CACzE,QAAQ,CAER;CAEA,MAAM,mBAAmB,MAAM,GAAG;CAElC,IAAI,QAAQ,aACV,OAAO;EACL,aAAa,IAAI;EACjB,WAAW;EACX,MAAM,IAAI;EACV,GAAI,IAAI,KAAK;GAAE,IAAI,IAAI;GAAI,QAAQ,IAAI;EAAO,IAAI,CAAC;EACnD,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;EAC3C,GAAI,IAAI,YAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;CACtD;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,MAAM,IAAI;EACV,GAAI,IAAI,KAAK;GAAE,IAAI,IAAI;GAAI,QAAQ,IAAI;EAAO,IAAI,CAAC;EACnD,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;EAC3C,GAAI,IAAI,YAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;CACtD;AACF"}
@@ -1,14 +1,14 @@
1
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';
2
+ export type ProjectType = "node" | "express" | "fastify" | "hono" | "bun" | "deno" | "aws-lambda" | "cloudflare-workers" | "netlify" | "vercel" | "azure-functions" | "google-cloud-run";
3
+ export declare const PROJECT_TYPES: readonly ProjectType[];
4
+ export type DbOdm = "drizzle" | "prisma" | "kysely";
5
5
  export declare const DB_ODMS: readonly DbOdm[];
6
- export type DbDriver = 'postgres' | 'sqlite' | 'mysql';
6
+ export type DbDriver = "postgres" | "sqlite" | "mysql";
7
7
  export declare const DB_DRIVERS: readonly DbDriver[];
8
8
  export declare const DEFAULT_DB_DRIVER: DbDriver;
9
- export type LoggerId = 'pino' | 'winston';
9
+ export type LoggerId = "pino" | "winston";
10
10
  export declare const LOGGERS: readonly LoggerId[];
11
- export type ValidatorId = 'zod' | 'arktype' | 'valibot';
11
+ export type ValidatorId = "zod" | "arktype" | "valibot";
12
12
  export declare const VALIDATORS: readonly ValidatorId[];
13
13
  export type PackageGroups = {
14
14
  dependencies: string[];
@@ -18,7 +18,7 @@ export type PackageGroups = {
18
18
  export type ScaffoldContext = {
19
19
  projectName: string;
20
20
  targetDir: string;
21
- framework: Framework;
21
+ type: ProjectType;
22
22
  db?: DbOdm;
23
23
  driver?: DbDriver;
24
24
  logger?: LoggerId;
@@ -30,7 +30,7 @@ export type ScaffoldOptions = ScaffoldContext & {
30
30
  };
31
31
  export type ScaffoldResult = ScaffoldContext;
32
32
  export type CapabilitiesCatalog = {
33
- frameworks: Framework[];
33
+ types: ProjectType[];
34
34
  db: {
35
35
  odms: DbOdm[];
36
36
  drivers: DbDriver[];
@@ -1,9 +1,17 @@
1
1
  //#region src/core/types.ts
2
- var FRAMEWORKS = [
2
+ var PROJECT_TYPES = [
3
3
  "node",
4
4
  "express",
5
+ "fastify",
5
6
  "hono",
6
- "fastify"
7
+ "bun",
8
+ "deno",
9
+ "aws-lambda",
10
+ "cloudflare-workers",
11
+ "netlify",
12
+ "vercel",
13
+ "azure-functions",
14
+ "google-cloud-run"
7
15
  ];
8
16
  var DB_ODMS = [
9
17
  "drizzle",
@@ -23,6 +31,6 @@ var VALIDATORS = [
23
31
  "valibot"
24
32
  ];
25
33
  //#endregion
26
- export { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, FRAMEWORKS, LOGGERS, VALIDATORS };
34
+ export { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, LOGGERS, PROJECT_TYPES, VALIDATORS };
27
35
 
28
36
  //# sourceMappingURL=types.js.map
@@ -1 +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 ValidatorId = 'zod' | 'arktype' | 'valibot'\n\nexport const VALIDATORS: readonly ValidatorId[] = ['zod', 'arktype', 'valibot']\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 validator?: ValidatorId\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 validators: ValidatorId[]\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;AAI9D,IAAa,aAAqC;CAAC;CAAO;CAAW;AAAS"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/core/types.ts"],"sourcesContent":["import type { Agent } from \"package-manager-detector\";\n\nexport type ProjectType =\n | \"node\"\n | \"express\"\n | \"fastify\"\n | \"hono\"\n | \"bun\"\n | \"deno\"\n | \"aws-lambda\"\n | \"cloudflare-workers\"\n | \"netlify\"\n | \"vercel\"\n | \"azure-functions\"\n | \"google-cloud-run\";\n\nexport const PROJECT_TYPES: readonly ProjectType[] = [\n \"node\",\n \"express\",\n \"fastify\",\n \"hono\",\n \"bun\",\n \"deno\",\n \"aws-lambda\",\n \"cloudflare-workers\",\n \"netlify\",\n \"vercel\",\n \"azure-functions\",\n \"google-cloud-run\",\n];\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 ValidatorId = \"zod\" | \"arktype\" | \"valibot\";\n\nexport const VALIDATORS: readonly ValidatorId[] = [\"zod\", \"arktype\", \"valibot\"];\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 type: ProjectType;\n db?: DbOdm;\n driver?: DbDriver;\n logger?: LoggerId;\n validator?: ValidatorId;\n};\n\nexport type ScaffoldOptions = ScaffoldContext & {\n skipInstall?: boolean;\n agent?: Agent;\n};\n\nexport type ScaffoldResult = ScaffoldContext;\n\nexport type CapabilitiesCatalog = {\n types: ProjectType[];\n db: {\n odms: DbOdm[];\n drivers: DbDriver[];\n defaultDriver: DbDriver;\n };\n loggers: LoggerId[];\n validators: ValidatorId[];\n};\n"],"mappings":";AAgBA,IAAa,gBAAwC;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,IAAa,UAA4B;CAAC;CAAW;CAAU;AAAQ;AAIvE,IAAa,aAAkC;CAAC;CAAY;CAAU;AAAO;AAE7E,IAAa,oBAA8B;AAI3C,IAAa,UAA+B,CAAC,QAAQ,SAAS;AAI9D,IAAa,aAAqC;CAAC;CAAO;CAAW;AAAS"}
@@ -1 +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"}
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"}
@@ -1,3 +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;
1
+ import { ProjectType } from '../core/types.js';
2
+ export declare function indexTemplate(type: ProjectType): string;
3
+ export declare function taserTsTemplate(type?: ProjectType): string;
@@ -1,7 +1,9 @@
1
1
  //#region src/frameworks/index.ts
2
- function indexTemplate(framework) {
3
- switch (framework) {
4
- case "express": return `import express from 'express'
2
+ function indexTemplate(type) {
3
+ switch (type) {
4
+ case "express": return `import 'dotenv/config'
5
+
6
+ import express from 'express'
5
7
  import { createExpressHandler } from '@taserjs/adapter-express'
6
8
 
7
9
  import { routeManifest } from '#src/routeManifest.gen.js'
@@ -11,14 +13,16 @@ const router = t.create(routeManifest)
11
13
 
12
14
  const taser = createExpressHandler(router)
13
15
  const app = express()
14
- taser.mount('/api{/*splat}', app)
16
+ taser.mount('/{*splat}', app)
15
17
 
16
18
  const port = Number(process.env.PORT ?? 3000)
17
19
  app.listen(port, () => {
18
20
  console.log(\`Express listening on http://localhost:\${port}\`)
19
21
  })
20
22
  `;
21
- case "hono": return `import { serve } from '@hono/node-server'
23
+ case "hono": return `import 'dotenv/config'
24
+
25
+ import { serve } from '@hono/node-server'
22
26
  import { Hono } from 'hono'
23
27
 
24
28
  import { routeManifest } from '#src/routeManifest.gen.js'
@@ -27,15 +31,16 @@ import { t } from '#src/taser.js'
27
31
  const router = t.create(routeManifest)
28
32
 
29
33
  const app = new Hono()
30
- const api = router.base('/api')
31
- app.all('/api/*', c => api.native(c).fetch(c.req.raw))
34
+ app.all('/*', c => router.native(c).fetch(c.req.raw))
32
35
 
33
36
  const port = Number(process.env.PORT ?? 3000)
34
37
  serve({ fetch: app.fetch, port }, () => {
35
38
  console.log(\`Hono listening on http://localhost:\${port}\`)
36
39
  })
37
40
  `;
38
- case "fastify": return `import Fastify from 'fastify'
41
+ case "fastify": return `import 'dotenv/config'
42
+
43
+ import Fastify from 'fastify'
39
44
  import { createFastifyHandler } from '@taserjs/adapter-fastify'
40
45
 
41
46
  import { routeManifest } from '#src/routeManifest.gen.js'
@@ -45,33 +50,149 @@ const router = t.create(routeManifest)
45
50
 
46
51
  const taser = createFastifyHandler(router)
47
52
  const app = Fastify()
48
- taser.mount('/api/*', app)
53
+ taser.mount('/*', app)
49
54
 
50
55
  const port = Number(process.env.PORT ?? 3000)
51
56
  await app.listen({ port })
52
57
  console.log(\`Fastify listening on http://localhost:\${port}\`)
53
58
  `;
54
- default: return `import { createServer } from 'node:http'
55
- import { createNodeHandler } from '@taserjs/adapter-node'
59
+ case "bun": return `import 'dotenv/config'
60
+
61
+ import { routeManifest } from '#src/routeManifest.gen.js'
62
+ import { t } from '#src/taser.js'
63
+
64
+ const router = t.create(routeManifest)
65
+
66
+ const port = Number(process.env.PORT ?? 3000)
67
+
68
+ export default {
69
+ port,
70
+ fetch(request: Request) {
71
+ return router.fetch(request)
72
+ },
73
+ }
74
+ `;
75
+ case "deno": return `import 'dotenv/config'
76
+
77
+ import { routeManifest } from '#src/routeManifest.gen.js'
78
+ import { t } from '#src/taser.js'
79
+
80
+ const router = t.create(routeManifest)
81
+
82
+ const port = Number(process.env.PORT ?? 8000)
83
+ Deno.serve({ port }, (request: Request) => router.fetch(request))
84
+ `;
85
+ case "aws-lambda": return `import 'dotenv/config'
86
+
87
+ import { Hono } from 'hono'
88
+ import { handle } from 'hono/aws-lambda'
89
+
90
+ import { routeManifest } from '#src/routeManifest.gen.js'
91
+ import { t } from '#src/taser.js'
92
+
93
+ const router = t.create(routeManifest)
94
+
95
+ const app = new Hono()
96
+ app.all('/*', c => router.native(c).fetch(c.req.raw))
97
+
98
+ export const handler = handle(app)
99
+ `;
100
+ case "cloudflare-workers": return `import 'dotenv/config'
101
+
102
+ import { routeManifest } from '#src/routeManifest.gen.js'
103
+ import { t } from '#src/taser.js'
104
+
105
+ const router = t.create(routeManifest)
106
+
107
+ export default {
108
+ fetch(request: Request, env: unknown, ctx: unknown) {
109
+ return router.fetch(request, env, ctx)
110
+ },
111
+ }
112
+ `;
113
+ case "netlify": return `import 'dotenv/config'
114
+
115
+ import { Hono } from 'hono'
116
+ import { handle } from 'hono/netlify'
117
+
118
+ import { routeManifest } from '#src/routeManifest.gen.js'
119
+ import { t } from '#src/taser.js'
120
+
121
+ const router = t.create(routeManifest)
122
+
123
+ const app = new Hono()
124
+ app.all('/*', c => router.native(c).fetch(c.req.raw))
125
+
126
+ export default handle(app)
127
+ `;
128
+ case "vercel": return `import 'dotenv/config'
129
+
130
+ import { Hono } from 'hono'
131
+ import { handle } from 'hono/vercel'
56
132
 
57
133
  import { routeManifest } from '#src/routeManifest.gen.js'
58
134
  import { t } from '#src/taser.js'
59
135
 
60
136
  const router = t.create(routeManifest)
61
137
 
62
- const taser = createNodeHandler(router)
63
- const app = createServer()
64
- taser.mount('/api/*', app)
138
+ const app = new Hono()
139
+ app.all('/*', c => router.native(c).fetch(c.req.raw))
140
+
141
+ export default handle(app)
142
+ `;
143
+ case "azure-functions": return `import 'dotenv/config'
144
+
145
+ import { app } from '@azure/functions'
146
+ import { Hono } from 'hono'
147
+ import { azureHonoHandler } from '@marplex/hono-azurefunc-adapter'
148
+
149
+ import { routeManifest } from '#src/routeManifest.gen.js'
150
+ import { t } from '#src/taser.js'
151
+
152
+ const router = t.create(routeManifest)
153
+
154
+ const honoApp = new Hono()
155
+ honoApp.all('/*', c => router.native(c).fetch(c.req.raw))
156
+
157
+ app.http('httpTrigger', {
158
+ methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'],
159
+ authLevel: 'anonymous',
160
+ route: '{*proxy}',
161
+ handler: azureHonoHandler(honoApp.fetch),
162
+ })
163
+ `;
164
+ case "google-cloud-run": return `import 'dotenv/config'
165
+
166
+ import { serve } from '@hono/node-server'
167
+
168
+ import { routeManifest } from '#src/routeManifest.gen.js'
169
+ import { t } from '#src/taser.js'
170
+
171
+ const router = t.create(routeManifest)
172
+
173
+ const port = Number(process.env.PORT ?? 8080)
174
+ serve({ fetch: router.fetch, port }, () => {
175
+ console.log(\`Cloud Run listening on http://localhost:\${port}\`)
176
+ })
177
+ `;
178
+ default: return `import 'dotenv/config'
179
+
180
+ import { serve } from '@hono/node-server'
181
+
182
+ import { routeManifest } from '#src/routeManifest.gen.js'
183
+ import { t } from '#src/taser.js'
184
+
185
+ const router = t.create(routeManifest)
65
186
 
66
187
  const port = Number(process.env.PORT ?? 3000)
67
- app.listen(port, () => {
188
+ serve({ fetch: router.fetch, port }, () => {
68
189
  console.log(\`Node listening on http://localhost:\${port}\`)
69
190
  })
70
191
  `;
71
192
  }
72
193
  }
73
- function taserTsTemplate(framework = "node") {
74
- if (framework === "hono") return `import type { Context } from 'hono'
194
+ function taserTsTemplate(type = "node") {
195
+ if (type === "hono" || type === "aws-lambda" || type === "netlify" || type === "vercel" || type === "azure-functions") return `import type { Context } from 'hono'
75
196
  import { createTaserApp, type InferAppContext } from '@taserjs/router'
76
197
 
77
198
  import { context } from '#src/context.js'
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/frameworks/index.ts"],"sourcesContent":["import type { Framework } from '../core/types.js'\n\nexport function indexTemplate(framework: Framework): string {\n switch (framework) {\n case 'express':\n return `import express from 'express'\nimport { createExpressHandler } from '@taserjs/adapter-express'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createExpressHandler(router)\nconst app = express()\ntaser.mount('/api{/*splat}', app)\n\nconst port = Number(process.env.PORT ?? 3000)\napp.listen(port, () => {\n console.log(\\`Express listening on http://localhost:\\${port}\\`)\n})\n`\n case 'hono':\n return `import { serve } from '@hono/node-server'\nimport { Hono } from 'hono'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\nconst api = router.base('/api')\napp.all('/api/*', c => api.native(c).fetch(c.req.raw))\n\nconst port = Number(process.env.PORT ?? 3000)\nserve({ fetch: app.fetch, port }, () => {\n console.log(\\`Hono listening on http://localhost:\\${port}\\`)\n})\n`\n case 'fastify':\n return `import Fastify from 'fastify'\nimport { createFastifyHandler } from '@taserjs/adapter-fastify'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createFastifyHandler(router)\nconst app = Fastify()\ntaser.mount('/api/*', app)\n\nconst port = Number(process.env.PORT ?? 3000)\nawait app.listen({ port })\nconsole.log(\\`Fastify listening on http://localhost:\\${port}\\`)\n`\n case 'node':\n default:\n return `import { createServer } from 'node:http'\nimport { createNodeHandler } from '@taserjs/adapter-node'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createNodeHandler(router)\nconst app = createServer()\ntaser.mount('/api/*', app)\n\nconst port = Number(process.env.PORT ?? 3000)\napp.listen(port, () => {\n console.log(\\`Node listening on http://localhost:\\${port}\\`)\n})\n`\n }\n}\n\nexport function taserTsTemplate(framework: Framework = 'node'): string {\n if (framework === 'hono') {\n return `import type { Context } from 'hono'\nimport { createTaserApp, type InferAppContext } from '@taserjs/router'\n\nimport { context } from '#src/context.js'\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n NativeContext: Context\n }\n}\n\nexport const t = createTaserApp({\n response: { validate: true },\n}).context(context)\n\nexport type AppContext = InferAppContext<typeof context>\n`\n }\n\n return `import { createTaserApp, type InferAppContext } from '@taserjs/router'\n\nimport { context } from '#src/context.js'\n\nexport const t = createTaserApp({\n response: { validate: true },\n}).context(context)\n\nexport type AppContext = InferAppContext<typeof context>\n`\n}\n"],"mappings":";AAEA,SAAgB,cAAc,WAA8B;CAC1D,QAAQ,WAAR;EACE,KAAK,WACH,OAAO;;;;;;;;;;;;;;;;;EAiBT,KAAK,QACH,OAAO;;;;;;;;;;;;;;;;;EAiBT,KAAK,WACH,OAAO;;;;;;;;;;;;;;;;EAiBT,SACE,OAAO;;;;;;;;;;;;;;;;;CAiBX;AACF;AAEA,SAAgB,gBAAgB,YAAuB,QAAgB;CACrE,IAAI,cAAc,QAChB,OAAO;;;;;;;;;;;;;;;;;CAmBT,OAAO;;;;;;;;;;AAUT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/frameworks/index.ts"],"sourcesContent":["import type { ProjectType } from \"../core/types.js\";\n\nexport function indexTemplate(type: ProjectType): string {\n switch (type) {\n case \"express\":\n return `import 'dotenv/config'\n\nimport express from 'express'\nimport { createExpressHandler } from '@taserjs/adapter-express'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createExpressHandler(router)\nconst app = express()\ntaser.mount('/{*splat}', app)\n\nconst port = Number(process.env.PORT ?? 3000)\napp.listen(port, () => {\n console.log(\\`Express listening on http://localhost:\\${port}\\`)\n})\n`;\n case \"hono\":\n return `import 'dotenv/config'\n\nimport { serve } from '@hono/node-server'\nimport { Hono } from 'hono'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\napp.all('/*', c => router.native(c).fetch(c.req.raw))\n\nconst port = Number(process.env.PORT ?? 3000)\nserve({ fetch: app.fetch, port }, () => {\n console.log(\\`Hono listening on http://localhost:\\${port}\\`)\n})\n`;\n case \"fastify\":\n return `import 'dotenv/config'\n\nimport Fastify from 'fastify'\nimport { createFastifyHandler } from '@taserjs/adapter-fastify'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createFastifyHandler(router)\nconst app = Fastify()\ntaser.mount('/*', app)\n\nconst port = Number(process.env.PORT ?? 3000)\nawait app.listen({ port })\nconsole.log(\\`Fastify listening on http://localhost:\\${port}\\`)\n`;\n case \"bun\":\n return `import 'dotenv/config'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst port = Number(process.env.PORT ?? 3000)\n\nexport default {\n port,\n fetch(request: Request) {\n return router.fetch(request)\n },\n}\n`;\n case \"deno\":\n return `import 'dotenv/config'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst port = Number(process.env.PORT ?? 8000)\nDeno.serve({ port }, (request: Request) => router.fetch(request))\n`;\n case \"aws-lambda\":\n return `import 'dotenv/config'\n\nimport { Hono } from 'hono'\nimport { handle } from 'hono/aws-lambda'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\napp.all('/*', c => router.native(c).fetch(c.req.raw))\n\nexport const handler = handle(app)\n`;\n case \"cloudflare-workers\":\n return `import 'dotenv/config'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nexport default {\n fetch(request: Request, env: unknown, ctx: unknown) {\n return router.fetch(request, env, ctx)\n },\n}\n`;\n case \"netlify\":\n return `import 'dotenv/config'\n\nimport { Hono } from 'hono'\nimport { handle } from 'hono/netlify'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\napp.all('/*', c => router.native(c).fetch(c.req.raw))\n\nexport default handle(app)\n`;\n case \"vercel\":\n return `import 'dotenv/config'\n\nimport { Hono } from 'hono'\nimport { handle } from 'hono/vercel'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\napp.all('/*', c => router.native(c).fetch(c.req.raw))\n\nexport default handle(app)\n`;\n case \"azure-functions\":\n return `import 'dotenv/config'\n\nimport { app } from '@azure/functions'\nimport { Hono } from 'hono'\nimport { azureHonoHandler } from '@marplex/hono-azurefunc-adapter'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst honoApp = new Hono()\nhonoApp.all('/*', c => router.native(c).fetch(c.req.raw))\n\napp.http('httpTrigger', {\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'],\n authLevel: 'anonymous',\n route: '{*proxy}',\n handler: azureHonoHandler(honoApp.fetch),\n})\n`;\n case \"google-cloud-run\":\n return `import 'dotenv/config'\n\nimport { serve } from '@hono/node-server'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst port = Number(process.env.PORT ?? 8080)\nserve({ fetch: router.fetch, port }, () => {\n console.log(\\`Cloud Run listening on http://localhost:\\${port}\\`)\n})\n`;\n case \"node\":\n default:\n return `import 'dotenv/config'\n\nimport { serve } from '@hono/node-server'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst port = Number(process.env.PORT ?? 3000)\nserve({ fetch: router.fetch, port }, () => {\n console.log(\\`Node listening on http://localhost:\\${port}\\`)\n})\n`;\n }\n}\n\nexport function taserTsTemplate(type: ProjectType = \"node\"): string {\n if (\n type === \"hono\" ||\n type === \"aws-lambda\" ||\n type === \"netlify\" ||\n type === \"vercel\" ||\n type === \"azure-functions\"\n ) {\n return `import type { Context } from 'hono'\nimport { createTaserApp, type InferAppContext } from '@taserjs/router'\n\nimport { context } from '#src/context.js'\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n NativeContext: Context\n }\n}\n\nexport const t = createTaserApp({\n response: { validate: true },\n}).context(context)\n\nexport type AppContext = InferAppContext<typeof context>\n`;\n }\n\n return `import { createTaserApp, type InferAppContext } from '@taserjs/router'\n\nimport { context } from '#src/context.js'\n\nexport const t = createTaserApp({\n response: { validate: true },\n}).context(context)\n\nexport type AppContext = InferAppContext<typeof context>\n`;\n}\n"],"mappings":";AAEA,SAAgB,cAAc,MAA2B;CACvD,QAAQ,MAAR;EACE,KAAK,WACH,OAAO;;;;;;;;;;;;;;;;;;;EAmBT,KAAK,QACH,OAAO;;;;;;;;;;;;;;;;;;EAkBT,KAAK,WACH,OAAO;;;;;;;;;;;;;;;;;;EAkBT,KAAK,OACH,OAAO;;;;;;;;;;;;;;;;EAgBT,KAAK,QACH,OAAO;;;;;;;;;;EAUT,KAAK,cACH,OAAO;;;;;;;;;;;;;;;EAeT,KAAK,sBACH,OAAO;;;;;;;;;;;;;EAaT,KAAK,WACH,OAAO;;;;;;;;;;;;;;;EAeT,KAAK,UACH,OAAO;;;;;;;;;;;;;;;EAeT,KAAK,mBACH,OAAO;;;;;;;;;;;;;;;;;;;;;EAqBT,KAAK,oBACH,OAAO;;;;;;;;;;;;;;EAeT,SACE,OAAO;;;;;;;;;;;;;;CAcX;AACF;AAEA,SAAgB,gBAAgB,OAAoB,QAAgB;CAClE,IACE,SAAS,UACT,SAAS,gBACT,SAAS,aACT,SAAS,YACT,SAAS,mBAET,OAAO;;;;;;;;;;;;;;;;;CAmBT,OAAO;;;;;;;;;;AAUT"}
@@ -1,3 +1,3 @@
1
1
  export { scaffoldProject } from './core/scaffold-engine.js';
2
2
  export { getPackageGroups, resolvePackages } from './core/resolve-packages.js';
3
- export type { Framework, ScaffoldOptions, ScaffoldResult, PackageGroups } from './core/types.js';
3
+ export type { PackageGroups, ProjectType, ScaffoldOptions, ScaffoldResult } from './core/types.js';