create-taserjs 0.0.0 → 0.0.2
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/dist/cjs/addons/arktype/index.cjs +6 -0
- package/dist/cjs/addons/arktype/index.cjs.map +1 -0
- package/dist/cjs/addons/arktype/index.d.cts +1 -0
- package/dist/cjs/addons/drizzle/index.cjs +9 -2
- package/dist/cjs/addons/drizzle/index.cjs.map +1 -1
- package/dist/cjs/addons/kysely/index.cjs +9 -2
- package/dist/cjs/addons/kysely/index.cjs.map +1 -1
- package/dist/cjs/addons/registry.cjs +26 -12
- package/dist/cjs/addons/registry.cjs.map +1 -1
- package/dist/cjs/addons/types.d.cts +2 -2
- package/dist/cjs/addons/valibot/index.cjs +6 -0
- package/dist/cjs/addons/valibot/index.cjs.map +1 -0
- package/dist/cjs/addons/valibot/index.d.cts +1 -0
- package/dist/cjs/addons/validators.cjs +40 -0
- package/dist/cjs/addons/validators.cjs.map +1 -0
- package/dist/cjs/addons/validators.d.cts +5 -0
- package/dist/cjs/addons/zod/index.cjs +6 -0
- package/dist/cjs/addons/zod/index.cjs.map +1 -0
- package/dist/cjs/addons/zod/index.d.cts +1 -0
- package/dist/cjs/cli.cjs +2 -0
- package/dist/cjs/cli.cjs.map +1 -1
- package/dist/cjs/commands/create.cjs +34 -1
- package/dist/cjs/commands/create.cjs.map +1 -1
- package/dist/cjs/commands/create.d.cts +1 -0
- package/dist/cjs/core/package-manager.cjs +5 -13
- package/dist/cjs/core/package-manager.cjs.map +1 -1
- package/dist/cjs/core/package-manager.d.cts +2 -1
- package/dist/cjs/core/parse-options.cjs +10 -0
- package/dist/cjs/core/parse-options.cjs.map +1 -1
- package/dist/cjs/core/parse-options.d.cts +3 -1
- package/dist/cjs/core/project-config.cjs +1 -0
- package/dist/cjs/core/project-config.cjs.map +1 -1
- package/dist/cjs/core/resolve-packages.cjs +2 -1
- package/dist/cjs/core/resolve-packages.cjs.map +1 -1
- package/dist/cjs/core/scaffold-engine.cjs +6 -3
- package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
- package/dist/cjs/core/types.cjs +6 -0
- package/dist/cjs/core/types.cjs.map +1 -1
- package/dist/cjs/core/types.d.cts +4 -0
- package/dist/cjs/templates/base.cjs +12 -13
- package/dist/cjs/templates/base.cjs.map +1 -1
- package/dist/esm/addons/arktype/index.d.ts +1 -0
- package/dist/esm/addons/arktype/index.js +7 -0
- package/dist/esm/addons/arktype/index.js.map +1 -0
- package/dist/esm/addons/drizzle/index.js +9 -2
- package/dist/esm/addons/drizzle/index.js.map +1 -1
- package/dist/esm/addons/kysely/index.js +9 -2
- package/dist/esm/addons/kysely/index.js.map +1 -1
- package/dist/esm/addons/registry.js +18 -4
- package/dist/esm/addons/registry.js.map +1 -1
- package/dist/esm/addons/types.d.ts +2 -2
- package/dist/esm/addons/valibot/index.d.ts +1 -0
- package/dist/esm/addons/valibot/index.js +7 -0
- package/dist/esm/addons/valibot/index.js.map +1 -0
- package/dist/esm/addons/validators.d.ts +5 -0
- package/dist/esm/addons/validators.js +38 -0
- package/dist/esm/addons/validators.js.map +1 -0
- package/dist/esm/addons/zod/index.d.ts +1 -0
- package/dist/esm/addons/zod/index.js +7 -0
- package/dist/esm/addons/zod/index.js.map +1 -0
- package/dist/esm/cli.js +2 -0
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/create.d.ts +1 -0
- package/dist/esm/commands/create.js +36 -3
- package/dist/esm/commands/create.js.map +1 -1
- package/dist/esm/core/package-manager.d.ts +2 -1
- package/dist/esm/core/package-manager.js +5 -14
- package/dist/esm/core/package-manager.js.map +1 -1
- package/dist/esm/core/parse-options.d.ts +3 -1
- package/dist/esm/core/parse-options.js +11 -2
- package/dist/esm/core/parse-options.js.map +1 -1
- package/dist/esm/core/project-config.js +1 -0
- package/dist/esm/core/project-config.js.map +1 -1
- package/dist/esm/core/resolve-packages.js +2 -1
- package/dist/esm/core/resolve-packages.js.map +1 -1
- package/dist/esm/core/scaffold-engine.js +6 -3
- package/dist/esm/core/scaffold-engine.js.map +1 -1
- package/dist/esm/core/types.d.ts +4 -0
- package/dist/esm/core/types.js +6 -1
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/templates/base.js +12 -13
- package/dist/esm/templates/base.js.map +1 -1
- package/package.json +1 -1
- package/src/addons/arktype/index.ts +3 -0
- package/src/addons/drizzle/index.ts +15 -2
- package/src/addons/kysely/index.ts +15 -2
- package/src/addons/registry.ts +26 -2
- package/src/addons/types.ts +2 -2
- package/src/addons/valibot/index.ts +3 -0
- package/src/addons/validators.ts +39 -0
- package/src/addons/zod/index.ts +3 -0
- package/src/cli.ts +2 -0
- package/src/commands/create.ts +32 -2
- package/src/core/package-manager.ts +7 -10
- package/src/core/parse-options.ts +19 -0
- package/src/core/project-config.ts +4 -0
- package/src/core/resolve-packages.ts +1 -0
- package/src/core/scaffold-engine.ts +3 -0
- package/src/core/types.ts +6 -0
- package/src/templates/base.ts +12 -13
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { DB_DRIVERS, DB_ODMS, FRAMEWORKS, LOGGERS } from "../core/types.js";
|
|
1
|
+
import { DB_DRIVERS, DB_ODMS, FRAMEWORKS, LOGGERS, VALIDATORS } from "../core/types.js";
|
|
2
2
|
import { getCapabilitiesCatalog } from "../addons/registry.js";
|
|
3
3
|
import { printCapabilitiesCatalog, printJsonError, printScaffoldResult } from "../core/json-output.js";
|
|
4
|
-
import { parseDbFlag, parseFrameworkFlag, parseLoggerFlag, resolveScaffoldDefaults } from "../core/parse-options.js";
|
|
4
|
+
import { parseDbFlag, parseFrameworkFlag, parseLoggerFlag, parseValidatorFlag, resolveScaffoldDefaults } from "../core/parse-options.js";
|
|
5
5
|
import { resolveUserAgent, runScript } from "../core/package-manager.js";
|
|
6
6
|
import { scaffoldProject } from "../core/scaffold-engine.js";
|
|
7
7
|
import { validateProjectName } from "../core/validate-project-name.js";
|
|
@@ -21,6 +21,9 @@ function isDbDriver(value) {
|
|
|
21
21
|
function isLoggerId(value) {
|
|
22
22
|
return typeof value === "string" && LOGGERS.includes(value);
|
|
23
23
|
}
|
|
24
|
+
function isValidatorId(value) {
|
|
25
|
+
return typeof value === "string" && VALIDATORS.includes(value);
|
|
26
|
+
}
|
|
24
27
|
async function promptInteractiveOptions(args) {
|
|
25
28
|
const projectName = args.projectName ?? await p.text({
|
|
26
29
|
message: "Project name",
|
|
@@ -141,6 +144,34 @@ async function promptInteractiveOptions(args) {
|
|
|
141
144
|
process.exit(0);
|
|
142
145
|
}
|
|
143
146
|
const logger = loggerChoice === "none" ? void 0 : isLoggerId(loggerChoice) ? loggerChoice : void 0;
|
|
147
|
+
const validatorChoice = args.validator ?? await p.select({
|
|
148
|
+
message: "Validator",
|
|
149
|
+
options: [
|
|
150
|
+
{
|
|
151
|
+
value: "none",
|
|
152
|
+
label: "None",
|
|
153
|
+
hint: "default"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
value: "zod",
|
|
157
|
+
label: "Zod"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
value: "arktype",
|
|
161
|
+
label: "Arktype"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
value: "valibot",
|
|
165
|
+
label: "Valibot"
|
|
166
|
+
}
|
|
167
|
+
],
|
|
168
|
+
initialValue: "none"
|
|
169
|
+
});
|
|
170
|
+
if (p.isCancel(validatorChoice)) {
|
|
171
|
+
p.cancel("Scaffold cancelled.");
|
|
172
|
+
process.exit(0);
|
|
173
|
+
}
|
|
174
|
+
const validator = validatorChoice === "none" ? void 0 : isValidatorId(validatorChoice) ? validatorChoice : void 0;
|
|
144
175
|
return {
|
|
145
176
|
projectName: String(projectName).trim(),
|
|
146
177
|
framework,
|
|
@@ -151,7 +182,8 @@ async function promptInteractiveOptions(args) {
|
|
|
151
182
|
db,
|
|
152
183
|
driver
|
|
153
184
|
} : {},
|
|
154
|
-
...logger ? { logger } : {}
|
|
185
|
+
...logger ? { logger } : {},
|
|
186
|
+
...validator ? { validator } : {}
|
|
155
187
|
};
|
|
156
188
|
}
|
|
157
189
|
async function runCreateCommand(args) {
|
|
@@ -230,6 +262,7 @@ function buildParsedArgsFromCli(values, positionals) {
|
|
|
230
262
|
args.driver = parsed.driver;
|
|
231
263
|
}
|
|
232
264
|
if (values.logger) args.logger = parseLoggerFlag(values.logger);
|
|
265
|
+
if (values.validator) args.validator = parseValidatorFlag(values.validator);
|
|
233
266
|
return args;
|
|
234
267
|
}
|
|
235
268
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","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 type ParsedCreateArgs,\n resolveScaffoldDefaults,\n} from '../core/parse-options.js'\nimport { scaffoldProject } from '../core/scaffold-engine.js'\nimport type { DbDriver, DbOdm, Framework, LoggerId, ScaffoldResult } from '../core/types.js'\nimport { DB_DRIVERS, DB_ODMS, FRAMEWORKS, LOGGERS } 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\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 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 }\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 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 return args\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.js","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":";;;;;;;;;;;AAqBA,SAAS,YAAY,OAAoC;CACvD,OAAO,OAAO,UAAU,YAAa,WAAiC,SAAS,KAAK;AACtF;AAEA,SAAS,QAAQ,OAAgC;CAC/C,OAAO,OAAO,UAAU,YAAa,QAA8B,SAAS,KAAK;AACnF;AAEA,SAAS,WAAW,OAAmC;CACrD,OAAO,OAAO,UAAU,YAAa,WAAiC,SAAS,KAAK;AACtF;AAEA,SAAS,WAAW,OAAmC;CACrD,OAAO,OAAO,UAAU,YAAa,QAA8B,SAAS,KAAK;AACnF;AAEA,SAAS,cAAc,OAAsC;CAC3D,OAAO,OAAO,UAAU,YAAa,WAAiC,SAAS,KAAK;AACtF;AAEA,eAAe,yBACb,MAC2B;CAC3B,MAAM,cAAc,KAAK,eACpB,MAAM,EAAE,KAAK;EACd,SAAS;EACT,aAAa;EACb,cAAc;EACd,SAAS,OAAO;GACd,OAAO,oBAAoB,KAAK;EAClC;CACF,CAAC;CAEH,IAAI,EAAE,SAAS,WAAW,GAAG;EAC3B,EAAE,OAAO,qBAAqB;EAC9B,QAAQ,KAAK,CAAC;CAChB;CAEA,MAAM,YAAY,KAAK,aAClB,MAAM,EAAE,OAAO;EAChB,SAAS;EACT,SAAS;GACP;IAAE,OAAO;IAAQ,OAAO;IAAiB,MAAM;GAAU;GACzD;IAAE,OAAO;IAAW,OAAO;GAAU;GACrC;IAAE,OAAO;IAAQ,OAAO;GAAO;GAC/B;IAAE,OAAO;IAAW,OAAO;GAAU;EACvC;EACA,cAAc;CAChB,CAAC;CAEH,IAAI,EAAE,SAAS,SAAS,KAAK,CAAC,YAAY,SAAS,GAAG;EACpD,EAAE,OAAO,qBAAqB;EAC9B,QAAQ,KAAK,CAAC;CAChB;CAEA,MAAM,WAAW,KAAK,MACjB,MAAM,EAAE,OAAO;EAChB,SAAS;EACT,SAAS;GACP;IAAE,OAAO;IAAQ,OAAO;IAAQ,MAAM;GAAU;GAChD;IAAE,OAAO;IAAW,OAAO;GAAU;GACrC;IAAE,OAAO;IAAU,OAAO;GAAS;GACnC;IAAE,OAAO;IAAU,OAAO;GAAS;EACrC;EACA,cAAc;CAChB,CAAC;CAEH,IAAI,EAAE,SAAS,QAAQ,GAAG;EACxB,EAAE,OAAO,qBAAqB;EAC9B,QAAQ,KAAK,CAAC;CAChB;CAEA,IAAI;CACJ,IAAI;CAEJ,IAAI,aAAa,UAAU,QAAQ,QAAQ,GAAG;EAC5C,KAAK;EACL,MAAM,eAAe,KAAK,UACrB,MAAM,EAAE,OAAO;GAChB,SAAS;GACT,SAAS;IACP;KAAE,OAAO;KAAU,OAAO;KAAU,MAAM;IAAU;IACpD;KAAE,OAAO;KAAY,OAAO;IAAa;IACzC;KAAE,OAAO;KAAS,OAAO;IAAQ;GACnC;GACA,cAAc;EAChB,CAAC;EAEH,IAAI,EAAE,SAAS,YAAY,KAAK,CAAC,WAAW,YAAY,GAAG;GACzD,EAAE,OAAO,qBAAqB;GAC9B,QAAQ,KAAK,CAAC;EAChB;EACA,SAAS;CACX;CAEA,MAAM,eAAe,KAAK,UACrB,MAAM,EAAE,OAAO;EAChB,SAAS;EACT,SAAS;GACP;IAAE,OAAO;IAAQ,OAAO;IAAQ,MAAM;GAAU;GAChD;IAAE,OAAO;IAAQ,OAAO;GAAO;GAC/B;IAAE,OAAO;IAAW,OAAO;GAAU;EACvC;EACA,cAAc;CAChB,CAAC;CAEH,IAAI,EAAE,SAAS,YAAY,GAAG;EAC5B,EAAE,OAAO,qBAAqB;EAC9B,QAAQ,KAAK,CAAC;CAChB;CAEA,MAAM,SAAS,iBAAiB,SAAS,KAAA,IAAY,WAAW,YAAY,IAAI,eAAe,KAAA;CAE/F,MAAM,kBAAkB,KAAK,aACxB,MAAM,EAAE,OAAO;EAChB,SAAS;EACT,SAAS;GACP;IAAE,OAAO;IAAQ,OAAO;IAAQ,MAAM;GAAU;GAChD;IAAE,OAAO;IAAO,OAAO;GAAM;GAC7B;IAAE,OAAO;IAAW,OAAO;GAAU;GACrC;IAAE,OAAO;IAAW,OAAO;GAAU;EACvC;EACA,cAAc;CAChB,CAAC;CAEH,IAAI,EAAE,SAAS,eAAe,GAAG;EAC/B,EAAE,OAAO,qBAAqB;EAC9B,QAAQ,KAAK,CAAC;CAChB;CAEA,MAAM,YAAY,oBAAoB,SAAS,KAAA,IAAY,cAAc,eAAe,IAAI,kBAAkB,KAAA;CAE9G,OAAO;EACL,aAAa,OAAO,WAAW,CAAC,CAAC,KAAK;EACtC;EACA,KAAK,KAAK;EACV,WAAW,KAAK;EAChB,MAAM,KAAK;EACX,GAAI,KAAK;GAAE;GAAY;EAAQ,IAAI,CAAC;EACpC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;CACnC;AACF;AAEA,eAAsB,iBAAiB,MAA6D;CAClG,IAAI,KAAK,QAAQ,CAAC,KAAK,aAAa;EAClC,yBAAyB,uBAAuB,CAAC;EACjD;CACF;CAEA,MAAM,MAAM,QAAQ,IAAI;CAExB,MAAM,WAAW,CADI,KAAK,MAEtB,MAAM,yBAAyB,IAAI,IACnC;EACE,GAAG;EACH,aAAa,KAAK,aAAa,KAAK;EACpC,WAAW,KAAK,aAAa;CAC/B;CAEJ,IAAI,CAAC,SAAS,aAAa;EACzB,MAAM,UAAU;EAChB,IAAI,KAAK,MAAM;GACb,eAAe,OAAO;GACtB,QAAQ,KAAK,CAAC;EAChB;EACA,MAAM,IAAI,MAAM,OAAO;CACzB;CAEA,MAAM,YAAY,oBAAoB,SAAS,aAAa,GAAG;CAC/D,IAAI,WAAW;EACb,IAAI,KAAK,MAAM;GACb,eAAe,SAAS;GACxB,QAAQ,KAAK,CAAC;EAChB;EACA,MAAM,IAAI,MAAM,SAAS;CAC3B;CAEA,MAAM,YAAY,KAAK,QAAQ,KAAK,SAAS,WAAW;CACxD,MAAM,cAAc,wBAAwB;EAC1C,GAAG;EACH,aAAa,SAAS;CACxB,CAAC;CACD,YAAY,YAAY;CAExB,IAAI,CAAC,KAAK,MAAM;EACd,MAAM,UAAU,EAAE,QAAQ;EAC1B,QAAQ,MAAM,qBAAqB;EACnC,IAAI;GACF,MAAM,SAAS,MAAM,gBAAgB;IACnC,GAAG;IACH;IACA,aAAa,KAAK;IAClB,OAAO,iBAAiB;GAC1B,CAAC;GACD,QAAQ,KAAK,iBAAiB;GAC9B,MAAM,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK;GAChD,EAAE,KACA,CACE,MAAM,UACN,UAAU,iBAAiB,GAAG,KAAK,CACrC,CAAC,CAAC,KAAK,IAAI,GACX,YACF;GACA,EAAE,MAAM,MAAM,MAAM,OAAO,CAAC;GAC5B,OAAO;EACT,SACO,OAAO;GACZ,QAAQ,KAAK,iBAAiB;GAC9B,MAAM;EACR;CACF;CAEA,MAAM,SAAS,MAAM,gBAAgB;EACnC,GAAG;EACH;EACA,aAAa,KAAK;EAClB,OAAO,iBAAiB;CAC1B,CAAC;CACD,oBAAoB,MAAM;CAC1B,OAAO;AACT;AAEA,SAAgB,uBAAuB,QAQpC,aAAyC;CAC1C,MAAM,OAAyB;EAC7B,KAAK,OAAO,KAAK;EACjB,WAAW,OAAO,aAAa;EAC/B,MAAM,OAAO,QAAQ;CACvB;CAEA,IAAI,YAAY,IACd,KAAK,cAAc,YAAY;CAGjC,IAAI,OAAO,WACT,KAAK,YAAY,mBAAmB,OAAO,SAAS;CAGtD,IAAI,OAAO,IAAI;EACb,MAAM,SAAS,YAAY,OAAO,EAAE;EACpC,KAAK,KAAK,OAAO;EACjB,KAAK,SAAS,OAAO;CACvB;CAEA,IAAI,OAAO,QACT,KAAK,SAAS,gBAAgB,OAAO,MAAM;CAG7C,IAAI,OAAO,WACT,KAAK,YAAY,mBAAmB,OAAO,SAAS;CAGtD,OAAO;AACT"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Agent } from 'package-manager-detector';
|
|
1
|
+
import { Agent, ResolvedCommand } from 'package-manager-detector';
|
|
2
2
|
export declare function resolveUserAgent(): Agent;
|
|
3
|
+
export declare function resolveInstallCommand(agent: Agent, packages: string[], dev: boolean): ResolvedCommand;
|
|
3
4
|
export declare function installPackages(agent: Agent, cwd: string, { dependencies, devDependencies }: {
|
|
4
5
|
dependencies: string[];
|
|
5
6
|
devDependencies: string[];
|
|
@@ -23,22 +23,13 @@ function runCommand(command, args, cwd) {
|
|
|
23
23
|
});
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
var fallback = {
|
|
27
|
-
agent: "npm",
|
|
28
|
-
install: (packages, dev) => {
|
|
29
|
-
return [
|
|
30
|
-
"install",
|
|
31
|
-
...packages,
|
|
32
|
-
dev ? "-D" : ""
|
|
33
|
-
];
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
26
|
function resolveInstallCommand(agent, packages, dev) {
|
|
37
|
-
const
|
|
27
|
+
const args = dev ? ["-D", ...packages] : packages;
|
|
28
|
+
const command = resolveCommand(agent, "add", args);
|
|
38
29
|
if (command) return command;
|
|
39
30
|
return {
|
|
40
|
-
command:
|
|
41
|
-
args:
|
|
31
|
+
command: "npm",
|
|
32
|
+
args: ["install", ...args]
|
|
42
33
|
};
|
|
43
34
|
}
|
|
44
35
|
async function installPackages(agent, cwd, { dependencies, devDependencies }) {
|
|
@@ -57,6 +48,6 @@ function runScript(agent, script) {
|
|
|
57
48
|
return `${resolved.command} ${resolved.args.join(" ")}`;
|
|
58
49
|
}
|
|
59
50
|
//#endregion
|
|
60
|
-
export { installPackages, resolveUserAgent, runScript };
|
|
51
|
+
export { installPackages, resolveInstallCommand, resolveUserAgent, runScript };
|
|
61
52
|
|
|
62
53
|
//# sourceMappingURL=package-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.js","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\
|
|
1
|
+
{"version":3,"file":"package-manager.js","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(agent: Agent, packages: string[], dev: boolean): 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 { dependencies, devDependencies }: {\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,OAAO,aAAa,KAAK;AAC3B;AAEA,SAAS,WAAW,SAAiB,MAAgB,KAA4B;CAC/E,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,QAAQ,MAAM,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,sBAAsB,OAAc,UAAoB,KAA+B;CACrG,MAAM,OAAO,MAAM,CAAC,MAAM,GAAG,QAAQ,IAAI;CACzC,MAAM,UAAU,eAAe,OAAO,OAAO,IAAI;CACjD,IAAI,SAAS,OAAO;CAEpB,OAAO;EACL,SAAS;EACT,MAAM,CAAC,WAAW,GAAG,IAAI;CAC3B;AACF;AAEA,eAAsB,gBACpB,OACA,KACA,EAAE,cAAc,mBAID;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,WAAW,eAAe,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,10 +1,11 @@
|
|
|
1
|
-
import { DbDriver, DbOdm, Framework, LoggerId, ScaffoldContext } from './types.js';
|
|
1
|
+
import { DbDriver, DbOdm, Framework, LoggerId, ScaffoldContext, ValidatorId } from './types.js';
|
|
2
2
|
export type ParsedCreateArgs = {
|
|
3
3
|
projectName?: string;
|
|
4
4
|
framework?: Framework;
|
|
5
5
|
db?: DbOdm;
|
|
6
6
|
driver?: DbDriver;
|
|
7
7
|
logger?: LoggerId;
|
|
8
|
+
validator?: ValidatorId;
|
|
8
9
|
yes: boolean;
|
|
9
10
|
noInstall: boolean;
|
|
10
11
|
json: boolean;
|
|
@@ -16,3 +17,4 @@ export declare function parseDbFlag(value: string): {
|
|
|
16
17
|
export declare function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext;
|
|
17
18
|
export declare function parseFrameworkFlag(value: string): Framework;
|
|
18
19
|
export declare function parseLoggerFlag(value: string): LoggerId;
|
|
20
|
+
export declare function parseValidatorFlag(value: string): ValidatorId;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, FRAMEWORKS, LOGGERS } from "./types.js";
|
|
1
|
+
import { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, FRAMEWORKS, LOGGERS, VALIDATORS } from "./types.js";
|
|
2
2
|
//#region src/core/parse-options.ts
|
|
3
3
|
function isFramework(value) {
|
|
4
4
|
return FRAMEWORKS.includes(value);
|
|
@@ -12,6 +12,9 @@ function isDbDriver(value) {
|
|
|
12
12
|
function isLoggerId(value) {
|
|
13
13
|
return LOGGERS.includes(value);
|
|
14
14
|
}
|
|
15
|
+
function isValidatorId(value) {
|
|
16
|
+
return VALIDATORS.includes(value);
|
|
17
|
+
}
|
|
15
18
|
function parseDbFlag(value) {
|
|
16
19
|
const [odm, driver] = value.split(":");
|
|
17
20
|
if (!odm || !isDbOdm(odm)) throw new Error(`Invalid --db value "${value}". Use drizzle, prisma, or kysely (optionally with :postgres, :sqlite, or :mysql).`);
|
|
@@ -29,6 +32,7 @@ function resolveScaffoldDefaults(args) {
|
|
|
29
32
|
const framework = args.framework ?? "node";
|
|
30
33
|
const db = args.db;
|
|
31
34
|
const logger = args.logger;
|
|
35
|
+
const validator = args.validator;
|
|
32
36
|
if (!args.projectName) throw new Error("Project name is required");
|
|
33
37
|
const result = {
|
|
34
38
|
projectName: args.projectName.trim(),
|
|
@@ -40,6 +44,7 @@ function resolveScaffoldDefaults(args) {
|
|
|
40
44
|
result.driver = args.driver ?? "sqlite";
|
|
41
45
|
}
|
|
42
46
|
if (logger) result.logger = logger;
|
|
47
|
+
if (validator) result.validator = validator;
|
|
43
48
|
return result;
|
|
44
49
|
}
|
|
45
50
|
function parseFrameworkFlag(value) {
|
|
@@ -50,7 +55,11 @@ function parseLoggerFlag(value) {
|
|
|
50
55
|
if (!isLoggerId(value)) throw new Error(`Invalid --logger "${value}". Use pino or winston.`);
|
|
51
56
|
return value;
|
|
52
57
|
}
|
|
58
|
+
function parseValidatorFlag(value) {
|
|
59
|
+
if (!isValidatorId(value)) throw new Error(`Invalid --validator "${value}". Use zod, arktype, or valibot.`);
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
53
62
|
//#endregion
|
|
54
|
-
export { parseDbFlag, parseFrameworkFlag, parseLoggerFlag, resolveScaffoldDefaults };
|
|
63
|
+
export { parseDbFlag, parseFrameworkFlag, parseLoggerFlag, parseValidatorFlag, resolveScaffoldDefaults };
|
|
55
64
|
|
|
56
65
|
//# sourceMappingURL=parse-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-options.js","names":[],"sources":["../../../src/core/parse-options.ts"],"sourcesContent":["import {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n FRAMEWORKS,\n LOGGERS,\n type DbDriver,\n type DbOdm,\n type Framework,\n type LoggerId,\n type ScaffoldContext,\n} from './types.js'\n\nexport type ParsedCreateArgs = {\n projectName?: string\n framework?: Framework\n db?: DbOdm\n driver?: DbDriver\n logger?: LoggerId\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 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\nexport function parseDbFlag(value: string): { db: DbOdm, driver: DbDriver } {\n const [odm, driver] = value.split(':')\n if (!odm || !isDbOdm(odm)) {\n throw new Error(`Invalid --db value \"${value}\". Use drizzle, prisma, or kysely (optionally with :postgres, :sqlite, or :mysql).`)\n }\n\n if (driver === undefined || driver === '') {\n return { db: odm, driver: DEFAULT_DB_DRIVER }\n }\n\n if (!isDbDriver(driver)) {\n throw new Error(`Invalid database driver \"${driver}\". Use postgres, sqlite, or mysql.`)\n }\n\n return { db: odm, driver }\n}\n\nexport function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext {\n const framework = args.framework ?? 'node'\n const db = args.db\n const logger = args.logger\n\n if (!args.projectName) {\n throw new Error('Project name is required')\n }\n\n const result: ScaffoldContext = {\n projectName: args.projectName.trim(),\n targetDir: '',\n framework,\n }\n\n if (db) {\n result.db = db\n result.driver = args.driver ?? DEFAULT_DB_DRIVER\n }\n\n if (logger) {\n result.logger = logger\n }\n\n return result\n}\n\nexport function parseFrameworkFlag(value: string): Framework {\n if (!isFramework(value)) {\n throw new Error(`Invalid --framework \"${value}\". Use node, express, hono, or fastify.`)\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"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"parse-options.js","names":[],"sources":["../../../src/core/parse-options.ts"],"sourcesContent":["import {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n FRAMEWORKS,\n LOGGERS,\n VALIDATORS,\n type DbDriver,\n type DbOdm,\n type Framework,\n type LoggerId,\n type ScaffoldContext,\n type ValidatorId,\n} from './types.js'\n\nexport type ParsedCreateArgs = {\n projectName?: string\n framework?: Framework\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 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(`Invalid --db value \"${value}\". Use drizzle, prisma, or kysely (optionally with :postgres, :sqlite, or :mysql).`)\n }\n\n if (driver === undefined || driver === '') {\n return { db: odm, driver: DEFAULT_DB_DRIVER }\n }\n\n if (!isDbDriver(driver)) {\n throw new Error(`Invalid database driver \"${driver}\". Use postgres, sqlite, or mysql.`)\n }\n\n return { db: odm, driver }\n}\n\nexport function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext {\n const framework = args.framework ?? 'node'\n const db = args.db\n const logger = args.logger\n const validator = args.validator\n\n if (!args.projectName) {\n throw new Error('Project name is required')\n }\n\n const result: ScaffoldContext = {\n projectName: args.projectName.trim(),\n targetDir: '',\n framework,\n }\n\n if (db) {\n result.db = db\n result.driver = args.driver ?? DEFAULT_DB_DRIVER\n }\n\n if (logger) {\n result.logger = logger\n }\n\n if (validator) {\n result.validator = validator\n }\n\n return result\n}\n\nexport function parseFrameworkFlag(value: string): Framework {\n if (!isFramework(value)) {\n throw new Error(`Invalid --framework \"${value}\". Use node, express, hono, or fastify.`)\n }\n return value\n}\n\nexport function parseLoggerFlag(value: string): LoggerId {\n if (!isLoggerId(value)) {\n throw new Error(`Invalid --logger \"${value}\". Use pino or winston.`)\n }\n return value\n}\n\nexport function parseValidatorFlag(value: string): ValidatorId {\n if (!isValidatorId(value)) {\n throw new Error(`Invalid --validator \"${value}\". Use zod, arktype, or valibot.`)\n }\n return value\n}\n"],"mappings":";;AA2BA,SAAS,YAAY,OAAmC;CACtD,OAAQ,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,QAAQ,OAA+B;CAC9C,OAAQ,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAS,cAAc,OAAqC;CAC1D,OAAQ,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,MAAM,uBAAuB,MAAM,mFAAmF;CAGlI,IAAI,WAAW,KAAA,KAAa,WAAW,IACrC,OAAO;EAAE,IAAI;EAAK,QAAQ;CAAkB;CAG9C,IAAI,CAAC,WAAW,MAAM,GACpB,MAAM,IAAI,MAAM,4BAA4B,OAAO,mCAAmC;CAGxF,OAAO;EAAE,IAAI;EAAK;CAAO;AAC3B;AAEA,SAAgB,wBAAwB,MAAyC;CAC/E,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,KAAK,KAAK;CAChB,MAAM,SAAS,KAAK;CACpB,MAAM,YAAY,KAAK;CAEvB,IAAI,CAAC,KAAK,aACR,MAAM,IAAI,MAAM,0BAA0B;CAG5C,MAAM,SAA0B;EAC9B,aAAa,KAAK,YAAY,KAAK;EACnC,WAAW;EACX;CACF;CAEA,IAAI,IAAI;EACN,OAAO,KAAK;EACZ,OAAO,SAAS,KAAK,UAAA;CACvB;CAEA,IAAI,QACF,OAAO,SAAS;CAGlB,IAAI,WACF,OAAO,YAAY;CAGrB,OAAO;AACT;AAEA,SAAgB,mBAAmB,OAA0B;CAC3D,IAAI,CAAC,YAAY,KAAK,GACpB,MAAM,IAAI,MAAM,wBAAwB,MAAM,wCAAwC;CAExF,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"}
|
|
@@ -8,6 +8,7 @@ async function writeProjectConfig(root, ctx) {
|
|
|
8
8
|
if (ctx.driver) config.driver = ctx.driver;
|
|
9
9
|
}
|
|
10
10
|
if (ctx.logger) config.logger = ctx.logger;
|
|
11
|
+
if (ctx.validator) config.validator = ctx.validator;
|
|
11
12
|
await writeFile(path.join(root, ".taser.json"), `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
12
13
|
}
|
|
13
14
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config.js","names":[],"sources":["../../../src/core/project-config.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { ScaffoldContext } from './types.js'\n\nexport async function writeProjectConfig(root: string, ctx: ScaffoldContext): Promise<void> {\n const config: Record<string, string> = {\n framework: ctx.framework,\n }\n\n if (ctx.db) {\n config.db = ctx.db\n if (ctx.driver) {\n config.driver = ctx.driver\n }\n }\n\n if (ctx.logger) {\n config.logger = ctx.logger\n }\n\n await writeFile(\n path.join(root, '.taser.json'),\n `${JSON.stringify(config, null, 2)}\\n`,\n 'utf8',\n )\n}\n"],"mappings":";;;AAKA,eAAsB,mBAAmB,MAAc,KAAqC;CAC1F,MAAM,SAAiC,EACrC,WAAW,IAAI,UACjB;CAEA,IAAI,IAAI,IAAI;EACV,OAAO,KAAK,IAAI;EAChB,IAAI,IAAI,QACN,OAAO,SAAS,IAAI;CAExB;CAEA,IAAI,IAAI,QACN,OAAO,SAAS,IAAI;CAGtB,MAAM,UACJ,KAAK,KAAK,MAAM,aAAa,GAC7B,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,KACnC,MACF;AACF"}
|
|
1
|
+
{"version":3,"file":"project-config.js","names":[],"sources":["../../../src/core/project-config.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { ScaffoldContext } from './types.js'\n\nexport async function writeProjectConfig(root: string, ctx: ScaffoldContext): Promise<void> {\n const config: Record<string, string> = {\n framework: ctx.framework,\n }\n\n if (ctx.db) {\n config.db = ctx.db\n if (ctx.driver) {\n config.driver = ctx.driver\n }\n }\n\n if (ctx.logger) {\n config.logger = ctx.logger\n }\n\n if (ctx.validator) {\n config.validator = ctx.validator\n }\n\n await writeFile(\n path.join(root, '.taser.json'),\n `${JSON.stringify(config, null, 2)}\\n`,\n 'utf8',\n )\n}\n"],"mappings":";;;AAKA,eAAsB,mBAAmB,MAAc,KAAqC;CAC1F,MAAM,SAAiC,EACrC,WAAW,IAAI,UACjB;CAEA,IAAI,IAAI,IAAI;EACV,OAAO,KAAK,IAAI;EAChB,IAAI,IAAI,QACN,OAAO,SAAS,IAAI;CAExB;CAEA,IAAI,IAAI,QACN,OAAO,SAAS,IAAI;CAGtB,IAAI,IAAI,WACN,OAAO,YAAY,IAAI;CAGzB,MAAM,UACJ,KAAK,KAAK,MAAM,aAAa,GAC7B,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,KACnC,MACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-packages.js","names":[],"sources":["../../../src/core/resolve-packages.ts"],"sourcesContent":["import { resolveAddons } from '../addons/registry.js'\nimport type { PackageGroups, ScaffoldContext, Framework } from '../core/types.js'\n\nfunction frameworkPackages(framework: Framework): PackageGroups {\n const dependencies = ['@taserjs/router']\n const devDependencies = [\n '@taserjs/router-cli',\n 'npm-run-all2',\n 'tsdown',\n 'tsx',\n 'typescript',\n ]\n const scripts: Record<string, string> = {}\n\n switch (framework) {\n case 'express':\n dependencies.push('@taserjs/adapter-express', 'express')\n devDependencies.push('@types/express')\n break\n case 'hono':\n dependencies.push('@hono/node-server', 'hono')\n break\n case 'fastify':\n dependencies.push('@taserjs/adapter-fastify', 'fastify')\n break\n case 'node':\n default:\n dependencies.push('@taserjs/adapter-node')\n break\n }\n\n return { dependencies, devDependencies, scripts }\n}\n\nexport function resolvePackages(ctx: ScaffoldContext): PackageGroups {\n const base = frameworkPackages(ctx.framework)\n const addons = resolveAddons(ctx)\n\n const dependencies = [...base.dependencies]\n const devDependencies = [...base.devDependencies]\n const scripts = { ...base.scripts }\n\n for (const addon of addons) {\n dependencies.push(...addon.dependencies(ctx))\n devDependencies.push(...addon.devDependencies(ctx))\n if (addon.scripts) {\n Object.assign(scripts, addon.scripts(ctx))\n }\n }\n\n return {\n dependencies: [...new Set(dependencies)],\n devDependencies: [...new Set(devDependencies)],\n scripts,\n }\n}\n\n// Backward-compatible export for tests during migration\nexport function getPackageGroups(framework: Framework): Omit<PackageGroups, 'scripts'> & { scripts?: Record<string, string> } {\n const groups = frameworkPackages(framework)\n return groups\n}\n"],"mappings":";;AAGA,SAAS,kBAAkB,WAAqC;CAC9D,MAAM,eAAe,CAAC,iBAAiB;CACvC,MAAM,kBAAkB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,UAAkC,CAAC;CAEzC,QAAQ,WAAR;EACE,KAAK;GACH,aAAa,KAAK,4BAA4B,SAAS;GACvD,gBAAgB,KAAK,gBAAgB;GACrC;EACF,KAAK;GACH,aAAa,KAAK,qBAAqB,MAAM;GAC7C;EACF,KAAK;GACH,aAAa,KAAK,4BAA4B,SAAS;GACvD;EAEF,SACE,aAAa,KAAK,uBAAuB;CAE7C;CAEA,OAAO;EAAE;EAAc;EAAiB;CAAQ;AAClD;AAEA,SAAgB,gBAAgB,KAAqC;CACnE,MAAM,OAAO,kBAAkB,IAAI,SAAS;CAC5C,MAAM,SAAS,cAAc,GAAG;CAEhC,MAAM,eAAe,CAAC,GAAG,KAAK,YAAY;CAC1C,MAAM,kBAAkB,CAAC,GAAG,KAAK,eAAe;CAChD,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;CAElC,KAAK,MAAM,SAAS,QAAQ;EAC1B,aAAa,KAAK,GAAG,MAAM,aAAa,GAAG,CAAC;EAC5C,gBAAgB,KAAK,GAAG,MAAM,gBAAgB,GAAG,CAAC;EAClD,IAAI,MAAM,SACR,OAAO,OAAO,SAAS,MAAM,QAAQ,GAAG,CAAC;CAE7C;CAEA,OAAO;EACL,cAAc,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC;EACvC,iBAAiB,CAAC,GAAG,IAAI,IAAI,eAAe,CAAC;EAC7C;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"resolve-packages.js","names":[],"sources":["../../../src/core/resolve-packages.ts"],"sourcesContent":["import { resolveAddons } from '../addons/registry.js'\nimport type { PackageGroups, ScaffoldContext, Framework } from '../core/types.js'\n\nfunction frameworkPackages(framework: Framework): PackageGroups {\n const dependencies = ['@taserjs/router']\n const devDependencies = [\n '@taserjs/router-cli',\n 'npm-run-all2',\n 'tsdown',\n 'tsx',\n 'typescript',\n '@types/node',\n ]\n const scripts: Record<string, string> = {}\n\n switch (framework) {\n case 'express':\n dependencies.push('@taserjs/adapter-express', 'express')\n devDependencies.push('@types/express')\n break\n case 'hono':\n dependencies.push('@hono/node-server', 'hono')\n break\n case 'fastify':\n dependencies.push('@taserjs/adapter-fastify', 'fastify')\n break\n case 'node':\n default:\n dependencies.push('@taserjs/adapter-node')\n break\n }\n\n return { dependencies, devDependencies, scripts }\n}\n\nexport function resolvePackages(ctx: ScaffoldContext): PackageGroups {\n const base = frameworkPackages(ctx.framework)\n const addons = resolveAddons(ctx)\n\n const dependencies = [...base.dependencies]\n const devDependencies = [...base.devDependencies]\n const scripts = { ...base.scripts }\n\n for (const addon of addons) {\n dependencies.push(...addon.dependencies(ctx))\n devDependencies.push(...addon.devDependencies(ctx))\n if (addon.scripts) {\n Object.assign(scripts, addon.scripts(ctx))\n }\n }\n\n return {\n dependencies: [...new Set(dependencies)],\n devDependencies: [...new Set(devDependencies)],\n scripts,\n }\n}\n\n// Backward-compatible export for tests during migration\nexport function getPackageGroups(framework: Framework): Omit<PackageGroups, 'scripts'> & { scripts?: Record<string, string> } {\n const groups = frameworkPackages(framework)\n return groups\n}\n"],"mappings":";;AAGA,SAAS,kBAAkB,WAAqC;CAC9D,MAAM,eAAe,CAAC,iBAAiB;CACvC,MAAM,kBAAkB;EACtB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,UAAkC,CAAC;CAEzC,QAAQ,WAAR;EACE,KAAK;GACH,aAAa,KAAK,4BAA4B,SAAS;GACvD,gBAAgB,KAAK,gBAAgB;GACrC;EACF,KAAK;GACH,aAAa,KAAK,qBAAqB,MAAM;GAC7C;EACF,KAAK;GACH,aAAa,KAAK,4BAA4B,SAAS;GACvD;EAEF,SACE,aAAa,KAAK,uBAAuB;CAE7C;CAEA,OAAO;EAAE;EAAc;EAAiB;CAAQ;AAClD;AAEA,SAAgB,gBAAgB,KAAqC;CACnE,MAAM,OAAO,kBAAkB,IAAI,SAAS;CAC5C,MAAM,SAAS,cAAc,GAAG;CAEhC,MAAM,eAAe,CAAC,GAAG,KAAK,YAAY;CAC1C,MAAM,kBAAkB,CAAC,GAAG,KAAK,eAAe;CAChD,MAAM,UAAU,EAAE,GAAG,KAAK,QAAQ;CAElC,KAAK,MAAM,SAAS,QAAQ;EAC1B,aAAa,KAAK,GAAG,MAAM,aAAa,GAAG,CAAC;EAC5C,gBAAgB,KAAK,GAAG,MAAM,gBAAgB,GAAG,CAAC;EAClD,IAAI,MAAM,SACR,OAAO,OAAO,SAAS,MAAM,QAAQ,GAAG,CAAC;CAE7C;CAEA,OAAO;EACL,cAAc,CAAC,GAAG,IAAI,IAAI,YAAY,CAAC;EACvC,iBAAiB,CAAC,GAAG,IAAI,IAAI,eAAe,CAAC;EAC7C;CACF;AACF"}
|
|
@@ -21,7 +21,8 @@ async function scaffoldProject(options) {
|
|
|
21
21
|
db: options.db,
|
|
22
22
|
driver: options.driver
|
|
23
23
|
} : {},
|
|
24
|
-
...options.logger ? { logger: options.logger } : {}
|
|
24
|
+
...options.logger ? { logger: options.logger } : {},
|
|
25
|
+
...options.validator ? { validator: options.validator } : {}
|
|
25
26
|
};
|
|
26
27
|
const addons = resolveAddons(ctx);
|
|
27
28
|
const packages = resolvePackages(ctx);
|
|
@@ -47,7 +48,8 @@ async function scaffoldProject(options) {
|
|
|
47
48
|
db: ctx.db,
|
|
48
49
|
driver: ctx.driver
|
|
49
50
|
} : {},
|
|
50
|
-
...ctx.logger ? { logger: ctx.logger } : {}
|
|
51
|
+
...ctx.logger ? { logger: ctx.logger } : {},
|
|
52
|
+
...ctx.validator ? { validator: ctx.validator } : {}
|
|
51
53
|
};
|
|
52
54
|
const agent = options.agent ?? resolveUserAgent();
|
|
53
55
|
await installPackages(agent, root, {
|
|
@@ -62,7 +64,8 @@ async function scaffoldProject(options) {
|
|
|
62
64
|
db: ctx.db,
|
|
63
65
|
driver: ctx.driver
|
|
64
66
|
} : {},
|
|
65
|
-
...ctx.logger ? { logger: ctx.logger } : {}
|
|
67
|
+
...ctx.logger ? { logger: ctx.logger } : {},
|
|
68
|
+
...ctx.validator ? { validator: ctx.validator } : {}
|
|
66
69
|
};
|
|
67
70
|
}
|
|
68
71
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold-engine.js","names":[],"sources":["../../../src/core/scaffold-engine.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { collectBootBindings, resolveAddons } from '../addons/registry.js'\nimport { indexTemplate, taserTsTemplate } from '../frameworks/index.js'\nimport { installPackages, resolveUserAgent } from './package-manager.js'\nimport { writeProjectConfig } from './project-config.js'\nimport { resolvePackages } from './resolve-packages.js'\nimport type { ScaffoldOptions, ScaffoldResult } from './types.js'\nimport {\n contextTemplate,\n gitignoreTemplate,\n healthRouteTemplate,\n indexRouteTemplate,\n packageJsonTemplate,\n rootLayoutTemplate,\n starterManifestTemplate,\n tsconfigTemplate,\n tsdownConfigTemplate,\n} from '../templates/base.js'\n\nasync function write(filePath: string, contents: string): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true })\n await writeFile(filePath, contents, 'utf8')\n}\n\nexport async function scaffoldProject(options: ScaffoldOptions): Promise<ScaffoldResult> {\n const root = options.targetDir\n const ctx = {\n projectName: options.projectName,\n targetDir: root,\n framework: options.framework,\n ...(options.db ? { db: options.db, driver: options.driver } : {}),\n ...(options.logger ? { logger: options.logger } : {}),\n }\n\n const addons = resolveAddons(ctx)\n const packages = resolvePackages(ctx)\n const bootBindings = collectBootBindings(ctx)\n\n await write(path.join(root, 'package.json'), packageJsonTemplate(options.projectName, packages.scripts))\n await write(path.join(root, 'tsconfig.json'), tsconfigTemplate())\n await write(path.join(root, 'tsdown.config.ts'), tsdownConfigTemplate())\n await write(path.join(root, '.gitignore'), gitignoreTemplate())\n await write(path.join(root, 'src/context.ts'), contextTemplate(bootBindings))\n await write(path.join(root, 'src/taser.ts'), taserTsTemplate(options.framework))\n await write(path.join(root, 'src/index.ts'), indexTemplate(options.framework))\n await write(path.join(root, 'src/routes/$.ts'), rootLayoutTemplate())\n await write(path.join(root, 'src/routes/index.get.ts'), indexRouteTemplate())\n await write(path.join(root, 'src/routes/health.get.ts'), healthRouteTemplate(ctx))\n await write(path.join(root, 'src/routeManifest.gen.ts'), starterManifestTemplate())\n\n for (const addon of addons) {\n await addon.apply(ctx, (filePath, contents) => write(path.join(root, filePath), contents))\n }\n\n await writeProjectConfig(root, ctx)\n\n if (options.skipInstall) {\n return {\n projectName: ctx.projectName,\n targetDir: root,\n framework: ctx.framework,\n ...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),\n ...(ctx.logger ? { logger: ctx.logger } : {}),\n }\n }\n\n const agent = options.agent ?? resolveUserAgent()\n await installPackages(agent, root, {\n dependencies: packages.dependencies,\n devDependencies: packages.devDependencies,\n })\n\n return {\n projectName: ctx.projectName,\n targetDir: root,\n framework: ctx.framework,\n ...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),\n ...(ctx.logger ? { logger: ctx.logger } : {}),\n }\n}\n"],"mappings":";;;;;;;;;AAqBA,eAAe,MAAM,UAAkB,UAAiC;CACtE,MAAM,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;CACvD,MAAM,UAAU,UAAU,UAAU,MAAM;AAC5C;AAEA,eAAsB,gBAAgB,SAAmD;CACvF,MAAM,OAAO,QAAQ;CACrB,MAAM,MAAM;EACV,aAAa,QAAQ;EACrB,WAAW;EACX,WAAW,QAAQ;EACnB,GAAI,QAAQ,KAAK;GAAE,IAAI,QAAQ;GAAI,QAAQ,QAAQ;EAAO,IAAI,CAAC;EAC/D,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold-engine.js","names":[],"sources":["../../../src/core/scaffold-engine.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { collectBootBindings, resolveAddons } from '../addons/registry.js'\nimport { indexTemplate, taserTsTemplate } from '../frameworks/index.js'\nimport { installPackages, resolveUserAgent } from './package-manager.js'\nimport { writeProjectConfig } from './project-config.js'\nimport { resolvePackages } from './resolve-packages.js'\nimport type { ScaffoldOptions, ScaffoldResult } from './types.js'\nimport {\n contextTemplate,\n gitignoreTemplate,\n healthRouteTemplate,\n indexRouteTemplate,\n packageJsonTemplate,\n rootLayoutTemplate,\n starterManifestTemplate,\n tsconfigTemplate,\n tsdownConfigTemplate,\n} from '../templates/base.js'\n\nasync function write(filePath: string, contents: string): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true })\n await writeFile(filePath, contents, 'utf8')\n}\n\nexport async function scaffoldProject(options: ScaffoldOptions): Promise<ScaffoldResult> {\n const root = options.targetDir\n const ctx = {\n projectName: options.projectName,\n targetDir: root,\n framework: options.framework,\n ...(options.db ? { db: options.db, driver: options.driver } : {}),\n ...(options.logger ? { logger: options.logger } : {}),\n ...(options.validator ? { validator: options.validator } : {}),\n }\n\n const addons = resolveAddons(ctx)\n const packages = resolvePackages(ctx)\n const bootBindings = collectBootBindings(ctx)\n\n await write(path.join(root, 'package.json'), packageJsonTemplate(options.projectName, packages.scripts))\n await write(path.join(root, 'tsconfig.json'), tsconfigTemplate())\n await write(path.join(root, 'tsdown.config.ts'), tsdownConfigTemplate())\n await write(path.join(root, '.gitignore'), gitignoreTemplate())\n await write(path.join(root, 'src/context.ts'), contextTemplate(bootBindings))\n await write(path.join(root, 'src/taser.ts'), taserTsTemplate(options.framework))\n await write(path.join(root, 'src/index.ts'), indexTemplate(options.framework))\n await write(path.join(root, 'src/routes/$.ts'), rootLayoutTemplate())\n await write(path.join(root, 'src/routes/index.get.ts'), indexRouteTemplate())\n await write(path.join(root, 'src/routes/health.get.ts'), healthRouteTemplate(ctx))\n await write(path.join(root, 'src/routeManifest.gen.ts'), starterManifestTemplate())\n\n for (const addon of addons) {\n await addon.apply(ctx, (filePath, contents) => write(path.join(root, filePath), contents))\n }\n\n await writeProjectConfig(root, ctx)\n\n if (options.skipInstall) {\n return {\n projectName: ctx.projectName,\n targetDir: root,\n framework: ctx.framework,\n ...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),\n ...(ctx.logger ? { logger: ctx.logger } : {}),\n ...(ctx.validator ? { validator: ctx.validator } : {}),\n }\n }\n\n const agent = options.agent ?? resolveUserAgent()\n await installPackages(agent, root, {\n dependencies: packages.dependencies,\n devDependencies: packages.devDependencies,\n })\n\n return {\n projectName: ctx.projectName,\n targetDir: root,\n framework: ctx.framework,\n ...(ctx.db ? { db: ctx.db, driver: ctx.driver } : {}),\n ...(ctx.logger ? { logger: ctx.logger } : {}),\n ...(ctx.validator ? { validator: ctx.validator } : {}),\n }\n}\n"],"mappings":";;;;;;;;;AAqBA,eAAe,MAAM,UAAkB,UAAiC;CACtE,MAAM,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;CACvD,MAAM,UAAU,UAAU,UAAU,MAAM;AAC5C;AAEA,eAAsB,gBAAgB,SAAmD;CACvF,MAAM,OAAO,QAAQ;CACrB,MAAM,MAAM;EACV,aAAa,QAAQ;EACrB,WAAW;EACX,WAAW,QAAQ;EACnB,GAAI,QAAQ,KAAK;GAAE,IAAI,QAAQ;GAAI,QAAQ,QAAQ;EAAO,IAAI,CAAC;EAC/D,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACnD,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;CAC9D;CAEA,MAAM,SAAS,cAAc,GAAG;CAChC,MAAM,WAAW,gBAAgB,GAAG;CACpC,MAAM,eAAe,oBAAoB,GAAG;CAE5C,MAAM,MAAM,KAAK,KAAK,MAAM,cAAc,GAAG,oBAAoB,QAAQ,aAAa,SAAS,OAAO,CAAC;CACvG,MAAM,MAAM,KAAK,KAAK,MAAM,eAAe,GAAG,iBAAiB,CAAC;CAChE,MAAM,MAAM,KAAK,KAAK,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;CACvE,MAAM,MAAM,KAAK,KAAK,MAAM,YAAY,GAAG,kBAAkB,CAAC;CAC9D,MAAM,MAAM,KAAK,KAAK,MAAM,gBAAgB,GAAG,gBAAgB,YAAY,CAAC;CAC5E,MAAM,MAAM,KAAK,KAAK,MAAM,cAAc,GAAG,gBAAgB,QAAQ,SAAS,CAAC;CAC/E,MAAM,MAAM,KAAK,KAAK,MAAM,cAAc,GAAG,cAAc,QAAQ,SAAS,CAAC;CAC7E,MAAM,MAAM,KAAK,KAAK,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;CACpE,MAAM,MAAM,KAAK,KAAK,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;CAC5E,MAAM,MAAM,KAAK,KAAK,MAAM,0BAA0B,GAAG,oBAAoB,GAAG,CAAC;CACjF,MAAM,MAAM,KAAK,KAAK,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;CAElF,KAAK,MAAM,SAAS,QAClB,MAAM,MAAM,MAAM,MAAM,UAAU,aAAa,MAAM,KAAK,KAAK,MAAM,QAAQ,GAAG,QAAQ,CAAC;CAG3F,MAAM,mBAAmB,MAAM,GAAG;CAElC,IAAI,QAAQ,aACV,OAAO;EACL,aAAa,IAAI;EACjB,WAAW;EACX,WAAW,IAAI;EACf,GAAI,IAAI,KAAK;GAAE,IAAI,IAAI;GAAI,QAAQ,IAAI;EAAO,IAAI,CAAC;EACnD,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;EAC3C,GAAI,IAAI,YAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;CACtD;CAGF,MAAM,QAAQ,QAAQ,SAAS,iBAAiB;CAChD,MAAM,gBAAgB,OAAO,MAAM;EACjC,cAAc,SAAS;EACvB,iBAAiB,SAAS;CAC5B,CAAC;CAED,OAAO;EACL,aAAa,IAAI;EACjB,WAAW;EACX,WAAW,IAAI;EACf,GAAI,IAAI,KAAK;GAAE,IAAI,IAAI;GAAI,QAAQ,IAAI;EAAO,IAAI,CAAC;EACnD,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;EAC3C,GAAI,IAAI,YAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;CACtD;AACF"}
|
package/dist/esm/core/types.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export declare const DB_DRIVERS: readonly DbDriver[];
|
|
|
8
8
|
export declare const DEFAULT_DB_DRIVER: DbDriver;
|
|
9
9
|
export type LoggerId = 'pino' | 'winston';
|
|
10
10
|
export declare const LOGGERS: readonly LoggerId[];
|
|
11
|
+
export type ValidatorId = 'zod' | 'arktype' | 'valibot';
|
|
12
|
+
export declare const VALIDATORS: readonly ValidatorId[];
|
|
11
13
|
export type PackageGroups = {
|
|
12
14
|
dependencies: string[];
|
|
13
15
|
devDependencies: string[];
|
|
@@ -20,6 +22,7 @@ export type ScaffoldContext = {
|
|
|
20
22
|
db?: DbOdm;
|
|
21
23
|
driver?: DbDriver;
|
|
22
24
|
logger?: LoggerId;
|
|
25
|
+
validator?: ValidatorId;
|
|
23
26
|
};
|
|
24
27
|
export type ScaffoldOptions = ScaffoldContext & {
|
|
25
28
|
skipInstall?: boolean;
|
|
@@ -34,4 +37,5 @@ export type CapabilitiesCatalog = {
|
|
|
34
37
|
defaultDriver: DbDriver;
|
|
35
38
|
};
|
|
36
39
|
loggers: LoggerId[];
|
|
40
|
+
validators: ValidatorId[];
|
|
37
41
|
};
|
package/dist/esm/core/types.js
CHANGED
|
@@ -17,7 +17,12 @@ var DB_DRIVERS = [
|
|
|
17
17
|
];
|
|
18
18
|
var DEFAULT_DB_DRIVER = "sqlite";
|
|
19
19
|
var LOGGERS = ["pino", "winston"];
|
|
20
|
+
var VALIDATORS = [
|
|
21
|
+
"zod",
|
|
22
|
+
"arktype",
|
|
23
|
+
"valibot"
|
|
24
|
+
];
|
|
20
25
|
//#endregion
|
|
21
|
-
export { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, FRAMEWORKS, LOGGERS };
|
|
26
|
+
export { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, FRAMEWORKS, LOGGERS, VALIDATORS };
|
|
22
27
|
|
|
23
28
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../src/core/types.ts"],"sourcesContent":["import type { Agent } from 'package-manager-detector'\n\nexport type Framework = 'node' | 'express' | 'hono' | 'fastify'\n\nexport const FRAMEWORKS: readonly Framework[] = ['node', 'express', 'hono', 'fastify']\n\nexport type DbOdm = 'drizzle' | 'prisma' | 'kysely'\n\nexport const DB_ODMS: readonly DbOdm[] = ['drizzle', 'prisma', 'kysely']\n\nexport type DbDriver = 'postgres' | 'sqlite' | 'mysql'\n\nexport const DB_DRIVERS: readonly DbDriver[] = ['postgres', 'sqlite', 'mysql']\n\nexport const DEFAULT_DB_DRIVER: DbDriver = 'sqlite'\n\nexport type LoggerId = 'pino' | 'winston'\n\nexport const LOGGERS: readonly LoggerId[] = ['pino', 'winston']\n\nexport type PackageGroups = {\n dependencies: string[]\n devDependencies: string[]\n scripts: Record<string, string>\n}\n\nexport type ScaffoldContext = {\n projectName: string\n targetDir: string\n framework: Framework\n db?: DbOdm\n driver?: DbDriver\n logger?: LoggerId\n}\n\nexport type ScaffoldOptions = ScaffoldContext & {\n skipInstall?: boolean\n agent?: Agent\n}\n\nexport type ScaffoldResult = ScaffoldContext\n\nexport type CapabilitiesCatalog = {\n frameworks: Framework[]\n db: {\n odms: DbOdm[]\n drivers: DbDriver[]\n defaultDriver: DbDriver\n }\n loggers: LoggerId[]\n}\n"],"mappings":";AAIA,IAAa,aAAmC;CAAC;CAAQ;CAAW;CAAQ;AAAS;AAIrF,IAAa,UAA4B;CAAC;CAAW;CAAU;AAAQ;AAIvE,IAAa,aAAkC;CAAC;CAAY;CAAU;AAAO;AAE7E,IAAa,oBAA8B;AAI3C,IAAa,UAA+B,CAAC,QAAQ,SAAS"}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/core/types.ts"],"sourcesContent":["import type { Agent } from 'package-manager-detector'\n\nexport type Framework = 'node' | 'express' | 'hono' | 'fastify'\n\nexport const FRAMEWORKS: readonly Framework[] = ['node', 'express', 'hono', 'fastify']\n\nexport type DbOdm = 'drizzle' | 'prisma' | 'kysely'\n\nexport const DB_ODMS: readonly DbOdm[] = ['drizzle', 'prisma', 'kysely']\n\nexport type DbDriver = 'postgres' | 'sqlite' | 'mysql'\n\nexport const DB_DRIVERS: readonly DbDriver[] = ['postgres', 'sqlite', 'mysql']\n\nexport const DEFAULT_DB_DRIVER: DbDriver = 'sqlite'\n\nexport type LoggerId = 'pino' | 'winston'\n\nexport const LOGGERS: readonly LoggerId[] = ['pino', 'winston']\n\nexport type ValidatorId = 'zod' | 'arktype' | 'valibot'\n\nexport const VALIDATORS: readonly ValidatorId[] = ['zod', 'arktype', 'valibot']\n\nexport type PackageGroups = {\n dependencies: string[]\n devDependencies: string[]\n scripts: Record<string, string>\n}\n\nexport type ScaffoldContext = {\n projectName: string\n targetDir: string\n framework: Framework\n db?: DbOdm\n driver?: DbDriver\n logger?: LoggerId\n validator?: ValidatorId\n}\n\nexport type ScaffoldOptions = ScaffoldContext & {\n skipInstall?: boolean\n agent?: Agent\n}\n\nexport type ScaffoldResult = ScaffoldContext\n\nexport type CapabilitiesCatalog = {\n frameworks: Framework[]\n db: {\n odms: DbOdm[]\n drivers: DbDriver[]\n defaultDriver: DbDriver\n }\n loggers: LoggerId[]\n validators: ValidatorId[]\n}\n"],"mappings":";AAIA,IAAa,aAAmC;CAAC;CAAQ;CAAW;CAAQ;AAAS;AAIrF,IAAa,UAA4B;CAAC;CAAW;CAAU;AAAQ;AAIvE,IAAa,aAAkC;CAAC;CAAY;CAAU;AAAO;AAE7E,IAAa,oBAA8B;AAI3C,IAAa,UAA+B,CAAC,QAAQ,SAAS;AAI9D,IAAa,aAAqC;CAAC;CAAO;CAAW;AAAS"}
|
|
@@ -12,8 +12,8 @@ function packageJsonTemplate(projectName, scripts = {}) {
|
|
|
12
12
|
"dev:taser": "taser watch",
|
|
13
13
|
"start": "tsx src/index.ts",
|
|
14
14
|
"generate": "taser generate",
|
|
15
|
-
"build": "taser generate && tsdown
|
|
16
|
-
"serve": "node dist/index.
|
|
15
|
+
"build": "taser generate && tsdown",
|
|
16
|
+
"serve": "node dist/index.mjs",
|
|
17
17
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
18
18
|
...scripts
|
|
19
19
|
}
|
|
@@ -25,9 +25,7 @@ function tsdownConfigTemplate() {
|
|
|
25
25
|
|
|
26
26
|
export default defineConfig({
|
|
27
27
|
entry: ['./src/index.ts'],
|
|
28
|
-
format: 'esm',
|
|
29
28
|
platform: 'node',
|
|
30
|
-
target: 'node20',
|
|
31
29
|
outDir: 'dist',
|
|
32
30
|
clean: true,
|
|
33
31
|
sourcemap: true,
|
|
@@ -38,9 +36,7 @@ function tsconfigTemplate() {
|
|
|
38
36
|
return `${JSON.stringify({
|
|
39
37
|
compilerOptions: {
|
|
40
38
|
target: "ES2022",
|
|
41
|
-
|
|
42
|
-
module: "ESNext",
|
|
43
|
-
moduleResolution: "bundler",
|
|
39
|
+
module: "NodeNext",
|
|
44
40
|
paths: { "#src/*": ["./src/*"] },
|
|
45
41
|
strict: true,
|
|
46
42
|
skipLibCheck: true,
|
|
@@ -88,10 +84,11 @@ export const Middleware = t.middleware('/$')
|
|
|
88
84
|
`;
|
|
89
85
|
}
|
|
90
86
|
function indexRouteTemplate() {
|
|
91
|
-
return `import {
|
|
87
|
+
return `import { reply } from '@taserjs/router'
|
|
88
|
+
import { t } from '#src/taser.js'
|
|
92
89
|
|
|
93
|
-
export const Route = t.get('/').handler((
|
|
94
|
-
return
|
|
90
|
+
export const Route = t.get('/').handler(() => {
|
|
91
|
+
return reply.json({ message: 'Welcome to Taser' })
|
|
95
92
|
})
|
|
96
93
|
`;
|
|
97
94
|
}
|
|
@@ -99,10 +96,12 @@ function healthRouteTemplate(ctx) {
|
|
|
99
96
|
const lines = [];
|
|
100
97
|
if (ctx.logger) lines.push(" ctx.logger.info('health check')");
|
|
101
98
|
if (ctx.db) lines.push(" // ctx.db is available from context boot");
|
|
102
|
-
|
|
99
|
+
const body = lines.length > 0 ? `${lines.join("\n")}\n` : "";
|
|
100
|
+
return `import { reply } from '@taserjs/router'
|
|
101
|
+
import { t } from '#src/taser.js'
|
|
103
102
|
|
|
104
|
-
export const Route = t.get('/health').handler((ctx) => {
|
|
105
|
-
${
|
|
103
|
+
export const Route = t.get('/health').handler(${lines.length > 0 ? "(ctx)" : "()"} => {
|
|
104
|
+
${body} return reply.json({ ok: true })
|
|
106
105
|
})
|
|
107
106
|
`;
|
|
108
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","names":[],"sources":["../../../src/templates/base.ts"],"sourcesContent":["import type { BootBinding } from '../addons/types.js'\nimport type { ScaffoldContext } from '../core/types.js'\n\nexport function packageJsonTemplate(projectName: string, scripts: Record<string, string> = {}): string {\n const pkg = {\n name: projectName,\n version: '1.0.0',\n private: true,\n type: 'module',\n imports: {\n '#src/*': './src/*',\n },\n scripts: {\n 'dev': 'run-p dev:server dev:taser',\n 'dev:server': 'tsx watch src/index.ts',\n 'dev:taser': 'taser watch',\n 'start': 'tsx src/index.ts',\n 'generate': 'taser generate',\n 'build': 'taser generate && tsdown
|
|
1
|
+
{"version":3,"file":"base.js","names":[],"sources":["../../../src/templates/base.ts"],"sourcesContent":["import type { BootBinding } from '../addons/types.js'\nimport type { ScaffoldContext } from '../core/types.js'\n\nexport function packageJsonTemplate(projectName: string, scripts: Record<string, string> = {}): string {\n const pkg = {\n name: projectName,\n version: '1.0.0',\n private: true,\n type: 'module',\n imports: {\n '#src/*': './src/*',\n },\n scripts: {\n 'dev': 'run-p dev:server dev:taser',\n 'dev:server': 'tsx watch src/index.ts',\n 'dev:taser': 'taser watch',\n 'start': 'tsx src/index.ts',\n 'generate': 'taser generate',\n 'build': 'taser generate && tsdown',\n 'serve': 'node dist/index.mjs',\n 'typecheck': 'tsc --noEmit -p tsconfig.json',\n ...scripts,\n },\n }\n\n return `${JSON.stringify(pkg, null, 2)}\\n`\n}\n\nexport function tsdownConfigTemplate(): string {\n return `import { defineConfig } from 'tsdown'\n\nexport default defineConfig({\n entry: ['./src/index.ts'],\n platform: 'node',\n outDir: 'dist',\n clean: true,\n sourcemap: true,\n})\n`\n}\n\nexport function tsconfigTemplate(): string {\n return `${JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n paths: {\n '#src/*': ['./src/*'],\n },\n strict: true,\n skipLibCheck: true,\n verbatimModuleSyntax: true,\n isolatedModules: true,\n noEmit: true,\n types: ['node'],\n },\n include: ['src'],\n }, null, 2)}\\n`\n}\n\nexport function gitignoreTemplate(): string {\n return `node_modules\ndist\n.DS_Store\n*.log\n.env\nlocal.db\ndrizzle\n`\n}\n\nexport function contextTemplate(bindings: BootBinding[]): string {\n const imports = bindings.map(\n binding => `import { ${binding.factoryName} } from '${binding.importPath}'`,\n )\n\n const bootBody = bindings.length > 0\n ? bindings.map(binding => ` ${binding.key}: ${binding.factoryName}(),`).join('\\n')\n : ''\n\n const bootBlock = bindings.length > 0\n ? ` boot: () => ({\\n${bootBody}\\n }),`\n : ''\n\n const importBlock = imports.length > 0 ? `${imports.join('\\n')}\\n\\n` : ''\n\n return `${importBlock}import { createContext } from '@taserjs/router'\n\nexport const context = createContext({\n${bootBlock}\n request: () => ({\n requestId: crypto.randomUUID(),\n }),\n})\n`\n}\n\nexport function rootLayoutTemplate(): string {\n return `import { bodyLimit } from '@taserjs/router/body-limit'\nimport { secureHeaders } from '@taserjs/router/secure-headers'\n\nimport { t } from '#src/taser.js'\n\nexport const Middleware = t.middleware('/$')\n .use(secureHeaders())\n .use(bodyLimit({ maxSize: 1_000_000 }))\n`\n}\n\nexport function indexRouteTemplate(): string {\n return `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n\nexport const Route = t.get('/').handler(() => {\n return reply.json({ message: 'Welcome to Taser' })\n})\n`\n}\n\nexport function healthRouteTemplate(ctx: ScaffoldContext): string {\n const lines: string[] = []\n\n if (ctx.logger) {\n lines.push(' ctx.logger.info(\\'health check\\')')\n }\n\n if (ctx.db) {\n lines.push(' // ctx.db is available from context boot')\n }\n\n const body = lines.length > 0 ? `${lines.join('\\n')}\\n` : ''\n const ctxArg = lines.length > 0 ? '(ctx)' : '()'\n\n return `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n\nexport const Route = t.get('/health').handler(${ctxArg} => {\n${body} return reply.json({ ok: true })\n})\n`\n}\n\n/** Minimal placeholder until `taser generate` runs. */\nexport function starterManifestTemplate(): string {\n return `/* eslint-disable */\n// Run \\`pnpm generate\\` (taser generate) to replace this file.\nimport { Middleware as RootSplatLayoutImport } from './routes/$.js'\nimport { Route as RootIndexGetRouteImport } from './routes/index.get.js'\nimport { Route as HealthGetRouteImport } from './routes/health.get.js'\n\nexport const routeManifest = {\n layouts: {\n '/$': {\n middlewares: RootSplatLayoutImport,\n },\n },\n routes: {\n '/': {\n GET: {\n layoutChain: ['/$'],\n route: RootIndexGetRouteImport,\n },\n },\n '/health': {\n GET: {\n layoutChain: ['/$'],\n route: HealthGetRouteImport,\n },\n },\n },\n} as const\n\nexport type RoutePathGen = '/' | '/health'\nexport type LayoutIdGen = '/$'\nexport type LayoutTreeGen = {\n '/$': {\n parent: null\n middlewares: typeof RootSplatLayoutImport\n }\n}\nexport type RouteByPathMethodGen = {\n '/': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof RootIndexGetRouteImport\n }\n }\n '/health': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof HealthGetRouteImport\n }\n }\n}\nexport type RouteManifest = typeof routeManifest\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n RoutePath: RoutePathGen\n LayoutId: LayoutIdGen\n LayoutTree: LayoutTreeGen\n RouteByPathMethod: RouteByPathMethodGen\n }\n}\n`\n}\n"],"mappings":";AAGA,SAAgB,oBAAoB,aAAqB,UAAkC,CAAC,GAAW;CACrG,MAAM,MAAM;EACV,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM;EACN,SAAS,EACP,UAAU,UACZ;EACA,SAAS;GACP,OAAO;GACP,cAAc;GACd,aAAa;GACb,SAAS;GACT,YAAY;GACZ,SAAS;GACT,SAAS;GACT,aAAa;GACb,GAAG;EACL;CACF;CAEA,OAAO,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE;AACzC;AAEA,SAAgB,uBAA+B;CAC7C,OAAO;;;;;;;;;;AAUT;AAEA,SAAgB,mBAA2B;CACzC,OAAO,GAAG,KAAK,UAAU;EACvB,iBAAiB;GACf,QAAQ;GACR,QAAQ;GACR,OAAO,EACL,UAAU,CAAC,SAAS,EACtB;GACA,QAAQ;GACR,cAAc;GACd,sBAAsB;GACtB,iBAAiB;GACjB,QAAQ;GACR,OAAO,CAAC,MAAM;EAChB;EACA,SAAS,CAAC,KAAK;CACjB,GAAG,MAAM,CAAC,EAAE;AACd;AAEA,SAAgB,oBAA4B;CAC1C,OAAO;;;;;;;;AAQT;AAEA,SAAgB,gBAAgB,UAAiC;CAC/D,MAAM,UAAU,SAAS,KACvB,YAAW,YAAY,QAAQ,YAAY,WAAW,QAAQ,WAAW,EAC3E;CAEA,MAAM,WAAW,SAAS,SAAS,IAC/B,SAAS,KAAI,YAAW,OAAO,QAAQ,IAAI,IAAI,QAAQ,YAAY,IAAI,CAAC,CAAC,KAAK,IAAI,IAClF;CAEJ,MAAM,YAAY,SAAS,SAAS,IAChC,qBAAqB,SAAS,WAC9B;CAIJ,OAAO,GAFa,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,IAAI,EAAE,QAAQ,GAEjD;;;EAGtB,UAAU;;;;;;AAMZ;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;;;AAST;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;AAOT;AAEA,SAAgB,oBAAoB,KAA8B;CAChE,MAAM,QAAkB,CAAC;CAEzB,IAAI,IAAI,QACN,MAAM,KAAK,mCAAqC;CAGlD,IAAI,IAAI,IACN,MAAM,KAAK,4CAA4C;CAGzD,MAAM,OAAO,MAAM,SAAS,IAAI,GAAG,MAAM,KAAK,IAAI,EAAE,MAAM;CAG1D,OAAO;;;gDAFQ,MAAM,SAAS,IAAI,UAAU,KAKS;EACrD,KAAK;;;AAGP;;AAGA,SAAgB,0BAAkC;CAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DT"}
|
package/package.json
CHANGED
|
@@ -112,6 +112,18 @@ function driverPackages(driver: DbDriver): string[] {
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
function driverDevPackages(driver: DbDriver): string[] {
|
|
116
|
+
switch (driver) {
|
|
117
|
+
case 'postgres':
|
|
118
|
+
return ['@types/pg']
|
|
119
|
+
case 'sqlite':
|
|
120
|
+
return ['@types/better-sqlite3']
|
|
121
|
+
case 'mysql':
|
|
122
|
+
default:
|
|
123
|
+
return []
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
115
127
|
export const drizzleAddon: AddonDefinition = {
|
|
116
128
|
id: 'drizzle',
|
|
117
129
|
category: 'database',
|
|
@@ -119,8 +131,9 @@ export const drizzleAddon: AddonDefinition = {
|
|
|
119
131
|
const driver = ctx.driver ?? 'sqlite'
|
|
120
132
|
return ['drizzle-orm', ...driverPackages(driver)]
|
|
121
133
|
},
|
|
122
|
-
devDependencies() {
|
|
123
|
-
|
|
134
|
+
devDependencies(ctx) {
|
|
135
|
+
const driver = ctx.driver ?? 'sqlite'
|
|
136
|
+
return ['drizzle-kit', ...driverDevPackages(driver)]
|
|
124
137
|
},
|
|
125
138
|
scripts() {
|
|
126
139
|
return {
|
|
@@ -73,6 +73,18 @@ function driverPackages(driver: DbDriver): string[] {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
function driverDevPackages(driver: DbDriver): string[] {
|
|
77
|
+
switch (driver) {
|
|
78
|
+
case 'postgres':
|
|
79
|
+
return ['@types/pg']
|
|
80
|
+
case 'sqlite':
|
|
81
|
+
return ['@types/better-sqlite3']
|
|
82
|
+
case 'mysql':
|
|
83
|
+
default:
|
|
84
|
+
return []
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
76
88
|
function envExample(driver: DbDriver): string {
|
|
77
89
|
switch (driver) {
|
|
78
90
|
case 'postgres':
|
|
@@ -92,8 +104,9 @@ export const kyselyAddon: AddonDefinition = {
|
|
|
92
104
|
const driver = ctx.driver ?? 'sqlite'
|
|
93
105
|
return ['kysely', ...driverPackages(driver)]
|
|
94
106
|
},
|
|
95
|
-
devDependencies() {
|
|
96
|
-
|
|
107
|
+
devDependencies(ctx) {
|
|
108
|
+
const driver = ctx.driver ?? 'sqlite'
|
|
109
|
+
return driverDevPackages(driver)
|
|
97
110
|
},
|
|
98
111
|
bootBinding() {
|
|
99
112
|
return {
|