create-taserjs 0.1.12 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/README.md +8 -44
  2. package/dist/cli-CBhdDKHU.cjs +1398 -0
  3. package/dist/cli-hL7a4VS0.js +1237 -0
  4. package/dist/cli-hL7a4VS0.js.map +1 -0
  5. package/dist/cli.cjs +4 -0
  6. package/dist/cli.d.cts +4 -0
  7. package/dist/cli.d.cts.map +1 -0
  8. package/dist/cli.d.ts +4 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +3 -0
  11. package/dist/index.cjs +25 -0
  12. package/dist/index.d.cts +119 -0
  13. package/dist/index.d.cts.map +1 -0
  14. package/dist/index.d.ts +119 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +2 -0
  17. package/package.json +39 -9
  18. package/src/addons/drizzle/index.ts +37 -40
  19. package/src/addons/kysely/index.ts +19 -22
  20. package/src/addons/pino/index.ts +2 -2
  21. package/src/addons/prisma/index.ts +18 -22
  22. package/src/addons/registry.ts +37 -73
  23. package/src/addons/types.ts +12 -13
  24. package/src/addons/validators.ts +22 -23
  25. package/src/addons/winston/index.ts +3 -3
  26. package/src/cli.ts +96 -56
  27. package/src/commands/create.ts +118 -249
  28. package/src/core/package-manager.ts +36 -55
  29. package/src/core/scaffold-engine.ts +100 -75
  30. package/src/core/targets.ts +19 -55
  31. package/src/core/types.ts +18 -53
  32. package/src/index.ts +8 -0
  33. package/src/templates/base.ts +139 -51
  34. package/dist/cjs/_virtual/_rolldown/runtime.cjs +0 -23
  35. package/dist/cjs/addons/arktype/index.cjs +0 -6
  36. package/dist/cjs/addons/arktype/index.cjs.map +0 -1
  37. package/dist/cjs/addons/arktype/index.d.cts +0 -1
  38. package/dist/cjs/addons/drizzle/index.cjs +0 -131
  39. package/dist/cjs/addons/drizzle/index.cjs.map +0 -1
  40. package/dist/cjs/addons/drizzle/index.d.cts +0 -2
  41. package/dist/cjs/addons/kysely/index.cjs +0 -103
  42. package/dist/cjs/addons/kysely/index.cjs.map +0 -1
  43. package/dist/cjs/addons/kysely/index.d.cts +0 -2
  44. package/dist/cjs/addons/pino/index.cjs +0 -30
  45. package/dist/cjs/addons/pino/index.cjs.map +0 -1
  46. package/dist/cjs/addons/pino/index.d.cts +0 -2
  47. package/dist/cjs/addons/prisma/index.cjs +0 -133
  48. package/dist/cjs/addons/prisma/index.cjs.map +0 -1
  49. package/dist/cjs/addons/prisma/index.d.cts +0 -2
  50. package/dist/cjs/addons/registry.cjs +0 -65
  51. package/dist/cjs/addons/registry.cjs.map +0 -1
  52. package/dist/cjs/addons/registry.d.cts +0 -5
  53. package/dist/cjs/addons/types.d.cts +0 -16
  54. package/dist/cjs/addons/valibot/index.cjs +0 -6
  55. package/dist/cjs/addons/valibot/index.cjs.map +0 -1
  56. package/dist/cjs/addons/valibot/index.d.cts +0 -1
  57. package/dist/cjs/addons/validators.cjs +0 -38
  58. package/dist/cjs/addons/validators.cjs.map +0 -1
  59. package/dist/cjs/addons/validators.d.cts +0 -5
  60. package/dist/cjs/addons/winston/index.cjs +0 -34
  61. package/dist/cjs/addons/winston/index.cjs.map +0 -1
  62. package/dist/cjs/addons/winston/index.d.cts +0 -2
  63. package/dist/cjs/addons/zod/index.cjs +0 -6
  64. package/dist/cjs/addons/zod/index.cjs.map +0 -1
  65. package/dist/cjs/addons/zod/index.d.cts +0 -1
  66. package/dist/cjs/cli.cjs +0 -65
  67. package/dist/cjs/cli.cjs.map +0 -1
  68. package/dist/cjs/cli.d.cts +0 -2
  69. package/dist/cjs/commands/create.cjs +0 -332
  70. package/dist/cjs/commands/create.cjs.map +0 -1
  71. package/dist/cjs/commands/create.d.cts +0 -14
  72. package/dist/cjs/core/json-output.cjs +0 -16
  73. package/dist/cjs/core/json-output.cjs.map +0 -1
  74. package/dist/cjs/core/json-output.d.cts +0 -4
  75. package/dist/cjs/core/package-manager.cjs +0 -56
  76. package/dist/cjs/core/package-manager.cjs.map +0 -1
  77. package/dist/cjs/core/package-manager.d.cts +0 -8
  78. package/dist/cjs/core/parse-options.cjs +0 -95
  79. package/dist/cjs/core/parse-options.cjs.map +0 -1
  80. package/dist/cjs/core/parse-options.d.cts +0 -35
  81. package/dist/cjs/core/project-config.cjs +0 -23
  82. package/dist/cjs/core/project-config.cjs.map +0 -1
  83. package/dist/cjs/core/project-config.d.cts +0 -2
  84. package/dist/cjs/core/resolve-packages.cjs +0 -58
  85. package/dist/cjs/core/resolve-packages.cjs.map +0 -1
  86. package/dist/cjs/core/resolve-packages.d.cts +0 -2
  87. package/dist/cjs/core/scaffold-engine.cjs +0 -72
  88. package/dist/cjs/core/scaffold-engine.cjs.map +0 -1
  89. package/dist/cjs/core/scaffold-engine.d.cts +0 -2
  90. package/dist/cjs/core/targets.cjs +0 -171
  91. package/dist/cjs/core/targets.cjs.map +0 -1
  92. package/dist/cjs/core/targets.d.cts +0 -49
  93. package/dist/cjs/core/types.cjs +0 -52
  94. package/dist/cjs/core/types.cjs.map +0 -1
  95. package/dist/cjs/core/types.d.cts +0 -57
  96. package/dist/cjs/core/validate-project-name.cjs +0 -44
  97. package/dist/cjs/core/validate-project-name.cjs.map +0 -1
  98. package/dist/cjs/core/validate-project-name.d.cts +0 -1
  99. package/dist/cjs/frameworks/index.cjs +0 -116
  100. package/dist/cjs/frameworks/index.cjs.map +0 -1
  101. package/dist/cjs/frameworks/index.d.cts +0 -18
  102. package/dist/cjs/scaffold.d.cts +0 -3
  103. package/dist/cjs/templates/base.cjs +0 -97
  104. package/dist/cjs/templates/base.cjs.map +0 -1
  105. package/dist/cjs/templates/base.d.cts +0 -9
  106. package/dist/cjs/types.d.cts +0 -1
  107. package/dist/esm/addons/arktype/index.d.ts +0 -1
  108. package/dist/esm/addons/arktype/index.js +0 -7
  109. package/dist/esm/addons/arktype/index.js.map +0 -1
  110. package/dist/esm/addons/drizzle/index.d.ts +0 -2
  111. package/dist/esm/addons/drizzle/index.js +0 -131
  112. package/dist/esm/addons/drizzle/index.js.map +0 -1
  113. package/dist/esm/addons/kysely/index.d.ts +0 -2
  114. package/dist/esm/addons/kysely/index.js +0 -103
  115. package/dist/esm/addons/kysely/index.js.map +0 -1
  116. package/dist/esm/addons/pino/index.d.ts +0 -2
  117. package/dist/esm/addons/pino/index.js +0 -30
  118. package/dist/esm/addons/pino/index.js.map +0 -1
  119. package/dist/esm/addons/prisma/index.d.ts +0 -2
  120. package/dist/esm/addons/prisma/index.js +0 -133
  121. package/dist/esm/addons/prisma/index.js.map +0 -1
  122. package/dist/esm/addons/registry.d.ts +0 -5
  123. package/dist/esm/addons/registry.js +0 -63
  124. package/dist/esm/addons/registry.js.map +0 -1
  125. package/dist/esm/addons/types.d.ts +0 -16
  126. package/dist/esm/addons/valibot/index.d.ts +0 -1
  127. package/dist/esm/addons/valibot/index.js +0 -7
  128. package/dist/esm/addons/valibot/index.js.map +0 -1
  129. package/dist/esm/addons/validators.d.ts +0 -5
  130. package/dist/esm/addons/validators.js +0 -36
  131. package/dist/esm/addons/validators.js.map +0 -1
  132. package/dist/esm/addons/winston/index.d.ts +0 -2
  133. package/dist/esm/addons/winston/index.js +0 -34
  134. package/dist/esm/addons/winston/index.js.map +0 -1
  135. package/dist/esm/addons/zod/index.d.ts +0 -1
  136. package/dist/esm/addons/zod/index.js +0 -7
  137. package/dist/esm/addons/zod/index.js.map +0 -1
  138. package/dist/esm/cli.d.ts +0 -2
  139. package/dist/esm/cli.js +0 -62
  140. package/dist/esm/cli.js.map +0 -1
  141. package/dist/esm/commands/create.d.ts +0 -14
  142. package/dist/esm/commands/create.js +0 -327
  143. package/dist/esm/commands/create.js.map +0 -1
  144. package/dist/esm/core/json-output.d.ts +0 -4
  145. package/dist/esm/core/json-output.js +0 -14
  146. package/dist/esm/core/json-output.js.map +0 -1
  147. package/dist/esm/core/package-manager.d.ts +0 -8
  148. package/dist/esm/core/package-manager.js +0 -53
  149. package/dist/esm/core/package-manager.js.map +0 -1
  150. package/dist/esm/core/parse-options.d.ts +0 -35
  151. package/dist/esm/core/parse-options.js +0 -89
  152. package/dist/esm/core/parse-options.js.map +0 -1
  153. package/dist/esm/core/project-config.d.ts +0 -2
  154. package/dist/esm/core/project-config.js +0 -21
  155. package/dist/esm/core/project-config.js.map +0 -1
  156. package/dist/esm/core/resolve-packages.d.ts +0 -2
  157. package/dist/esm/core/resolve-packages.js +0 -58
  158. package/dist/esm/core/resolve-packages.js.map +0 -1
  159. package/dist/esm/core/scaffold-engine.d.ts +0 -2
  160. package/dist/esm/core/scaffold-engine.js +0 -70
  161. package/dist/esm/core/scaffold-engine.js.map +0 -1
  162. package/dist/esm/core/targets.d.ts +0 -49
  163. package/dist/esm/core/targets.js +0 -166
  164. package/dist/esm/core/targets.js.map +0 -1
  165. package/dist/esm/core/types.d.ts +0 -57
  166. package/dist/esm/core/types.js +0 -45
  167. package/dist/esm/core/types.js.map +0 -1
  168. package/dist/esm/core/validate-project-name.d.ts +0 -1
  169. package/dist/esm/core/validate-project-name.js +0 -42
  170. package/dist/esm/core/validate-project-name.js.map +0 -1
  171. package/dist/esm/frameworks/index.d.ts +0 -18
  172. package/dist/esm/frameworks/index.js +0 -112
  173. package/dist/esm/frameworks/index.js.map +0 -1
  174. package/dist/esm/scaffold.d.ts +0 -3
  175. package/dist/esm/templates/base.d.ts +0 -9
  176. package/dist/esm/templates/base.js +0 -91
  177. package/dist/esm/templates/base.js.map +0 -1
  178. package/dist/esm/types.d.ts +0 -1
  179. package/src/addons/arktype/index.ts +0 -3
  180. package/src/addons/valibot/index.ts +0 -3
  181. package/src/addons/zod/index.ts +0 -3
  182. package/src/core/json-output.ts +0 -13
  183. package/src/core/parse-options.ts +0 -167
  184. package/src/core/project-config.ts +0 -32
  185. package/src/core/resolve-packages.ts +0 -69
  186. package/src/core/validate-project-name.ts +0 -55
  187. package/src/frameworks/index.ts +0 -120
  188. package/src/scaffold.ts +0 -3
  189. package/src/types.ts +0 -12
