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.
- package/README.md +1 -1
- package/dist/cjs/addons/prisma/index.cjs +12 -5
- package/dist/cjs/addons/prisma/index.cjs.map +1 -1
- package/dist/cjs/addons/registry.cjs +3 -1
- package/dist/cjs/addons/registry.cjs.map +1 -1
- package/dist/cjs/addons/validators.cjs +10 -13
- package/dist/cjs/addons/validators.cjs.map +1 -1
- package/dist/cjs/cli.cjs +7 -5
- package/dist/cjs/cli.cjs.map +1 -1
- package/dist/cjs/commands/create.cjs +72 -49
- package/dist/cjs/commands/create.cjs.map +1 -1
- package/dist/cjs/commands/create.d.cts +2 -1
- package/dist/cjs/core/parse-options.cjs +48 -22
- package/dist/cjs/core/parse-options.cjs.map +1 -1
- package/dist/cjs/core/parse-options.d.cts +19 -4
- package/dist/cjs/core/project-config.cjs +5 -1
- package/dist/cjs/core/project-config.cjs.map +1 -1
- package/dist/cjs/core/resolve-packages.cjs +35 -65
- package/dist/cjs/core/resolve-packages.cjs.map +1 -1
- package/dist/cjs/core/resolve-packages.d.cts +1 -4
- package/dist/cjs/core/scaffold-engine.cjs +16 -27
- package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
- package/dist/cjs/core/targets.cjs +171 -0
- package/dist/cjs/core/targets.cjs.map +1 -0
- package/dist/cjs/core/targets.d.cts +49 -0
- package/dist/cjs/core/types.cjs +22 -11
- package/dist/cjs/core/types.cjs.map +1 -1
- package/dist/cjs/core/types.d.cts +20 -4
- package/dist/cjs/core/validate-project-name.cjs +0 -1
- package/dist/cjs/core/validate-project-name.cjs.map +1 -1
- package/dist/cjs/frameworks/index.cjs +79 -171
- package/dist/cjs/frameworks/index.cjs.map +1 -1
- package/dist/cjs/frameworks/index.d.cts +18 -3
- package/dist/cjs/scaffold.d.cts +2 -2
- package/dist/cjs/templates/base.cjs +15 -99
- package/dist/cjs/templates/base.cjs.map +1 -1
- package/dist/cjs/templates/base.d.cts +0 -3
- package/dist/cjs/types.d.cts +1 -1
- package/dist/esm/addons/prisma/index.js +12 -5
- package/dist/esm/addons/prisma/index.js.map +1 -1
- package/dist/esm/addons/registry.js +4 -2
- package/dist/esm/addons/registry.js.map +1 -1
- package/dist/esm/addons/validators.js +10 -13
- package/dist/esm/addons/validators.js.map +1 -1
- package/dist/esm/cli.js +7 -5
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/create.d.ts +2 -1
- package/dist/esm/commands/create.js +74 -51
- package/dist/esm/commands/create.js.map +1 -1
- package/dist/esm/core/parse-options.d.ts +19 -4
- package/dist/esm/core/parse-options.js +47 -23
- package/dist/esm/core/parse-options.js.map +1 -1
- package/dist/esm/core/project-config.js +5 -1
- package/dist/esm/core/project-config.js.map +1 -1
- package/dist/esm/core/resolve-packages.d.ts +1 -4
- package/dist/esm/core/resolve-packages.js +35 -65
- package/dist/esm/core/resolve-packages.js.map +1 -1
- package/dist/esm/core/scaffold-engine.js +18 -29
- package/dist/esm/core/scaffold-engine.js.map +1 -1
- package/dist/esm/core/targets.d.ts +49 -0
- package/dist/esm/core/targets.js +166 -0
- package/dist/esm/core/targets.js.map +1 -0
- package/dist/esm/core/types.d.ts +20 -4
- package/dist/esm/core/types.js +20 -11
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/core/validate-project-name.js +0 -1
- package/dist/esm/core/validate-project-name.js.map +1 -1
- package/dist/esm/frameworks/index.d.ts +18 -3
- package/dist/esm/frameworks/index.js +76 -171
- package/dist/esm/frameworks/index.js.map +1 -1
- package/dist/esm/scaffold.d.ts +2 -2
- package/dist/esm/templates/base.d.ts +0 -3
- package/dist/esm/templates/base.js +16 -98
- package/dist/esm/templates/base.js.map +1 -1
- package/dist/esm/types.d.ts +1 -1
- package/package.json +3 -2
- package/src/addons/prisma/index.ts +12 -5
- package/src/addons/registry.ts +6 -2
- package/src/addons/validators.ts +10 -13
- package/src/cli.ts +6 -4
- package/src/commands/create.ts +92 -26
- package/src/core/parse-options.ts +84 -35
- package/src/core/project-config.ts +6 -1
- package/src/core/resolve-packages.ts +37 -74
- package/src/core/scaffold-engine.ts +41 -65
- package/src/core/targets.ts +211 -0
- package/src/core/types.ts +40 -24
- package/src/core/validate-project-name.ts +0 -4
- package/src/frameworks/index.ts +80 -178
- package/src/scaffold.ts +2 -2
- package/src/templates/base.ts +14 -98
- 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
|
|
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
|
-
|
|
102
|
+
const driver = ctx.driver ?? "sqlite";
|
|
103
|
+
return [prismaPackage("@prisma/client"), ...driverPackages(driver)];
|
|
98
104
|
},
|
|
99
105
|
devDependencies(ctx) {
|
|
100
|
-
|
|
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":";
|
|
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
|
-
|
|
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
|
|
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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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 {
|
|
19
|
-
import { t } from '#
|
|
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
|
|
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:
|
|
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
|
-
|
|
15
|
+
preset: {
|
|
16
16
|
type: "string",
|
|
17
|
-
short: "
|
|
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.
|
|
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 } : {}
|
package/dist/cjs/cli.cjs.map
CHANGED
|
@@ -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
|
|
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
|
|
17
|
-
return typeof value === "string" && require_types.
|
|
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
|
|
45
|
-
message: "
|
|
45
|
+
const framework = args.framework ?? await _clack_prompts.select({
|
|
46
|
+
message: "Host framework",
|
|
46
47
|
options: [
|
|
47
48
|
{
|
|
48
|
-
value: "
|
|
49
|
-
label: "
|
|
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: "
|
|
66
|
-
label: "
|
|
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: "
|
|
94
|
-
label: "
|
|
62
|
+
value: "fastify",
|
|
63
|
+
label: "Fastify"
|
|
95
64
|
}
|
|
96
65
|
],
|
|
97
|
-
initialValue: "
|
|
66
|
+
initialValue: "none"
|
|
98
67
|
});
|
|
99
|
-
if (_clack_prompts.isCancel(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
295
|
-
|
|
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
|
-
|
|
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
|
|
4
|
-
return require_types.
|
|
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
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
47
|
-
if (validator) result.validator = validator;
|
|
48
|
-
return result;
|
|
51
|
+
return { preset: value };
|
|
49
52
|
}
|
|
50
|
-
function
|
|
51
|
-
if (!
|
|
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.
|
|
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
|
|
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"}
|