create-taserjs 0.0.6 → 0.1.1

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 (92) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/addons/prisma/index.cjs +12 -5
  3. package/dist/cjs/addons/prisma/index.cjs.map +1 -1
  4. package/dist/cjs/addons/registry.cjs +3 -1
  5. package/dist/cjs/addons/registry.cjs.map +1 -1
  6. package/dist/cjs/addons/validators.cjs +10 -13
  7. package/dist/cjs/addons/validators.cjs.map +1 -1
  8. package/dist/cjs/cli.cjs +7 -5
  9. package/dist/cjs/cli.cjs.map +1 -1
  10. package/dist/cjs/commands/create.cjs +72 -49
  11. package/dist/cjs/commands/create.cjs.map +1 -1
  12. package/dist/cjs/commands/create.d.cts +2 -1
  13. package/dist/cjs/core/parse-options.cjs +48 -22
  14. package/dist/cjs/core/parse-options.cjs.map +1 -1
  15. package/dist/cjs/core/parse-options.d.cts +19 -4
  16. package/dist/cjs/core/project-config.cjs +5 -1
  17. package/dist/cjs/core/project-config.cjs.map +1 -1
  18. package/dist/cjs/core/resolve-packages.cjs +35 -65
  19. package/dist/cjs/core/resolve-packages.cjs.map +1 -1
  20. package/dist/cjs/core/resolve-packages.d.cts +1 -4
  21. package/dist/cjs/core/scaffold-engine.cjs +16 -27
  22. package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
  23. package/dist/cjs/core/targets.cjs +171 -0
  24. package/dist/cjs/core/targets.cjs.map +1 -0
  25. package/dist/cjs/core/targets.d.cts +49 -0
  26. package/dist/cjs/core/types.cjs +22 -11
  27. package/dist/cjs/core/types.cjs.map +1 -1
  28. package/dist/cjs/core/types.d.cts +20 -4
  29. package/dist/cjs/core/validate-project-name.cjs +0 -1
  30. package/dist/cjs/core/validate-project-name.cjs.map +1 -1
  31. package/dist/cjs/frameworks/index.cjs +79 -171
  32. package/dist/cjs/frameworks/index.cjs.map +1 -1
  33. package/dist/cjs/frameworks/index.d.cts +18 -3
  34. package/dist/cjs/scaffold.d.cts +2 -2
  35. package/dist/cjs/templates/base.cjs +15 -99
  36. package/dist/cjs/templates/base.cjs.map +1 -1
  37. package/dist/cjs/templates/base.d.cts +0 -3
  38. package/dist/cjs/types.d.cts +1 -1
  39. package/dist/esm/addons/prisma/index.js +12 -5
  40. package/dist/esm/addons/prisma/index.js.map +1 -1
  41. package/dist/esm/addons/registry.js +4 -2
  42. package/dist/esm/addons/registry.js.map +1 -1
  43. package/dist/esm/addons/validators.js +10 -13
  44. package/dist/esm/addons/validators.js.map +1 -1
  45. package/dist/esm/cli.js +7 -5
  46. package/dist/esm/cli.js.map +1 -1
  47. package/dist/esm/commands/create.d.ts +2 -1
  48. package/dist/esm/commands/create.js +74 -51
  49. package/dist/esm/commands/create.js.map +1 -1
  50. package/dist/esm/core/parse-options.d.ts +19 -4
  51. package/dist/esm/core/parse-options.js +47 -23
  52. package/dist/esm/core/parse-options.js.map +1 -1
  53. package/dist/esm/core/project-config.js +5 -1
  54. package/dist/esm/core/project-config.js.map +1 -1
  55. package/dist/esm/core/resolve-packages.d.ts +1 -4
  56. package/dist/esm/core/resolve-packages.js +35 -65
  57. package/dist/esm/core/resolve-packages.js.map +1 -1
  58. package/dist/esm/core/scaffold-engine.js +18 -29
  59. package/dist/esm/core/scaffold-engine.js.map +1 -1
  60. package/dist/esm/core/targets.d.ts +49 -0
  61. package/dist/esm/core/targets.js +166 -0
  62. package/dist/esm/core/targets.js.map +1 -0
  63. package/dist/esm/core/types.d.ts +20 -4
  64. package/dist/esm/core/types.js +20 -11
  65. package/dist/esm/core/types.js.map +1 -1
  66. package/dist/esm/core/validate-project-name.js +0 -1
  67. package/dist/esm/core/validate-project-name.js.map +1 -1
  68. package/dist/esm/frameworks/index.d.ts +18 -3
  69. package/dist/esm/frameworks/index.js +76 -171
  70. package/dist/esm/frameworks/index.js.map +1 -1
  71. package/dist/esm/scaffold.d.ts +2 -2
  72. package/dist/esm/templates/base.d.ts +0 -3
  73. package/dist/esm/templates/base.js +16 -98
  74. package/dist/esm/templates/base.js.map +1 -1
  75. package/dist/esm/types.d.ts +1 -1
  76. package/package.json +3 -2
  77. package/src/addons/prisma/index.ts +12 -5
  78. package/src/addons/registry.ts +6 -2
  79. package/src/addons/validators.ts +10 -13
  80. package/src/cli.ts +6 -4
  81. package/src/commands/create.ts +92 -26
  82. package/src/core/parse-options.ts +84 -35
  83. package/src/core/project-config.ts +6 -1
  84. package/src/core/resolve-packages.ts +37 -74
  85. package/src/core/scaffold-engine.ts +41 -65
  86. package/src/core/targets.ts +211 -0
  87. package/src/core/types.ts +40 -24
  88. package/src/core/validate-project-name.ts +0 -4
  89. package/src/frameworks/index.ts +80 -178
  90. package/src/scaffold.ts +2 -2
  91. package/src/templates/base.ts +14 -98
  92. package/src/types.ts +3 -1
package/README.md CHANGED
@@ -17,7 +17,7 @@ pnpm create taserjs@latest
17
17
  npx jsr @taserjs/create
