create-taserjs 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +22 -0
  3. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  4. package/dist/cjs/addons/drizzle/index.cjs +124 -0
  5. package/dist/cjs/addons/drizzle/index.cjs.map +1 -0
  6. package/dist/cjs/addons/drizzle/index.d.cts +2 -0
  7. package/dist/cjs/addons/kysely/index.cjs +96 -0
  8. package/dist/cjs/addons/kysely/index.cjs.map +1 -0
  9. package/dist/cjs/addons/kysely/index.d.cts +2 -0
  10. package/dist/cjs/addons/pino/index.cjs +30 -0
  11. package/dist/cjs/addons/pino/index.cjs.map +1 -0
  12. package/dist/cjs/addons/pino/index.d.cts +2 -0
  13. package/dist/cjs/addons/prisma/index.cjs +66 -0
  14. package/dist/cjs/addons/prisma/index.cjs.map +1 -0
  15. package/dist/cjs/addons/prisma/index.d.cts +2 -0
  16. package/dist/cjs/addons/registry.cjs +52 -0
  17. package/dist/cjs/addons/registry.cjs.map +1 -0
  18. package/dist/cjs/addons/registry.d.cts +5 -0
  19. package/dist/cjs/addons/types.d.cts +16 -0
  20. package/dist/cjs/addons/winston/index.cjs +34 -0
  21. package/dist/cjs/addons/winston/index.cjs.map +1 -0
  22. package/dist/cjs/addons/winston/index.d.cts +2 -0
  23. package/dist/cjs/cli.cjs +56 -0
  24. package/dist/cjs/cli.cjs.map +1 -0
  25. package/dist/cjs/cli.d.cts +2 -0
  26. package/dist/cjs/commands/create.cjs +243 -0
  27. package/dist/cjs/commands/create.cjs.map +1 -0
  28. package/dist/cjs/commands/create.d.cts +11 -0
  29. package/dist/cjs/core/json-output.cjs +16 -0
  30. package/dist/cjs/core/json-output.cjs.map +1 -0
  31. package/dist/cjs/core/json-output.d.cts +4 -0
  32. package/dist/cjs/core/package-manager.cjs +64 -0
  33. package/dist/cjs/core/package-manager.cjs.map +1 -0
  34. package/dist/cjs/core/package-manager.d.cts +7 -0
  35. package/dist/cjs/core/parse-options.cjs +59 -0
  36. package/dist/cjs/core/parse-options.cjs.map +1 -0
  37. package/dist/cjs/core/parse-options.d.cts +18 -0
  38. package/dist/cjs/core/project-config.cjs +18 -0
  39. package/dist/cjs/core/project-config.cjs.map +1 -0
  40. package/dist/cjs/core/project-config.d.cts +2 -0
  41. package/dist/cjs/core/resolve-packages.cjs +52 -0
  42. package/dist/cjs/core/resolve-packages.cjs.map +1 -0
  43. package/dist/cjs/core/resolve-packages.d.cts +5 -0
  44. package/dist/cjs/core/scaffold-engine.cjs +73 -0
  45. package/dist/cjs/core/scaffold-engine.cjs.map +1 -0
  46. package/dist/cjs/core/scaffold-engine.d.cts +2 -0
  47. package/dist/cjs/core/types.cjs +27 -0
  48. package/dist/cjs/core/types.cjs.map +1 -0
  49. package/dist/cjs/core/types.d.cts +37 -0
  50. package/dist/cjs/core/validate-project-name.cjs +45 -0
  51. package/dist/cjs/core/validate-project-name.cjs.map +1 -0
  52. package/dist/cjs/core/validate-project-name.d.cts +1 -0
  53. package/dist/cjs/frameworks/index.cjs +106 -0
  54. package/dist/cjs/frameworks/index.cjs.map +1 -0
  55. package/dist/cjs/frameworks/index.d.cts +3 -0
  56. package/dist/cjs/scaffold.d.cts +3 -0
  57. package/dist/cjs/templates/base.cjs +186 -0
  58. package/dist/cjs/templates/base.cjs.map +1 -0
  59. package/dist/cjs/templates/base.d.cts +12 -0
  60. package/dist/cjs/types.d.cts +1 -0
  61. package/dist/esm/addons/drizzle/index.d.ts +2 -0
  62. package/dist/esm/addons/drizzle/index.js +124 -0
  63. package/dist/esm/addons/drizzle/index.js.map +1 -0
  64. package/dist/esm/addons/kysely/index.d.ts +2 -0
  65. package/dist/esm/addons/kysely/index.js +96 -0
  66. package/dist/esm/addons/kysely/index.js.map +1 -0
  67. package/dist/esm/addons/pino/index.d.ts +2 -0
  68. package/dist/esm/addons/pino/index.js +30 -0
  69. package/dist/esm/addons/pino/index.js.map +1 -0
  70. package/dist/esm/addons/prisma/index.d.ts +2 -0
  71. package/dist/esm/addons/prisma/index.js +66 -0
  72. package/dist/esm/addons/prisma/index.js.map +1 -0
  73. package/dist/esm/addons/registry.d.ts +5 -0
  74. package/dist/esm/addons/registry.js +50 -0
  75. package/dist/esm/addons/registry.js.map +1 -0
  76. package/dist/esm/addons/types.d.ts +16 -0
  77. package/dist/esm/addons/winston/index.d.ts +2 -0
  78. package/dist/esm/addons/winston/index.js +34 -0
  79. package/dist/esm/addons/winston/index.js.map +1 -0
  80. package/dist/esm/cli.d.ts +2 -0
  81. package/dist/esm/cli.js +53 -0
  82. package/dist/esm/cli.js.map +1 -0
  83. package/dist/esm/commands/create.d.ts +11 -0
  84. package/dist/esm/commands/create.js +238 -0
  85. package/dist/esm/commands/create.js.map +1 -0
  86. package/dist/esm/core/json-output.d.ts +4 -0
  87. package/dist/esm/core/json-output.js +14 -0
  88. package/dist/esm/core/json-output.js.map +1 -0
  89. package/dist/esm/core/package-manager.d.ts +7 -0
  90. package/dist/esm/core/package-manager.js +62 -0
  91. package/dist/esm/core/package-manager.js.map +1 -0
  92. package/dist/esm/core/parse-options.d.ts +18 -0
  93. package/dist/esm/core/parse-options.js +56 -0
  94. package/dist/esm/core/parse-options.js.map +1 -0
  95. package/dist/esm/core/project-config.d.ts +2 -0
  96. package/dist/esm/core/project-config.js +16 -0
  97. package/dist/esm/core/project-config.js.map +1 -0
  98. package/dist/esm/core/resolve-packages.d.ts +5 -0
  99. package/dist/esm/core/resolve-packages.js +52 -0
  100. package/dist/esm/core/resolve-packages.js.map +1 -0
  101. package/dist/esm/core/scaffold-engine.d.ts +2 -0
  102. package/dist/esm/core/scaffold-engine.js +71 -0
  103. package/dist/esm/core/scaffold-engine.js.map +1 -0
  104. package/dist/esm/core/types.d.ts +37 -0
  105. package/dist/esm/core/types.js +23 -0
  106. package/dist/esm/core/types.js.map +1 -0
  107. package/dist/esm/core/validate-project-name.d.ts +1 -0
  108. package/dist/esm/core/validate-project-name.js +43 -0
  109. package/dist/esm/core/validate-project-name.js.map +1 -0
  110. package/dist/esm/frameworks/index.d.ts +3 -0
  111. package/dist/esm/frameworks/index.js +105 -0
  112. package/dist/esm/frameworks/index.js.map +1 -0
  113. package/dist/esm/scaffold.d.ts +3 -0
  114. package/dist/esm/templates/base.d.ts +12 -0
  115. package/dist/esm/templates/base.js +178 -0
  116. package/dist/esm/templates/base.js.map +1 -0
  117. package/dist/esm/types.d.ts +1 -0
  118. package/package.json +45 -0
  119. package/src/addons/drizzle/index.ts +145 -0
  120. package/src/addons/kysely/index.ts +111 -0
  121. package/src/addons/pino/index.ts +30 -0
  122. package/src/addons/prisma/index.ts +81 -0
  123. package/src/addons/registry.ts +73 -0
  124. package/src/addons/types.ts +19 -0
  125. package/src/addons/winston/index.ts +34 -0
  126. package/src/cli.ts +57 -0
  127. package/src/commands/create.ts +253 -0
  128. package/src/core/json-output.ts +13 -0
  129. package/src/core/package-manager.ts +68 -0
  130. package/src/core/parse-options.ts +97 -0
  131. package/src/core/project-config.ts +27 -0
  132. package/src/core/resolve-packages.ts +62 -0
  133. package/src/core/scaffold-engine.ts +82 -0
  134. package/src/core/types.ts +51 -0
  135. package/src/core/validate-project-name.ts +59 -0
  136. package/src/frameworks/index.ts +111 -0
  137. package/src/scaffold.ts +3 -0
  138. package/src/templates/base.ts +209 -0
  139. package/src/types.ts +9 -0
