create-taserjs 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/cjs/addons/arktype/index.cjs.map +1 -1
- package/dist/cjs/addons/drizzle/index.cjs.map +1 -1
- package/dist/cjs/addons/kysely/index.cjs.map +1 -1
- package/dist/cjs/addons/pino/index.cjs.map +1 -1
- package/dist/cjs/addons/prisma/index.cjs +84 -24
- package/dist/cjs/addons/prisma/index.cjs.map +1 -1
- package/dist/cjs/addons/registry.cjs +1 -1
- package/dist/cjs/addons/registry.cjs.map +1 -1
- package/dist/cjs/addons/types.d.cts +1 -1
- package/dist/cjs/addons/valibot/index.cjs.map +1 -1
- package/dist/cjs/addons/validators.cjs.map +1 -1
- package/dist/cjs/addons/winston/index.cjs.map +1 -1
- package/dist/cjs/addons/zod/index.cjs.map +1 -1
- package/dist/cjs/cli.cjs +5 -0
- package/dist/cjs/cli.cjs.map +1 -1
- package/dist/cjs/commands/create.cjs +44 -11
- package/dist/cjs/commands/create.cjs.map +1 -1
- package/dist/cjs/commands/create.d.cts +1 -0
- package/dist/cjs/core/json-output.cjs.map +1 -1
- package/dist/cjs/core/package-manager.cjs.map +1 -1
- package/dist/cjs/core/package-manager.d.cts +1 -1
- package/dist/cjs/core/parse-options.cjs +7 -7
- package/dist/cjs/core/parse-options.cjs.map +1 -1
- package/dist/cjs/core/parse-options.d.cts +3 -3
- package/dist/cjs/core/project-config.cjs +1 -1
- package/dist/cjs/core/project-config.cjs.map +1 -1
- package/dist/cjs/core/resolve-packages.cjs +41 -7
- package/dist/cjs/core/resolve-packages.cjs.map +1 -1
- package/dist/cjs/core/resolve-packages.d.cts +2 -2
- package/dist/cjs/core/scaffold-engine.cjs +33 -6
- package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
- package/dist/cjs/core/types.cjs +11 -3
- package/dist/cjs/core/types.cjs.map +1 -1
- package/dist/cjs/core/types.d.cts +8 -8
- package/dist/cjs/core/validate-project-name.cjs.map +1 -1
- package/dist/cjs/frameworks/index.cjs +138 -17
- package/dist/cjs/frameworks/index.cjs.map +1 -1
- package/dist/cjs/frameworks/index.d.cts +3 -3
- package/dist/cjs/scaffold.d.cts +1 -1
- package/dist/cjs/templates/base.cjs +6 -6
- package/dist/cjs/templates/base.cjs.map +1 -1
- package/dist/cjs/types.d.cts +1 -1
- package/dist/esm/addons/arktype/index.js.map +1 -1
- package/dist/esm/addons/drizzle/index.js.map +1 -1
- package/dist/esm/addons/kysely/index.js.map +1 -1
- package/dist/esm/addons/pino/index.js.map +1 -1
- package/dist/esm/addons/prisma/index.js +84 -24
- package/dist/esm/addons/prisma/index.js.map +1 -1
- package/dist/esm/addons/registry.js +2 -2
- package/dist/esm/addons/registry.js.map +1 -1
- package/dist/esm/addons/types.d.ts +1 -1
- package/dist/esm/addons/valibot/index.js.map +1 -1
- package/dist/esm/addons/validators.js.map +1 -1
- package/dist/esm/addons/winston/index.js.map +1 -1
- package/dist/esm/addons/zod/index.js.map +1 -1
- package/dist/esm/cli.js +5 -0
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/create.d.ts +1 -0
- package/dist/esm/commands/create.js +46 -13
- package/dist/esm/commands/create.js.map +1 -1
- package/dist/esm/core/json-output.js.map +1 -1
- package/dist/esm/core/package-manager.d.ts +1 -1
- package/dist/esm/core/package-manager.js.map +1 -1
- package/dist/esm/core/parse-options.d.ts +3 -3
- package/dist/esm/core/parse-options.js +8 -8
- package/dist/esm/core/parse-options.js.map +1 -1
- package/dist/esm/core/project-config.js +1 -1
- package/dist/esm/core/project-config.js.map +1 -1
- package/dist/esm/core/resolve-packages.d.ts +2 -2
- package/dist/esm/core/resolve-packages.js +41 -7
- package/dist/esm/core/resolve-packages.js.map +1 -1
- package/dist/esm/core/scaffold-engine.js +34 -7
- package/dist/esm/core/scaffold-engine.js.map +1 -1
- package/dist/esm/core/types.d.ts +8 -8
- package/dist/esm/core/types.js +11 -3
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/core/validate-project-name.js.map +1 -1
- package/dist/esm/frameworks/index.d.ts +3 -3
- package/dist/esm/frameworks/index.js +138 -17
- package/dist/esm/frameworks/index.js.map +1 -1
- package/dist/esm/scaffold.d.ts +1 -1
- package/dist/esm/templates/base.js +6 -6
- package/dist/esm/templates/base.js.map +1 -1
- package/dist/esm/types.d.ts +1 -1
- package/package.json +13 -13
- package/src/addons/arktype/index.ts +2 -2
- package/src/addons/drizzle/index.ts +53 -53
- package/src/addons/kysely/index.ts +42 -42
- package/src/addons/pino/index.ts +12 -12
- package/src/addons/prisma/index.ts +128 -55
- package/src/addons/registry.ts +37 -37
- package/src/addons/types.ts +14 -14
- package/src/addons/valibot/index.ts +2 -2
- package/src/addons/validators.ts +9 -9
- package/src/addons/winston/index.ts +12 -12
- package/src/addons/zod/index.ts +2 -2
- package/src/cli.ts +27 -26
- package/src/commands/create.ts +181 -152
- package/src/core/json-output.ts +4 -4
- package/src/core/package-manager.ts +38 -31
- package/src/core/parse-options.ts +50 -48
- package/src/core/project-config.ts +10 -14
- package/src/core/resolve-packages.ts +79 -41
- package/src/core/scaffold-engine.ts +106 -36
- package/src/core/types.ts +61 -36
- package/src/core/validate-project-name.ts +40 -40
- package/src/frameworks/index.ts +164 -29
- package/src/scaffold.ts +3 -3
- package/src/templates/base.ts +57 -51
- package/src/types.ts +5 -4
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/arktype/index.ts"],"sourcesContent":["import { ValidatorAddon } from
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/arktype/index.ts"],"sourcesContent":["import { ValidatorAddon } from \"../validators.js\";\n\nexport const arktypeAddon = ValidatorAddon(\"arktype\");\n"],"mappings":";AAEA,IAAa,0CAAe,CAAA,CAAA,eAAe,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/drizzle/index.ts"],"sourcesContent":["import type { AddonDefinition } from
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/drizzle/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\nimport type { DbDriver } from \"../../core/types.js\";\n\nfunction schemaSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { pgTable, serial, text } from 'drizzle-orm/pg-core'\n\nexport const users = pgTable('users', {\n id: serial('id').primaryKey(),\n email: text('email').notNull(),\n})\n`;\n case \"mysql\":\n return `import { mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core'\n\nexport const users = mysqlTable('users', {\n id: serial('id').primaryKey(),\n email: varchar('email', { length: 255 }).notNull(),\n})\n`;\n case \"sqlite\":\n default:\n return `import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core'\n\nexport const users = sqliteTable('users', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n email: text('email').notNull(),\n})\n`;\n }\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { drizzle } from 'drizzle-orm/node-postgres'\nimport pg from 'pg'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const pool = new pg.Pool({\n connectionString: process.env.DATABASE_URL,\n })\n return drizzle(pool, { schema })\n}\n`;\n case \"mysql\":\n return `import { drizzle } from 'drizzle-orm/mysql2'\nimport mysql from 'mysql2/promise'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const pool = mysql.createPool(process.env.DATABASE_URL ?? '')\n return drizzle(pool, { schema, mode: 'default' })\n}\n`;\n case \"sqlite\":\n default:\n return `import Database from 'better-sqlite3'\nimport { drizzle } from 'drizzle-orm/better-sqlite3'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const filePath = (process.env.DATABASE_URL ?? 'file:./local.db').replace(/^file:/, '')\n const client = new Database(filePath)\n return drizzle(client, { schema })\n}\n`;\n }\n}\n\nfunction drizzleConfigSource(driver: DbDriver): string {\n const dialect = driver === \"postgres\" ? \"postgresql\" : driver === \"mysql\" ? \"mysql\" : \"sqlite\";\n return `import { defineConfig } from 'drizzle-kit'\n\nexport default defineConfig({\n schema: './src/db/schema.ts',\n out: './drizzle',\n dialect: '${dialect}',\n dbCredentials: {\n url: process.env.DATABASE_URL ?? '',\n },\n})\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 [\"pg\"];\n case \"mysql\":\n return [\"mysql2\"];\n case \"sqlite\":\n default:\n return [\"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\nexport const drizzleAddon: AddonDefinition = {\n id: \"drizzle\",\n category: \"database\",\n dependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"drizzle-orm\", ...driverPackages(driver)];\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"drizzle-kit\", ...driverDevPackages(driver)];\n },\n scripts() {\n return {\n \"db:generate\": \"drizzle-kit generate\",\n \"db:push\": \"drizzle-kit 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(\"src/db/schema.ts\", schemaSource(driver));\n await write(\"src/db/index.ts\", dbIndexSource(driver));\n await write(\"drizzle.config.ts\", drizzleConfigSource(driver));\n await write(\".env.example\", envExample(driver));\n },\n};\n"],"mappings":";AAGA,SAAS,aAAa,QAA0B;CAC9C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;EAOT,KAAK,SACH,OAAO;;;;;;;EAQT,SACE,OAAO;;;;;;;CAOX;AACF;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;;EAYT,KAAK,SACH,OAAO;;;;;;;;;;EAWT,SACE,OAAO;;;;;;;;;;;CAWX;AACF;AAEA,SAAS,oBAAoB,QAA0B;CAErD,OAAO;;;;;cADS,WAAW,aAAa,eAAe,WAAW,UAAU,UAAU,SAMlE;;;;;;AAMtB;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,IAAI;EACd,KAAK,SACH,OAAO,CAAC,QAAQ;EAElB,SACE,OAAO,CAAC,gBAAgB;CAC5B;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,IAAa,eAAgC;CAC3C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,eAAe,GAAG,eADX,IAAI,UAAU,QACkB,CAAC;CAClD;CACA,gBAAgB,KAAK;EAEnB,OAAO,CAAC,eAAe,GAAG,kBADX,IAAI,UAAU,QACqB,CAAC;CACrD;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,aAAa,MAAM,CAAC;EACpD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,qBAAqB,oBAAoB,MAAM,CAAC;EAC5D,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/kysely/index.ts"],"sourcesContent":["import type { AddonDefinition } from
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/kysely/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\nimport type { DbDriver } from \"../../core/types.js\";\n\nfunction schemaTypesSource(): string {\n return `export interface UserTable {\n id: number\n email: string\n}\n\nexport interface DB {\n users: UserTable\n}\n`;\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { Kysely, PostgresDialect } from 'kysely'\nimport pg from 'pg'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const pool = new pg.Pool({\n connectionString: process.env.DATABASE_URL,\n })\n return new Kysely<DB>({\n dialect: new PostgresDialect({ pool }),\n })\n}\n`;\n case \"mysql\":\n return `import { Kysely, MysqlDialect } from 'kysely'\nimport { createPool } from 'mysql2'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const pool = createPool(process.env.DATABASE_URL ?? '')\n return new Kysely<DB>({\n dialect: new MysqlDialect({ pool }),\n })\n}\n`;\n case \"sqlite\":\n default:\n return `import Database from 'better-sqlite3'\nimport { Kysely, SqliteDialect } from 'kysely'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const filePath = (process.env.DATABASE_URL ?? 'file:./local.db').replace(/^file:/, '')\n const database = new Database(filePath)\n return new Kysely<DB>({\n dialect: new SqliteDialect({ database }),\n })\n}\n`;\n }\n}\n\nfunction driverPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"pg\"];\n case \"mysql\":\n return [\"mysql2\"];\n case \"sqlite\":\n default:\n return [\"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 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\nexport const kyselyAddon: AddonDefinition = {\n id: \"kysely\",\n category: \"database\",\n dependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"kysely\", ...driverPackages(driver)];\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return driverDevPackages(driver);\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(\"src/db/schema.ts\", schemaTypesSource());\n await write(\"src/db/index.ts\", dbIndexSource(driver));\n await write(\".env.example\", envExample(driver));\n },\n};\n"],"mappings":";AAGA,SAAS,oBAA4B;CACnC,OAAO;;;;;;;;;AAST;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;;;;EAcT,KAAK,SACH,OAAO;;;;;;;;;;;;EAaT,SACE,OAAO;;;;;;;;;;;;;CAaX;AACF;AAEA,SAAS,eAAe,QAA4B;CAClD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,IAAI;EACd,KAAK,SACH,OAAO,CAAC,QAAQ;EAElB,SACE,OAAO,CAAC,gBAAgB;CAC5B;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,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,IAAa,cAA+B;CAC1C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,UAAU,GAAG,eADN,IAAI,UAAU,QACa,CAAC;CAC7C;CACA,gBAAgB,KAAK;EAEnB,OAAO,kBADQ,IAAI,UAAU,QACE;CACjC;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,kBAAkB,CAAC;EACnD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/pino/index.ts"],"sourcesContent":["import type { AddonDefinition } from
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/pino/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\n\nexport const pinoAddon: AddonDefinition = {\n id: \"pino\",\n category: \"logger\",\n dependencies() {\n return [\"pino\"];\n },\n devDependencies() {\n return [];\n },\n bootBinding() {\n return {\n key: \"logger\",\n importPath: \"./logger.js\",\n factoryName: \"createLogger\",\n };\n },\n async apply(_ctx, write) {\n await write(\n \"src/logger.ts\",\n `import pino from 'pino'\n\nexport function createLogger() {\n return pino({ level: process.env.LOG_LEVEL ?? 'info' })\n}\n`,\n );\n },\n};\n"],"mappings":";AAEA,IAAa,YAA6B;CACxC,IAAI;CACJ,UAAU;CACV,eAAe;EACb,OAAO,CAAC,MAAM;CAChB;CACA,kBAAkB;EAChB,OAAO,CAAC;CACV;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,MAAM,OAAO;EACvB,MAAM,MACJ,iBACA;;;;;CAMF;CACF;AACF"}
|
|
@@ -13,14 +13,91 @@ function envExample(driver) {
|
|
|
13
13
|
default: return "DATABASE_URL=file:./local.db\n";
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
+
function driverPackages(driver) {
|
|
17
|
+
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"];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function driverDevPackages(driver) {
|
|
24
|
+
switch (driver) {
|
|
25
|
+
case "postgres": return ["@types/pg"];
|
|
26
|
+
case "sqlite": return ["@types/better-sqlite3"];
|
|
27
|
+
default: return [];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function dbIndexSource(driver) {
|
|
31
|
+
switch (driver) {
|
|
32
|
+
case "postgres": return `import { PrismaPg } from '@prisma/adapter-pg'
|
|
33
|
+
|
|
34
|
+
import { PrismaClient } from './prisma/client.js'
|
|
35
|
+
|
|
36
|
+
export function createDb() {
|
|
37
|
+
const adapter = new PrismaPg({
|
|
38
|
+
connectionString: process.env.DATABASE_URL,
|
|
39
|
+
})
|
|
40
|
+
return new PrismaClient({ adapter })
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
43
|
+
case "mysql": return `import { PrismaMariaDb } from '@prisma/adapter-mariadb'
|
|
44
|
+
|
|
45
|
+
import { PrismaClient } from './prisma/client.js'
|
|
46
|
+
|
|
47
|
+
export function createDb() {
|
|
48
|
+
const adapter = new PrismaMariaDb(process.env.DATABASE_URL ?? 'mariadb://root:@localhost:3306/mydb')
|
|
49
|
+
return new PrismaClient({ adapter })
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
default: return `import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'
|
|
53
|
+
|
|
54
|
+
import { PrismaClient } from './prisma/client.js'
|
|
55
|
+
|
|
56
|
+
export function createDb() {
|
|
57
|
+
const adapter = new PrismaBetterSqlite3({
|
|
58
|
+
url: process.env.DATABASE_URL ?? 'file:./local.db',
|
|
59
|
+
})
|
|
60
|
+
return new PrismaClient({ adapter })
|
|
61
|
+
}
|
|
62
|
+
`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function prismaConfigSource() {
|
|
66
|
+
return `import 'dotenv/config'
|
|
67
|
+
import { defineConfig, env } from 'prisma/config'
|
|
68
|
+
|
|
69
|
+
export default defineConfig({
|
|
70
|
+
schema: 'prisma/schema.prisma',
|
|
71
|
+
datasource: {
|
|
72
|
+
url: env('DATABASE_URL'),
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
function schemaSource(driver) {
|
|
78
|
+
return `generator client {
|
|
79
|
+
provider = "prisma-client"
|
|
80
|
+
output = "../src/db/prisma"
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
datasource db {
|
|
84
|
+
provider = "${prismaProvider(driver)}"
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
model User {
|
|
88
|
+
id Int @id @default(autoincrement())
|
|
89
|
+
email String
|
|
90
|
+
}
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
16
93
|
var prismaAddon = {
|
|
17
94
|
id: "prisma",
|
|
18
95
|
category: "database",
|
|
19
|
-
dependencies() {
|
|
20
|
-
return ["@prisma/client"];
|
|
96
|
+
dependencies(ctx) {
|
|
97
|
+
return ["@prisma/client", ...driverPackages(ctx.driver ?? "sqlite")];
|
|
21
98
|
},
|
|
22
|
-
devDependencies() {
|
|
23
|
-
return ["prisma"];
|
|
99
|
+
devDependencies(ctx) {
|
|
100
|
+
return ["prisma", ...driverDevPackages(ctx.driver ?? "sqlite")];
|
|
24
101
|
},
|
|
25
102
|
scripts() {
|
|
26
103
|
return {
|
|
@@ -37,26 +114,9 @@ var prismaAddon = {
|
|
|
37
114
|
},
|
|
38
115
|
async apply(ctx, write) {
|
|
39
116
|
const driver = ctx.driver ?? "sqlite";
|
|
40
|
-
await write("prisma
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
datasource db {
|
|
45
|
-
provider = "${prismaProvider(driver)}"
|
|
46
|
-
url = env("DATABASE_URL")
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
model User {
|
|
50
|
-
id Int @id @default(autoincrement())
|
|
51
|
-
email String
|
|
52
|
-
}
|
|
53
|
-
`);
|
|
54
|
-
await write("src/db/index.ts", `import { PrismaClient } from '@prisma/client'
|
|
55
|
-
|
|
56
|
-
export function createDb() {
|
|
57
|
-
return new PrismaClient()
|
|
58
|
-
}
|
|
59
|
-
`);
|
|
117
|
+
await write("prisma.config.ts", prismaConfigSource());
|
|
118
|
+
await write("prisma/schema.prisma", schemaSource(driver));
|
|
119
|
+
await write("src/db/index.ts", dbIndexSource(driver));
|
|
60
120
|
await write(".env.example", envExample(driver));
|
|
61
121
|
}
|
|
62
122
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/prisma/index.ts"],"sourcesContent":["import type { AddonDefinition } from
|
|
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"}
|
|
@@ -23,7 +23,7 @@ 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
|
+
types: [...require_types.PROJECT_TYPES],
|
|
27
27
|
db: {
|
|
28
28
|
odms: [...require_types.DB_ODMS],
|
|
29
29
|
drivers: [...require_types.DB_DRIVERS],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.cjs","names":[],"sources":["../../../src/addons/registry.ts"],"sourcesContent":["import { arktypeAddon } from
|
|
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 const dbCount = selected.filter((addon) => addon.category === \"database\").length;\n if (dbCount > 1) {\n throw new Error(\"Only one database addon can be selected\");\n }\n\n const loggerCount = selected.filter((addon) => addon.category === \"logger\").length;\n if (loggerCount > 1) {\n throw new Error(\"Only one logger addon can be selected\");\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 const validatorCount = selected.filter((addon) => addon.category === \"validator\").length;\n if (validatorCount > 1) {\n throw new Error(\"Only one validator addon can be selected\");\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;CAGA,IADgB,SAAS,QAAQ,UAAU,MAAM,aAAa,UAAU,CAAC,CAAC,SAC5D,GACZ,MAAM,IAAI,MAAM,yCAAyC;CAI3D,IADoB,SAAS,QAAQ,UAAU,MAAM,aAAa,QAAQ,CAAC,CAAC,SAC1D,GAChB,MAAM,IAAI,MAAM,uCAAuC;CAGzD,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;CAGA,IADuB,SAAS,QAAQ,UAAU,MAAM,aAAa,WAAW,CAAC,CAAC,SAC7D,GACnB,MAAM,IAAI,MAAM,0CAA0C;CAG5D,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"}
|
|
@@ -7,7 +7,7 @@ export type BootBinding = {
|
|
|
7
7
|
export type FileWriter = (filePath: string, contents: string) => Promise<void>;
|
|
8
8
|
export type AddonDefinition = {
|
|
9
9
|
id: string;
|
|
10
|
-
category:
|
|
10
|
+
category: "database" | "logger" | "validator";
|
|
11
11
|
dependencies: (ctx: ScaffoldContext) => string[];
|
|
12
12
|
devDependencies: (ctx: ScaffoldContext) => string[];
|
|
13
13
|
scripts?: (ctx: ScaffoldContext) => Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/valibot/index.ts"],"sourcesContent":["import { ValidatorAddon } from
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/valibot/index.ts"],"sourcesContent":["import { ValidatorAddon } from \"../validators.js\";\n\nexport const valibotAddon = ValidatorAddon(\"valibot\");\n"],"mappings":";AAEA,IAAa,0CAAe,CAAA,CAAA,eAAe,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.cjs","names":[],"sources":["../../../src/addons/validators.ts"],"sourcesContent":["import type { ValidatorId } from
|
|
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() }),\n}`,\n arktype: `, {\n query: type({ name: 'string' }),\n}`,\n valibot: `, {\n query: v.object({ name: v.string() }),\n}`,\n};\n\nconst ROUTE_TEMPLATE = (validator: ValidatorId) => `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n${IMPORT_LINES[validator]}\n\nexport const Route = t.get('/'${VALIDATION_BLOCK_TEMPLATE[validator]}).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;;gCAEM,0BAA0B,WAAW;;;;AAKrE,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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/winston/index.ts"],"sourcesContent":["import type { AddonDefinition } from
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/winston/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\n\nexport const winstonAddon: AddonDefinition = {\n id: \"winston\",\n category: \"logger\",\n dependencies() {\n return [\"winston\"];\n },\n devDependencies() {\n return [];\n },\n bootBinding() {\n return {\n key: \"logger\",\n importPath: \"./logger.js\",\n factoryName: \"createLogger\",\n };\n },\n async apply(_ctx, write) {\n await write(\n \"src/logger.ts\",\n `import winston from 'winston'\n\nexport function createLogger() {\n return winston.createLogger({\n level: process.env.LOG_LEVEL ?? 'info',\n format: winston.format.json(),\n transports: [new winston.transports.Console()],\n })\n}\n`,\n );\n },\n};\n"],"mappings":";AAEA,IAAa,eAAgC;CAC3C,IAAI;CACJ,UAAU;CACV,eAAe;EACb,OAAO,CAAC,SAAS;CACnB;CACA,kBAAkB;EAChB,OAAO,CAAC;CACV;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,MAAM,OAAO;EACvB,MAAM,MACJ,iBACA;;;;;;;;;CAUF;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/zod/index.ts"],"sourcesContent":["import { ValidatorAddon } from
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/zod/index.ts"],"sourcesContent":["import { ValidatorAddon } from \"../validators.js\";\n\nexport const zodAddon = ValidatorAddon(\"zod\");\n"],"mappings":";AAEA,IAAa,sCAAW,CAAA,CAAA,eAAe,KAAK"}
|
package/dist/cjs/cli.cjs
CHANGED
|
@@ -12,6 +12,10 @@ async function main() {
|
|
|
12
12
|
const { values, positionals } = (0, node_util.parseArgs)({
|
|
13
13
|
args: process.argv.slice(2),
|
|
14
14
|
options: {
|
|
15
|
+
type: {
|
|
16
|
+
type: "string",
|
|
17
|
+
short: "t"
|
|
18
|
+
},
|
|
15
19
|
framework: { type: "string" },
|
|
16
20
|
db: { type: "string" },
|
|
17
21
|
logger: { type: "string" },
|
|
@@ -26,6 +30,7 @@ async function main() {
|
|
|
26
30
|
allowPositionals: true
|
|
27
31
|
});
|
|
28
32
|
const parsed = require_create.buildParsedArgsFromCli({
|
|
33
|
+
...values.type !== void 0 ? { type: values.type } : {},
|
|
29
34
|
...values.framework !== void 0 ? { framework: values.framework } : {},
|
|
30
35
|
...values.db !== void 0 ? { db: values.db } : {},
|
|
31
36
|
...values.logger !== void 0 ? { logger: values.logger } : {},
|
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
|
|
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"}
|
|
@@ -13,8 +13,8 @@ picocolors = require_runtime.__toESM(picocolors, 1);
|
|
|
13
13
|
let node_path = require("node:path");
|
|
14
14
|
node_path = require_runtime.__toESM(node_path, 1);
|
|
15
15
|
//#region src/commands/create.ts
|
|
16
|
-
function
|
|
17
|
-
return typeof value === "string" && require_types.
|
|
16
|
+
function isProjectType(value) {
|
|
17
|
+
return typeof value === "string" && require_types.PROJECT_TYPES.includes(value);
|
|
18
18
|
}
|
|
19
19
|
function isDbOdm(value) {
|
|
20
20
|
return typeof value === "string" && require_types.DB_ODMS.includes(value);
|
|
@@ -41,30 +41,62 @@ async function promptInteractiveOptions(args) {
|
|
|
41
41
|
_clack_prompts.cancel("Scaffold cancelled.");
|
|
42
42
|
process.exit(0);
|
|
43
43
|
}
|
|
44
|
-
const
|
|
45
|
-
message: "
|
|
44
|
+
const type = args.type ?? await _clack_prompts.select({
|
|
45
|
+
message: "Project type (runtime / framework)",
|
|
46
46
|
options: [
|
|
47
47
|
{
|
|
48
48
|
value: "node",
|
|
49
|
-
label: "
|
|
49
|
+
label: "Node.js",
|
|
50
50
|
hint: "default"
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
value: "express",
|
|
54
54
|
label: "Express"
|
|
55
55
|
},
|
|
56
|
+
{
|
|
57
|
+
value: "fastify",
|
|
58
|
+
label: "Fastify"
|
|
59
|
+
},
|
|
56
60
|
{
|
|
57
61
|
value: "hono",
|
|
58
62
|
label: "Hono"
|
|
59
63
|
},
|
|
60
64
|
{
|
|
61
|
-
value: "
|
|
62
|
-
label: "
|
|
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"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
value: "google-cloud-run",
|
|
94
|
+
label: "Google Cloud Run"
|
|
63
95
|
}
|
|
64
96
|
],
|
|
65
97
|
initialValue: "node"
|
|
66
98
|
});
|
|
67
|
-
if (_clack_prompts.isCancel(
|
|
99
|
+
if (_clack_prompts.isCancel(type) || !isProjectType(type)) {
|
|
68
100
|
_clack_prompts.cancel("Scaffold cancelled.");
|
|
69
101
|
process.exit(0);
|
|
70
102
|
}
|
|
@@ -178,7 +210,7 @@ async function promptInteractiveOptions(args) {
|
|
|
178
210
|
const validator = validatorChoice === "none" ? void 0 : isValidatorId(validatorChoice) ? validatorChoice : void 0;
|
|
179
211
|
return {
|
|
180
212
|
projectName: String(projectName).trim(),
|
|
181
|
-
|
|
213
|
+
type,
|
|
182
214
|
yes: args.yes,
|
|
183
215
|
noInstall: args.noInstall,
|
|
184
216
|
json: args.json,
|
|
@@ -199,7 +231,7 @@ async function runCreateCommand(args) {
|
|
|
199
231
|
const resolved = !args.yes ? await promptInteractiveOptions(args) : {
|
|
200
232
|
...args,
|
|
201
233
|
projectName: args.projectName?.trim(),
|
|
202
|
-
|
|
234
|
+
type: args.type ?? "node"
|
|
203
235
|
};
|
|
204
236
|
if (!resolved.projectName) {
|
|
205
237
|
const message = "Project name is required";
|
|
@@ -259,7 +291,8 @@ function buildParsedArgsFromCli(values, positionals) {
|
|
|
259
291
|
json: values.json ?? false
|
|
260
292
|
};
|
|
261
293
|
if (positionals[0]) args.projectName = positionals[0];
|
|
262
|
-
|
|
294
|
+
const typeFlag = values.type ?? values.framework;
|
|
295
|
+
if (typeFlag) args.type = require_parse_options.parseTypeFlag(typeFlag);
|
|
263
296
|
if (values.db) {
|
|
264
297
|
const parsed = require_parse_options.parseDbFlag(values.db);
|
|
265
298
|
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 { printCapabilitiesCatalog, printJsonError, printScaffoldResult } from '../core/json-output.js'\nimport {\n parseDbFlag,\n parseFrameworkFlag,\n parseLoggerFlag,\n parseValidatorFlag,\n type ParsedCreateArgs,\n resolveScaffoldDefaults,\n} from '../core/parse-options.js'\nimport { scaffoldProject } from '../core/scaffold-engine.js'\nimport type { DbDriver, DbOdm, Framework, LoggerId, ScaffoldResult, ValidatorId } from '../core/types.js'\nimport { DB_DRIVERS, DB_ODMS, FRAMEWORKS, LOGGERS, VALIDATORS } from '../core/types.js'\nimport { validateProjectName } from '../core/validate-project-name.js'\nimport { resolveUserAgent, runScript } from '../core/package-manager.js'\n\nfunction isFramework(value: unknown): value is Framework {\n return typeof value === 'string' && (FRAMEWORKS as readonly string[]).includes(value)\n}\n\nfunction isDbOdm(value: unknown): value is DbOdm {\n return typeof value === 'string' && (DB_ODMS as readonly string[]).includes(value)\n}\n\nfunction isDbDriver(value: unknown): value is DbDriver {\n return typeof value === 'string' && (DB_DRIVERS as readonly string[]).includes(value)\n}\n\nfunction isLoggerId(value: unknown): value is LoggerId {\n return typeof value === 'string' && (LOGGERS as readonly string[]).includes(value)\n}\n\nfunction isValidatorId(value: unknown): value is ValidatorId {\n return typeof value === 'string' && (VALIDATORS as readonly string[]).includes(value)\n}\n\nasync function promptInteractiveOptions(\n args: ParsedCreateArgs,\n): Promise<ParsedCreateArgs> {\n const projectName = args.projectName\n ?? await p.text({\n message: 'Project name',\n placeholder: 'my-taser-app',\n defaultValue: 'my-taser-app',\n validate(value) {\n return validateProjectName(value)\n },\n })\n\n if (p.isCancel(projectName)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n\n const framework = args.framework\n ?? await p.select({\n message: 'Framework adapter',\n options: [\n { value: 'node', label: 'Plain Node.js', hint: 'default' },\n { value: 'express', label: 'Express' },\n { value: 'hono', label: 'Hono' },\n { value: 'fastify', label: 'Fastify' },\n ],\n initialValue: 'node',\n })\n\n if (p.isCancel(framework) || !isFramework(framework)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n\n const dbChoice = args.db\n ?? await p.select({\n message: 'Database',\n options: [\n { value: 'none', label: 'None', hint: 'default' },\n { value: 'drizzle', label: 'Drizzle' },\n { value: 'prisma', label: 'Prisma' },\n { value: 'kysely', label: 'Kysely' },\n ],\n initialValue: 'none',\n })\n\n if (p.isCancel(dbChoice)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n\n let db: DbOdm | undefined\n let driver: DbDriver | undefined\n\n if (dbChoice !== 'none' && isDbOdm(dbChoice)) {\n db = dbChoice\n const driverChoice = args.driver\n ?? await p.select({\n message: 'Database driver',\n options: [\n { value: 'sqlite', label: 'SQLite', hint: 'default' },\n { value: 'postgres', label: 'PostgreSQL' },\n { value: 'mysql', label: 'MySQL' },\n ],\n initialValue: 'sqlite',\n })\n\n if (p.isCancel(driverChoice) || !isDbDriver(driverChoice)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n driver = driverChoice\n }\n\n const loggerChoice = args.logger\n ?? await p.select({\n message: 'Logger',\n options: [\n { value: 'none', label: 'None', hint: 'default' },\n { value: 'pino', label: 'Pino' },\n { value: 'winston', label: 'Winston' },\n ],\n initialValue: 'none',\n })\n\n if (p.isCancel(loggerChoice)) {\n p.cancel('Scaffold cancelled.')\n process.exit(0)\n }\n\n const logger = loggerChoice === 'none' ? undefined : isLoggerId(loggerChoice) ? loggerChoice : undefined\n\n const validatorChoice = 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 = validatorChoice === 'none' ? undefined : isValidatorId(validatorChoice) ? validatorChoice : undefined\n\n return {\n projectName: String(projectName).trim(),\n framework,\n yes: args.yes,\n noInstall: args.noInstall,\n json: args.json,\n ...(db ? { db, driver: driver! } : {}),\n ...(logger ? { logger } : {}),\n ...(validator ? { validator } : {}),\n }\n}\n\nexport async function runCreateCommand(args: ParsedCreateArgs): Promise<ScaffoldResult | undefined> {\n if (args.json && !args.projectName) {\n printCapabilitiesCatalog(getCapabilitiesCatalog())\n return undefined\n }\n\n const cwd = process.cwd()\n const interactive = !args.yes\n const resolved = interactive\n ? await promptInteractiveOptions(args)\n : {\n ...args,\n projectName: args.projectName?.trim(),\n framework: args.framework ?? 'node',\n }\n\n if (!resolved.projectName) {\n const message = 'Project name is required'\n if (args.json) {\n printJsonError(message)\n process.exit(1)\n }\n throw new Error(message)\n }\n\n const nameError = validateProjectName(resolved.projectName, cwd)\n if (nameError) {\n if (args.json) {\n printJsonError(nameError)\n process.exit(1)\n }\n throw new Error(nameError)\n }\n\n const targetDir = path.resolve(cwd, resolved.projectName)\n const scaffoldCtx = resolveScaffoldDefaults({\n ...resolved,\n projectName: resolved.projectName,\n })\n scaffoldCtx.targetDir = targetDir\n\n if (!args.json) {\n const spinner = p.spinner()\n spinner.start('Scaffolding project')\n try {\n const result = await scaffoldProject({\n ...scaffoldCtx,\n targetDir,\n skipInstall: args.noInstall,\n agent: resolveUserAgent(),\n })\n spinner.stop('Project created')\n const cdPath = path.relative(cwd, targetDir) || '.'\n p.note(\n [\n `cd ${cdPath}`,\n runScript(resolveUserAgent(), 'dev'),\n ].join('\\n'),\n 'Next steps',\n )\n p.outro(color.green('Done.'))\n return result\n }\n catch (error) {\n spinner.stop('Scaffold failed')\n throw error\n }\n }\n\n const result = await scaffoldProject({\n ...scaffoldCtx,\n targetDir,\n skipInstall: args.noInstall,\n agent: resolveUserAgent(),\n })\n printScaffoldResult(result)\n return result\n}\n\nexport function buildParsedArgsFromCli(values: {\n framework?: string\n db?: string\n logger?: string\n validator?: string\n y?: boolean\n noInstall?: boolean\n json?: boolean\n}, positionals: string[]): ParsedCreateArgs {\n const args: ParsedCreateArgs = {\n yes: values.y ?? false,\n noInstall: values.noInstall ?? false,\n json: values.json ?? false,\n }\n\n if (positionals[0]) {\n args.projectName = positionals[0]\n }\n\n if (values.framework) {\n args.framework = parseFrameworkFlag(values.framework)\n }\n\n if (values.db) {\n const parsed = parseDbFlag(values.db)\n args.db = parsed.db\n args.driver = parsed.driver\n }\n\n if (values.logger) {\n args.logger = parseLoggerFlag(values.logger)\n }\n\n 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 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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"}
|
|
@@ -2,6 +2,7 @@ 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
6
|
framework?: string;
|
|
6
7
|
db?: string;
|
|
7
8
|
logger?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-output.cjs","names":[],"sources":["../../../src/core/json-output.ts"],"sourcesContent":["import type { CapabilitiesCatalog, ScaffoldResult } from
|
|
1
|
+
{"version":3,"file":"json-output.cjs","names":[],"sources":["../../../src/core/json-output.ts"],"sourcesContent":["import type { CapabilitiesCatalog, ScaffoldResult } from \"./types.js\";\n\nexport function printCapabilitiesCatalog(catalog: CapabilitiesCatalog): void {\n console.log(JSON.stringify(catalog, null, 2));\n}\n\nexport function printScaffoldResult(result: ScaffoldResult): void {\n console.log(JSON.stringify(result, null, 2));\n}\n\nexport function printJsonError(message: string): void {\n console.error(JSON.stringify({ error: message }));\n}\n"],"mappings":";AAEA,SAAgB,yBAAyB,SAAoC;CAC3E,QAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC9C;AAEA,SAAgB,oBAAoB,QAA8B;CAChE,QAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC7C;AAEA,SAAgB,eAAe,SAAuB;CACpD,QAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC,CAAC;AAClD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.cjs","names":[],"sources":["../../../src/core/package-manager.ts"],"sourcesContent":["import { spawn } from
|
|
1
|
+
{"version":3,"file":"package-manager.cjs","names":[],"sources":["../../../src/core/package-manager.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\n\nimport type { Agent, ResolvedCommand } from \"package-manager-detector\";\nimport { resolveCommand } from \"package-manager-detector/commands\";\nimport { getUserAgent } from \"package-manager-detector/detect\";\n\nexport function resolveUserAgent(): Agent {\n return getUserAgent() || \"npm\";\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: \"inherit\",\n shell: false,\n env: process.env,\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(`${command} ${args.join(\" \")} exited with code ${code}`));\n });\n });\n}\n\nexport function resolveInstallCommand(\n agent: Agent,\n packages: string[],\n dev: boolean,\n): ResolvedCommand {\n const args = dev ? [\"-D\", ...packages] : packages;\n const command = resolveCommand(agent, \"add\", args);\n if (command) return command;\n\n return {\n command: \"npm\",\n args: [\"install\", ...args],\n };\n}\n\nexport async function installPackages(\n agent: Agent,\n cwd: string,\n {\n dependencies,\n devDependencies,\n }: {\n dependencies: string[];\n devDependencies: string[];\n },\n): Promise<void> {\n if (dependencies.length > 0) {\n const { command, args } = resolveInstallCommand(agent, dependencies, false);\n await runCommand(command, args, cwd);\n }\n if (devDependencies.length > 0) {\n const { command, args } = resolveInstallCommand(agent, devDependencies, true);\n await runCommand(command, args, cwd);\n }\n}\n\nexport function runScript(agent: Agent, script: string): string {\n const resolved = resolveCommand(agent, \"run\", [script]);\n if (!resolved) {\n throw new Error(`Unable to resolve run command for ${agent}`);\n }\n return `${resolved.command} ${resolved.args.join(\" \")}`;\n}\n"],"mappings":";;;;AAMA,SAAgB,mBAA0B;CACxC,QAAA,GAAO,gCAAA,aAAA,CAAa,KAAK;AAC3B;AAEA,SAAS,WAAW,SAAiB,MAAgB,KAA4B;CAC/E,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,SAAA,GAAQ,mBAAA,MAAA,CAAM,SAAS,MAAM;GACjC;GACA,OAAO;GACP,OAAO;GACP,KAAK,QAAQ;EACf,CAAC;EACD,MAAM,GAAG,SAAS,MAAM;EACxB,MAAM,GAAG,UAAU,SAAS;GAC1B,IAAI,SAAS,GAAG;IACd,QAAQ;IACR;GACF;GACA,uBAAO,IAAI,MAAM,GAAG,QAAQ,GAAG,KAAK,KAAK,GAAG,EAAE,oBAAoB,MAAM,CAAC;EAC3E,CAAC;CACH,CAAC;AACH;AAEA,SAAgB,sBACd,OACA,UACA,KACiB;CACjB,MAAM,OAAO,MAAM,CAAC,MAAM,GAAG,QAAQ,IAAI;CACzC,MAAM,WAAA,GAAU,kCAAA,eAAA,CAAe,OAAO,OAAO,IAAI;CACjD,IAAI,SAAS,OAAO;CAEpB,OAAO;EACL,SAAS;EACT,MAAM,CAAC,WAAW,GAAG,IAAI;CAC3B;AACF;AAEA,eAAsB,gBACpB,OACA,KACA,EACE,cACA,mBAKa;CACf,IAAI,aAAa,SAAS,GAAG;EAC3B,MAAM,EAAE,SAAS,SAAS,sBAAsB,OAAO,cAAc,KAAK;EAC1E,MAAM,WAAW,SAAS,MAAM,GAAG;CACrC;CACA,IAAI,gBAAgB,SAAS,GAAG;EAC9B,MAAM,EAAE,SAAS,SAAS,sBAAsB,OAAO,iBAAiB,IAAI;EAC5E,MAAM,WAAW,SAAS,MAAM,GAAG;CACrC;AACF;AAEA,SAAgB,UAAU,OAAc,QAAwB;CAC9D,MAAM,YAAA,GAAW,kCAAA,eAAA,CAAe,OAAO,OAAO,CAAC,MAAM,CAAC;CACtD,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,qCAAqC,OAAO;CAE9D,OAAO,GAAG,SAAS,QAAQ,GAAG,SAAS,KAAK,KAAK,GAAG;AACtD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Agent, ResolvedCommand } from 'package-manager-detector';
|
|
2
2
|
export declare function resolveUserAgent(): Agent;
|
|
3
3
|
export declare function resolveInstallCommand(agent: Agent, packages: string[], dev: boolean): ResolvedCommand;
|
|
4
|
-
export declare function installPackages(agent: Agent, cwd: string, { dependencies, devDependencies }: {
|
|
4
|
+
export declare function installPackages(agent: Agent, cwd: string, { dependencies, devDependencies, }: {
|
|
5
5
|
dependencies: string[];
|
|
6
6
|
devDependencies: string[];
|
|
7
7
|
}): Promise<void>;
|