18
18
  ```
19
19
 
20
- This will scaffold a new Taser application with your choice of framework adapter and optional add-ons.
20
+ This will scaffold a new Taser application with your choice of deployment preset and optional add-ons.
21
21
 
22
22
  ## License
23
23
 
@@ -1,4 +1,9 @@
1
1
  //#region src/addons/prisma/index.ts
2
+ /** Latest Prisma ORM v7 release line — keep all @prisma/* packages on this range. */
3
+ var PRISMA_VERSION = "^7.10.0";
4
+ function prismaPackage(name) {
5
+ return `${name}@${PRISMA_VERSION}`;
6
+ }
2
7
  function prismaProvider(driver) {
3
8
  switch (driver) {
4
9
  case "postgres": return "postgresql";
@@ -15,9 +20,9 @@ function envExample(driver) {
15
20
  }
16
21
  function driverPackages(driver) {
17
22
  switch (driver) {
18
- case "postgres": return ["@prisma/adapter-pg", "pg"];
19
- case "mysql": return ["@prisma/adapter-mariadb", "mariadb"];
20
- default: return ["@prisma/adapter-better-sqlite3", "better-sqlite3"];
23
+ case "postgres": return [prismaPackage("@prisma/adapter-pg"), "pg"];
24
+ case "mysql": return [prismaPackage("@prisma/adapter-mariadb"), "mariadb"];
25
+ default: return [prismaPackage("@prisma/adapter-better-sqlite3"), "better-sqlite3"];
21
26
  }
22
27
  }
23
28
  function driverDevPackages(driver) {
@@ -94,10 +99,12 @@ var prismaAddon = {
94
99
  id: "prisma",
95
100
  category: "database",
96
101
  dependencies(ctx) {
97
- return ["@prisma/client", ...driverPackages(ctx.driver ?? "sqlite")];
102
+ const driver = ctx.driver ?? "sqlite";
103
+ return [prismaPackage("@prisma/client"), ...driverPackages(driver)];
98
104
  },
99
105
  devDependencies(ctx) {
100
- return ["prisma", ...driverDevPackages(ctx.driver ?? "sqlite")];
106
+ const driver = ctx.driver ?? "sqlite";
107
+ return [prismaPackage("prisma"), ...driverDevPackages(driver)];
101
108
  },
102
109
  scripts() {
103
110
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/prisma/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\nimport type { DbDriver } from \"../../core/types.js\";\n\nfunction prismaProvider(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return \"postgresql\";\n case \"mysql\":\n return \"mysql\";\n case \"sqlite\":\n default:\n return \"sqlite\";\n }\n}\n\nfunction envExample(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return \"DATABASE_URL=postgresql://user:password@localhost:5432/mydb\\n\";\n case \"mysql\":\n return \"DATABASE_URL=mysql://user:password@localhost:3306/mydb\\n\";\n case \"sqlite\":\n default:\n return \"DATABASE_URL=file:./local.db\\n\";\n }\n}\n\nfunction driverPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"@prisma/adapter-pg\", \"pg\"];\n case \"mysql\":\n return [\"@prisma/adapter-mariadb\", \"mariadb\"];\n case \"sqlite\":\n default:\n return [\"@prisma/adapter-better-sqlite3\", \"better-sqlite3\"];\n }\n}\n\nfunction driverDevPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"@types/pg\"];\n case \"sqlite\":\n return [\"@types/better-sqlite3\"];\n case \"mysql\":\n default:\n return [];\n }\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { PrismaPg } from '@prisma/adapter-pg'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaPg({\n connectionString: process.env.DATABASE_URL,\n })\n return new PrismaClient({ adapter })\n}\n`;\n case \"mysql\":\n return `import { PrismaMariaDb } from '@prisma/adapter-mariadb'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaMariaDb(process.env.DATABASE_URL ?? 'mariadb://root:@localhost:3306/mydb')\n return new PrismaClient({ adapter })\n}\n`;\n case \"sqlite\":\n default:\n return `import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaBetterSqlite3({\n url: process.env.DATABASE_URL ?? 'file:./local.db',\n })\n return new PrismaClient({ adapter })\n}\n`;\n }\n}\n\nfunction prismaConfigSource(): string {\n return `import 'dotenv/config'\nimport { defineConfig, env } from 'prisma/config'\n\nexport default defineConfig({\n schema: 'prisma/schema.prisma',\n datasource: {\n url: env('DATABASE_URL'),\n },\n})\n`;\n}\n\nfunction schemaSource(driver: DbDriver): string {\n const provider = prismaProvider(driver);\n return `generator client {\n provider = \"prisma-client\"\n output = \"../src/db/prisma\"\n}\n\ndatasource db {\n provider = \"${provider}\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n email String\n}\n`;\n}\n\nexport const prismaAddon: AddonDefinition = {\n id: \"prisma\",\n category: \"database\",\n dependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"@prisma/client\", ...driverPackages(driver)];\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"prisma\", ...driverDevPackages(driver)];\n },\n scripts() {\n return {\n \"db:generate\": \"prisma generate\",\n \"db:push\": \"prisma db push\",\n };\n },\n bootBinding() {\n return {\n key: \"db\",\n importPath: \"./db/index.js\",\n factoryName: \"createDb\",\n };\n },\n async apply(ctx, write) {\n const driver = ctx.driver ?? \"sqlite\";\n await write(\"prisma.config.ts\", prismaConfigSource());\n await write(\"prisma/schema.prisma\", schemaSource(driver));\n await write(\"src/db/index.ts\", dbIndexSource(driver));\n await write(\".env.example\", envExample(driver));\n },\n};\n"],"mappings":";AAGA,SAAS,eAAe,QAA0B;CAChD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,eAAe,QAA4B;CAClD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,sBAAsB,IAAI;EACpC,KAAK,SACH,OAAO,CAAC,2BAA2B,SAAS;EAE9C,SACE,OAAO,CAAC,kCAAkC,gBAAgB;CAC9D;AACF;AAEA,SAAS,kBAAkB,QAA4B;CACrD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,WAAW;EACrB,KAAK,UACH,OAAO,CAAC,uBAAuB;EAEjC,SACE,OAAO,CAAC;CACZ;AACF;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;EAWT,KAAK,SACH,OAAO;;;;;;;;;EAUT,SACE,OAAO;;;;;;;;;;;CAWX;AACF;AAEA,SAAS,qBAA6B;CACpC,OAAO;;;;;;;;;;AAUT;AAEA,SAAS,aAAa,QAA0B;CAE9C,OAAO;;;;;;gBADU,eAAe,MAOlB,EAAS;;;;;;;;AAQzB;AAEA,IAAa,cAA+B;CAC1C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,kBAAkB,GAAG,eADd,IAAI,UAAU,QACqB,CAAC;CACrD;CACA,gBAAgB,KAAK;EAEnB,OAAO,CAAC,UAAU,GAAG,kBADN,IAAI,UAAU,QACgB,CAAC;CAChD;CACA,UAAU;EACR,OAAO;GACL,eAAe;GACf,WAAW;EACb;CACF;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,KAAK,OAAO;EACtB,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,MAAM,oBAAoB,mBAAmB,CAAC;EACpD,MAAM,MAAM,wBAAwB,aAAa,MAAM,CAAC;EACxD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/prisma/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\nimport type { DbDriver } from \"../../core/types.js\";\n\n/** Latest Prisma ORM v7 release line — keep all @prisma/* packages on this range. */\nconst PRISMA_VERSION = \"^7.10.0\";\n\nfunction prismaPackage(name: string): string {\n return `${name}@${PRISMA_VERSION}`;\n}\n\nfunction prismaProvider(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return \"postgresql\";\n case \"mysql\":\n return \"mysql\";\n case \"sqlite\":\n default:\n return \"sqlite\";\n }\n}\n\nfunction envExample(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return \"DATABASE_URL=postgresql://user:password@localhost:5432/mydb\\n\";\n case \"mysql\":\n return \"DATABASE_URL=mysql://user:password@localhost:3306/mydb\\n\";\n case \"sqlite\":\n default:\n return \"DATABASE_URL=file:./local.db\\n\";\n }\n}\n\nfunction driverPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [prismaPackage(\"@prisma/adapter-pg\"), \"pg\"];\n case \"mysql\":\n return [prismaPackage(\"@prisma/adapter-mariadb\"), \"mariadb\"];\n case \"sqlite\":\n default:\n return [prismaPackage(\"@prisma/adapter-better-sqlite3\"), \"better-sqlite3\"];\n }\n}\n\nfunction driverDevPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"@types/pg\"];\n case \"sqlite\":\n return [\"@types/better-sqlite3\"];\n case \"mysql\":\n default:\n return [];\n }\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { PrismaPg } from '@prisma/adapter-pg'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaPg({\n connectionString: process.env.DATABASE_URL,\n })\n return new PrismaClient({ adapter })\n}\n`;\n case \"mysql\":\n return `import { PrismaMariaDb } from '@prisma/adapter-mariadb'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaMariaDb(process.env.DATABASE_URL ?? 'mariadb://root:@localhost:3306/mydb')\n return new PrismaClient({ adapter })\n}\n`;\n case \"sqlite\":\n default:\n return `import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaBetterSqlite3({\n url: process.env.DATABASE_URL ?? 'file:./local.db',\n })\n return new PrismaClient({ adapter })\n}\n`;\n }\n}\n\nfunction prismaConfigSource(): string {\n return `import 'dotenv/config'\nimport { defineConfig, env } from 'prisma/config'\n\nexport default defineConfig({\n schema: 'prisma/schema.prisma',\n datasource: {\n url: env('DATABASE_URL'),\n },\n})\n`;\n}\n\nfunction schemaSource(driver: DbDriver): string {\n const provider = prismaProvider(driver);\n return `generator client {\n provider = \"prisma-client\"\n output = \"../src/db/prisma\"\n}\n\ndatasource db {\n provider = \"${provider}\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n email String\n}\n`;\n}\n\nexport const prismaAddon: AddonDefinition = {\n id: \"prisma\",\n category: \"database\",\n dependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [prismaPackage(\"@prisma/client\"), ...driverPackages(driver)];\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [prismaPackage(\"prisma\"), ...driverDevPackages(driver)];\n },\n scripts() {\n return {\n \"db:generate\": \"prisma generate\",\n \"db:push\": \"prisma db push\",\n };\n },\n bootBinding() {\n return {\n key: \"db\",\n importPath: \"./db/index.js\",\n factoryName: \"createDb\",\n };\n },\n async apply(ctx, write) {\n const driver = ctx.driver ?? \"sqlite\";\n await write(\"prisma.config.ts\", prismaConfigSource());\n await write(\"prisma/schema.prisma\", schemaSource(driver));\n await write(\"src/db/index.ts\", dbIndexSource(driver));\n await write(\".env.example\", envExample(driver));\n },\n};\n"],"mappings":";;AAIA,IAAM,iBAAiB;AAEvB,SAAS,cAAc,MAAsB;CAC3C,OAAO,GAAG,KAAK,GAAG;AACpB;AAEA,SAAS,eAAe,QAA0B;CAChD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,eAAe,QAA4B;CAClD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,cAAc,oBAAoB,GAAG,IAAI;EACnD,KAAK,SACH,OAAO,CAAC,cAAc,yBAAyB,GAAG,SAAS;EAE7D,SACE,OAAO,CAAC,cAAc,gCAAgC,GAAG,gBAAgB;CAC7E;AACF;AAEA,SAAS,kBAAkB,QAA4B;CACrD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,WAAW;EACrB,KAAK,UACH,OAAO,CAAC,uBAAuB;EAEjC,SACE,OAAO,CAAC;CACZ;AACF;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;EAWT,KAAK,SACH,OAAO;;;;;;;;;EAUT,SACE,OAAO;;;;;;;;;;;CAWX;AACF;AAEA,SAAS,qBAA6B;CACpC,OAAO;;;;;;;;;;AAUT;AAEA,SAAS,aAAa,QAA0B;CAE9C,OAAO;;;;;;gBADU,eAAe,MAOlB,EAAS;;;;;;;;AAQzB;AAEA,IAAa,cAA+B;CAC1C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAChB,MAAM,SAAS,IAAI,UAAU;EAC7B,OAAO,CAAC,cAAc,gBAAgB,GAAG,GAAG,eAAe,MAAM,CAAC;CACpE;CACA,gBAAgB,KAAK;EACnB,MAAM,SAAS,IAAI,UAAU;EAC7B,OAAO,CAAC,cAAc,QAAQ,GAAG,GAAG,kBAAkB,MAAM,CAAC;CAC/D;CACA,UAAU;EACR,OAAO;GACL,eAAe;GACf,WAAW;EACb;CACF;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,KAAK,OAAO;EACtB,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,MAAM,oBAAoB,mBAAmB,CAAC;EACpD,MAAM,MAAM,wBAAwB,aAAa,MAAM,CAAC;EACxD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
@@ -23,7 +23,9 @@ var LOGGER_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "logger");
23
23
  var VALIDATOR_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "validator");