@@ -0,0 +1,243 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_types = require("../core/types.cjs");
3
+ const require_registry = require("../addons/registry.cjs");
4
+ const require_json_output = require("../core/json-output.cjs");
5
+ const require_parse_options = require("../core/parse-options.cjs");
6
+ const require_package_manager = require("../core/package-manager.cjs");
7
+ const require_scaffold_engine = require("../core/scaffold-engine.cjs");
8
+ const require_validate_project_name = require("../core/validate-project-name.cjs");
9
+ let _clack_prompts = require("@clack/prompts");
10
+ _clack_prompts = require_runtime.__toESM(_clack_prompts, 1);
11
+ let picocolors = require("picocolors");
12
+ picocolors = require_runtime.__toESM(picocolors, 1);
13
+ let node_path = require("node:path");
14
+ node_path = require_runtime.__toESM(node_path, 1);
15
+ //#region src/commands/create.ts
16
+ function isFramework(value) {
17
+ return typeof value === "string" && require_types.FRAMEWORKS.includes(value);
18
+ }
19
+ function isDbOdm(value) {
20
+ return typeof value === "string" && require_types.DB_ODMS.includes(value);
21
+ }
22
+ function isDbDriver(value) {
23
+ return typeof value === "string" && require_types.DB_DRIVERS.includes(value);
24
+ }
25
+ function isLoggerId(value) {
26
+ return typeof value === "string" && require_types.LOGGERS.includes(value);
27
+ }
28
+ async function promptInteractiveOptions(args) {
29
+ const projectName = args.projectName ?? await _clack_prompts.text({
30
+ message: "Project name",
31
+ placeholder: "my-taser-app",
32
+ defaultValue: "my-taser-app",
33
+ validate(value) {
34
+ return require_validate_project_name.validateProjectName(value);
35
+ }
36
+ });
37
+ if (_clack_prompts.isCancel(projectName)) {
38
+ _clack_prompts.cancel("Scaffold cancelled.");
39
+ process.exit(0);
40
+ }
41
+ const framework = args.framework ?? await _clack_prompts.select({
42
+ message: "Framework adapter",
43
+ options: [
44
+ {
45
+ value: "node",
46
+ label: "Plain Node.js",
47
+ hint: "default"
48
+ },
49
+ {
50
+ value: "express",
51
+ label: "Express"
52
+ },
53
+ {
54
+ value: "hono",
55
+ label: "Hono"
56
+ },
57
+ {
58
+ value: "fastify",
59
+ label: "Fastify"
60
+ }
61
+ ],
62
+ initialValue: "node"
63
+ });
64
+ if (_clack_prompts.isCancel(framework) || !isFramework(framework)) {
65
+ _clack_prompts.cancel("Scaffold cancelled.");
66
+ process.exit(0);
67
+ }
68
+ const dbChoice = args.db ?? await _clack_prompts.select({
69
+ message: "Database",
70
+ options: [
71
+ {
72
+ value: "none",
73
+ label: "None",
74
+ hint: "default"
75
+ },
76
+ {
77
+ value: "drizzle",
78
+ label: "Drizzle"
79
+ },
80
+ {
81
+ value: "prisma",
82
+ label: "Prisma"
83
+ },
84
+ {
85
+ value: "kysely",
86
+ label: "Kysely"
87
+ }
88
+ ],
89
+ initialValue: "none"
90
+ });
91
+ if (_clack_prompts.isCancel(dbChoice)) {
92
+ _clack_prompts.cancel("Scaffold cancelled.");
93
+ process.exit(0);
94
+ }
95
+ let db;
96
+ let driver;
97
+ if (dbChoice !== "none" && isDbOdm(dbChoice)) {
98
+ db = dbChoice;
99
+ const driverChoice = args.driver ?? await _clack_prompts.select({
100
+ message: "Database driver",
101
+ options: [
102
+ {
103
+ value: "sqlite",
104
+ label: "SQLite",
105
+ hint: "default"
106
+ },
107
+ {
108
+ value: "postgres",
109
+ label: "PostgreSQL"
110
+ },
111
+ {
112
+ value: "mysql",
113
+ label: "MySQL"
114
+ }
115
+ ],
116
+ initialValue: "sqlite"
117
+ });
118
+ if (_clack_prompts.isCancel(driverChoice) || !isDbDriver(driverChoice)) {
119
+ _clack_prompts.cancel("Scaffold cancelled.");
120
+ process.exit(0);
121
+ }
122
+ driver = driverChoice;
123
+ }
124
+ const loggerChoice = args.logger ?? await _clack_prompts.select({
125
+ message: "Logger",
126
+ options: [
127
+ {
128
+ value: "none",
129
+ label: "None",
130
+ hint: "default"
131
+ },
132
+ {
133
+ value: "pino",
134
+ label: "Pino"
135
+ },
136
+ {
137
+ value: "winston",
138
+ label: "Winston"
139
+ }
140
+ ],
141
+ initialValue: "none"
142
+ });
143
+ if (_clack_prompts.isCancel(loggerChoice)) {
144
+ _clack_prompts.cancel("Scaffold cancelled.");
145
+ process.exit(0);
146
+ }
147
+ const logger = loggerChoice === "none" ? void 0 : isLoggerId(loggerChoice) ? loggerChoice : void 0;
148
+ return {
149
+ projectName: String(projectName).trim(),
150
+ framework,
151
+ yes: args.yes,
152
+ noInstall: args.noInstall,
153
+ json: args.json,
154
+ ...db ? {
155
+ db,
156
+ driver
157
+ } : {},
158
+ ...logger ? { logger } : {}
159
+ };
160
+ }
161
+ async function runCreateCommand(args) {
162
+ if (args.json && !args.projectName) {
163
+ require_json_output.printCapabilitiesCatalog(require_registry.getCapabilitiesCatalog());
164
+ return;
165
+ }
166
+ const cwd = process.cwd();
167
+ const resolved = !args.yes ? await promptInteractiveOptions(args) : {
168
+ ...args,
169
+ projectName: args.projectName?.trim(),
170
+ framework: args.framework ?? "node"
171
+ };
172
+ if (!resolved.projectName) {
173
+ const message = "Project name is required";
174
+ if (args.json) {
175
+ require_json_output.printJsonError(message);
176
+ process.exit(1);
177
+ }
178
+ throw new Error(message);
179
+ }
180
+ const nameError = require_validate_project_name.validateProjectName(resolved.projectName, cwd);
181
+ if (nameError) {
182
+ if (args.json) {
183
+ require_json_output.printJsonError(nameError);
184
+ process.exit(1);
185
+ }
186
+ throw new Error(nameError);
187
+ }
188
+ const targetDir = node_path.default.resolve(cwd, resolved.projectName);
189
+ const scaffoldCtx = require_parse_options.resolveScaffoldDefaults({
190
+ ...resolved,
191
+ projectName: resolved.projectName
192
+ });
193
+ scaffoldCtx.targetDir = targetDir;
194
+ if (!args.json) {
195
+ const spinner = _clack_prompts.spinner();
196
+ spinner.start("Scaffolding project");
197
+ try {
198
+ const result = await require_scaffold_engine.scaffoldProject({
199
+ ...scaffoldCtx,
200
+ targetDir,
201
+ skipInstall: args.noInstall,
202
+ agent: require_package_manager.resolveUserAgent()
203
+ });
204
+ spinner.stop("Project created");
205
+ const cdPath = node_path.default.relative(cwd, targetDir) || ".";
206
+ _clack_prompts.note([`cd ${cdPath}`, require_package_manager.runScript(require_package_manager.resolveUserAgent(), "dev")].join("\n"), "Next steps");
207
+ _clack_prompts.outro(picocolors.default.green("Done."));
208
+ return result;
209
+ } catch (error) {
210
+ spinner.stop("Scaffold failed");
211
+ throw error;
212
+ }
213
+ }
214
+ const result = await require_scaffold_engine.scaffoldProject({
215
+ ...scaffoldCtx,
216
+ targetDir,
217
+ skipInstall: args.noInstall,
218
+ agent: require_package_manager.resolveUserAgent()
219
+ });
220
+ require_json_output.printScaffoldResult(result);
221
+ return result;
222
+ }
223
+ function buildParsedArgsFromCli(values, positionals) {
224
+ const args = {
225
+ yes: values.y ?? false,
226
+ noInstall: values.noInstall ?? false,
227
+ json: values.json ?? false
228
+ };
229
+ if (positionals[0]) args.projectName = positionals[0];
230
+ if (values.framework) args.framework = require_parse_options.parseFrameworkFlag(values.framework);
231
+ if (values.db) {
232
+ const parsed = require_parse_options.parseDbFlag(values.db);
233
+ args.db = parsed.db;
234
+ args.driver = parsed.driver;
235
+ }
236
+ if (values.logger) args.logger = require_parse_options.parseLoggerFlag(values.logger);
237
+ return args;
238
+ }
239
+ //#endregion
240
+ exports.buildParsedArgsFromCli = buildParsedArgsFromCli;
241
+ exports.runCreateCommand = runCreateCommand;
242
+
243
+ //# sourceMappingURL=create.cjs.map
@@ -0,0 +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 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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"}
@@ -0,0 +1,11 @@
1
+ import { ParsedCreateArgs } from '../core/parse-options.js';
2
+ import { ScaffoldResult } from '../core/types.js';
3
+ export declare function runCreateCommand(args: ParsedCreateArgs): Promise<ScaffoldResult | undefined>;
4
+ export declare function buildParsedArgsFromCli(values: {
5
+ framework?: string;
6
+ db?: string;
7
+ logger?: string;
8
+ y?: boolean;
9
+ noInstall?: boolean;
10
+ json?: boolean;
11
+ }, positionals: string[]): ParsedCreateArgs;
@@ -0,0 +1,16 @@
1
+ //#region src/core/json-output.ts
2
+ function printCapabilitiesCatalog(catalog) {
3
+ console.log(JSON.stringify(catalog, null, 2));
4
+ }
5
+ function printScaffoldResult(result) {
6
+ console.log(JSON.stringify(result, null, 2));
7
+ }
8
+ function printJsonError(message) {
9
+ console.error(JSON.stringify({ error: message }));
10
+ }
11
+ //#endregion
12
+ exports.printCapabilitiesCatalog = printCapabilitiesCatalog;
13
+ exports.printJsonError = printJsonError;
14
+ exports.printScaffoldResult = printScaffoldResult;
15
+
16
+ //# sourceMappingURL=json-output.cjs.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,4 @@
1
+ import { CapabilitiesCatalog, ScaffoldResult } from './types.js';
2
+ export declare function printCapabilitiesCatalog(catalog: CapabilitiesCatalog): void;
3
+ export declare function printScaffoldResult(result: ScaffoldResult): void;
4
+ export declare function printJsonError(message: string): void;
@@ -0,0 +1,64 @@
1
+ let node_child_process = require("node:child_process");
2
+ let package_manager_detector_commands = require("package-manager-detector/commands");
3
+ let package_manager_detector_detect = require("package-manager-detector/detect");
4
+ //#region src/core/package-manager.ts
5
+ function resolveUserAgent() {
6
+ return (0, package_manager_detector_detect.getUserAgent)() || "npm";
7
+ }
8
+ function runCommand(command, args, cwd) {
9
+ return new Promise((resolve, reject) => {
10
+ const child = (0, node_child_process.spawn)(command, args, {
11
+ cwd,
12
+ stdio: "inherit",
13
+ shell: false,
14
+ env: process.env
15
+ });
16
+ child.on("error", reject);
17
+ child.on("close", (code) => {
18
+ if (code === 0) {
19
+ resolve();
20
+ return;
21
+ }
22
+ reject(/* @__PURE__ */ new Error(`${command} ${args.join(" ")} exited with code ${code}`));
23
+ });
24
+ });
25
+ }
26
+ var fallback = {
27
+ agent: "npm",
28
+ install: (packages, dev) => {
29
+ return [
30
+ "install",
31
+ ...packages,
32
+ dev ? "-D" : ""
33
+ ];
34
+ }
35
+ };
36
+ function resolveInstallCommand(agent, packages, dev) {
37
+ const command = (0, package_manager_detector_commands.resolveCommand)(agent, "install", packages);
38
+ if (command) return command;
39
+ return {
40
+ command: fallback.agent,
41
+ args: fallback.install(packages, dev)
42
+ };
43
+ }
44
+ async function installPackages(agent, cwd, { dependencies, devDependencies }) {
45
+ if (dependencies.length > 0) {
46
+ const { command, args } = resolveInstallCommand(agent, dependencies, false);
47
+ await runCommand(command, args, cwd);
48
+ }
49
+ if (devDependencies.length > 0) {
50
+ const { command, args } = resolveInstallCommand(agent, devDependencies, true);
51
+ await runCommand(command, args, cwd);
52
+ }
53
+ }
54
+ function runScript(agent, script) {
55
+ const resolved = (0, package_manager_detector_commands.resolveCommand)(agent, "run", [script]);
56
+ if (!resolved) throw new Error(`Unable to resolve run command for ${agent}`);
57
+ return `${resolved.command} ${resolved.args.join(" ")}`;
58
+ }
59
+ //#endregion
60
+ exports.installPackages = installPackages;
61
+ exports.resolveUserAgent = resolveUserAgent;
62
+ exports.runScript = runScript;
63
+
64
+ //# sourceMappingURL=package-manager.cjs.map
@@ -0,0 +1 @@
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\nconst fallback = {\n agent: 'npm',\n install: (packages: string[], dev: boolean) => {\n return ['install', ...packages, dev ? '-D' : '']\n },\n}\n\nfunction resolveInstallCommand(agent: Agent, packages: string[], dev: boolean): ResolvedCommand {\n const command = resolveCommand(agent, 'install', packages)\n if (command) return command\n\n return { command: fallback.agent, args: fallback.install(packages, dev) }\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,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,IAAM,WAAW;CACf,OAAO;CACP,UAAU,UAAoB,QAAiB;EAC7C,OAAO;GAAC;GAAW,GAAG;GAAU,MAAM,OAAO;EAAE;CACjD;AACF;AAEA,SAAS,sBAAsB,OAAc,UAAoB,KAA+B;CAC9F,MAAM,WAAA,GAAU,kCAAA,eAAA,CAAe,OAAO,WAAW,QAAQ;CACzD,IAAI,SAAS,OAAO;CAEpB,OAAO;EAAE,SAAS,SAAS;EAAO,MAAM,SAAS,QAAQ,UAAU,GAAG;CAAE;AAC1E;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,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"}
@@ -0,0 +1,7 @@
1
+ import { Agent } from 'package-manager-detector';
2
+ export declare function resolveUserAgent(): Agent;
3
+ export declare function installPackages(agent: Agent, cwd: string, { dependencies, devDependencies }: {
4
+ dependencies: string[];
5
+ devDependencies: string[];
6
+ }): Promise<void>;
7
+ export declare function runScript(agent: Agent, script: string): string;
@@ -0,0 +1,59 @@
1
+ const require_types = require("./types.cjs");
2
+ //#region src/core/parse-options.ts
3
+ function isFramework(value) {
4
+ return require_types.FRAMEWORKS.includes(value);
5
+ }
6
+ function isDbOdm(value) {
7
+ return require_types.DB_ODMS.includes(value);
8
+ }
9
+ function isDbDriver(value) {
10
+ return require_types.DB_DRIVERS.includes(value);
11
+ }
12
+ function isLoggerId(value) {
13
+ return require_types.LOGGERS.includes(value);
14
+ }
15
+ function parseDbFlag(value) {
16
+ const [odm, driver] = value.split(":");
17
+ if (!odm || !isDbOdm(odm)) throw new Error(`Invalid --db value "${value}". Use drizzle, prisma, or kysely (optionally with :postgres, :sqlite, or :mysql).`);
18
+ if (driver === void 0 || driver === "") return {
19
+ db: odm,
20
+ driver: require_types.DEFAULT_DB_DRIVER
21
+ };
22
+ if (!isDbDriver(driver)) throw new Error(`Invalid database driver "${driver}". Use postgres, sqlite, or mysql.`);
23
+ return {
24
+ db: odm,
25
+ driver
26
+ };
27
+ }
28
+ function resolveScaffoldDefaults(args) {
29
+ const framework = args.framework ?? "node";
30
+ const db = args.db;
31
+ const logger = args.logger;
32
+ if (!args.projectName) throw new Error("Project name is required");
33
+ const result = {
34
+ projectName: args.projectName.trim(),
35
+ targetDir: "",
36
+ framework
37
+ };
38
+ if (db) {
39
+ result.db = db;
40
+ result.driver = args.driver ?? "sqlite";
41
+ }
42
+ if (logger) result.logger = logger;
43
+ return result;
44
+ }
45
+ function parseFrameworkFlag(value) {
46
+ if (!isFramework(value)) throw new Error(`Invalid --framework "${value}". Use node, express, hono, or fastify.`);
47
+ return value;
48
+ }
49
+ function parseLoggerFlag(value) {
50
+ if (!isLoggerId(value)) throw new Error(`Invalid --logger "${value}". Use pino or winston.`);
51
+ return value;
52
+ }
53
+ //#endregion
54
+ exports.parseDbFlag = parseDbFlag;
55
+ exports.parseFrameworkFlag = parseFrameworkFlag;
56
+ exports.parseLoggerFlag = parseLoggerFlag;
57
+ exports.resolveScaffoldDefaults = resolveScaffoldDefaults;
58
+
59
+ //# sourceMappingURL=parse-options.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-options.cjs","names":[],"sources":["../../../src/core/parse-options.ts"],"sourcesContent":["import {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n 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":";;AAwBA,SAAS,YAAY,OAAmC;CACtD,OAAQ,cAAA,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,QAAQ,OAA+B;CAC9C,OAAQ,cAAA,QAA8B,SAAS,KAAK;AACtD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,cAAA,WAAiC,SAAS,KAAK;AACzD;AAEA,SAAS,WAAW,OAAkC;CACpD,OAAQ,cAAA,QAA8B,SAAS,KAAK;AACtD;AAEA,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,cAAA;CAAkB;CAG9C,IAAI,CAAC,WAAW,MAAM,GACpB,MAAM,IAAI,MAAM,4BAA4B,OAAO,mCAAmC;CAGxF,OAAO;EAAE,IAAI;EAAK;CAAO;AAC3B;AAEA,SAAgB,wBAAwB,MAAyC;CAC/E,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,KAAK,KAAK;CAChB,MAAM,SAAS,KAAK;CAEpB,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,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"}
@@ -0,0 +1,18 @@
1
+ import { DbDriver, DbOdm, Framework, LoggerId, ScaffoldContext } from './types.js';
2
+ export type ParsedCreateArgs = {
3
+ projectName?: string;
4
+ framework?: Framework;
5
+ db?: DbOdm;
6
+ driver?: DbDriver;
7
+ logger?: LoggerId;
8
+ yes: boolean;
9
+ noInstall: boolean;
10
+ json: boolean;
11
+ };
12
+ export declare function parseDbFlag(value: string): {
13
+ db: DbOdm;
14
+ driver: DbDriver;
15
+ };
16
+ export declare function resolveScaffoldDefaults(args: ParsedCreateArgs): ScaffoldContext;
17
+ export declare function parseFrameworkFlag(value: string): Framework;
18
+ export declare function parseLoggerFlag(value: string): LoggerId;
@@ -0,0 +1,18 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let node_path = require("node:path");
3
+ node_path = require_runtime.__toESM(node_path, 1);
4
+ let node_fs_promises = require("node:fs/promises");
5
+ //#region src/core/project-config.ts
6
+ async function writeProjectConfig(root, ctx) {
7
+ const config = { framework: ctx.framework };
8
+ if (ctx.db) {
9
+ config.db = ctx.db;
10
+ if (ctx.driver) config.driver = ctx.driver;
11
+ }
12
+ if (ctx.logger) config.logger = ctx.logger;
13
+ await (0, node_fs_promises.writeFile)(node_path.default.join(root, ".taser.json"), `${JSON.stringify(config, null, 2)}\n`, "utf8");
14
+ }
15
+ //#endregion
16
+ exports.writeProjectConfig = writeProjectConfig;
17
+
18
+ //# sourceMappingURL=project-config.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.cjs","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,OAAA,GAAM,iBAAA,UAAA,CACJ,UAAA,QAAK,KAAK,MAAM,aAAa,GAC7B,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,KACnC,MACF;AACF"}
@@ -0,0 +1,2 @@
1
+ import { ScaffoldContext } from './types.js';
2
+ export declare function writeProjectConfig(root: string, ctx: ScaffoldContext): Promise<void>;
@@ -0,0 +1,52 @@
1
+ const require_registry = require("../addons/registry.cjs");
2
+ //#region src/core/resolve-packages.ts
3
+ function frameworkPackages(framework) {
4
+ const dependencies = ["@taserjs/router"];
5
+ const devDependencies = [
6
+ "@taserjs/router-cli",
7
+ "npm-run-all2",
8
+ "tsdown",
9
+ "tsx",
10
+ "typescript"
11
+ ];
12
+ const scripts = {};
13
+ switch (framework) {
14
+ case "express":
15
+ dependencies.push("@taserjs/adapter-express", "express");
16
+ devDependencies.push("@types/express");
17
+ break;
18
+ case "hono":
19
+ dependencies.push("@hono/node-server", "hono");
20
+ break;
21
+ case "fastify":
22
+ dependencies.push("@taserjs/adapter-fastify", "fastify");
23
+ break;
24
+ default: dependencies.push("@taserjs/adapter-node");
25
+ }
26
+ return {
27
+ dependencies,
28
+ devDependencies,
29
+ scripts
30
+ };
31
+ }
32
+ function resolvePackages(ctx) {
33
+ const base = frameworkPackages(ctx.framework);
34
+ const addons = require_registry.resolveAddons(ctx);
35
+ const dependencies = [...base.dependencies];
36
+ const devDependencies = [...base.devDependencies];
37
+ const scripts = { ...base.scripts };
38
+ for (const addon of addons) {
39
+ dependencies.push(...addon.dependencies(ctx));
40
+ devDependencies.push(...addon.devDependencies(ctx));
41
+ if (addon.scripts) Object.assign(scripts, addon.scripts(ctx));
42
+ }
43
+ return {
44
+ dependencies: [...new Set(dependencies)],
45
+ devDependencies: [...new Set(devDependencies)],
46
+ scripts
47
+ };
48
+ }
49
+ //#endregion
50
+ exports.resolvePackages = resolvePackages;
51
+
52
+ //# sourceMappingURL=resolve-packages.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-packages.cjs","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,iBAAA,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"}
@@ -0,0 +1,5 @@
1
+ import { PackageGroups, ScaffoldContext, Framework } from '../core/types.js';
2
+ export declare function resolvePackages(ctx: ScaffoldContext): PackageGroups;
3
+ export declare function getPackageGroups(framework: Framework): Omit<PackageGroups, 'scripts'> & {
4
+ scripts?: Record<string, string>;
5
+ };
@@ -0,0 +1,73 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_registry = require("../addons/registry.cjs");
3
+ const require_index = require("../frameworks/index.cjs");
4
+ const require_package_manager = require("./package-manager.cjs");
5
+ const require_project_config = require("./project-config.cjs");
6
+ const require_resolve_packages = require("./resolve-packages.cjs");
7
+ const require_base = require("../templates/base.cjs");
8
+ let node_path = require("node:path");
9
+ node_path = require_runtime.__toESM(node_path, 1);
10
+ let node_fs_promises = require("node:fs/promises");
11
+ //#region src/core/scaffold-engine.ts
12
+ async function write(filePath, contents) {
13
+ await (0, node_fs_promises.mkdir)(node_path.default.dirname(filePath), { recursive: true });
14
+ await (0, node_fs_promises.writeFile)(filePath, contents, "utf8");
15
+ }
16
+ async function scaffoldProject(options) {
17
+ const root = options.targetDir;
18
+ const ctx = {
19
+ projectName: options.projectName,
20
+ targetDir: root,
21
+ framework: options.framework,
22
+ ...options.db ? {
23
+ db: options.db,
24
+ driver: options.driver
25
+ } : {},
26
+ ...options.logger ? { logger: options.logger } : {}
27
+ };
28
+ const addons = require_registry.resolveAddons(ctx);
29
+ const packages = require_resolve_packages.resolvePackages(ctx);
30
+ const bootBindings = require_registry.collectBootBindings(ctx);
31
+ await write(node_path.default.join(root, "package.json"), require_base.packageJsonTemplate(options.projectName, packages.scripts));
32
+ await write(node_path.default.join(root, "tsconfig.json"), require_base.tsconfigTemplate());
33
+ await write(node_path.default.join(root, "tsdown.config.ts"), require_base.tsdownConfigTemplate());
34
+ await write(node_path.default.join(root, ".gitignore"), require_base.gitignoreTemplate());
35
+ await write(node_path.default.join(root, "src/context.ts"), require_base.contextTemplate(bootBindings));
36
+ await write(node_path.default.join(root, "src/taser.ts"), require_index.taserTsTemplate(options.framework));
37
+ await write(node_path.default.join(root, "src/index.ts"), require_index.indexTemplate(options.framework));
38
+ await write(node_path.default.join(root, "src/routes/$.ts"), require_base.rootLayoutTemplate());
39
+ await write(node_path.default.join(root, "src/routes/index.get.ts"), require_base.indexRouteTemplate());
40
+ await write(node_path.default.join(root, "src/routes/health.get.ts"), require_base.healthRouteTemplate(ctx));
41
+ await write(node_path.default.join(root, "src/routeManifest.gen.ts"), require_base.starterManifestTemplate());
42
+ for (const addon of addons) await addon.apply(ctx, (filePath, contents) => write(node_path.default.join(root, filePath), contents));
43
+ await require_project_config.writeProjectConfig(root, ctx);
44
+ if (options.skipInstall) return {
45
+ projectName: ctx.projectName,
46
+ targetDir: root,
47
+ framework: ctx.framework,
48
+ ...ctx.db ? {
49
+ db: ctx.db,
50
+ driver: ctx.driver
51
+ } : {},
52
+ ...ctx.logger ? { logger: ctx.logger } : {}
53
+ };
54
+ const agent = options.agent ?? require_package_manager.resolveUserAgent();
55
+ await require_package_manager.installPackages(agent, root, {
56
+ dependencies: packages.dependencies,
57
+ devDependencies: packages.devDependencies
58
+ });
59
+ return {
60
+ projectName: ctx.projectName,
61
+ targetDir: root,
62
+ framework: ctx.framework,
63
+ ...ctx.db ? {
64
+ db: ctx.db,
65
+ driver: ctx.driver
66
+ } : {},
67
+ ...ctx.logger ? { logger: ctx.logger } : {}
68
+ };
69
+ }
70
+ //#endregion
71
+ exports.scaffoldProject = scaffoldProject;
72
+
73
+ //# sourceMappingURL=scaffold-engine.cjs.map