@@ -0,0 +1,1398 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ //#endregion
23
+ let node_fs_promises = require("node:fs/promises");
24
+ let node_path = require("node:path");
25
+ node_path = __toESM(node_path, 1);
26
+ let node_child_process = require("node:child_process");
27
+ let package_manager_detector = require("package-manager-detector");
28
+ let _clack_prompts = require("@clack/prompts");
29
+ _clack_prompts = __toESM(_clack_prompts, 1);
30
+ let picocolors = require("picocolors");
31
+ picocolors = __toESM(picocolors, 1);
32
+ let yargs = require("yargs");
33
+ yargs = __toESM(yargs, 1);
34
+ let yargs_helpers = require("yargs/helpers");
35
+ //#region src/core/types.ts
36
+ const RUNTIMES = [
37
+ "node",
38
+ "bun",
39
+ "deno"
40
+ ];
41
+ const DEPLOY_TARGETS = [
42
+ "none",
43
+ "node-server",
44
+ "node-cluster",
45
+ "bun",
46
+ "deno-server",
47
+ "deno-deploy",
48
+ "cloudflare-module",
49
+ "vercel",
50
+ "aws-lambda",
51
+ "netlify"
52
+ ];
53
+ const DB_ODMS = [
54
+ "drizzle",
55
+ "prisma",
56
+ "kysely"
57
+ ];
58
+ const DB_DRIVERS = [
59
+ "postgres",
60
+ "sqlite",
61
+ "mysql"
62
+ ];
63
+ const DEFAULT_DB_DRIVER = "sqlite";
64
+ const LOGGERS = ["pino", "winston"];
65
+ const VALIDATORS = [
66
+ "zod",
67
+ "arktype",
68
+ "valibot"
69
+ ];
70
+ //#endregion
71
+ //#region src/addons/drizzle/index.ts
72
+ function schemaSource$1(driver) {
73
+ switch (driver) {
74
+ case "postgres": return `import { pgTable, serial, text } from "drizzle-orm/pg-core";
75
+
76
+ export const users = pgTable("users", {
77
+ id: serial("id").primaryKey(),
78
+ email: text("email").notNull(),
79
+ });
80
+ `;
81
+ case "mysql": return `import { mysqlTable, serial, varchar } from "drizzle-orm/mysql-core";
82
+
83
+ export const users = mysqlTable("users", {
84
+ id: serial("id").primaryKey(),
85
+ email: varchar("email", { length: 255 }).notNull(),
86
+ });
87
+ `;
88
+ default: return `import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core";
89
+
90
+ export const users = sqliteTable("users", {
91
+ id: integer("id").primaryKey({ autoIncrement: true }),
92
+ email: text("email").notNull(),
93
+ });
94
+ `;
95
+ }
96
+ }
97
+ function dbIndexSource$2(driver) {
98
+ switch (driver) {
99
+ case "postgres": return `import { drizzle } from "drizzle-orm/node-postgres";
100
+ import pg from "pg";
101
+ import * as schema from "./schema.js";
102
+
103
+ export function createDb() {
104
+ const pool = new pg.Pool({
105
+ connectionString: process.env.DATABASE_URL,
106
+ });
107
+ return drizzle(pool, { schema });
108
+ }
109
+ `;
110
+ case "mysql": return `import { drizzle } from "drizzle-orm/mysql2";
111
+ import mysql from "mysql2/promise";
112
+ import * as schema from "./schema.js";
113
+
114
+ export function createDb() {
115
+ const pool = mysql.createPool(process.env.DATABASE_URL ?? "");
116
+ return drizzle(pool, { schema, mode: "default" });
117
+ }
118
+ `;
119
+ default: return `import Database from "better-sqlite3";
120
+ import { drizzle } from "drizzle-orm/better-sqlite3";
121
+ import * as schema from "./schema.js";
122
+
123
+ export function createDb() {
124
+ const filePath = (process.env.DATABASE_URL ?? "file:./local.db").replace(/^file:/, "");
125
+ const client = new Database(filePath);
126
+ return drizzle(client, { schema });
127
+ }
128
+ `;
129
+ }
130
+ }
131
+ function drizzleConfigSource(driver) {
132
+ return `import { defineConfig } from "drizzle-kit";
133
+
134
+ export default defineConfig({
135
+ schema: "./src/db/schema.ts",
136
+ out: "./drizzle",
137
+ dialect: "${driver === "postgres" ? "postgresql" : driver === "mysql" ? "mysql" : "sqlite"}",
138
+ dbCredentials: {
139
+ url: process.env.DATABASE_URL ?? "",
140
+ },
141
+ });
142
+ `;
143
+ }
144
+ function envExample$2(driver) {
145
+ switch (driver) {
146
+ case "postgres": return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
147
+ case "mysql": return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
148
+ default: return "DATABASE_URL=file:./local.db\n";
149
+ }
150
+ }
151
+ function driverPackages$2(driver) {
152
+ switch (driver) {
153
+ case "postgres": return ["pg"];
154
+ case "mysql": return ["mysql2"];
155
+ default: return ["better-sqlite3"];
156
+ }
157
+ }
158
+ function driverDevPackages$2(driver) {
159
+ switch (driver) {
160
+ case "postgres": return ["@types/pg"];
161
+ case "sqlite": return ["@types/better-sqlite3"];
162
+ default: return [];
163
+ }
164
+ }
165
+ const drizzleAddon = {
166
+ id: "drizzle",
167
+ category: "database",
168
+ dependencies(ctx) {
169
+ return ["drizzle-orm", ...driverPackages$2(ctx.driver ?? "sqlite")];
170
+ },
171
+ devDependencies(ctx) {
172
+ return ["drizzle-kit", ...driverDevPackages$2(ctx.driver ?? "sqlite")];
173
+ },
174
+ scripts() {
175
+ return {
176
+ "db:generate": "drizzle-kit generate",
177
+ "db:push": "drizzle-kit push"
178
+ };
179
+ },
180
+ bootBinding() {
181
+ return {
182
+ key: "db",
183
+ importPath: "./db/index.js",
184
+ factoryName: "createDb"
185
+ };
186
+ },
187
+ async apply(ctx, write) {
188
+ const driver = ctx.driver ?? "sqlite";
189
+ await write("src/db/schema.ts", schemaSource$1(driver));
190
+ await write("src/db/index.ts", dbIndexSource$2(driver));
191
+ await write("drizzle.config.ts", drizzleConfigSource(driver));
192
+ await write(".env.example", envExample$2(driver));
193
+ }
194
+ };
195
+ //#endregion
196
+ //#region src/addons/kysely/index.ts
197
+ function schemaTypesSource() {
198
+ return `export interface UserTable {
199
+ id: number;
200
+ email: string;
201
+ }
202
+
203
+ export interface DB {
204
+ users: UserTable;
205
+ }
206
+ `;
207
+ }
208
+ function dbIndexSource$1(driver) {
209
+ switch (driver) {
210
+ case "postgres": return `import { Kysely, PostgresDialect } from "kysely";
211
+ import pg from "pg";
212
+ import type { DB } from "./schema.js";
213
+
214
+ export function createDb() {
215
+ const pool = new pg.Pool({
216
+ connectionString: process.env.DATABASE_URL,
217
+ });
218
+ return new Kysely<DB>({
219
+ dialect: new PostgresDialect({ pool }),
220
+ });
221
+ }
222
+ `;
223
+ case "mysql": return `import { Kysely, MysqlDialect } from "kysely";
224
+ import { createPool } from "mysql2";
225
+ import type { DB } from "./schema.js";
226
+
227
+ export function createDb() {
228
+ const pool = createPool(process.env.DATABASE_URL ?? "");
229
+ return new Kysely<DB>({
230
+ dialect: new MysqlDialect({ pool }),
231
+ });
232
+ }
233
+ `;
234
+ default: return `import Database from "better-sqlite3";
235
+ import { Kysely, SqliteDialect } from "kysely";
236
+ import type { DB } from "./schema.js";
237
+
238
+ export function createDb() {
239
+ const filePath = (process.env.DATABASE_URL ?? "file:./local.db").replace(/^file:/, "");
240
+ const database = new Database(filePath);
241
+ return new Kysely<DB>({
242
+ dialect: new SqliteDialect({ database }),
243
+ });
244
+ }
245
+ `;
246
+ }
247
+ }
248
+ function driverPackages$1(driver) {
249
+ switch (driver) {
250
+ case "postgres": return ["pg"];
251
+ case "mysql": return ["mysql2"];
252
+ default: return ["better-sqlite3"];
253
+ }
254
+ }
255
+ function driverDevPackages$1(driver) {
256
+ switch (driver) {
257
+ case "postgres": return ["@types/pg"];
258
+ case "sqlite": return ["@types/better-sqlite3"];
259
+ default: return [];
260
+ }
261
+ }
262
+ function envExample$1(driver) {
263
+ switch (driver) {
264
+ case "postgres": return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
265
+ case "mysql": return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
266
+ default: return "DATABASE_URL=file:./local.db\n";
267
+ }
268
+ }
269
+ const kyselyAddon = {
270
+ id: "kysely",
271
+ category: "database",
272
+ dependencies(ctx) {
273
+ return ["kysely", ...driverPackages$1(ctx.driver ?? "sqlite")];
274
+ },
275
+ devDependencies(ctx) {
276
+ return driverDevPackages$1(ctx.driver ?? "sqlite");
277
+ },
278
+ bootBinding() {
279
+ return {
280
+ key: "db",
281
+ importPath: "./db/index.js",
282
+ factoryName: "createDb"
283
+ };
284
+ },
285
+ async apply(ctx, write) {
286
+ const driver = ctx.driver ?? "sqlite";
287
+ await write("src/db/schema.ts", schemaTypesSource());
288
+ await write("src/db/index.ts", dbIndexSource$1(driver));
289
+ await write(".env.example", envExample$1(driver));
290
+ }
291
+ };
292
+ //#endregion
293
+ //#region src/addons/pino/index.ts
294
+ const pinoAddon = {
295
+ id: "pino",
296
+ category: "logger",
297
+ dependencies() {
298
+ return ["pino"];
299
+ },
300
+ devDependencies() {
301
+ return [];
302
+ },
303
+ bootBinding() {
304
+ return {
305
+ key: "logger",
306
+ importPath: "./logger.js",
307
+ factoryName: "createLogger"
308
+ };
309
+ },
310
+ async apply(_ctx, write) {
311
+ await write("src/logger.ts", `import pino from "pino";
312
+
313
+ export function createLogger() {
314
+ return pino({ level: process.env.LOG_LEVEL ?? "info" });
315
+ }
316
+ `);
317
+ }
318
+ };
319
+ //#endregion
320
+ //#region src/addons/prisma/index.ts
321
+ const PRISMA_VERSION = "^7.10.0";
322
+ function prismaPackage(name) {
323
+ return `${name}@${PRISMA_VERSION}`;
324
+ }
325
+ function prismaProvider(driver) {
326
+ switch (driver) {
327
+ case "postgres": return "postgresql";
328
+ case "mysql": return "mysql";
329
+ default: return "sqlite";
330
+ }
331
+ }
332
+ function envExample(driver) {
333
+ switch (driver) {
334
+ case "postgres": return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
335
+ case "mysql": return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
336
+ default: return "DATABASE_URL=file:./local.db\n";
337
+ }
338
+ }
339
+ function driverPackages(driver) {
340
+ switch (driver) {
341
+ case "postgres": return [prismaPackage("@prisma/adapter-pg"), "pg"];
342
+ case "mysql": return [prismaPackage("@prisma/adapter-mariadb"), "mariadb"];
343
+ default: return [prismaPackage("@prisma/adapter-better-sqlite3"), "better-sqlite3"];
344
+ }
345
+ }
346
+ function driverDevPackages(driver) {
347
+ switch (driver) {
348
+ case "postgres": return ["@types/pg"];
349
+ case "sqlite": return ["@types/better-sqlite3"];
350
+ default: return [];
351
+ }
352
+ }
353
+ function dbIndexSource(driver) {
354
+ switch (driver) {
355
+ case "postgres": return `import { PrismaPg } from "@prisma/adapter-pg";
356
+ import { PrismaClient } from "./prisma/client.js";
357
+
358
+ export function createDb() {
359
+ const adapter = new PrismaPg({
360
+ connectionString: process.env.DATABASE_URL,
361
+ });
362
+ return new PrismaClient({ adapter });
363
+ }
364
+ `;
365
+ case "mysql": return `import { PrismaMariaDb } from "@prisma/adapter-mariadb";
366
+ import { PrismaClient } from "./prisma/client.js";
367
+
368
+ export function createDb() {
369
+ const adapter = new PrismaMariaDb(process.env.DATABASE_URL ?? "mariadb://root:@localhost:3306/mydb");
370
+ return new PrismaClient({ adapter });
371
+ }
372
+ `;
373
+ default: return `import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
374
+ import { PrismaClient } from "./prisma/client.js";
375
+
376
+ export function createDb() {
377
+ const adapter = new PrismaBetterSqlite3({
378
+ url: process.env.DATABASE_URL ?? "file:./local.db",
379
+ });
380
+ return new PrismaClient({ adapter });
381
+ }
382
+ `;
383
+ }
384
+ }
385
+ function prismaConfigSource() {
386
+ return `import "dotenv/config";
387
+ import { defineConfig, env } from "prisma/config";
388
+
389
+ export default defineConfig({
390
+ schema: "prisma/schema.prisma",
391
+ datasource: {
392
+ url: env("DATABASE_URL"),
393
+ },
394
+ });
395
+ `;
396
+ }
397
+ function schemaSource(driver) {
398
+ return `generator client {
399
+ provider = "prisma-client"
400
+ output = "../src/db/prisma"
401
+ }
402
+
403
+ datasource db {
404
+ provider = "${prismaProvider(driver)}"
405
+ }
406
+
407
+ model User {
408
+ id Int @id @default(autoincrement())
409
+ email String
410
+ }
411
+ `;
412
+ }
413
+ const prismaAddon = {
414
+ id: "prisma",
415
+ category: "database",
416
+ dependencies(ctx) {
417
+ const driver = ctx.driver ?? "sqlite";
418
+ return [prismaPackage("@prisma/client"), ...driverPackages(driver)];
419
+ },
420
+ devDependencies(ctx) {
421
+ const driver = ctx.driver ?? "sqlite";
422
+ return [prismaPackage("prisma"), ...driverDevPackages(driver)];
423
+ },
424
+ scripts() {
425
+ return {
426
+ "db:generate": "prisma generate",
427
+ "db:push": "prisma db push"
428
+ };
429
+ },
430
+ bootBinding() {
431
+ return {
432
+ key: "db",
433
+ importPath: "./db/index.js",
434
+ factoryName: "createDb"
435
+ };
436
+ },
437
+ async apply(ctx, write) {
438
+ const driver = ctx.driver ?? "sqlite";
439
+ await write("prisma.config.ts", prismaConfigSource());
440
+ await write("prisma/schema.prisma", schemaSource(driver));
441
+ await write("src/db/index.ts", dbIndexSource(driver));
442
+ await write(".env.example", envExample(driver));
443
+ }
444
+ };
445
+ //#endregion
446
+ //#region src/addons/validators.ts
447
+ const IMPORT_LINES = {
448
+ zod: `import { z } from "zod";`,
449
+ arktype: `import { type } from "arktype";`,
450
+ valibot: `import * as v from "valibot";`
451
+ };
452
+ const QUERY_SCHEMA_EXPR = {
453
+ zod: `z.object({ name: z.string().default("Taser.js") })`,
454
+ arktype: `type({ "name?": 'string = "Taser.js"' })`,
455
+ valibot: `v.object({ name: v.optional(v.string(), "Taser.js") })`
456
+ };
457
+ const ValidatorAddon = (validator) => {
458
+ return {
459
+ id: validator,
460
+ category: "validator",
461
+ dependencies: () => [validator],
462
+ devDependencies: () => [],
463
+ apply: async (_ctx, write) => {
464
+ await write("src/routes/index.get.ts", `import { t } from "@taserjs/router";
465
+ ${IMPORT_LINES[validator]}
466
+
467
+ export default t
468
+ .get("/")
469
+ .query(${QUERY_SCHEMA_EXPR[validator]})
470
+ .handler(({ req }) => {
471
+ return Response.json({ message: \`Hello, \${req.query.name}!\` });
472
+ });
473
+ `);
474
+ }
475
+ };
476
+ };
477
+ //#endregion
478
+ //#region src/addons/registry.ts
479
+ const ADDONS = {
480
+ drizzle: drizzleAddon,
481
+ prisma: prismaAddon,
482
+ kysely: kyselyAddon,
483
+ pino: pinoAddon,
484
+ winston: {
485
+ id: "winston",
486
+ category: "logger",
487
+ dependencies() {
488
+ return ["winston"];
489
+ },
490
+ devDependencies() {
491
+ return [];
492
+ },
493
+ bootBinding() {
494
+ return {
495
+ key: "logger",
496
+ importPath: "./logger.js",
497
+ factoryName: "createLogger"
498
+ };
499
+ },
500
+ async apply(_ctx, write) {
501
+ await write("src/logger.ts", `import winston from "winston";
502
+
503
+ export function createLogger() {
504
+ return winston.createLogger({
505
+ level: process.env.LOG_LEVEL ?? "info",
506
+ format: winston.format.json(),
507
+ transports: [new winston.transports.Console()],
508
+ });
509
+ }
510
+ `);
511
+ }
512
+ },
513
+ zod: ValidatorAddon("zod"),
514
+ arktype: ValidatorAddon("arktype"),
515
+ valibot: ValidatorAddon("valibot")
516
+ };
517
+ function resolveAddons(ctx) {
518
+ const result = [];
519
+ if (ctx.db && ADDONS[ctx.db]) {
520
+ const addon = ADDONS[ctx.db];
521
+ if (addon) result.push(addon);
522
+ }
523
+ if (ctx.logger && ADDONS[ctx.logger]) {
524
+ const addon = ADDONS[ctx.logger];
525
+ if (addon) result.push(addon);
526
+ }
527
+ if (ctx.validator && ADDONS[ctx.validator]) {
528
+ const addon = ADDONS[ctx.validator];
529
+ if (addon) result.push(addon);
530
+ }
531
+ return result;
532
+ }
533
+ function collectBootBindings(ctx) {
534
+ const addons = resolveAddons(ctx);
535
+ const bindings = [];
536
+ for (const addon of addons) if (addon.bootBinding) {
537
+ const binding = addon.bootBinding(ctx);
538
+ if (binding) bindings.push(binding);
539
+ }
540
+ return bindings;
541
+ }
542
+ //#endregion
543
+ //#region src/core/package-manager.ts
544
+ function resolveUserAgent() {
545
+ return (0, package_manager_detector.getUserAgent)() || "pnpm";
546
+ }
547
+ function runScript(agent, script) {
548
+ switch (agent) {
549
+ case "npm": return `npm run ${script}`;
550
+ case "yarn": return `yarn ${script}`;
551
+ case "bun": return `bun run ${script}`;
552
+ default: return `pnpm ${script}`;
553
+ }
554
+ }
555
+ async function installPackages(agent, cwd, packages) {
556
+ if (packages.dependencies.length > 0) {
557
+ const cmd = (0, package_manager_detector.resolveCommand)(agent, "add", packages.dependencies);
558
+ if (cmd) (0, node_child_process.execSync)(`${cmd.command} ${cmd.args.join(" ")}`, {
559
+ cwd,
560
+ stdio: "ignore"
561
+ });
562
+ }
563
+ if (packages.devDependencies.length > 0) {
564
+ const cmd = (0, package_manager_detector.resolveCommand)(agent, "add", [...agent === "npm" ? ["--save-dev"] : ["-D"], ...packages.devDependencies]);
565
+ if (cmd) (0, node_child_process.execSync)(`${cmd.command} ${cmd.args.join(" ")}`, {
566
+ cwd,
567
+ stdio: "ignore"
568
+ });
569
+ }
570
+ }
571
+ //#endregion
572
+ //#region src/core/targets.ts
573
+ const NITRO_NODE_START = "node .output/server/index.mjs";
574
+ const DEPLOY_ENTRIES = {
575
+ none: {
576
+ id: "none",
577
+ impliedRuntime: "node",
578
+ selfHosted: true,
579
+ startScript: "node dist/serve.mjs",
580
+ devDeps: [],
581
+ files: []
582
+ },
583
+ "node-server": {
584
+ id: "node-server",
585
+ impliedRuntime: "node",
586
+ selfHosted: true,
587
+ startScript: NITRO_NODE_START,
588
+ devDeps: ["nitro"],
589
+ files: []
590
+ },
591
+ "node-cluster": {
592
+ id: "node-cluster",
593
+ impliedRuntime: "node",
594
+ selfHosted: true,
595
+ startScript: NITRO_NODE_START,
596
+ devDeps: ["nitro"],
597
+ files: []
598
+ },
599
+ bun: {
600
+ id: "bun",
601
+ impliedRuntime: "bun",
602
+ selfHosted: true,
603
+ startScript: "bun .output/server/index.mjs",
604
+ devDeps: ["nitro", "@types/bun"],
605
+ files: []
606
+ },
607
+ "deno-server": {
608
+ id: "deno-server",
609
+ impliedRuntime: "deno",
610
+ selfHosted: true,
611
+ startScript: "deno run -A .output/server/index.mjs",
612
+ devDeps: ["nitro"],
613
+ files: []
614
+ },
615
+ "deno-deploy": {
616
+ id: "deno-deploy",
617
+ impliedRuntime: "deno",
618
+ selfHosted: false,
619
+ startScript: null,
620
+ devDeps: ["nitro"],
621
+ files: []
622
+ },
623
+ "cloudflare-module": {
624
+ id: "cloudflare-module",
625
+ impliedRuntime: "workerd",
626
+ selfHosted: false,
627
+ startScript: null,
628
+ devDeps: [
629
+ "nitro",
630
+ "wrangler",
631
+ "@cloudflare/workers-types"
632
+ ],
633
+ files: [{
634
+ name: "wrangler.jsonc",
635
+ content: ({ projectName }) => `${JSON.stringify({
636
+ $schema: "node_modules/wrangler/config-schema.json",
637
+ name: projectName,
638
+ main: ".output/server/index.mjs",
639
+ compatibility_date: "2024-11-01"
640
+ }, null, 2)}\n`
641
+ }]
642
+ },
643
+ vercel: {
644
+ id: "vercel",
645
+ impliedRuntime: "node",
646
+ selfHosted: false,
647
+ startScript: null,
648
+ devDeps: ["nitro", "@vercel/node"],
649
+ files: []
650
+ },
651
+ "aws-lambda": {
652
+ id: "aws-lambda",
653
+ impliedRuntime: "node",
654
+ selfHosted: false,
655
+ startScript: null,
656
+ devDeps: ["nitro", "@types/aws-lambda"],
657
+ files: []
658
+ },
659
+ netlify: {
660
+ id: "netlify",
661
+ impliedRuntime: "node",
662
+ selfHosted: false,
663
+ startScript: null,
664
+ devDeps: ["nitro"],
665
+ files: []
666
+ }
667
+ };
668
+ const RUNTIME_OVERRIDES = {
669
+ none: ["node", "bun"],
670
+ "node-server": ["node", "bun"],
671
+ "node-cluster": ["node", "bun"]
672
+ };
673
+ const DEFAULT_DEPLOY = "none";
674
+ function isCuratedDeploy(value) {
675
+ return DEPLOY_TARGETS.includes(value);
676
+ }
677
+ function resolveDeployEntry(id) {
678
+ if (isCuratedDeploy(id)) return {
679
+ entry: DEPLOY_ENTRIES[id],
680
+ curated: true
681
+ };
682
+ return {
683
+ entry: {
684
+ id,
685
+ impliedRuntime: "node",
686
+ selfHosted: false,
687
+ startScript: null,
688
+ devDeps: ["nitro"],
689
+ files: []
690
+ },
691
+ curated: false
692
+ };
693
+ }
694
+ function allowedRuntimeOverrides(id) {
695
+ return RUNTIME_OVERRIDES[id] ?? [];
696
+ }
697
+ function validateCombination(runtimeOverride, deploy) {
698
+ const { entry } = resolveDeployEntry(deploy);
699
+ if (runtimeOverride !== void 0) {
700
+ const allowed = entry.selfHosted ? allowedRuntimeOverrides(entry.id) : [];
701
+ if (!allowed.includes(runtimeOverride)) return {
702
+ ok: false,
703
+ reason: `Runtime "${runtimeOverride}" is not valid for deploy target "${entry.id}". ` + (allowed.length > 0 ? `Allowed overrides: ${allowed.join(", ")}.` : `It implies runtime "${String(entry.impliedRuntime)}".`)
704
+ };
705
+ }
706
+ return {
707
+ ok: true,
708
+ runtime: runtimeOverride ?? entry.impliedRuntime
709
+ };
710
+ }
711
+ //#endregion
712
+ //#region src/templates/base.ts
713
+ function packageJsonTemplate(projectName, scripts = {}) {
714
+ const pkg = {
715
+ name: projectName,
716
+ version: "0.0.1",
717
+ private: true,
718
+ type: "module",
719
+ scripts: {
720
+ dev: "vite",
721
+ build: "vite build",
722
+ start: "node dist/serve.mjs",
723
+ ...scripts
724
+ }
725
+ };
726
+ return `${JSON.stringify(pkg, null, 2)}\n`;
727
+ }
728
+ function tsconfigTemplate() {
729
+ return `${JSON.stringify({
730
+ compilerOptions: {
731
+ target: "ES2022",
732
+ module: "NodeNext",
733
+ moduleResolution: "NodeNext",
734
+ strict: true,
735
+ skipLibCheck: true,
736
+ esModuleInterop: true
737
+ },
738
+ include: [
739
+ "src/**/*",
740
+ "src/.taserjs/**/*",
741
+ "taserjs.config.ts",
742
+ "vite.config.ts",
743
+ "nitro.config.ts"
744
+ ]
745
+ }, null, 2)}\n`;
746
+ }
747
+ function gitignoreTemplate() {
748
+ return `node_modules/
749
+ dist/
750
+ .output/
751
+ .taserjs/
752
+ .env
753
+ .env.*
754
+ !.env.example
755
+ *.log
756
+ local.db
757
+ drizzle/
758
+ `;
759
+ }
760
+ function taserConfigTemplate() {
761
+ return `import { defineConfig } from "@taserjs/cli";
762
+
763
+ export default defineConfig({
764
+ serverDir: "src",
765
+ routesDir: "routes",
766
+ outputDir: ".taserjs",
767
+ app: "taser.ts",
768
+ });
769
+ `;
770
+ }
771
+ function viteConfigTemplate(preset = "none") {
772
+ if (preset === "none") return `import { defineConfig } from "vite";
773
+ import { taser } from "@taserjs/plugin/vite";
774
+
775
+ export default defineConfig({
776
+ plugins: [taser()],
777
+ });
778
+ `;
779
+ return `import { defineConfig } from "vite";
780
+ import { nitro } from "nitro/vite";
781
+ import { taser } from "@taserjs/plugin/vite";
782
+
783
+ export default defineConfig({
784
+ plugins: [taser(), nitro()],
785
+ });
786
+ `;
787
+ }
788
+ function nitroConfigTemplate(preset) {
789
+ return `import { defineConfig } from "nitro/config";
790
+ import { taser } from "@taserjs/plugin/nitro";
791
+
792
+ export default defineConfig({
793
+ preset: "${preset}",
794
+ modules: [taser({ standalone: true })],
795
+ });
796
+ `;
797
+ }
798
+ function contextTemplate(bindings) {
799
+ const imports = bindings.map((b) => `import { ${b.factoryName} } from "${b.importPath}";`);
800
+ const bootBody = bindings.length > 0 ? bindings.map((b) => ` ${b.key}: ${b.factoryName}(),`).join("\n") : "";
801
+ const bootBlock = bindings.length > 0 ? ` boot: () => ({\n${bootBody}\n }),\n` : "";
802
+ return `${imports.length > 0 ? `${imports.join("\n")}\n\n` : ""}import { createContext } from "@taserjs/router";
803
+
804
+ export const context = createContext({
805
+ ${bootBlock} request: () => ({
806
+ requestId: crypto.randomUUID(),
807
+ }),
808
+ });
809
+ `;
810
+ }
811
+ function taserTsTemplate() {
812
+ return `import { defineTaser } from "@taserjs/router";
813
+ import { context } from "./context.js";
814
+
815
+ export default defineTaser().context(context);
816
+ `;
817
+ }
818
+ function rootLayoutTemplate() {
819
+ return `import { t } from "@taserjs/router";
820
+
821
+ export default t.layout("/*").use(async (_args, next) => {
822
+ return await next();
823
+ });
824
+ `;
825
+ }
826
+ function indexRouteTemplate() {
827
+ return `import { t } from "@taserjs/router";
828
+
829
+ export default t.get("/").handler(() => {
830
+ return Response.json({ message: "Welcome to Taser.js!" });
831
+ });
832
+ `;
833
+ }
834
+ function staticRoutesGenTemplate() {
835
+ return `// @ts-nocheck
836
+ import { createTaserApp } from "@taserjs/runtime";
837
+ import taser from "../taser.js";
838
+ import layout_0 from "../routes/$.js";
839
+ import route_0 from "../routes/index.get.js";
840
+
841
+ export type LayoutTree = {
842
+ "/*": typeof layout_0;
843
+ };
844
+
845
+ export const layoutManifest = {
846
+ "/*": layout_0,
847
+ } as const;
848
+
849
+ export const routeManifest = {
850
+ layouts: layoutManifest,
851
+ routes: {
852
+ "/": {
853
+ GET: {
854
+ layouts: ["/*"],
855
+ route: route_0,
856
+ },
857
+ },
858
+ },
859
+ } as const;
860
+
861
+ export type RouteManifest = typeof routeManifest;
862
+
863
+ export const app = createTaserApp(routeManifest, taser);
864
+ export default app;
865
+ export const createApp = (overrideTaser?: typeof taser) =>
866
+ createTaserApp(routeManifest, overrideTaser ?? taser);
867
+
868
+ export type RoutePath = "/";
869
+
870
+ export type LayoutHierarchy = {
871
+ "/*": readonly [];
872
+ };
873
+
874
+ export type RouteByPathMethod = {
875
+ "/": {
876
+ GET: {
877
+ layouts: readonly ["/*"];
878
+ };
879
+ };
880
+ };
881
+
882
+ export type AppContext = typeof taser.$Infer.Context;
883
+
884
+ declare module "@taserjs/router" {
885
+ interface RouterRegister {
886
+ RoutePath: RoutePath;
887
+ LayoutTree: LayoutTree;
888
+ LayoutHierarchy: LayoutHierarchy;
889
+ RouteByPathMethod: RouteByPathMethod;
890
+ AppContext: AppContext;
891
+ }
892
+ }
893
+ `;
894
+ }
895
+ //#endregion
896
+ //#region src/core/scaffold-engine.ts
897
+ async function write(filePath, contents) {
898
+ await (0, node_fs_promises.mkdir)((0, node_path.dirname)(filePath), { recursive: true });
899
+ await (0, node_fs_promises.writeFile)(filePath, contents.trimStart(), "utf-8");
900
+ }
901
+ async function scaffoldProject(options) {
902
+ const root = options.targetDir;
903
+ const preset = options.preset ?? "none";
904
+ const combination = validateCombination(options.runtime, preset);
905
+ if (!combination.ok) throw new Error(combination.reason);
906
+ const writtenFiles = [];
907
+ const trackedWrite = async (relPath, contents) => {
908
+ await write((0, node_path.join)(root, relPath), contents);
909
+ writtenFiles.push(relPath);
910
+ };
911
+ const addons = resolveAddons(options);
912
+ const bootBindings = collectBootBindings(options);
913
+ const { entry: deployEntry } = resolveDeployEntry(preset);
914
+ const scripts = {};
915
+ if (deployEntry.startScript) scripts.start = deployEntry.startScript;
916
+ const dependencies = ["@taserjs/router", "@taserjs/runtime"];
917
+ const devDependencies = [
918
+ "@taserjs/cli",
919
+ "@taserjs/plugin",
920
+ "typescript",
921
+ "vite"
922
+ ];
923
+ for (const dep of deployEntry.devDeps) devDependencies.push(dep);
924
+ for (const addon of addons) {
925
+ dependencies.push(...addon.dependencies(options));
926
+ devDependencies.push(...addon.devDependencies(options));
927
+ if (addon.scripts) Object.assign(scripts, addon.scripts(options));
928
+ }
929
+ const formatDep = (pkg) => {
930
+ const ver = options.packageVersions?.[pkg];
931
+ return ver ? `${pkg}@${ver}` : pkg;
932
+ };
933
+ const resolvedDeps = [...new Set(dependencies)].map(formatDep);
934
+ const resolvedDevDeps = [...new Set(devDependencies)].map(formatDep);
935
+ await trackedWrite("package.json", packageJsonTemplate(options.projectName, scripts));
936
+ await trackedWrite("tsconfig.json", tsconfigTemplate());
937
+ await trackedWrite(".gitignore", gitignoreTemplate());
938
+ await trackedWrite("taserjs.config.ts", taserConfigTemplate());
939
+ await trackedWrite("vite.config.ts", viteConfigTemplate(preset));
940
+ if (preset !== "none") await trackedWrite("nitro.config.ts", nitroConfigTemplate(preset));
941
+ await Promise.all(deployEntry.files.map(async (file) => {
942
+ const content = typeof file.content === "function" ? file.content({ projectName: options.projectName }) : file.content;
943
+ await trackedWrite(file.name, content);
944
+ }));
945
+ await trackedWrite("src/context.ts", contextTemplate(bootBindings));
946
+ await trackedWrite("src/taser.ts", taserTsTemplate());
947
+ await trackedWrite("src/routes/index.get.ts", indexRouteTemplate());
948
+ await trackedWrite("src/routes/$.ts", rootLayoutTemplate());
949
+ await Promise.all(addons.map(async (addon) => {
950
+ await addon.apply(options, async (relPath, contents) => {
951
+ await trackedWrite(relPath, contents);
952
+ });
953
+ }));
954
+ await trackedWrite("src/.taserjs/routes.gen.ts", staticRoutesGenTemplate());
955
+ if (!options.skipInstall) await installPackages(options.agent ?? resolveUserAgent(), root, {
956
+ dependencies: resolvedDeps,
957
+ devDependencies: resolvedDevDeps
958
+ });
959
+ return {
960
+ ...options,
961
+ files: writtenFiles
962
+ };
963
+ }
964
+ //#endregion
965
+ //#region src/commands/create.ts
966
+ const DEPLOY_LABELS = {
967
+ none: "None (Standalone Vite SSR)",
968
+ "node-server": "Node.js server (Nitro)",
969
+ "node-cluster": "Node.js cluster (Nitro)",
970
+ bun: "Bun (Nitro)",
971
+ "deno-server": "Deno (Nitro)",
972
+ "deno-deploy": "Deno Deploy (Nitro)",
973
+ "cloudflare-module": "Cloudflare Workers (Nitro)",
974
+ vercel: "Vercel (Nitro)",
975
+ "aws-lambda": "AWS Lambda (Nitro)",
976
+ netlify: "Netlify (Nitro)"
977
+ };
978
+ async function promptInteractiveOptions(defaults) {
979
+ const projectName = defaults.projectName ?? await _clack_prompts.text({
980
+ message: "Project name",
981
+ placeholder: "my-taser-app",
982
+ defaultValue: "my-taser-app",
983
+ validate(value) {
984
+ if (!value || value.trim().length === 0) return "Project name cannot be empty";
985
+ if (/[^a-zA-Z0-9_-]/.test(value)) return "Project name contains invalid characters";
986
+ }
987
+ });
988
+ if (_clack_prompts.isCancel(projectName)) {
989
+ _clack_prompts.cancel("Scaffold cancelled.");
990
+ process.exit(0);
991
+ }
992
+ const preset = defaults.preset ?? await _clack_prompts.select({
993
+ message: "Deployment target",
994
+ options: DEPLOY_TARGETS.map((id) => ({
995
+ value: id,
996
+ label: DEPLOY_LABELS[id]
997
+ })),
998
+ initialValue: "none"
999
+ });
1000
+ if (_clack_prompts.isCancel(preset)) {
1001
+ _clack_prompts.cancel("Scaffold cancelled.");
1002
+ process.exit(0);
1003
+ }
1004
+ let runtime;
1005
+ const runtimeOverrides = allowedRuntimeOverrides(preset);
1006
+ if (runtimeOverrides.length > 0) {
1007
+ const runtimeChoice = defaults.runtime ?? await _clack_prompts.select({
1008
+ message: "Runtime override",
1009
+ options: [...runtimeOverrides.map((rt) => ({
1010
+ value: rt,
1011
+ label: rt
1012
+ })), {
1013
+ value: "default",
1014
+ label: "Preset default",
1015
+ hint: "no override"
1016
+ }],
1017
+ initialValue: "default"
1018
+ });
1019
+ if (_clack_prompts.isCancel(runtimeChoice)) {
1020
+ _clack_prompts.cancel("Scaffold cancelled.");
1021
+ process.exit(0);
1022
+ }
1023
+ runtime = runtimeChoice === "default" ? void 0 : runtimeChoice;
1024
+ }
1025
+ const validatorChoice = defaults.validator ?? await _clack_prompts.select({
1026
+ message: "Standard Schema Validator",
1027
+ options: [
1028
+ {
1029
+ value: "none",
1030
+ label: "None",
1031
+ hint: "default"
1032
+ },
1033
+ {
1034
+ value: "zod",
1035
+ label: "Zod"
1036
+ },
1037
+ {
1038
+ value: "valibot",
1039
+ label: "Valibot"
1040
+ },
1041
+ {
1042
+ value: "arktype",
1043
+ label: "Arktype"
1044
+ }
1045
+ ],
1046
+ initialValue: "none"
1047
+ });
1048
+ if (_clack_prompts.isCancel(validatorChoice)) {
1049
+ _clack_prompts.cancel("Scaffold cancelled.");
1050
+ process.exit(0);
1051
+ }
1052
+ const validator = validatorChoice === "none" ? void 0 : validatorChoice;
1053
+ const dbChoice = defaults.db ?? await _clack_prompts.select({
1054
+ message: "Database ORM / Query Builder",
1055
+ options: [
1056
+ {
1057
+ value: "none",
1058
+ label: "None",
1059
+ hint: "default"
1060
+ },
1061
+ {
1062
+ value: "drizzle",
1063
+ label: "Drizzle"
1064
+ },
1065
+ {
1066
+ value: "prisma",
1067
+ label: "Prisma"
1068
+ },
1069
+ {
1070
+ value: "kysely",
1071
+ label: "Kysely"
1072
+ }
1073
+ ],
1074
+ initialValue: "none"
1075
+ });
1076
+ if (_clack_prompts.isCancel(dbChoice)) {
1077
+ _clack_prompts.cancel("Scaffold cancelled.");
1078
+ process.exit(0);
1079
+ }
1080
+ let db;
1081
+ let driver;
1082
+ if (dbChoice !== "none") {
1083
+ db = dbChoice;
1084
+ const driverChoice = defaults.driver ?? await _clack_prompts.select({
1085
+ message: "Database driver",
1086
+ options: [
1087
+ {
1088
+ value: "sqlite",
1089
+ label: "SQLite",
1090
+ hint: "default"
1091
+ },
1092
+ {
1093
+ value: "postgres",
1094
+ label: "PostgreSQL"
1095
+ },
1096
+ {
1097
+ value: "mysql",
1098
+ label: "MySQL"
1099
+ }
1100
+ ],
1101
+ initialValue: "sqlite"
1102
+ });
1103
+ if (_clack_prompts.isCancel(driverChoice)) {
1104
+ _clack_prompts.cancel("Scaffold cancelled.");
1105
+ process.exit(0);
1106
+ }
1107
+ driver = driverChoice;
1108
+ }
1109
+ const loggerChoice = defaults.logger ?? await _clack_prompts.select({
1110
+ message: "Logger",
1111
+ options: [
1112
+ {
1113
+ value: "none",
1114
+ label: "None",
1115
+ hint: "default"
1116
+ },
1117
+ {
1118
+ value: "pino",
1119
+ label: "Pino"
1120
+ },
1121
+ {
1122
+ value: "winston",
1123
+ label: "Winston"
1124
+ }
1125
+ ],
1126
+ initialValue: "none"
1127
+ });
1128
+ if (_clack_prompts.isCancel(loggerChoice)) {
1129
+ _clack_prompts.cancel("Scaffold cancelled.");
1130
+ process.exit(0);
1131
+ }
1132
+ const logger = loggerChoice === "none" ? void 0 : loggerChoice;
1133
+ return {
1134
+ projectName: String(projectName).trim(),
1135
+ preset,
1136
+ ...runtime ? { runtime } : {},
1137
+ ...validator ? { validator } : {},
1138
+ ...db ? {
1139
+ db,
1140
+ driver
1141
+ } : {},
1142
+ ...logger ? { logger } : {},
1143
+ skipInstall: defaults.skipInstall
1144
+ };
1145
+ }
1146
+ async function runCreateCommand(args = {}) {
1147
+ const isInteractive = args.interactive ?? (Boolean(process.stdout.isTTY) && process.env.NODE_ENV !== "test");
1148
+ const resolved = isInteractive ? await promptInteractiveOptions(args) : {
1149
+ ...args,
1150
+ projectName: args.projectName ?? "my-taser-app",
1151
+ preset: args.preset ?? "none"
1152
+ };
1153
+ const cwd = process.cwd();
1154
+ const projectName = resolved.projectName || "my-taser-app";
1155
+ const targetDir = args.targetDir ? node_path.default.resolve(cwd, args.targetDir) : node_path.default.resolve(cwd, projectName);
1156
+ const scaffoldOpts = {
1157
+ projectName,
1158
+ targetDir,
1159
+ ...resolved.preset !== void 0 ? { preset: resolved.preset } : {},
1160
+ ...resolved.runtime !== void 0 ? { runtime: resolved.runtime } : {},
1161
+ ...resolved.validator !== void 0 ? { validator: resolved.validator } : {},
1162
+ ...resolved.db !== void 0 ? { db: resolved.db } : {},
1163
+ ...resolved.driver !== void 0 ? { driver: resolved.driver } : {},
1164
+ ...resolved.logger !== void 0 ? { logger: resolved.logger } : {},
1165
+ ...args.packageVersions !== void 0 ? { packageVersions: args.packageVersions } : {},
1166
+ skipInstall: resolved.skipInstall ?? process.env.NODE_ENV === "test"
1167
+ };
1168
+ if (isInteractive) {
1169
+ const s = _clack_prompts.spinner();
1170
+ s.start("Scaffolding project");
1171
+ const result = await scaffoldProject(scaffoldOpts);
1172
+ s.stop("Project created");
1173
+ const agent = resolveUserAgent();
1174
+ _clack_prompts.outro(picocolors.default.green("Done!"));
1175
+ console.log(`\nNext steps:`);
1176
+ console.log(` cd ${node_path.default.relative(cwd, targetDir) || "."}`);
1177
+ if (scaffoldOpts.skipInstall) console.log(` ${runScript(agent, "install")}`);
1178
+ console.log(` ${runScript(agent, "dev")}\n`);
1179
+ return result;
1180
+ }
1181
+ return await scaffoldProject(scaffoldOpts);
1182
+ }
1183
+ //#endregion
1184
+ //#region src/cli.ts
1185
+ async function run(argv = (0, yargs_helpers.hideBin)(process.argv)) {
1186
+ await (0, yargs.default)(argv).scriptName("create-taserjs").usage("$0 [dir] [options]").command("$0 [dir]", "Scaffold a new Taser.js application", (y) => y.positional("dir", {
1187
+ type: "string",
1188
+ description: "Directory or project name"
1189
+ }).option("preset", {
1190
+ alias: "p",
1191
+ type: "string",
1192
+ description: "Deployment preset"
1193
+ }).option("runtime", {
1194
+ type: "string",
1195
+ description: "Runtime override (node, bun, deno)"
1196
+ }).option("validator", {
1197
+ alias: "v",
1198
+ type: "string",
1199
+ choices: [
1200
+ "zod",
1201
+ "valibot",
1202
+ "arktype",
1203
+ "none"
1204
+ ],
1205
+ description: "Standard Schema validator"
1206
+ }).option("db", {
1207
+ type: "string",
1208
+ choices: [
1209
+ "drizzle",
1210
+ "prisma",
1211
+ "kysely",
1212
+ "none"
1213
+ ],
1214
+ description: "Database ORM / Query builder"
1215
+ }).option("driver", {
1216
+ type: "string",
1217
+ choices: [
1218
+ "sqlite",
1219
+ "postgres",
1220
+ "mysql"
1221
+ ],
1222
+ description: "Database driver"
1223
+ }).option("logger", {
1224
+ alias: "l",
1225
+ type: "string",
1226
+ choices: [
1227
+ "pino",
1228
+ "winston",
1229
+ "none"
1230
+ ],
1231
+ description: "Logger addon"
1232
+ }).option("skip-install", {
1233
+ type: "boolean",
1234
+ description: "Skip dependency installation",
1235
+ default: false
1236
+ }).option("yes", {
1237
+ alias: "y",
1238
+ type: "boolean",
1239
+ description: "Skip prompts and use defaults",
1240
+ default: false
1241
+ }), async (args) => {
1242
+ await runCreateCommand({
1243
+ targetDir: args.dir,
1244
+ projectName: args.dir,
1245
+ preset: args.preset,
1246
+ runtime: args.runtime,
1247
+ validator: args.validator === "none" ? void 0 : args.validator,
1248
+ db: args.db === "none" ? void 0 : args.db,
1249
+ driver: args.driver,
1250
+ logger: args.logger === "none" ? void 0 : args.logger,
1251
+ skipInstall: Boolean(args.skipInstall),
1252
+ interactive: !args.yes
1253
+ });
1254
+ }).help().alias("help", "h").version().alias("version", "V").strict().exitProcess(false).parse();
1255
+ }
1256
+ if (process.argv[1] && process.argv[1].endsWith("cli.js")) run().catch((err) => {
1257
+ console.error(err instanceof Error ? err.message : String(err));
1258
+ process.exit(1);
1259
+ });
1260
+ //#endregion
1261
+ Object.defineProperty(exports, "ADDONS", {
1262
+ enumerable: true,
1263
+ get: function() {
1264
+ return ADDONS;
1265
+ }
1266
+ });
1267
+ Object.defineProperty(exports, "DB_DRIVERS", {
1268
+ enumerable: true,
1269
+ get: function() {
1270
+ return DB_DRIVERS;
1271
+ }
1272
+ });
1273
+ Object.defineProperty(exports, "DB_ODMS", {
1274
+ enumerable: true,
1275
+ get: function() {
1276
+ return DB_ODMS;
1277
+ }
1278
+ });
1279
+ Object.defineProperty(exports, "DEFAULT_DB_DRIVER", {
1280
+ enumerable: true,
1281
+ get: function() {
1282
+ return DEFAULT_DB_DRIVER;
1283
+ }
1284
+ });
1285
+ Object.defineProperty(exports, "DEFAULT_DEPLOY", {
1286
+ enumerable: true,
1287
+ get: function() {
1288
+ return DEFAULT_DEPLOY;
1289
+ }
1290
+ });
1291
+ Object.defineProperty(exports, "DEPLOY_ENTRIES", {
1292
+ enumerable: true,
1293
+ get: function() {
1294
+ return DEPLOY_ENTRIES;
1295
+ }
1296
+ });
1297
+ Object.defineProperty(exports, "DEPLOY_TARGETS", {
1298
+ enumerable: true,
1299
+ get: function() {
1300
+ return DEPLOY_TARGETS;
1301
+ }
1302
+ });
1303
+ Object.defineProperty(exports, "LOGGERS", {
1304
+ enumerable: true,
1305
+ get: function() {
1306
+ return LOGGERS;
1307
+ }
1308
+ });
1309
+ Object.defineProperty(exports, "RUNTIMES", {
1310
+ enumerable: true,
1311
+ get: function() {
1312
+ return RUNTIMES;
1313
+ }
1314
+ });
1315
+ Object.defineProperty(exports, "VALIDATORS", {
1316
+ enumerable: true,
1317
+ get: function() {
1318
+ return VALIDATORS;
1319
+ }
1320
+ });
1321
+ Object.defineProperty(exports, "allowedRuntimeOverrides", {
1322
+ enumerable: true,
1323
+ get: function() {
1324
+ return allowedRuntimeOverrides;
1325
+ }
1326
+ });
1327
+ Object.defineProperty(exports, "collectBootBindings", {
1328
+ enumerable: true,
1329
+ get: function() {
1330
+ return collectBootBindings;
1331
+ }
1332
+ });
1333
+ Object.defineProperty(exports, "installPackages", {
1334
+ enumerable: true,
1335
+ get: function() {
1336
+ return installPackages;
1337
+ }
1338
+ });
1339
+ Object.defineProperty(exports, "isCuratedDeploy", {
1340
+ enumerable: true,
1341
+ get: function() {
1342
+ return isCuratedDeploy;
1343
+ }
1344
+ });
1345
+ Object.defineProperty(exports, "promptInteractiveOptions", {
1346
+ enumerable: true,
1347
+ get: function() {
1348
+ return promptInteractiveOptions;
1349
+ }
1350
+ });
1351
+ Object.defineProperty(exports, "resolveAddons", {
1352
+ enumerable: true,
1353
+ get: function() {
1354
+ return resolveAddons;
1355
+ }
1356
+ });
1357
+ Object.defineProperty(exports, "resolveDeployEntry", {
1358
+ enumerable: true,
1359
+ get: function() {
1360
+ return resolveDeployEntry;
1361
+ }
1362
+ });
1363
+ Object.defineProperty(exports, "resolveUserAgent", {
1364
+ enumerable: true,
1365
+ get: function() {
1366
+ return resolveUserAgent;
1367
+ }
1368
+ });
1369
+ Object.defineProperty(exports, "run", {
1370
+ enumerable: true,
1371
+ get: function() {
1372
+ return run;
1373
+ }
1374
+ });
1375
+ Object.defineProperty(exports, "runCreateCommand", {
1376
+ enumerable: true,
1377
+ get: function() {
1378
+ return runCreateCommand;
1379
+ }
1380
+ });
1381
+ Object.defineProperty(exports, "runScript", {
1382
+ enumerable: true,
1383
+ get: function() {
1384
+ return runScript;
1385
+ }
1386
+ });
1387
+ Object.defineProperty(exports, "scaffoldProject", {
1388
+ enumerable: true,
1389
+ get: function() {
1390
+ return scaffoldProject;
1391
+ }
1392
+ });
1393
+ Object.defineProperty(exports, "validateCombination", {
1394
+ enumerable: true,
1395
+ get: function() {
1396
+ return validateCombination;
1397
+ }
1398
+ });