24
24
  function getCapabilitiesCatalog() {
25
25
  return {
26
- types: [...require_types.PROJECT_TYPES],
26
+ frameworks: [...require_types.FRAMEWORKS],
27
+ deployTargets: [...require_types.DEPLOY_TARGETS],
28
+ runtimes: [...require_types.RUNTIMES],
27
29
  db: {
28
30
  odms: [...require_types.DB_ODMS],
29
31
  drivers: [...require_types.DB_DRIVERS],
@@ -1 +1 @@
1
- {"version":3,"file":"registry.cjs","names":[],"sources":["../../../src/addons/registry.ts"],"sourcesContent":["import { arktypeAddon } from \"./arktype/index.js\";\nimport { drizzleAddon } from \"./drizzle/index.js\";\nimport { kyselyAddon } from \"./kysely/index.js\";\nimport { pinoAddon } from \"./pino/index.js\";\nimport { prismaAddon } from \"./prisma/index.js\";\nimport { valibotAddon } from \"./valibot/index.js\";\nimport { winstonAddon } from \"./winston/index.js\";\nimport { zodAddon } from \"./zod/index.js\";\nimport type { AddonDefinition } from \"./types.js\";\nimport type { CapabilitiesCatalog, ScaffoldContext } from \"../core/types.js\";\nimport {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n LOGGERS,\n PROJECT_TYPES,\n VALIDATORS,\n} from \"../core/types.js\";\n\nconst ALL_ADDONS: AddonDefinition[] = [\n drizzleAddon,\n prismaAddon,\n kyselyAddon,\n pinoAddon,\n winstonAddon,\n zodAddon,\n arktypeAddon,\n valibotAddon,\n];\n\nconst DB_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"database\");\nconst LOGGER_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"logger\");\nconst VALIDATOR_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"validator\");\n\nexport function getCapabilitiesCatalog(): CapabilitiesCatalog {\n return {\n types: [...PROJECT_TYPES],\n db: {\n odms: [...DB_ODMS],\n drivers: [...DB_DRIVERS],\n defaultDriver: DEFAULT_DB_DRIVER,\n },\n loggers: [...LOGGERS],\n validators: [...VALIDATORS],\n };\n}\n\nexport function resolveAddons(ctx: ScaffoldContext): AddonDefinition[] {\n const selected: AddonDefinition[] = [];\n\n if (ctx.db) {\n const dbAddon = DB_ADDONS.find((addon) => addon.id === ctx.db);\n if (!dbAddon) {\n throw new Error(`Unknown database addon \"${ctx.db}\"`);\n }\n selected.push(dbAddon);\n }\n\n if (ctx.logger) {\n const loggerAddon = LOGGER_ADDONS.find((addon) => addon.id === ctx.logger);\n if (!loggerAddon) {\n throw new Error(`Unknown logger addon \"${ctx.logger}\"`);\n }\n selected.push(loggerAddon);\n }\n\n if (ctx.validator) {\n const validatorAddon = VALIDATOR_ADDONS.find((addon) => addon.id === ctx.validator);\n if (!validatorAddon) {\n throw new Error(`Unknown validator addon \"${ctx.validator}\"`);\n }\n selected.push(validatorAddon);\n }\n\n return selected;\n}\n\nexport function collectBootBindings(ctx: ScaffoldContext) {\n return resolveAddons(ctx)\n .map((addon) => addon.bootBinding?.(ctx))\n .filter((v): v is NonNullable<typeof v> => Boolean(v));\n}\n"],"mappings":";;;;;;;;;;AAmBA,IAAM,aAAgC;CACpC,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,cAAA;CACA,gBAAA;AACF;AAEA,IAAM,YAAY,WAAW,QAAQ,UAAU,MAAM,aAAa,UAAU;AAC5E,IAAM,gBAAgB,WAAW,QAAQ,UAAU,MAAM,aAAa,QAAQ;AAC9E,IAAM,mBAAmB,WAAW,QAAQ,UAAU,MAAM,aAAa,WAAW;AAEpF,SAAgB,yBAA8C;CAC5D,OAAO;EACL,OAAO,CAAC,GAAG,cAAA,aAAa;EACxB,IAAI;GACF,MAAM,CAAC,GAAG,cAAA,OAAO;GACjB,SAAS,CAAC,GAAG,cAAA,UAAU;GACvB,eAAe,cAAA;EACjB;EACA,SAAS,CAAC,GAAG,cAAA,OAAO;EACpB,YAAY,CAAC,GAAG,cAAA,UAAU;CAC5B;AACF;AAEA,SAAgB,cAAc,KAAyC;CACrE,MAAM,WAA8B,CAAC;CAErC,IAAI,IAAI,IAAI;EACV,MAAM,UAAU,UAAU,MAAM,UAAU,MAAM,OAAO,IAAI,EAAE;EAC7D,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,2BAA2B,IAAI,GAAG,EAAE;EAEtD,SAAS,KAAK,OAAO;CACvB;CAEA,IAAI,IAAI,QAAQ;EACd,MAAM,cAAc,cAAc,MAAM,UAAU,MAAM,OAAO,IAAI,MAAM;EACzE,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,yBAAyB,IAAI,OAAO,EAAE;EAExD,SAAS,KAAK,WAAW;CAC3B;CAEA,IAAI,IAAI,WAAW;EACjB,MAAM,iBAAiB,iBAAiB,MAAM,UAAU,MAAM,OAAO,IAAI,SAAS;EAClF,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;EAE9D,SAAS,KAAK,cAAc;CAC9B;CAEA,OAAO;AACT;AAEA,SAAgB,oBAAoB,KAAsB;CACxD,OAAO,cAAc,GAAG,CAAC,CACtB,KAAK,UAAU,MAAM,cAAc,GAAG,CAAC,CAAC,CACxC,QAAQ,MAAkC,QAAQ,CAAC,CAAC;AACzD"}
1
+ {"version":3,"file":"registry.cjs","names":[],"sources":["../../../src/addons/registry.ts"],"sourcesContent":["import { arktypeAddon } from \"./arktype/index.js\";\nimport { drizzleAddon } from \"./drizzle/index.js\";\nimport { kyselyAddon } from \"./kysely/index.js\";\nimport { pinoAddon } from \"./pino/index.js\";\nimport { prismaAddon } from \"./prisma/index.js\";\nimport { valibotAddon } from \"./valibot/index.js\";\nimport { winstonAddon } from \"./winston/index.js\";\nimport { zodAddon } from \"./zod/index.js\";\nimport type { AddonDefinition } from \"./types.js\";\nimport type { CapabilitiesCatalog, ScaffoldContext } from \"../core/types.js\";\nimport {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n DEPLOY_TARGETS,\n FRAMEWORKS,\n LOGGERS,\n RUNTIMES,\n VALIDATORS,\n} from \"../core/types.js\";\n\nconst ALL_ADDONS: AddonDefinition[] = [\n drizzleAddon,\n prismaAddon,\n kyselyAddon,\n pinoAddon,\n winstonAddon,\n zodAddon,\n arktypeAddon,\n valibotAddon,\n];\n\nconst DB_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"database\");\nconst LOGGER_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"logger\");\nconst VALIDATOR_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"validator\");\n\nexport function getCapabilitiesCatalog(): CapabilitiesCatalog {\n return {\n frameworks: [...FRAMEWORKS],\n deployTargets: [...DEPLOY_TARGETS],\n runtimes: [...RUNTIMES],\n db: {\n odms: [...DB_ODMS],\n drivers: [...DB_DRIVERS],\n defaultDriver: DEFAULT_DB_DRIVER,\n },\n loggers: [...LOGGERS],\n validators: [...VALIDATORS],\n };\n}\n\nexport function resolveAddons(ctx: ScaffoldContext): AddonDefinition[] {\n const selected: AddonDefinition[] = [];\n\n if (ctx.db) {\n const dbAddon = DB_ADDONS.find((addon) => addon.id === ctx.db);\n if (!dbAddon) {\n throw new Error(`Unknown database addon \"${ctx.db}\"`);\n }\n selected.push(dbAddon);\n }\n\n if (ctx.logger) {\n const loggerAddon = LOGGER_ADDONS.find((addon) => addon.id === ctx.logger);\n if (!loggerAddon) {\n throw new Error(`Unknown logger addon \"${ctx.logger}\"`);\n }\n selected.push(loggerAddon);\n }\n\n if (ctx.validator) {\n const validatorAddon = VALIDATOR_ADDONS.find((addon) => addon.id === ctx.validator);\n if (!validatorAddon) {\n throw new Error(`Unknown validator addon \"${ctx.validator}\"`);\n }\n selected.push(validatorAddon);\n }\n\n return selected;\n}\n\nexport function collectBootBindings(ctx: ScaffoldContext) {\n return resolveAddons(ctx)\n .map((addon) => addon.bootBinding?.(ctx))\n .filter((v): v is NonNullable<typeof v> => Boolean(v));\n}\n"],"mappings":";;;;;;;;;;AAqBA,IAAM,aAAgC;CACpC,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,cAAA;CACA,gBAAA;AACF;AAEA,IAAM,YAAY,WAAW,QAAQ,UAAU,MAAM,aAAa,UAAU;AAC5E,IAAM,gBAAgB,WAAW,QAAQ,UAAU,MAAM,aAAa,QAAQ;AAC9E,IAAM,mBAAmB,WAAW,QAAQ,UAAU,MAAM,aAAa,WAAW;AAEpF,SAAgB,yBAA8C;CAC5D,OAAO;EACL,YAAY,CAAC,GAAG,cAAA,UAAU;EAC1B,eAAe,CAAC,GAAG,cAAA,cAAc;EACjC,UAAU,CAAC,GAAG,cAAA,QAAQ;EACtB,IAAI;GACF,MAAM,CAAC,GAAG,cAAA,OAAO;GACjB,SAAS,CAAC,GAAG,cAAA,UAAU;GACvB,eAAe,cAAA;EACjB;EACA,SAAS,CAAC,GAAG,cAAA,OAAO;EACpB,YAAY,CAAC,GAAG,cAAA,UAAU;CAC5B;AACF;AAEA,SAAgB,cAAc,KAAyC;CACrE,MAAM,WAA8B,CAAC;CAErC,IAAI,IAAI,IAAI;EACV,MAAM,UAAU,UAAU,MAAM,UAAU,MAAM,OAAO,IAAI,EAAE;EAC7D,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,2BAA2B,IAAI,GAAG,EAAE;EAEtD,SAAS,KAAK,OAAO;CACvB;CAEA,IAAI,IAAI,QAAQ;EACd,MAAM,cAAc,cAAc,MAAM,UAAU,MAAM,OAAO,IAAI,MAAM;EACzE,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,yBAAyB,IAAI,OAAO,EAAE;EAExD,SAAS,KAAK,WAAW;CAC3B;CAEA,IAAI,IAAI,WAAW;EACjB,MAAM,iBAAiB,iBAAiB,MAAM,UAAU,MAAM,OAAO,IAAI,SAAS;EAClF,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;EAE9D,SAAS,KAAK,cAAc;CAC9B;CAEA,OAAO;AACT;AAEA,SAAgB,oBAAoB,KAAsB;CACxD,OAAO,cAAc,GAAG,CAAC,CACtB,KAAK,UAAU,MAAM,cAAc,GAAG,CAAC,CAAC,CACxC,QAAQ,MAAkC,QAAQ,CAAC,CAAC;AACzD"}
@@ -5,25 +5,22 @@ var IMPORT_LINES = {
5
5
  valibot: `import * as v from 'valibot'`
6
6
  };
7
7
  var VALIDATION_BLOCK_TEMPLATE = {
8
- zod: `, {
9
- query: z.object({ name: z.string().default('Taser') }),
10
- }`,
11
- arktype: `, {
12
- query: type({ 'name?': 'string = "Taser"' }),
13
- }`,
14
- valibot: `, {
15
- query: v.object({ name: v.optional(v.string(), 'Taser') }),
16
- }`
8
+ zod: `
9
+ .query(z.object({ name: z.string().default('Taser') }))`,
10
+ arktype: `
11
+ .query(type({ 'name?': 'string = "Taser"' }))`,
12
+ valibot: `
13
+ .query(v.object({ name: v.optional(v.string(), 'Taser') }))`
17
14
  };
18
- var ROUTE_TEMPLATE = (validator) => `import { reply } from '@taserjs/router'
19
- import { t } from '#src/taser.js'
15
+ var ROUTE_TEMPLATE = (validator) => `import { json } from '@taserjs/router/reply'
16
+ import { t } from '#taserjs/router'
20
17
  ${IMPORT_LINES[validator]}
21
18
 
22
- const GET = t.get('/'${VALIDATION_BLOCK_TEMPLATE[validator]})
19
+ const GET = t.get('/')${VALIDATION_BLOCK_TEMPLATE[validator]}
23
20
 
24
21
  export type RouteContext = typeof GET.$Infer.Context
25
22
  export const Route = GET.handler((ctx) => {
26
- return reply.json({ message: \`Hello, \${ctx.query.name}!\` })
23
+ return json({ message: \`Hello, \${ctx.query.name}!\` })
27
24
  })
28
25
  `;
29
26
  var ValidatorAddon = (validator) => {
@@ -1 +1 @@
1
- {"version":3,"file":"validators.cjs","names":[],"sources":["../../../src/addons/validators.ts"],"sourcesContent":["import type { ValidatorId } from \"../core/types\";\nimport type { AddonDefinition } from \"./types\";\n\nexport const IMPORT_LINES: Record<ValidatorId, string> = {\n zod: `import { z } from 'zod'`,\n arktype: `import { type } from 'arktype'`,\n valibot: `import * as v from 'valibot'`,\n};\n\nexport const VALIDATION_BLOCK_TEMPLATE: Record<ValidatorId, string> = {\n zod: `, {\n query: z.object({ name: z.string().default('Taser') }),\n}`,\n arktype: `, {\n query: type({ 'name?': 'string = \"Taser\"' }),\n}`,\n valibot: `, {\n query: v.object({ name: v.optional(v.string(), 'Taser') }),\n}`,\n};\n\nconst ROUTE_TEMPLATE = (validator: ValidatorId) => `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n${IMPORT_LINES[validator]}\n\nconst GET = t.get('/'${VALIDATION_BLOCK_TEMPLATE[validator]})\n\nexport type RouteContext = typeof GET.$Infer.Context\nexport const Route = GET.handler((ctx) => {\n return reply.json({ message: \\`Hello, \\${ctx.query.name}!\\` })\n})\n`;\n\nexport const ValidatorAddon = (validator: ValidatorId): AddonDefinition => {\n return {\n id: validator,\n category: \"validator\",\n dependencies: () => [validator],\n devDependencies: () => [],\n apply: (ctx, write) => write(\"src/routes/index.get.ts\", ROUTE_TEMPLATE(validator)),\n };\n};\n"],"mappings":";AAGA,IAAa,eAA4C;CACvD,KAAK;CACL,SAAS;CACT,SAAS;AACX;AAEA,IAAa,4BAAyD;CACpE,KAAK;;;CAGL,SAAS;;;CAGT,SAAS;;;AAGX;AAEA,IAAM,kBAAkB,cAA2B;;EAEjD,aAAa,WAAW;;uBAEH,0BAA0B,WAAW;;;;;;;AAQ5D,IAAa,kBAAkB,cAA4C;CACzE,OAAO;EACL,IAAI;EACJ,UAAU;EACV,oBAAoB,CAAC,SAAS;EAC9B,uBAAuB,CAAC;EACxB,QAAQ,KAAK,UAAU,MAAM,2BAA2B,eAAe,SAAS,CAAC;CACnF;AACF"}
1
+ {"version":3,"file":"validators.cjs","names":[],"sources":["../../../src/addons/validators.ts"],"sourcesContent":["import type { ValidatorId } from \"../core/types\";\nimport type { AddonDefinition } from \"./types\";\n\nexport const IMPORT_LINES: Record<ValidatorId, string> = {\n zod: `import { z } from 'zod'`,\n arktype: `import { type } from 'arktype'`,\n valibot: `import * as v from 'valibot'`,\n};\n\nexport const VALIDATION_BLOCK_TEMPLATE: Record<ValidatorId, string> = {\n zod: `\n .query(z.object({ name: z.string().default('Taser') }))`,\n arktype: `\n .query(type({ 'name?': 'string = \"Taser\"' }))`,\n valibot: `\n .query(v.object({ name: v.optional(v.string(), 'Taser') }))`,\n};\n\nconst ROUTE_TEMPLATE = (validator: ValidatorId) => `import { json } from '@taserjs/router/reply'\nimport { t } from '#taserjs/router'\n${IMPORT_LINES[validator]}\n\nconst GET = t.get('/')${VALIDATION_BLOCK_TEMPLATE[validator]}\n\nexport type RouteContext = typeof GET.$Infer.Context\nexport const Route = GET.handler((ctx) => {\n return json({ message: \\`Hello, \\${ctx.query.name}!\\` })\n})\n`;\n\nexport const ValidatorAddon = (validator: ValidatorId): AddonDefinition => {\n return {\n id: validator,\n category: \"validator\",\n dependencies: () => [validator],\n devDependencies: () => [],\n apply: (ctx, write) => write(\"src/routes/index.get.ts\", ROUTE_TEMPLATE(validator)),\n };\n};\n"],"mappings":";AAGA,IAAa,eAA4C;CACvD,KAAK;CACL,SAAS;CACT,SAAS;AACX;AAEA,IAAa,4BAAyD;CACpE,KAAK;;CAEL,SAAS;;CAET,SAAS;;AAEX;AAEA,IAAM,kBAAkB,cAA2B;;EAEjD,aAAa,WAAW;;wBAEF,0BAA0B,WAAW;;;;;;;AAQ7D,IAAa,kBAAkB,cAA4C;CACzE,OAAO;EACL,IAAI;EACJ,UAAU;EACV,oBAAoB,CAAC,SAAS;EAC9B,uBAAuB,CAAC;EACxB,QAAQ,KAAK,UAAU,MAAM,2BAA2B,eAAe,SAAS,CAAC;CACnF;AACF"}
package/dist/cjs/cli.cjs CHANGED
@@ -12,14 +12,15 @@ async function main() {
12
12
  const { values, positionals } = (0, node_util.parseArgs)({
13
13
  args: process.argv.slice(2),
14
14
  options: {
15
- type: {
15
+ preset: {
16
16
  type: "string",
17
- short: "t"
17
+ short: "p"
18
18
  },
19
- framework: { type: "string" },
20
19
  db: { type: "string" },
21
20
  logger: { type: "string" },
22
21
  validator: { type: "string" },
22
+ framework: { type: "string" },
23
+ runtime: { type: "string" },
23
24
  y: {
24
25
  type: "boolean",
25
26
  short: "y"
@@ -30,11 +31,12 @@ async function main() {
30
31
  allowPositionals: true
31
32
  });
32
33
  const parsed = require_create.buildParsedArgsFromCli({
33
- ...values.type !== void 0 ? { type: values.type } : {},
34
- ...values.framework !== void 0 ? { framework: values.framework } : {},
34
+ ...values.preset !== void 0 ? { preset: values.preset } : {},
35
35
  ...values.db !== void 0 ? { db: values.db } : {},
36
36
  ...values.logger !== void 0 ? { logger: values.logger } : {},
37
37
  ...values.validator !== void 0 ? { validator: values.validator } : {},
38
+ ...values.framework !== void 0 ? { framework: values.framework } : {},
39
+ ...values.runtime !== void 0 ? { runtime: values.runtime } : {},
38
40
  ...values.y !== void 0 ? { y: values.y } : {},
39
41
  ...values.noInstall !== void 0 ? { noInstall: values.noInstall } : {},
40
42
  ...values.json !== void 0 ? { json: values.json } : {}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","names":[],"sources":["../../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\n\nimport * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { buildParsedArgsFromCli, runCreateCommand } from \"./commands/create.js\";\nimport { printJsonError } from \"./core/json-output.js\";\n\nasync function main(): Promise<void> {\n const { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n options: {\n type: { type: \"string\", short: \"t\" },\n framework: { type: \"string\" },\n db: { type: \"string\" },\n logger: { type: \"string\" },\n validator: { type: \"string\" },\n y: { type: \"boolean\", short: \"y\" },\n noInstall: { type: \"boolean\" },\n json: { type: \"boolean\" },\n },\n allowPositionals: true,\n });\n\n const parsed = buildParsedArgsFromCli(\n {\n ...(values.type !== undefined ? { type: values.type } : {}),\n ...(values.framework !== undefined ? { framework: values.framework } : {}),\n ...(values.db !== undefined ? { db: values.db } : {}),\n ...(values.logger !== undefined ? { logger: values.logger } : {}),\n ...(values.validator !== undefined ? { validator: values.validator } : {}),\n ...(values.y !== undefined ? { y: values.y } : {}),\n ...(values.noInstall !== undefined ? { noInstall: values.noInstall } : {}),\n ...(values.json !== undefined ? { json: values.json } : {}),\n },\n positionals,\n );\n\n if (!parsed.json) {\n console.clear();\n p.intro(color.bgCyan(color.black(\" create-taser \")));\n }\n\n try {\n await runCreateCommand(parsed);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (parsed.json) {\n printJsonError(message);\n process.exit(1);\n }\n throw error;\n }\n}\n\nmain().catch((error: unknown) => {\n console.error(error);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;AASA,eAAe,OAAsB;CACnC,MAAM,EAAE,QAAQ,iBAAA,GAAgB,UAAA,UAAA,CAAU;EACxC,MAAM,QAAQ,KAAK,MAAM,CAAC;EAC1B,SAAS;GACP,MAAM;IAAE,MAAM;IAAU,OAAO;GAAI;GACnC,WAAW,EAAE,MAAM,SAAS;GAC5B,IAAI,EAAE,MAAM,SAAS;GACrB,QAAQ,EAAE,MAAM,SAAS;GACzB,WAAW,EAAE,MAAM,SAAS;GAC5B,GAAG;IAAE,MAAM;IAAW,OAAO;GAAI;GACjC,WAAW,EAAE,MAAM,UAAU;GAC7B,MAAM,EAAE,MAAM,UAAU;EAC1B;EACA,kBAAkB;CACpB,CAAC;CAED,MAAM,SAAS,eAAA,uBACb;EACE,GAAI,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;EACzD,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACxE,GAAI,OAAO,OAAO,KAAA,IAAY,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC;EACnD,GAAI,OAAO,WAAW,KAAA,IAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;EAC/D,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACxE,GAAI,OAAO,MAAM,KAAA,IAAY,EAAE,GAAG,OAAO,EAAE,IAAI,CAAC;EAChD,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACxE,GAAI,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;CAC3D,GACA,WACF;CAEA,IAAI,CAAC,OAAO,MAAM;EAChB,QAAQ,MAAM;EACd,eAAE,MAAM,WAAA,QAAM,OAAO,WAAA,QAAM,MAAM,gBAAgB,CAAC,CAAC;CACrD;CAEA,IAAI;EACF,MAAM,eAAA,iBAAiB,MAAM;CAC/B,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACrE,IAAI,OAAO,MAAM;GACf,oBAAA,eAAe,OAAO;GACtB,QAAQ,KAAK,CAAC;EAChB;EACA,MAAM;CACR;AACF;AAEA,KAAK,CAAC,CAAC,OAAO,UAAmB;CAC/B,QAAQ,MAAM,KAAK;CACnB,QAAQ,KAAK,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"cli.cjs","names":[],"sources":["../../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\n\nimport * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { buildParsedArgsFromCli, runCreateCommand } from \"./commands/create.js\";\nimport { printJsonError } from \"./core/json-output.js\";\n\nasync function main(): Promise<void> {\n const { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n options: {\n preset: { type: \"string\", short: \"p\" },\n db: { type: \"string\" },\n logger: { type: \"string\" },\n validator: { type: \"string\" },\n framework: { type: \"string\" },\n runtime: { type: \"string\" },\n y: { type: \"boolean\", short: \"y\" },\n noInstall: { type: \"boolean\" },\n json: { type: \"boolean\" },\n },\n allowPositionals: true,\n });\n\n const parsed = buildParsedArgsFromCli(\n {\n ...(values.preset !== undefined ? { preset: values.preset } : {}),\n ...(values.db !== undefined ? { db: values.db } : {}),\n ...(values.logger !== undefined ? { logger: values.logger } : {}),\n ...(values.validator !== undefined ? { validator: values.validator } : {}),\n ...(values.framework !== undefined ? { framework: values.framework } : {}),\n ...(values.runtime !== undefined ? { runtime: values.runtime } : {}),\n ...(values.y !== undefined ? { y: values.y } : {}),\n ...(values.noInstall !== undefined ? { noInstall: values.noInstall } : {}),\n ...(values.json !== undefined ? { json: values.json } : {}),\n },\n positionals,\n );\n\n if (!parsed.json) {\n console.clear();\n p.intro(color.bgCyan(color.black(\" create-taser \")));\n }\n\n try {\n await runCreateCommand(parsed);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (parsed.json) {\n printJsonError(message);\n process.exit(1);\n }\n throw error;\n }\n}\n\nmain().catch((error: unknown) => {\n console.error(error);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;AASA,eAAe,OAAsB;CACnC,MAAM,EAAE,QAAQ,iBAAA,GAAgB,UAAA,UAAA,CAAU;EACxC,MAAM,QAAQ,KAAK,MAAM,CAAC;EAC1B,SAAS;GACP,QAAQ;IAAE,MAAM;IAAU,OAAO;GAAI;GACrC,IAAI,EAAE,MAAM,SAAS;GACrB,QAAQ,EAAE,MAAM,SAAS;GACzB,WAAW,EAAE,MAAM,SAAS;GAC5B,WAAW,EAAE,MAAM,SAAS;GAC5B,SAAS,EAAE,MAAM,SAAS;GAC1B,GAAG;IAAE,MAAM;IAAW,OAAO;GAAI;GACjC,WAAW,EAAE,MAAM,UAAU;GAC7B,MAAM,EAAE,MAAM,UAAU;EAC1B;EACA,kBAAkB;CACpB,CAAC;CAED,MAAM,SAAS,eAAA,uBACb;EACE,GAAI,OAAO,WAAW,KAAA,IAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;EAC/D,GAAI,OAAO,OAAO,KAAA,IAAY,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC;EACnD,GAAI,OAAO,WAAW,KAAA,IAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;EAC/D,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACxE,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACxE,GAAI,OAAO,YAAY,KAAA,IAAY,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;EAClE,GAAI,OAAO,MAAM,KAAA,IAAY,EAAE,GAAG,OAAO,EAAE,IAAI,CAAC;EAChD,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACxE,GAAI,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;CAC3D,GACA,WACF;CAEA,IAAI,CAAC,OAAO,MAAM;EAChB,QAAQ,MAAM;EACd,eAAE,MAAM,WAAA,QAAM,OAAO,WAAA,QAAM,MAAM,gBAAgB,CAAC,CAAC;CACrD;CAEA,IAAI;EACF,MAAM,eAAA,iBAAiB,MAAM;CAC/B,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACrE,IAAI,OAAO,MAAM;GACf,oBAAA,eAAe,OAAO;GACtB,QAAQ,KAAK,CAAC;EAChB;EACA,MAAM;CACR;AACF;AAEA,KAAK,CAAC,CAAC,OAAO,UAAmB;CAC/B,QAAQ,MAAM,KAAK;CACnB,QAAQ,KAAK,CAAC;AAChB,CAAC"}
@@ -2,6 +2,7 @@ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
2
  const require_types = require("../core/types.cjs");
3
3
  const require_registry = require("../addons/registry.cjs");
4
4
  const require_json_output = require("../core/json-output.cjs");
5
+ const require_targets = require("../core/targets.cjs");
5
6
  const require_parse_options = require("../core/parse-options.cjs");
6
7
  const require_package_manager = require("../core/package-manager.cjs");
7
8
  const require_scaffold_engine = require("../core/scaffold-engine.cjs");
@@ -13,8 +14,8 @@ picocolors = require_runtime.__toESM(picocolors, 1);
13
14
  let node_path = require("node:path");
14
15
  node_path = require_runtime.__toESM(node_path, 1);
15
16
  //#region src/commands/create.ts
16
- function isProjectType(value) {
17
- return typeof value === "string" && require_types.PROJECT_TYPES.includes(value);
17
+ function isDeployTarget(value) {
18
+ return typeof value === "string" && require_types.DEPLOY_TARGETS.includes(value);
18
19
  }
19
20
  function isDbOdm(value) {
20
21
  return typeof value === "string" && require_types.DB_ODMS.includes(value);
@@ -41,65 +42,80 @@ async function promptInteractiveOptions(args) {
41
42
  _clack_prompts.cancel("Scaffold cancelled.");
42
43
  process.exit(0);
43
44
  }
44
- const type = args.type ?? await _clack_prompts.select({
45
- message: "Project type (runtime / framework)",
45
+ const framework = args.framework ?? await _clack_prompts.select({
46
+ message: "Host framework",
46
47
  options: [
47
48
  {
48
- value: "node",
49
- label: "Node.js",
50
- hint: "default"
51
- },
52
- {
53
- value: "express",
54
- label: "Express"
55
- },
56
- {
57
- value: "fastify",
58
- label: "Fastify"
49
+ value: "none",
50
+ label: "None",
51
+ hint: "Taser Fetch (default)"
59
52
  },
60
53
  {
61
54
  value: "hono",
62
55
  label: "Hono"
63
56
  },
64
57
  {
65
- value: "bun",
66
- label: "Bun"
67
- },
68
- {
69
- value: "deno",
70
- label: "Deno"
71
- },
72
- {
73
- value: "aws-lambda",
74
- label: "AWS Lambda"
75
- },
76
- {
77
- value: "cloudflare-workers",
78
- label: "Cloudflare Workers"
79
- },
80
- {
81
- value: "netlify",
82
- label: "Netlify"
83
- },
84
- {
85
- value: "vercel",
86
- label: "Vercel"
87
- },
88
- {
89
- value: "azure-functions",
90
- label: "Azure Functions"
58
+ value: "express",
59
+ label: "Express"
91
60
  },
92
61
  {
93
- value: "google-cloud-run",
94
- label: "Google Cloud Run"
62
+ value: "fastify",
63
+ label: "Fastify"
95
64
  }
96
65
  ],
97
- initialValue: "node"
66
+ initialValue: "none"
98
67
  });
99
- if (_clack_prompts.isCancel(type) || !isProjectType(type)) {
68
+ if (_clack_prompts.isCancel(framework)) {
100
69
  _clack_prompts.cancel("Scaffold cancelled.");
101
70
  process.exit(0);
102
71
  }
72
+ const DEPLOY_LABELS = {
73
+ none: "None (Standalone Vite)",
74
+ "node-server": "Node.js server",
75
+ "node-cluster": "Node.js cluster",
76
+ bun: "Bun",
77
+ "deno-server": "Deno",
78
+ "deno-deploy": "Deno Deploy",
79
+ "cloudflare-module": "Cloudflare Workers",
80
+ vercel: "Vercel",
81
+ "aws-lambda": "AWS Lambda",
82
+ netlify: "Netlify"
83
+ };
84
+ const DEPLOY_HINTS = { none: "standalone Vite, no Nitro" };
85
+ const preset = args.preset ?? await _clack_prompts.select({
86
+ message: "Deployment target",
87
+ options: require_types.DEPLOY_TARGETS.map((id) => ({
88
+ value: id,
89
+ label: DEPLOY_LABELS[id],
90
+ ...DEPLOY_HINTS[id] ? { hint: DEPLOY_HINTS[id] } : {}
91
+ })),
92
+ initialValue: "node-server"
93
+ });
94
+ if (_clack_prompts.isCancel(preset) || !isDeployTarget(preset)) {
95
+ _clack_prompts.cancel("Scaffold cancelled.");
96
+ process.exit(0);
97
+ }
98
+ let runtime;
99
+ const runtimeOverrides = require_targets.allowedRuntimeOverrides(preset);
100
+ if (runtimeOverrides.length > 0) {
101
+ const runtimeChoice = args.runtime ?? await _clack_prompts.select({
102
+ message: "Runtime",
103
+ options: [...runtimeOverrides.map((rt) => ({
104
+ value: rt,
105
+ label: rt
106
+ })), {
107
+ value: "default",
108
+ label: `Preset default`,
109
+ hint: "no override"
110
+ }],
111
+ initialValue: "default"
112
+ });
113
+ if (_clack_prompts.isCancel(runtimeChoice)) {
114
+ _clack_prompts.cancel("Scaffold cancelled.");
115
+ process.exit(0);
116
+ }
117
+ runtime = runtimeChoice === "default" ? void 0 : runtimeChoice;
118
+ }
103
119
  const dbChoice = args.db ?? await _clack_prompts.select({
104
120
  message: "Database",
105
121
  options: [
@@ -210,7 +226,9 @@ async function promptInteractiveOptions(args) {
210
226
  const validator = validatorChoice === "none" ? void 0 : isValidatorId(validatorChoice) ? validatorChoice : void 0;
211
227
  return {
212
228
  projectName: String(projectName).trim(),
213
- type,
229
+ framework,
230
+ preset,
231
+ ...runtime !== void 0 ? { runtime } : {},
214
232
  yes: args.yes,
215
233
  noInstall: args.noInstall,
216
234
  json: args.json,
@@ -231,7 +249,7 @@ async function runCreateCommand(args) {
231
249
  const resolved = !args.yes ? await promptInteractiveOptions(args) : {
232
250
  ...args,
233
251
  projectName: args.projectName?.trim(),
234
- type: args.type ?? "node"
252
+ preset: args.preset ?? "node-server"
235
253
  };
236
254
  if (!resolved.projectName) {
237
255
  const message = "Project name is required";
@@ -291,8 +309,13 @@ function buildParsedArgsFromCli(values, positionals) {
291
309
  json: values.json ?? false
292
310
  };
293
311
  if (positionals[0]) args.projectName = positionals[0];
294
- const typeFlag = values.type ?? values.framework;
295
- if (typeFlag) args.type = require_parse_options.parseTypeFlag(typeFlag);
312
+ if (values.preset) {
313
+ const parsed = require_parse_options.parsePresetFlag(values.preset);
314
+ args.preset = parsed.preset;
315
+ if (parsed.warning && !args.json) console.warn(`warning: ${parsed.warning}`);
316
+ }
317
+ if (values.framework) args.framework = require_parse_options.parseFrameworkFlag(values.framework);
318
+ if (values.runtime) args.runtime = require_parse_options.parseRuntimeFlag(values.runtime);
296
319
  if (values.db) {
297
320
  const parsed = require_parse_options.parseDbFlag(values.db);
298
321
  args.db = parsed.db;
@@ -1 +1 @@
1
- {"version":3,"file":"create.cjs","names":[],"sources":["../../../src/commands/create.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { getCapabilitiesCatalog } from \"../addons/registry.js\";\nimport {\n printCapabilitiesCatalog,\n printJsonError,\n printScaffoldResult,\n} from \"../core/json-output.js\";\nimport {\n parseDbFlag,\n parseLoggerFlag,\n parseTypeFlag,\n parseValidatorFlag,\n type ParsedCreateArgs,\n resolveScaffoldDefaults,\n} from \"../core/parse-options.js\";\nimport { scaffoldProject } from \"../core/scaffold-engine.js\";\nimport type {\n DbDriver,\n DbOdm,\n LoggerId,\n ProjectType,\n ScaffoldResult,\n ValidatorId,\n} from \"../core/types.js\";\nimport { DB_DRIVERS, DB_ODMS, LOGGERS, PROJECT_TYPES, VALIDATORS } from \"../core/types.js\";\nimport { validateProjectName } from \"../core/validate-project-name.js\";\nimport { resolveUserAgent, runScript } from \"../core/package-manager.js\";\n\nfunction isProjectType(value: unknown): value is ProjectType {\n return typeof value === \"string\" && (PROJECT_TYPES as readonly string[]).includes(value);\n}\n\nfunction isDbOdm(value: unknown): value is DbOdm {\n return typeof value === \"string\" && (DB_ODMS as readonly string[]).includes(value);\n}\n\nfunction isDbDriver(value: unknown): value is DbDriver {\n return typeof value === \"string\" && (DB_DRIVERS as readonly string[]).includes(value);\n}\n\nfunction isLoggerId(value: unknown): value is LoggerId {\n return typeof value === \"string\" && (LOGGERS as readonly string[]).includes(value);\n}\n\nfunction isValidatorId(value: unknown): value is ValidatorId {\n return typeof value === \"string\" && (VALIDATORS as readonly string[]).includes(value);\n}\n\nasync function promptInteractiveOptions(args: ParsedCreateArgs): Promise<ParsedCreateArgs> {\n const projectName =\n args.projectName ??\n (await p.text({\n message: \"Project name\",\n placeholder: \"my-taser-app\",\n defaultValue: \"my-taser-app\",\n validate(value) {\n return validateProjectName(value);\n },\n }));\n\n if (p.isCancel(projectName)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n const type =\n args.type ??\n (await p.select({\n message: \"Project type (runtime / framework)\",\n options: [\n { value: \"node\", label: \"Node.js\", hint: \"default\" },\n { value: \"express\", label: \"Express\" },\n { value: \"fastify\", label: \"Fastify\" },\n { value: \"hono\", label: \"Hono\" },\n { value: \"bun\", label: \"Bun\" },\n { value: \"deno\", label: \"Deno\" },\n { value: \"aws-lambda\", label: \"AWS Lambda\" },\n { value: \"cloudflare-workers\", label: \"Cloudflare Workers\" },\n { value: \"netlify\", label: \"Netlify\" },\n { value: \"vercel\", label: \"Vercel\" },\n { value: \"azure-functions\", label: \"Azure Functions\" },\n { value: \"google-cloud-run\", label: \"Google Cloud Run\" },\n ],\n initialValue: \"node\",\n }));\n\n if (p.isCancel(type) || !isProjectType(type)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n const dbChoice =\n args.db ??\n (await p.select({\n message: \"Database\",\n options: [\n { value: \"none\", label: \"None\", hint: \"default\" },\n { value: \"drizzle\", label: \"Drizzle\" },\n { value: \"prisma\", label: \"Prisma\" },\n { value: \"kysely\", label: \"Kysely\" },\n ],\n initialValue: \"none\",\n }));\n\n if (p.isCancel(dbChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n let db: DbOdm | undefined;\n let driver: DbDriver | undefined;\n\n if (dbChoice !== \"none\" && isDbOdm(dbChoice)) {\n db = dbChoice;\n const driverChoice =\n args.driver ??\n (await p.select({\n message: \"Database driver\",\n options: [\n { value: \"sqlite\", label: \"SQLite\", hint: \"default\" },\n { value: \"postgres\", label: \"PostgreSQL\" },\n { value: \"mysql\", label: \"MySQL\" },\n ],\n initialValue: \"sqlite\",\n }));\n\n if (p.isCancel(driverChoice) || !isDbDriver(driverChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n driver = driverChoice;\n }\n\n const loggerChoice =\n args.logger ??\n (await p.select({\n message: \"Logger\",\n options: [\n { value: \"none\", label: \"None\", hint: \"default\" },\n { value: \"pino\", label: \"Pino\" },\n { value: \"winston\", label: \"Winston\" },\n ],\n initialValue: \"none\",\n }));\n\n if (p.isCancel(loggerChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n const logger =\n loggerChoice === \"none\" ? undefined : isLoggerId(loggerChoice) ? loggerChoice : undefined;\n\n const validatorChoice =\n args.validator ??\n (await p.select({\n message: \"Validator\",\n options: [\n { value: \"none\", label: \"None\", hint: \"default\" },\n { value: \"zod\", label: \"Zod\" },\n { value: \"arktype\", label: \"Arktype\" },\n { value: \"valibot\", label: \"Valibot\" },\n ],\n initialValue: \"none\",\n }));\n\n if (p.isCancel(validatorChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n const validator =\n validatorChoice === \"none\"\n ? undefined\n : isValidatorId(validatorChoice)\n ? validatorChoice\n : undefined;\n\n return {\n projectName: String(projectName).trim(),\n type,\n yes: args.yes,\n noInstall: args.noInstall,\n json: args.json,\n ...(db ? { db, driver: driver! } : {}),\n ...(logger ? { logger } : {}),\n ...(validator ? { validator } : {}),\n };\n}\n\nexport async function runCreateCommand(\n args: ParsedCreateArgs,\n): Promise<ScaffoldResult | undefined> {\n if (args.json && !args.projectName) {\n printCapabilitiesCatalog(getCapabilitiesCatalog());\n return undefined;\n }\n\n const cwd = process.cwd();\n const interactive = !args.yes;\n const resolved = interactive\n ? await promptInteractiveOptions(args)\n : {\n ...args,\n projectName: args.projectName?.trim(),\n type: args.type ?? \"node\",\n };\n\n if (!resolved.projectName) {\n const message = \"Project name is required\";\n if (args.json) {\n printJsonError(message);\n process.exit(1);\n }\n throw new Error(message);\n }\n\n const nameError = validateProjectName(resolved.projectName, cwd);\n if (nameError) {\n if (args.json) {\n printJsonError(nameError);\n process.exit(1);\n }\n throw new Error(nameError);\n }\n\n const targetDir = path.resolve(cwd, resolved.projectName);\n const scaffoldCtx = resolveScaffoldDefaults({\n ...resolved,\n projectName: resolved.projectName,\n });\n scaffoldCtx.targetDir = targetDir;\n\n if (!args.json) {\n const spinner = p.spinner();\n spinner.start(\"Scaffolding project\");\n try {\n const result = await scaffoldProject({\n ...scaffoldCtx,\n targetDir,\n skipInstall: args.noInstall,\n agent: resolveUserAgent(),\n });\n spinner.stop(\"Project created\");\n const cdPath = path.relative(cwd, targetDir) || \".\";\n p.note([`cd ${cdPath}`, runScript(resolveUserAgent(), \"dev\")].join(\"\\n\"), \"Next steps\");\n p.outro(color.green(\"Done.\"));\n return result;\n } catch (error) {\n spinner.stop(\"Scaffold failed\");\n throw error;\n }\n }\n\n const result = await scaffoldProject({\n ...scaffoldCtx,\n targetDir,\n skipInstall: args.noInstall,\n agent: resolveUserAgent(),\n });\n printScaffoldResult(result);\n return result;\n}\n\nexport function buildParsedArgsFromCli(\n values: {\n type?: string;\n framework?: string;\n db?: string;\n logger?: string;\n validator?: string;\n y?: boolean;\n noInstall?: boolean;\n json?: boolean;\n },\n positionals: string[],\n): ParsedCreateArgs {\n const args: ParsedCreateArgs = {\n yes: values.y ?? false,\n noInstall: values.noInstall ?? false,\n json: values.json ?? false,\n };\n\n if (positionals[0]) {\n args.projectName = positionals[0];\n }\n\n const typeFlag = values.type ?? values.framework;\n if (typeFlag) {\n args.type = parseTypeFlag(typeFlag);\n }\n\n if (values.db) {\n const parsed = parseDbFlag(values.db);\n args.db = parsed.db;\n args.driver = parsed.driver;\n }\n\n if (values.logger) {\n args.logger = parseLoggerFlag(values.logger);\n }\n\n if (values.validator) {\n args.validator = parseValidatorFlag(values.validator);\n }\n\n return args;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"create.cjs","names":[],"sources":["../../../src/commands/create.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport color from \"picocolors\";\n\nimport { getCapabilitiesCatalog } from \"../addons/registry.js\";\nimport {\n printCapabilitiesCatalog,\n printJsonError,\n printScaffoldResult,\n} from \"../core/json-output.js\";\nimport {\n parseDbFlag,\n parseFrameworkFlag,\n parseLoggerFlag,\n parsePresetFlag,\n parseRuntimeFlag,\n parseValidatorFlag,\n type ParsedCreateArgs,\n resolveScaffoldDefaults,\n} from \"../core/parse-options.js\";\nimport { scaffoldProject } from \"../core/scaffold-engine.js\";\nimport { allowedRuntimeOverrides } from \"../core/targets.js\";\nimport type {\n DbDriver,\n DbOdm,\n DeployTarget,\n LoggerId,\n ScaffoldResult,\n ValidatorId,\n} from \"../core/types.js\";\nimport { DB_DRIVERS, DB_ODMS, DEPLOY_TARGETS, LOGGERS, VALIDATORS } from \"../core/types.js\";\nimport { validateProjectName } from \"../core/validate-project-name.js\";\nimport { resolveUserAgent, runScript } from \"../core/package-manager.js\";\n\nfunction isDeployTarget(value: unknown): value is DeployTarget {\n return typeof value === \"string\" && (DEPLOY_TARGETS as readonly string[]).includes(value);\n}\n\nfunction isDbOdm(value: unknown): value is DbOdm {\n return typeof value === \"string\" && (DB_ODMS as readonly string[]).includes(value);\n}\n\nfunction isDbDriver(value: unknown): value is DbDriver {\n return typeof value === \"string\" && (DB_DRIVERS as readonly string[]).includes(value);\n}\n\nfunction isLoggerId(value: unknown): value is LoggerId {\n return typeof value === \"string\" && (LOGGERS as readonly string[]).includes(value);\n}\n\nfunction isValidatorId(value: unknown): value is ValidatorId {\n return typeof value === \"string\" && (VALIDATORS as readonly string[]).includes(value);\n}\n\nasync function promptInteractiveOptions(args: ParsedCreateArgs): Promise<ParsedCreateArgs> {\n const projectName =\n args.projectName ??\n (await p.text({\n message: \"Project name\",\n placeholder: \"my-taser-app\",\n defaultValue: \"my-taser-app\",\n validate(value) {\n return validateProjectName(value);\n },\n }));\n\n if (p.isCancel(projectName)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n const framework =\n args.framework ??\n (await p.select({\n message: \"Host framework\",\n options: [\n { value: \"none\", label: \"None\", hint: \"Taser Fetch (default)\" },\n { value: \"hono\", label: \"Hono\" },\n { value: \"express\", label: \"Express\" },\n { value: \"fastify\", label: \"Fastify\" },\n ],\n initialValue: \"none\",\n }));\n\n if (p.isCancel(framework)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n const DEPLOY_LABELS: Record<DeployTarget, string> = {\n none: \"None (Standalone Vite)\",\n \"node-server\": \"Node.js server\",\n \"node-cluster\": \"Node.js cluster\",\n bun: \"Bun\",\n \"deno-server\": \"Deno\",\n \"deno-deploy\": \"Deno Deploy\",\n \"cloudflare-module\": \"Cloudflare Workers\",\n vercel: \"Vercel\",\n \"aws-lambda\": \"AWS Lambda\",\n netlify: \"Netlify\",\n };\n\n const DEPLOY_HINTS: Partial<Record<DeployTarget, string>> = {\n none: \"standalone Vite, no Nitro\",\n };\n\n const preset =\n args.preset ??\n (await p.select({\n message: \"Deployment target\",\n // oxlint-disable-next-line oxc/no-map-spread\n options: DEPLOY_TARGETS.map((id) => ({\n value: id,\n label: DEPLOY_LABELS[id],\n ...(DEPLOY_HINTS[id] ? { hint: DEPLOY_HINTS[id] } : {}),\n })),\n initialValue: \"node-server\",\n }));\n\n if (p.isCancel(preset) || !isDeployTarget(preset)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n let runtime: import(\"../core/types.js\").Runtime | undefined;\n const runtimeOverrides = allowedRuntimeOverrides(preset);\n if (runtimeOverrides.length > 0) {\n const runtimeChoice =\n args.runtime ??\n (await p.select({\n message: \"Runtime\",\n options: [\n ...runtimeOverrides.map((rt) => ({ value: rt, label: rt })),\n { value: \"default\", label: `Preset default`, hint: \"no override\" },\n ],\n initialValue: \"default\",\n }));\n\n if (p.isCancel(runtimeChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n runtime = runtimeChoice === \"default\" ? undefined : runtimeChoice;\n }\n\n const dbChoice =\n args.db ??\n (await p.select({\n message: \"Database\",\n options: [\n { value: \"none\", label: \"None\", hint: \"default\" },\n { value: \"drizzle\", label: \"Drizzle\" },\n { value: \"prisma\", label: \"Prisma\" },\n { value: \"kysely\", label: \"Kysely\" },\n ],\n initialValue: \"none\",\n }));\n\n if (p.isCancel(dbChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n let db: DbOdm | undefined;\n let driver: DbDriver | undefined;\n\n if (dbChoice !== \"none\" && isDbOdm(dbChoice)) {\n db = dbChoice;\n const driverChoice =\n args.driver ??\n (await p.select({\n message: \"Database driver\",\n options: [\n { value: \"sqlite\", label: \"SQLite\", hint: \"default\" },\n { value: \"postgres\", label: \"PostgreSQL\" },\n { value: \"mysql\", label: \"MySQL\" },\n ],\n initialValue: \"sqlite\",\n }));\n\n if (p.isCancel(driverChoice) || !isDbDriver(driverChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n driver = driverChoice;\n }\n\n const loggerChoice =\n args.logger ??\n (await p.select({\n message: \"Logger\",\n options: [\n { value: \"none\", label: \"None\", hint: \"default\" },\n { value: \"pino\", label: \"Pino\" },\n { value: \"winston\", label: \"Winston\" },\n ],\n initialValue: \"none\",\n }));\n\n if (p.isCancel(loggerChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n const logger =\n loggerChoice === \"none\" ? undefined : isLoggerId(loggerChoice) ? loggerChoice : undefined;\n\n const validatorChoice =\n args.validator ??\n (await p.select({\n message: \"Validator\",\n options: [\n { value: \"none\", label: \"None\", hint: \"default\" },\n { value: \"zod\", label: \"Zod\" },\n { value: \"arktype\", label: \"Arktype\" },\n { value: \"valibot\", label: \"Valibot\" },\n ],\n initialValue: \"none\",\n }));\n\n if (p.isCancel(validatorChoice)) {\n p.cancel(\"Scaffold cancelled.\");\n process.exit(0);\n }\n\n const validator =\n validatorChoice === \"none\"\n ? undefined\n : isValidatorId(validatorChoice)\n ? validatorChoice\n : undefined;\n\n return {\n projectName: String(projectName).trim(),\n framework,\n preset,\n ...(runtime !== undefined ? { runtime } : {}),\n yes: args.yes,\n noInstall: args.noInstall,\n json: args.json,\n ...(db ? { db, driver: driver! } : {}),\n ...(logger ? { logger } : {}),\n ...(validator ? { validator } : {}),\n };\n}\n\nexport async function runCreateCommand(\n args: ParsedCreateArgs,\n): Promise<ScaffoldResult | undefined> {\n if (args.json && !args.projectName) {\n printCapabilitiesCatalog(getCapabilitiesCatalog());\n return undefined;\n }\n\n const cwd = process.cwd();\n const interactive = !args.yes;\n const resolved = interactive\n ? await promptInteractiveOptions(args)\n : {\n ...args,\n projectName: args.projectName?.trim(),\n preset: args.preset ?? \"node-server\",\n };\n\n if (!resolved.projectName) {\n const message = \"Project name is required\";\n if (args.json) {\n printJsonError(message);\n process.exit(1);\n }\n throw new Error(message);\n }\n\n const nameError = validateProjectName(resolved.projectName, cwd);\n if (nameError) {\n if (args.json) {\n printJsonError(nameError);\n process.exit(1);\n }\n throw new Error(nameError);\n }\n\n const targetDir = path.resolve(cwd, resolved.projectName);\n const scaffoldCtx = resolveScaffoldDefaults({\n ...resolved,\n projectName: resolved.projectName,\n });\n scaffoldCtx.targetDir = targetDir;\n\n if (!args.json) {\n const spinner = p.spinner();\n spinner.start(\"Scaffolding project\");\n try {\n const result = await scaffoldProject({\n ...scaffoldCtx,\n targetDir,\n skipInstall: args.noInstall,\n agent: resolveUserAgent(),\n });\n spinner.stop(\"Project created\");\n const cdPath = path.relative(cwd, targetDir) || \".\";\n p.note([`cd ${cdPath}`, runScript(resolveUserAgent(), \"dev\")].join(\"\\n\"), \"Next steps\");\n p.outro(color.green(\"Done.\"));\n return result;\n } catch (error) {\n spinner.stop(\"Scaffold failed\");\n throw error;\n }\n }\n\n const result = await scaffoldProject({\n ...scaffoldCtx,\n targetDir,\n skipInstall: args.noInstall,\n agent: resolveUserAgent(),\n });\n printScaffoldResult(result);\n return result;\n}\n\nexport function buildParsedArgsFromCli(\n values: {\n preset?: string;\n framework?: string;\n runtime?: string;\n db?: string;\n logger?: string;\n validator?: string;\n y?: boolean;\n noInstall?: boolean;\n json?: boolean;\n },\n positionals: string[],\n): ParsedCreateArgs {\n const args: ParsedCreateArgs = {\n yes: values.y ?? false,\n noInstall: values.noInstall ?? false,\n json: values.json ?? false,\n };\n\n if (positionals[0]) {\n args.projectName = positionals[0];\n }\n\n if (values.preset) {\n const parsed = parsePresetFlag(values.preset);\n args.preset = parsed.preset;\n if (parsed.warning && !args.json) {\n console.warn(`warning: ${parsed.warning}`);\n }\n }\n\n if (values.framework) {\n args.framework = parseFrameworkFlag(values.framework);\n }\n\n if (values.runtime) {\n args.runtime = parseRuntimeFlag(values.runtime);\n }\n\n if (values.db) {\n const parsed = parseDbFlag(values.db);\n args.db = parsed.db;\n args.driver = parsed.driver;\n }\n\n if (values.logger) {\n args.logger = parseLoggerFlag(values.logger);\n }\n\n if (values.validator) {\n args.validator = parseValidatorFlag(values.validator);\n }\n\n return args;\n}\n"],"mappings":"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"}
@@ -2,8 +2,9 @@ import { ParsedCreateArgs } from '../core/parse-options.js';
2
2
  import { ScaffoldResult } from '../core/types.js';
3
3
  export declare function runCreateCommand(args: ParsedCreateArgs): Promise<ScaffoldResult | undefined>;
4
4
  export declare function buildParsedArgsFromCli(values: {
5
- type?: string;
5
+ preset?: string;
6
6
  framework?: string;
7
+ runtime?: string;
7
8
  db?: string;
8
9
  logger?: string;
9
10
  validator?: string;
@@ -1,7 +1,11 @@
1
1
  const require_types = require("./types.cjs");
2
+ const require_targets = require("./targets.cjs");
2
3
  //#region src/core/parse-options.ts
3
- function isProjectType(value) {
4
- return require_types.PROJECT_TYPES.includes(value);
4
+ function isFramework(value) {
5
+ return require_types.FRAMEWORKS.includes(value);
6
+ }
7
+ function isRuntime(value) {
8
+ return require_types.RUNTIMES.includes(value);
5
9
  }
6
10
  function isDbOdm(value) {
7
11
  return require_types.DB_ODMS.includes(value);
@@ -28,27 +32,26 @@ function parseDbFlag(value) {
28
32
  driver
29
33
  };
30
34
  }
31
- function resolveScaffoldDefaults(args) {
32
- const type = args.type ?? "node";
33
- const db = args.db;
34
- const logger = args.logger;
35
- const validator = args.validator;
36
- if (!args.projectName) throw new Error("Project name is required");
37
- const result = {
38
- projectName: args.projectName.trim(),
39
- targetDir: "",
40
- type
41
- };
42
- if (db) {
43
- result.db = db;
44
- result.driver = args.driver ?? "sqlite";
35
+ function parseFrameworkFlag(value) {
36
+ if (!isFramework(value)) throw new Error(`Invalid --framework "${value}". Use ${require_types.FRAMEWORKS.join(", ")}.`);
37
+ return value;
38
+ }
39
+ /**
40
+ * Accepts curated deploy targets verbatim; unknown ids pass through to Nitro.
41
+ * Returns a warning for passthrough ids so callers can surface it.
42
+ */
43
+ function parsePresetFlag(value) {
44
+ if (!require_targets.isCuratedDeploy(value)) {
45
+ if (!/^[a-z0-9][a-z0-9-_]*$/i.test(value)) throw new Error(`Invalid --preset "${value}".`);
46
+ return {
47
+ preset: value,
48
+ warning: `"${value}" is not a curated Taser deploy target; passing it through to Nitro as-is.`
49
+ };
45
50
  }
46
- if (logger) result.logger = logger;
47
- if (validator) result.validator = validator;
48
- return result;
51
+ return { preset: value };
49
52
  }
50
- function parseTypeFlag(value) {
51
- if (!isProjectType(value)) throw new Error(`Invalid --type "${value}". Use ${require_types.PROJECT_TYPES.join(", ")}.`);
53
+ function parseRuntimeFlag(value) {
54
+ if (!isRuntime(value)) throw new Error(`Invalid --runtime "${value}". Use node, bun, or deno.`);
52
55
  return value;
53
56
  }
54
57
  function parseLoggerFlag(value) {
@@ -59,10 +62,33 @@ function parseValidatorFlag(value) {
59
62
  if (!isValidatorId(value)) throw new Error(`Invalid --validator "${value}". Use zod, arktype, or valibot.`);
60
63
  return value;
61
64
  }
65
+ function resolveScaffoldDefaults(args) {
66
+ const framework = args.framework ?? "none";
67
+ const preset = args.preset ?? "node-server";
68
+ if (!args.projectName) throw new Error("Project name is required");
69
+ const combination = require_targets.validateCombination(args.runtime, framework, preset);
70
+ if (!combination.ok) throw new Error(combination.reason);
71
+ const result = {
72
+ projectName: args.projectName.trim(),
73
+ targetDir: "",
74
+ framework,
75
+ preset,
76
+ ...args.runtime !== void 0 ? { runtime: args.runtime } : {}
77
+ };
78
+ if (args.db) {
79
+ result.db = args.db;
80
+ result.driver = args.driver ?? "sqlite";
81
+ }
82
+ if (args.logger) result.logger = args.logger;
83
+ if (args.validator) result.validator = args.validator;
84
+ return result;
85
+ }
62
86
  //#endregion
63
87
  exports.parseDbFlag = parseDbFlag;
88
+ exports.parseFrameworkFlag = parseFrameworkFlag;
64
89
  exports.parseLoggerFlag = parseLoggerFlag;
65
- exports.parseTypeFlag = parseTypeFlag;
90
+ exports.parsePresetFlag = parsePresetFlag;
91
+ exports.parseRuntimeFlag = parseRuntimeFlag;
66
92
  exports.parseValidatorFlag = parseValidatorFlag;
67
93
  exports.resolveScaffoldDefaults = resolveScaffoldDefaults;
68
94
 
@@ -1 +1 @@
1
- {"version":3,"file":"parse-options.cjs","names":[],"sources":["../../../src/core/parse-options.ts"],"sourcesContent":["import {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n LOGGERS,\n PROJECT_TYPES,\n VALIDATORS,\n type DbDriver,\n type DbOdm,\n type LoggerId,\n type ProjectType,\n type ScaffoldContext,\n type ValidatorId,\n} from \"./types.js\";\n\nexport type ParsedCreateArgs = {\n projectName?: string;\n type?: ProjectType;\n db?: DbOdm;\n driver?: DbDriver;\n logger?: LoggerId;\n validator?: ValidatorId;\n yes: boolean;\n noInstall: boolean;\n json: boolean;\n};\n\nfunction isProjectType(value: string): value is ProjectType {\n return (PROJECT_TYPES as readonly string[]).includes(value);\n}\n\nfunction isDbOdm(value: string): value is DbOdm {\n return (DB_ODMS as readonly string[]).includes(value);\n}\n\nfunction isDbDriver(value: string): value is DbDriver {\n return (DB_DRIVERS as readonly string[]).includes(value);\n}\n\nfunction isLoggerId(value: string): value is LoggerId {\n return (LOGGERS as readonly string[]).includes(value);\n}\n\nfunction isValidatorId(value: string): value is ValidatorId {\n return (VALIDATORS as readonly string[]).includes(value);\n}\n\nexport function parseDbFlag(value: string): { db: DbOdm; driver: DbDriver } {\n const [odm, driver] = value.split(\":\");\n if (!odm || !isDbOdm(odm)) {\n throw new Error(\n `Invalid --db value \"${value}\". Use drizzle, prisma, or kysely (optionally with :postgres, :sqlite, or :mysql).`,\n );\n }\n\n if (driver === undefined || driver === \"\") {\n return { db: odm, driver: DEFAULT_DB_DRIVER };\n }\n\n if (!isDbDriver(driver)) {\n throw new Error(`Invalid database driver \"${driver}\". Use postgres, sqlite, or mysql.`);\n }\n\n return { db: odm, driver };\n}\n\nexport function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext {\n const type = args.type ?? \"node\";\n const db = args.db;\n const logger = args.logger;\n const validator = args.validator;\n\n if (!args.projectName) {\n throw new Error(\"Project name is required\");\n }\n\n const result: ScaffoldContext = {\n projectName: args.projectName.trim(),\n targetDir: \"\",\n type,\n };\n\n if (db) {\n result.db = db;\n result.driver = args.driver ?? DEFAULT_DB_DRIVER;\n }\n\n if (logger) {\n result.logger = logger;\n }\n\n if (validator) {\n result.validator = validator;\n }\n\n return result;\n}\n\nexport function parseTypeFlag(value: string): ProjectType {\n if (!isProjectType(value)) {\n throw new Error(`Invalid --type \"${value}\". Use ${PROJECT_TYPES.join(\", \")}.`);\n }\n return value;\n}\n\nexport function parseLoggerFlag(value: string): LoggerId {\n if (!isLoggerId(value)) {\n throw new Error(`Invalid --logger \"${value}\". Use pino or winston.`);\n }\n return value;\n}\n\nexport function parseValidatorFlag(value: string): ValidatorId {\n if (!isValidatorId(value)) {\n throw new Error(`Invalid --validator \"${value}\". Use zod, arktype, or valibot.`);\n }\n return value;\n}\n"],"mappings":";;AA2BA,SAAS,cAAc,OAAqC;CAC1D,OAAQ,cAAA,cAAoC,SAAS,KAAK;AAC5D;AAEA,SAAS,QAAQ,OAA+B;CAC9C,OAAQ,cAAA,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,cAAA,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,cAAA,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAS,cAAc,OAAqC;CAC1D,OAAQ,cAAA,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAgB,YAAY,OAAgD;CAC1E,MAAM,CAAC,KAAK,UAAU,MAAM,MAAM,GAAG;CACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,GACtB,MAAM,IAAI,MACR,uBAAuB,MAAM,mFAC/B;CAGF,IAAI,WAAW,KAAA,KAAa,WAAW,IACrC,OAAO;EAAE,IAAI;EAAK,QAAQ,cAAA;CAAkB;CAG9C,IAAI,CAAC,WAAW,MAAM,GACpB,MAAM,IAAI,MAAM,4BAA4B,OAAO,mCAAmC;CAGxF,OAAO;EAAE,IAAI;EAAK;CAAO;AAC3B;AAEA,SAAgB,wBAAwB,MAAyC;CAC/E,MAAM,OAAO,KAAK,QAAQ;CAC1B,MAAM,KAAK,KAAK;CAChB,MAAM,SAAS,KAAK;CACpB,MAAM,YAAY,KAAK;CAEvB,IAAI,CAAC,KAAK,aACR,MAAM,IAAI,MAAM,0BAA0B;CAG5C,MAAM,SAA0B;EAC9B,aAAa,KAAK,YAAY,KAAK;EACnC,WAAW;EACX;CACF;CAEA,IAAI,IAAI;EACN,OAAO,KAAK;EACZ,OAAO,SAAS,KAAK,UAAA;CACvB;CAEA,IAAI,QACF,OAAO,SAAS;CAGlB,IAAI,WACF,OAAO,YAAY;CAGrB,OAAO;AACT;AAEA,SAAgB,cAAc,OAA4B;CACxD,IAAI,CAAC,cAAc,KAAK,GACtB,MAAM,IAAI,MAAM,mBAAmB,MAAM,SAAS,cAAA,cAAc,KAAK,IAAI,EAAE,EAAE;CAE/E,OAAO;AACT;AAEA,SAAgB,gBAAgB,OAAyB;CACvD,IAAI,CAAC,WAAW,KAAK,GACnB,MAAM,IAAI,MAAM,qBAAqB,MAAM,wBAAwB;CAErE,OAAO;AACT;AAEA,SAAgB,mBAAmB,OAA4B;CAC7D,IAAI,CAAC,cAAc,KAAK,GACtB,MAAM,IAAI,MAAM,wBAAwB,MAAM,iCAAiC;CAEjF,OAAO;AACT"}
1
+ {"version":3,"file":"parse-options.cjs","names":[],"sources":["../../../src/core/parse-options.ts"],"sourcesContent":["import {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n FRAMEWORKS,\n LOGGERS,\n RUNTIMES,\n VALIDATORS,\n type DbDriver,\n type DbOdm,\n type DeployTarget,\n type Framework,\n type LoggerId,\n type Runtime,\n type ScaffoldContext,\n type ValidatorId,\n} from \"./types.js\";\nimport {\n DEFAULT_DEPLOY,\n isCuratedDeploy,\n resolveDeployEntry,\n validateCombination,\n} from \"./targets.js\";\n\nexport type ParsedCreateArgs = {\n projectName?: string;\n framework?: Framework;\n /** Deployment target — a Nitro preset id. */\n preset?: string;\n runtime?: Runtime;\n db?: DbOdm;\n driver?: DbDriver;\n logger?: LoggerId;\n validator?: ValidatorId;\n yes: boolean;\n noInstall: boolean;\n json: boolean;\n};\n\nfunction isFramework(value: string): value is Framework {\n return (FRAMEWORKS as readonly string[]).includes(value);\n}\n\nfunction isRuntime(value: string): value is Runtime {\n return (RUNTIMES as readonly string[]).includes(value);\n}\n\nfunction isDbOdm(value: string): value is DbOdm {\n return (DB_ODMS as readonly string[]).includes(value);\n}\n\nfunction isDbDriver(value: string): value is DbDriver {\n return (DB_DRIVERS as readonly string[]).includes(value);\n}\n\nfunction isLoggerId(value: string): value is LoggerId {\n return (LOGGERS as readonly string[]).includes(value);\n}\n\nfunction isValidatorId(value: string): value is ValidatorId {\n return (VALIDATORS as readonly string[]).includes(value);\n}\n\nexport function parseDbFlag(value: string): { db: DbOdm; driver: DbDriver } {\n const [odm, driver] = value.split(\":\");\n if (!odm || !isDbOdm(odm)) {\n throw new Error(\n `Invalid --db value \"${value}\". Use drizzle, prisma, or kysely (optionally with :postgres, :sqlite, or :mysql).`,\n );\n }\n\n if (driver === undefined || driver === \"\") {\n return { db: odm, driver: DEFAULT_DB_DRIVER };\n }\n\n if (!isDbDriver(driver)) {\n throw new Error(`Invalid database driver \"${driver}\". Use postgres, sqlite, or mysql.`);\n }\n\n return { db: odm, driver };\n}\n\nexport function parseFrameworkFlag(value: string): Framework {\n if (!isFramework(value)) {\n throw new Error(`Invalid --framework \"${value}\". Use ${FRAMEWORKS.join(\", \")}.`);\n }\n return value;\n}\n\n/**\n * Accepts curated deploy targets verbatim; unknown ids pass through to Nitro.\n * Returns a warning for passthrough ids so callers can surface it.\n */\nexport function parsePresetFlag(value: string): { preset: string; warning?: string } {\n if (!isCuratedDeploy(value)) {\n if (!/^[a-z0-9][a-z0-9-_]*$/i.test(value)) {\n throw new Error(`Invalid --preset \"${value}\".`);\n }\n return {\n preset: value,\n warning: `\"${value}\" is not a curated Taser deploy target; passing it through to Nitro as-is.`,\n };\n }\n return { preset: value };\n}\n\nexport function parseRuntimeFlag(value: string): Runtime {\n if (!isRuntime(value)) {\n throw new Error(`Invalid --runtime \"${value}\". Use node, bun, or deno.`);\n }\n return value;\n}\n\nexport function parseLoggerFlag(value: string): LoggerId {\n if (!isLoggerId(value)) {\n throw new Error(`Invalid --logger \"${value}\". Use pino or winston.`);\n }\n return value;\n}\n\nexport function parseValidatorFlag(value: string): ValidatorId {\n if (!isValidatorId(value)) {\n throw new Error(`Invalid --validator \"${value}\". Use zod, arktype, or valibot.`);\n }\n return value;\n}\n\nexport function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext {\n const framework: Framework = args.framework ?? \"none\";\n const preset = args.preset ?? DEFAULT_DEPLOY;\n\n if (!args.projectName) {\n throw new Error(\"Project name is required\");\n }\n\n // Throws with a precise reason when runtime × framework × deploy clash.\n const combination = validateCombination(args.runtime, framework, preset);\n if (!combination.ok) {\n throw new Error(combination.reason);\n }\n\n const result: ScaffoldContext = {\n projectName: args.projectName.trim(),\n targetDir: \"\",\n framework,\n preset: preset as DeployTarget,\n ...(args.runtime !== undefined ? { runtime: args.runtime } : {}),\n };\n\n if (args.db) {\n result.db = args.db;\n result.driver = args.driver ?? DEFAULT_DB_DRIVER;\n }\n\n if (args.logger) {\n result.logger = args.logger;\n }\n\n if (args.validator) {\n result.validator = args.validator;\n }\n\n return result;\n}\n\n/** Re-exported for CLI layers that need to warn about passthrough presets. */\nexport { resolveDeployEntry };\n"],"mappings":";;;AAuCA,SAAS,YAAY,OAAmC;CACtD,OAAQ,cAAA,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,UAAU,OAAiC;CAClD,OAAQ,cAAA,SAA+B,SAAS,KAAK;AACvD;AAEA,SAAS,QAAQ,OAA+B;CAC9C,OAAQ,cAAA,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,cAAA,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,cAAA,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAS,cAAc,OAAqC;CAC1D,OAAQ,cAAA,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAgB,YAAY,OAAgD;CAC1E,MAAM,CAAC,KAAK,UAAU,MAAM,MAAM,GAAG;CACrC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,GACtB,MAAM,IAAI,MACR,uBAAuB,MAAM,mFAC/B;CAGF,IAAI,WAAW,KAAA,KAAa,WAAW,IACrC,OAAO;EAAE,IAAI;EAAK,QAAQ,cAAA;CAAkB;CAG9C,IAAI,CAAC,WAAW,MAAM,GACpB,MAAM,IAAI,MAAM,4BAA4B,OAAO,mCAAmC;CAGxF,OAAO;EAAE,IAAI;EAAK;CAAO;AAC3B;AAEA,SAAgB,mBAAmB,OAA0B;CAC3D,IAAI,CAAC,YAAY,KAAK,GACpB,MAAM,IAAI,MAAM,wBAAwB,MAAM,SAAS,cAAA,WAAW,KAAK,IAAI,EAAE,EAAE;CAEjF,OAAO;AACT;;;;;AAMA,SAAgB,gBAAgB,OAAqD;CACnF,IAAI,CAAC,gBAAA,gBAAgB,KAAK,GAAG;EAC3B,IAAI,CAAC,yBAAyB,KAAK,KAAK,GACtC,MAAM,IAAI,MAAM,qBAAqB,MAAM,GAAG;EAEhD,OAAO;GACL,QAAQ;GACR,SAAS,IAAI,MAAM;EACrB;CACF;CACA,OAAO,EAAE,QAAQ,MAAM;AACzB;AAEA,SAAgB,iBAAiB,OAAwB;CACvD,IAAI,CAAC,UAAU,KAAK,GAClB,MAAM,IAAI,MAAM,sBAAsB,MAAM,2BAA2B;CAEzE,OAAO;AACT;AAEA,SAAgB,gBAAgB,OAAyB;CACvD,IAAI,CAAC,WAAW,KAAK,GACnB,MAAM,IAAI,MAAM,qBAAqB,MAAM,wBAAwB;CAErE,OAAO;AACT;AAEA,SAAgB,mBAAmB,OAA4B;CAC7D,IAAI,CAAC,cAAc,KAAK,GACtB,MAAM,IAAI,MAAM,wBAAwB,MAAM,iCAAiC;CAEjF,OAAO;AACT;AAEA,SAAgB,wBAAwB,MAAyC;CAC/E,MAAM,YAAuB,KAAK,aAAa;CAC/C,MAAM,SAAS,KAAK,UAAA;CAEpB,IAAI,CAAC,KAAK,aACR,MAAM,IAAI,MAAM,0BAA0B;CAI5C,MAAM,cAAc,gBAAA,oBAAoB,KAAK,SAAS,WAAW,MAAM;CACvE,IAAI,CAAC,YAAY,IACf,MAAM,IAAI,MAAM,YAAY,MAAM;CAGpC,MAAM,SAA0B;EAC9B,aAAa,KAAK,YAAY,KAAK;EACnC,WAAW;EACX;EACQ;EACR,GAAI,KAAK,YAAY,KAAA,IAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CAChE;CAEA,IAAI,KAAK,IAAI;EACX,OAAO,KAAK,KAAK;EACjB,OAAO,SAAS,KAAK,UAAA;CACvB;CAEA,IAAI,KAAK,QACP,OAAO,SAAS,KAAK;CAGvB,IAAI,KAAK,WACP,OAAO,YAAY,KAAK;CAG1B,OAAO;AACT"}