create-taserjs 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/addons/arktype/index.cjs.map +1 -1
  3. package/dist/cjs/addons/drizzle/index.cjs.map +1 -1
  4. package/dist/cjs/addons/kysely/index.cjs.map +1 -1
  5. package/dist/cjs/addons/pino/index.cjs.map +1 -1
  6. package/dist/cjs/addons/prisma/index.cjs +84 -24
  7. package/dist/cjs/addons/prisma/index.cjs.map +1 -1
  8. package/dist/cjs/addons/registry.cjs +1 -1
  9. package/dist/cjs/addons/registry.cjs.map +1 -1
  10. package/dist/cjs/addons/types.d.cts +1 -1
  11. package/dist/cjs/addons/valibot/index.cjs.map +1 -1
  12. package/dist/cjs/addons/validators.cjs.map +1 -1
  13. package/dist/cjs/addons/winston/index.cjs.map +1 -1
  14. package/dist/cjs/addons/zod/index.cjs.map +1 -1
  15. package/dist/cjs/cli.cjs +5 -0
  16. package/dist/cjs/cli.cjs.map +1 -1
  17. package/dist/cjs/commands/create.cjs +44 -11
  18. package/dist/cjs/commands/create.cjs.map +1 -1
  19. package/dist/cjs/commands/create.d.cts +1 -0
  20. package/dist/cjs/core/json-output.cjs.map +1 -1
  21. package/dist/cjs/core/package-manager.cjs.map +1 -1
  22. package/dist/cjs/core/package-manager.d.cts +1 -1
  23. package/dist/cjs/core/parse-options.cjs +7 -7
  24. package/dist/cjs/core/parse-options.cjs.map +1 -1
  25. package/dist/cjs/core/parse-options.d.cts +3 -3
  26. package/dist/cjs/core/project-config.cjs +1 -1
  27. package/dist/cjs/core/project-config.cjs.map +1 -1
  28. package/dist/cjs/core/resolve-packages.cjs +41 -7
  29. package/dist/cjs/core/resolve-packages.cjs.map +1 -1
  30. package/dist/cjs/core/resolve-packages.d.cts +2 -2
  31. package/dist/cjs/core/scaffold-engine.cjs +33 -6
  32. package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
  33. package/dist/cjs/core/types.cjs +11 -3
  34. package/dist/cjs/core/types.cjs.map +1 -1
  35. package/dist/cjs/core/types.d.cts +8 -8
  36. package/dist/cjs/core/validate-project-name.cjs.map +1 -1
  37. package/dist/cjs/frameworks/index.cjs +138 -17
  38. package/dist/cjs/frameworks/index.cjs.map +1 -1
  39. package/dist/cjs/frameworks/index.d.cts +3 -3
  40. package/dist/cjs/scaffold.d.cts +1 -1
  41. package/dist/cjs/templates/base.cjs +6 -6
  42. package/dist/cjs/templates/base.cjs.map +1 -1
  43. package/dist/cjs/types.d.cts +1 -1
  44. package/dist/esm/addons/arktype/index.js.map +1 -1
  45. package/dist/esm/addons/drizzle/index.js.map +1 -1
  46. package/dist/esm/addons/kysely/index.js.map +1 -1
  47. package/dist/esm/addons/pino/index.js.map +1 -1
  48. package/dist/esm/addons/prisma/index.js +84 -24
  49. package/dist/esm/addons/prisma/index.js.map +1 -1
  50. package/dist/esm/addons/registry.js +2 -2
  51. package/dist/esm/addons/registry.js.map +1 -1
  52. package/dist/esm/addons/types.d.ts +1 -1
  53. package/dist/esm/addons/valibot/index.js.map +1 -1
  54. package/dist/esm/addons/validators.js.map +1 -1
  55. package/dist/esm/addons/winston/index.js.map +1 -1
  56. package/dist/esm/addons/zod/index.js.map +1 -1
  57. package/dist/esm/cli.js +5 -0
  58. package/dist/esm/cli.js.map +1 -1
  59. package/dist/esm/commands/create.d.ts +1 -0
  60. package/dist/esm/commands/create.js +46 -13
  61. package/dist/esm/commands/create.js.map +1 -1
  62. package/dist/esm/core/json-output.js.map +1 -1
  63. package/dist/esm/core/package-manager.d.ts +1 -1
  64. package/dist/esm/core/package-manager.js.map +1 -1
  65. package/dist/esm/core/parse-options.d.ts +3 -3
  66. package/dist/esm/core/parse-options.js +8 -8
  67. package/dist/esm/core/parse-options.js.map +1 -1
  68. package/dist/esm/core/project-config.js +1 -1
  69. package/dist/esm/core/project-config.js.map +1 -1
  70. package/dist/esm/core/resolve-packages.d.ts +2 -2
  71. package/dist/esm/core/resolve-packages.js +41 -7
  72. package/dist/esm/core/resolve-packages.js.map +1 -1
  73. package/dist/esm/core/scaffold-engine.js +34 -7
  74. package/dist/esm/core/scaffold-engine.js.map +1 -1
  75. package/dist/esm/core/types.d.ts +8 -8
  76. package/dist/esm/core/types.js +11 -3
  77. package/dist/esm/core/types.js.map +1 -1
  78. package/dist/esm/core/validate-project-name.js.map +1 -1
  79. package/dist/esm/frameworks/index.d.ts +3 -3
  80. package/dist/esm/frameworks/index.js +138 -17
  81. package/dist/esm/frameworks/index.js.map +1 -1
  82. package/dist/esm/scaffold.d.ts +1 -1
  83. package/dist/esm/templates/base.js +6 -6
  84. package/dist/esm/templates/base.js.map +1 -1
  85. package/dist/esm/types.d.ts +1 -1
  86. package/package.json +13 -13
  87. package/src/addons/arktype/index.ts +2 -2
  88. package/src/addons/drizzle/index.ts +53 -53
  89. package/src/addons/kysely/index.ts +42 -42
  90. package/src/addons/pino/index.ts +12 -12
  91. package/src/addons/prisma/index.ts +128 -55
  92. package/src/addons/registry.ts +37 -37
  93. package/src/addons/types.ts +14 -14
  94. package/src/addons/valibot/index.ts +2 -2
  95. package/src/addons/validators.ts +9 -9
  96. package/src/addons/winston/index.ts +12 -12
  97. package/src/addons/zod/index.ts +2 -2
  98. package/src/cli.ts +27 -26
  99. package/src/commands/create.ts +181 -152
  100. package/src/core/json-output.ts +4 -4
  101. package/src/core/package-manager.ts +38 -31
  102. package/src/core/parse-options.ts +50 -48
  103. package/src/core/project-config.ts +10 -14
  104. package/src/core/resolve-packages.ts +79 -41
  105. package/src/core/scaffold-engine.ts +106 -36
  106. package/src/core/types.ts +61 -36
  107. package/src/core/validate-project-name.ts +40 -40
  108. package/src/frameworks/index.ts +164 -29
  109. package/src/scaffold.ts +3 -3
  110. package/src/templates/base.ts +57 -51
  111. package/src/types.ts +5 -4
@@ -1,7 +1,9 @@
1
1
  //#region src/frameworks/index.ts
2
- function indexTemplate(framework) {
3
- switch (framework) {
4
- case "express": return `import express from 'express'
2
+ function indexTemplate(type) {
3
+ switch (type) {
4
+ case "express": return `import 'dotenv/config'
5
+
6
+ import express from 'express'
5
7
  import { createExpressHandler } from '@taserjs/adapter-express'
6
8
 
7
9
  import { routeManifest } from '#src/routeManifest.gen.js'
@@ -11,14 +13,16 @@ const router = t.create(routeManifest)
11
13
 
12
14
  const taser = createExpressHandler(router)
13
15
  const app = express()
14
- taser.mount('/api{/*splat}', app)
16
+ taser.mount('/{*splat}', app)
15
17
 
16
18
  const port = Number(process.env.PORT ?? 3000)
17
19
  app.listen(port, () => {
18
20
  console.log(\`Express listening on http://localhost:\${port}\`)
19
21
  })
20
22
  `;
21
- case "hono": return `import { serve } from '@hono/node-server'
23
+ case "hono": return `import 'dotenv/config'
24
+
25
+ import { serve } from '@hono/node-server'
22
26
  import { Hono } from 'hono'
23
27
 
24
28
  import { routeManifest } from '#src/routeManifest.gen.js'
@@ -27,15 +31,16 @@ import { t } from '#src/taser.js'
27
31
  const router = t.create(routeManifest)
28
32
 
29
33
  const app = new Hono()
30
- const api = router.base('/api')
31
- app.all('/api/*', c => api.native(c).fetch(c.req.raw))
34
+ app.all('/*', c => router.native(c).fetch(c.req.raw))
32
35
 
33
36
  const port = Number(process.env.PORT ?? 3000)
34
37
  serve({ fetch: app.fetch, port }, () => {
35
38
  console.log(\`Hono listening on http://localhost:\${port}\`)
36
39
  })
37
40
  `;
38
- case "fastify": return `import Fastify from 'fastify'
41
+ case "fastify": return `import 'dotenv/config'
42
+
43
+ import Fastify from 'fastify'
39
44
  import { createFastifyHandler } from '@taserjs/adapter-fastify'
40
45
 
41
46
  import { routeManifest } from '#src/routeManifest.gen.js'
@@ -45,33 +50,149 @@ const router = t.create(routeManifest)
45
50
 
46
51
  const taser = createFastifyHandler(router)
47
52
  const app = Fastify()
48
- taser.mount('/api/*', app)
53
+ taser.mount('/*', app)
49
54
 
50
55
  const port = Number(process.env.PORT ?? 3000)
51
56
  await app.listen({ port })
52
57
  console.log(\`Fastify listening on http://localhost:\${port}\`)
53
58
  `;
54
- default: return `import { createServer } from 'node:http'
55
- import { createNodeHandler } from '@taserjs/adapter-node'
59
+ case "bun": return `import 'dotenv/config'
60
+
61
+ import { routeManifest } from '#src/routeManifest.gen.js'
62
+ import { t } from '#src/taser.js'
63
+
64
+ const router = t.create(routeManifest)
65
+
66
+ const port = Number(process.env.PORT ?? 3000)
67
+
68
+ export default {
69
+ port,
70
+ fetch(request: Request) {
71
+ return router.fetch(request)
72
+ },
73
+ }
74
+ `;
75
+ case "deno": return `import 'dotenv/config'
76
+
77
+ import { routeManifest } from '#src/routeManifest.gen.js'
78
+ import { t } from '#src/taser.js'
79
+
80
+ const router = t.create(routeManifest)
81
+
82
+ const port = Number(process.env.PORT ?? 8000)
83
+ Deno.serve({ port }, (request: Request) => router.fetch(request))
84
+ `;
85
+ case "aws-lambda": return `import 'dotenv/config'
86
+
87
+ import { Hono } from 'hono'
88
+ import { handle } from 'hono/aws-lambda'
89
+
90
+ import { routeManifest } from '#src/routeManifest.gen.js'
91
+ import { t } from '#src/taser.js'
92
+
93
+ const router = t.create(routeManifest)
94
+
95
+ const app = new Hono()
96
+ app.all('/*', c => router.native(c).fetch(c.req.raw))
97
+
98
+ export const handler = handle(app)
99
+ `;
100
+ case "cloudflare-workers": return `import 'dotenv/config'
101
+
102
+ import { routeManifest } from '#src/routeManifest.gen.js'
103
+ import { t } from '#src/taser.js'
104
+
105
+ const router = t.create(routeManifest)
106
+
107
+ export default {
108
+ fetch(request: Request, env: unknown, ctx: unknown) {
109
+ return router.fetch(request, env, ctx)
110
+ },
111
+ }
112
+ `;
113
+ case "netlify": return `import 'dotenv/config'
114
+
115
+ import { Hono } from 'hono'
116
+ import { handle } from 'hono/netlify'
117
+
118
+ import { routeManifest } from '#src/routeManifest.gen.js'
119
+ import { t } from '#src/taser.js'
120
+
121
+ const router = t.create(routeManifest)
122
+
123
+ const app = new Hono()
124
+ app.all('/*', c => router.native(c).fetch(c.req.raw))
125
+
126
+ export default handle(app)
127
+ `;
128
+ case "vercel": return `import 'dotenv/config'
129
+
130
+ import { Hono } from 'hono'
131
+ import { handle } from 'hono/vercel'
56
132
 
57
133
  import { routeManifest } from '#src/routeManifest.gen.js'
58
134
  import { t } from '#src/taser.js'
59
135
 
60
136
  const router = t.create(routeManifest)
61
137
 
62
- const taser = createNodeHandler(router)
63
- const app = createServer()
64
- taser.mount('/api/*', app)
138
+ const app = new Hono()
139
+ app.all('/*', c => router.native(c).fetch(c.req.raw))
140
+
141
+ export default handle(app)
142
+ `;
143
+ case "azure-functions": return `import 'dotenv/config'
144
+
145
+ import { app } from '@azure/functions'
146
+ import { Hono } from 'hono'
147
+ import { azureHonoHandler } from '@marplex/hono-azurefunc-adapter'
148
+
149
+ import { routeManifest } from '#src/routeManifest.gen.js'
150
+ import { t } from '#src/taser.js'
151
+
152
+ const router = t.create(routeManifest)
153
+
154
+ const honoApp = new Hono()
155
+ honoApp.all('/*', c => router.native(c).fetch(c.req.raw))
156
+
157
+ app.http('httpTrigger', {
158
+ methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'],
159
+ authLevel: 'anonymous',
160
+ route: '{*proxy}',
161
+ handler: azureHonoHandler(honoApp.fetch),
162
+ })
163
+ `;
164
+ case "google-cloud-run": return `import 'dotenv/config'
165
+
166
+ import { serve } from '@hono/node-server'
167
+
168
+ import { routeManifest } from '#src/routeManifest.gen.js'
169
+ import { t } from '#src/taser.js'
170
+
171
+ const router = t.create(routeManifest)
172
+
173
+ const port = Number(process.env.PORT ?? 8080)
174
+ serve({ fetch: router.fetch, port }, () => {
175
+ console.log(\`Cloud Run listening on http://localhost:\${port}\`)
176
+ })
177
+ `;
178
+ default: return `import 'dotenv/config'
179
+
180
+ import { serve } from '@hono/node-server'
181
+
182
+ import { routeManifest } from '#src/routeManifest.gen.js'
183
+ import { t } from '#src/taser.js'
184
+
185
+ const router = t.create(routeManifest)
65
186
 
66
187
  const port = Number(process.env.PORT ?? 3000)
67
- app.listen(port, () => {
188
+ serve({ fetch: router.fetch, port }, () => {
68
189
  console.log(\`Node listening on http://localhost:\${port}\`)
69
190
  })
70
191
  `;
71
192
  }
72
193
  }
73
- function taserTsTemplate(framework = "node") {
74
- if (framework === "hono") return `import type { Context } from 'hono'
194
+ function taserTsTemplate(type = "node") {
195
+ if (type === "hono" || type === "aws-lambda" || type === "netlify" || type === "vercel" || type === "azure-functions") return `import type { Context } from 'hono'
75
196
  import { createTaserApp, type InferAppContext } from '@taserjs/router'
76
197
 
77
198
  import { context } from '#src/context.js'
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/frameworks/index.ts"],"sourcesContent":["import type { Framework } from '../core/types.js'\n\nexport function indexTemplate(framework: Framework): string {\n switch (framework) {\n case 'express':\n return `import express from 'express'\nimport { createExpressHandler } from '@taserjs/adapter-express'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createExpressHandler(router)\nconst app = express()\ntaser.mount('/api{/*splat}', app)\n\nconst port = Number(process.env.PORT ?? 3000)\napp.listen(port, () => {\n console.log(\\`Express listening on http://localhost:\\${port}\\`)\n})\n`\n case 'hono':\n return `import { serve } from '@hono/node-server'\nimport { Hono } from 'hono'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\nconst api = router.base('/api')\napp.all('/api/*', c => api.native(c).fetch(c.req.raw))\n\nconst port = Number(process.env.PORT ?? 3000)\nserve({ fetch: app.fetch, port }, () => {\n console.log(\\`Hono listening on http://localhost:\\${port}\\`)\n})\n`\n case 'fastify':\n return `import Fastify from 'fastify'\nimport { createFastifyHandler } from '@taserjs/adapter-fastify'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createFastifyHandler(router)\nconst app = Fastify()\ntaser.mount('/api/*', app)\n\nconst port = Number(process.env.PORT ?? 3000)\nawait app.listen({ port })\nconsole.log(\\`Fastify listening on http://localhost:\\${port}\\`)\n`\n case 'node':\n default:\n return `import { createServer } from 'node:http'\nimport { createNodeHandler } from '@taserjs/adapter-node'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createNodeHandler(router)\nconst app = createServer()\ntaser.mount('/api/*', app)\n\nconst port = Number(process.env.PORT ?? 3000)\napp.listen(port, () => {\n console.log(\\`Node listening on http://localhost:\\${port}\\`)\n})\n`\n }\n}\n\nexport function taserTsTemplate(framework: Framework = 'node'): string {\n if (framework === 'hono') {\n return `import type { Context } from 'hono'\nimport { createTaserApp, type InferAppContext } from '@taserjs/router'\n\nimport { context } from '#src/context.js'\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n NativeContext: Context\n }\n}\n\nexport const t = createTaserApp({\n response: { validate: true },\n}).context(context)\n\nexport type AppContext = InferAppContext<typeof context>\n`\n }\n\n return `import { createTaserApp, type InferAppContext } from '@taserjs/router'\n\nimport { context } from '#src/context.js'\n\nexport const t = createTaserApp({\n response: { validate: true },\n}).context(context)\n\nexport type AppContext = InferAppContext<typeof context>\n`\n}\n"],"mappings":";AAEA,SAAgB,cAAc,WAA8B;CAC1D,QAAQ,WAAR;EACE,KAAK,WACH,OAAO;;;;;;;;;;;;;;;;;EAiBT,KAAK,QACH,OAAO;;;;;;;;;;;;;;;;;EAiBT,KAAK,WACH,OAAO;;;;;;;;;;;;;;;;EAiBT,SACE,OAAO;;;;;;;;;;;;;;;;;CAiBX;AACF;AAEA,SAAgB,gBAAgB,YAAuB,QAAgB;CACrE,IAAI,cAAc,QAChB,OAAO;;;;;;;;;;;;;;;;;CAmBT,OAAO;;;;;;;;;;AAUT"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/frameworks/index.ts"],"sourcesContent":["import type { ProjectType } from \"../core/types.js\";\n\nexport function indexTemplate(type: ProjectType): string {\n switch (type) {\n case \"express\":\n return `import 'dotenv/config'\n\nimport express from 'express'\nimport { createExpressHandler } from '@taserjs/adapter-express'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createExpressHandler(router)\nconst app = express()\ntaser.mount('/{*splat}', app)\n\nconst port = Number(process.env.PORT ?? 3000)\napp.listen(port, () => {\n console.log(\\`Express listening on http://localhost:\\${port}\\`)\n})\n`;\n case \"hono\":\n return `import 'dotenv/config'\n\nimport { serve } from '@hono/node-server'\nimport { Hono } from 'hono'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\napp.all('/*', c => router.native(c).fetch(c.req.raw))\n\nconst port = Number(process.env.PORT ?? 3000)\nserve({ fetch: app.fetch, port }, () => {\n console.log(\\`Hono listening on http://localhost:\\${port}\\`)\n})\n`;\n case \"fastify\":\n return `import 'dotenv/config'\n\nimport Fastify from 'fastify'\nimport { createFastifyHandler } from '@taserjs/adapter-fastify'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst taser = createFastifyHandler(router)\nconst app = Fastify()\ntaser.mount('/*', app)\n\nconst port = Number(process.env.PORT ?? 3000)\nawait app.listen({ port })\nconsole.log(\\`Fastify listening on http://localhost:\\${port}\\`)\n`;\n case \"bun\":\n return `import 'dotenv/config'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst port = Number(process.env.PORT ?? 3000)\n\nexport default {\n port,\n fetch(request: Request) {\n return router.fetch(request)\n },\n}\n`;\n case \"deno\":\n return `import 'dotenv/config'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst port = Number(process.env.PORT ?? 8000)\nDeno.serve({ port }, (request: Request) => router.fetch(request))\n`;\n case \"aws-lambda\":\n return `import 'dotenv/config'\n\nimport { Hono } from 'hono'\nimport { handle } from 'hono/aws-lambda'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\napp.all('/*', c => router.native(c).fetch(c.req.raw))\n\nexport const handler = handle(app)\n`;\n case \"cloudflare-workers\":\n return `import 'dotenv/config'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nexport default {\n fetch(request: Request, env: unknown, ctx: unknown) {\n return router.fetch(request, env, ctx)\n },\n}\n`;\n case \"netlify\":\n return `import 'dotenv/config'\n\nimport { Hono } from 'hono'\nimport { handle } from 'hono/netlify'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\napp.all('/*', c => router.native(c).fetch(c.req.raw))\n\nexport default handle(app)\n`;\n case \"vercel\":\n return `import 'dotenv/config'\n\nimport { Hono } from 'hono'\nimport { handle } from 'hono/vercel'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst app = new Hono()\napp.all('/*', c => router.native(c).fetch(c.req.raw))\n\nexport default handle(app)\n`;\n case \"azure-functions\":\n return `import 'dotenv/config'\n\nimport { app } from '@azure/functions'\nimport { Hono } from 'hono'\nimport { azureHonoHandler } from '@marplex/hono-azurefunc-adapter'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst honoApp = new Hono()\nhonoApp.all('/*', c => router.native(c).fetch(c.req.raw))\n\napp.http('httpTrigger', {\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'],\n authLevel: 'anonymous',\n route: '{*proxy}',\n handler: azureHonoHandler(honoApp.fetch),\n})\n`;\n case \"google-cloud-run\":\n return `import 'dotenv/config'\n\nimport { serve } from '@hono/node-server'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst port = Number(process.env.PORT ?? 8080)\nserve({ fetch: router.fetch, port }, () => {\n console.log(\\`Cloud Run listening on http://localhost:\\${port}\\`)\n})\n`;\n case \"node\":\n default:\n return `import 'dotenv/config'\n\nimport { serve } from '@hono/node-server'\n\nimport { routeManifest } from '#src/routeManifest.gen.js'\nimport { t } from '#src/taser.js'\n\nconst router = t.create(routeManifest)\n\nconst port = Number(process.env.PORT ?? 3000)\nserve({ fetch: router.fetch, port }, () => {\n console.log(\\`Node listening on http://localhost:\\${port}\\`)\n})\n`;\n }\n}\n\nexport function taserTsTemplate(type: ProjectType = \"node\"): string {\n if (\n type === \"hono\" ||\n type === \"aws-lambda\" ||\n type === \"netlify\" ||\n type === \"vercel\" ||\n type === \"azure-functions\"\n ) {\n return `import type { Context } from 'hono'\nimport { createTaserApp, type InferAppContext } from '@taserjs/router'\n\nimport { context } from '#src/context.js'\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n NativeContext: Context\n }\n}\n\nexport const t = createTaserApp({\n response: { validate: true },\n}).context(context)\n\nexport type AppContext = InferAppContext<typeof context>\n`;\n }\n\n return `import { createTaserApp, type InferAppContext } from '@taserjs/router'\n\nimport { context } from '#src/context.js'\n\nexport const t = createTaserApp({\n response: { validate: true },\n}).context(context)\n\nexport type AppContext = InferAppContext<typeof context>\n`;\n}\n"],"mappings":";AAEA,SAAgB,cAAc,MAA2B;CACvD,QAAQ,MAAR;EACE,KAAK,WACH,OAAO;;;;;;;;;;;;;;;;;;;EAmBT,KAAK,QACH,OAAO;;;;;;;;;;;;;;;;;;EAkBT,KAAK,WACH,OAAO;;;;;;;;;;;;;;;;;;EAkBT,KAAK,OACH,OAAO;;;;;;;;;;;;;;;;EAgBT,KAAK,QACH,OAAO;;;;;;;;;;EAUT,KAAK,cACH,OAAO;;;;;;;;;;;;;;;EAeT,KAAK,sBACH,OAAO;;;;;;;;;;;;;EAaT,KAAK,WACH,OAAO;;;;;;;;;;;;;;;EAeT,KAAK,UACH,OAAO;;;;;;;;;;;;;;;EAeT,KAAK,mBACH,OAAO;;;;;;;;;;;;;;;;;;;;;EAqBT,KAAK,oBACH,OAAO;;;;;;;;;;;;;;EAeT,SACE,OAAO;;;;;;;;;;;;;;CAcX;AACF;AAEA,SAAgB,gBAAgB,OAAoB,QAAgB;CAClE,IACE,SAAS,UACT,SAAS,gBACT,SAAS,aACT,SAAS,YACT,SAAS,mBAET,OAAO;;;;;;;;;;;;;;;;;CAmBT,OAAO;;;;;;;;;;AAUT"}
@@ -1,3 +1,3 @@
1
- import { Framework } from '../core/types.js';
2
- export declare function indexTemplate(framework: Framework): string;
3
- export declare function taserTsTemplate(framework?: Framework): string;
1
+ import { ProjectType } from '../core/types.js';
2
+ export declare function indexTemplate(type: ProjectType): string;
3
+ export declare function taserTsTemplate(type?: ProjectType): string;
@@ -1,3 +1,3 @@
1
1
  export { scaffoldProject } from './core/scaffold-engine.js';
2
2
  export { getPackageGroups, resolvePackages } from './core/resolve-packages.js';
3
- export type { Framework, ScaffoldOptions, ScaffoldResult, PackageGroups } from './core/types.js';
3
+ export type { PackageGroups, ProjectType, ScaffoldOptions, ScaffoldResult } from './core/types.js';
@@ -7,14 +7,14 @@ function packageJsonTemplate(projectName, scripts = {}) {
7
7
  type: "module",
8
8
  imports: { "#src/*": "./src/*" },
9
9
  scripts: {
10
- "dev": "run-p dev:server dev:taser",
10
+ dev: "run-p dev:server dev:taser",
11
11
  "dev:server": "tsx watch src/index.ts",
12
12
  "dev:taser": "taser watch",
13
- "start": "tsx src/index.ts",
14
- "generate": "taser generate",
15
- "build": "taser generate && tsdown",
16
- "serve": "node dist/index.mjs",
17
- "typecheck": "tsc --noEmit -p tsconfig.json",
13
+ start: "tsx src/index.ts",
14
+ generate: "taser generate",
15
+ build: "taser generate && tsdown",
16
+ serve: "node dist/index.mjs",
17
+ typecheck: "tsc --noEmit -p tsconfig.json",
18
18
  ...scripts
19
19
  }
20
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"base.cjs","names":[],"sources":["../../../src/templates/base.ts"],"sourcesContent":["import type { BootBinding } from '../addons/types.js'\nimport type { ScaffoldContext } from '../core/types.js'\n\nexport function packageJsonTemplate(projectName: string, scripts: Record<string, string> = {}): string {\n const pkg = {\n name: projectName,\n version: '1.0.0',\n private: true,\n type: 'module',\n imports: {\n '#src/*': './src/*',\n },\n scripts: {\n 'dev': 'run-p dev:server dev:taser',\n 'dev:server': 'tsx watch src/index.ts',\n 'dev:taser': 'taser watch',\n 'start': 'tsx src/index.ts',\n 'generate': 'taser generate',\n 'build': 'taser generate && tsdown',\n 'serve': 'node dist/index.mjs',\n 'typecheck': 'tsc --noEmit -p tsconfig.json',\n ...scripts,\n },\n }\n\n return `${JSON.stringify(pkg, null, 2)}\\n`\n}\n\nexport function tsdownConfigTemplate(): string {\n return `import { defineConfig } from 'tsdown'\n\nexport default defineConfig({\n entry: ['./src/index.ts'],\n platform: 'node',\n outDir: 'dist',\n clean: true,\n sourcemap: true,\n})\n`\n}\n\nexport function tsconfigTemplate(): string {\n return `${JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n paths: {\n '#src/*': ['./src/*'],\n },\n strict: true,\n skipLibCheck: true,\n verbatimModuleSyntax: true,\n isolatedModules: true,\n noEmit: true,\n types: ['node'],\n },\n include: ['src'],\n }, null, 2)}\\n`\n}\n\nexport function gitignoreTemplate(): string {\n return `node_modules\ndist\n.DS_Store\n*.log\n.env\nlocal.db\ndrizzle\n`\n}\n\nexport function contextTemplate(bindings: BootBinding[]): string {\n const imports = bindings.map(\n binding => `import { ${binding.factoryName} } from '${binding.importPath}'`,\n )\n\n const bootBody = bindings.length > 0\n ? bindings.map(binding => ` ${binding.key}: ${binding.factoryName}(),`).join('\\n')\n : ''\n\n const bootBlock = bindings.length > 0\n ? ` boot: () => ({\\n${bootBody}\\n }),`\n : ''\n\n const importBlock = imports.length > 0 ? `${imports.join('\\n')}\\n\\n` : ''\n\n return `${importBlock}import { createContext } from '@taserjs/router'\n\nexport const context = createContext({\n${bootBlock}\n request: () => ({\n requestId: crypto.randomUUID(),\n }),\n})\n`\n}\n\nexport function rootLayoutTemplate(): string {\n return `import { bodyLimit } from '@taserjs/router/body-limit'\nimport { secureHeaders } from '@taserjs/router/secure-headers'\n\nimport { t } from '#src/taser.js'\n\nexport const Middleware = t.middleware('/$')\n .use(secureHeaders())\n .use(bodyLimit({ maxSize: 1_000_000 }))\n`\n}\n\nexport function indexRouteTemplate(): string {\n return `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n\nexport const Route = t.get('/').handler(() => {\n return reply.json({ message: 'Welcome to Taser' })\n})\n`\n}\n\nexport function healthRouteTemplate(ctx: ScaffoldContext): string {\n const lines: string[] = []\n\n if (ctx.logger) {\n lines.push(' ctx.logger.info(\\'health check\\')')\n }\n\n if (ctx.db) {\n lines.push(' // ctx.db is available from context boot')\n }\n\n const body = lines.length > 0 ? `${lines.join('\\n')}\\n` : ''\n const ctxArg = lines.length > 0 ? '(ctx)' : '()'\n\n return `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n\nexport const Route = t.get('/health').handler(${ctxArg} => {\n${body} return reply.json({ ok: true })\n})\n`\n}\n\n/** Minimal placeholder until `taser generate` runs. */\nexport function starterManifestTemplate(): string {\n return `/* eslint-disable */\n// Run \\`pnpm generate\\` (taser generate) to replace this file.\nimport { Middleware as RootSplatLayoutImport } from './routes/$.js'\nimport { Route as RootIndexGetRouteImport } from './routes/index.get.js'\nimport { Route as HealthGetRouteImport } from './routes/health.get.js'\n\nexport const routeManifest = {\n layouts: {\n '/$': {\n middlewares: RootSplatLayoutImport,\n },\n },\n routes: {\n '/': {\n GET: {\n layoutChain: ['/$'],\n route: RootIndexGetRouteImport,\n },\n },\n '/health': {\n GET: {\n layoutChain: ['/$'],\n route: HealthGetRouteImport,\n },\n },\n },\n} as const\n\nexport type RoutePathGen = '/' | '/health'\nexport type LayoutIdGen = '/$'\nexport type LayoutTreeGen = {\n '/$': {\n parent: null\n middlewares: typeof RootSplatLayoutImport\n }\n}\nexport type RouteByPathMethodGen = {\n '/': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof RootIndexGetRouteImport\n }\n }\n '/health': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof HealthGetRouteImport\n }\n }\n}\nexport type RouteManifest = typeof routeManifest\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n RoutePath: RoutePathGen\n LayoutId: LayoutIdGen\n LayoutTree: LayoutTreeGen\n RouteByPathMethod: RouteByPathMethodGen\n }\n}\n`\n}\n"],"mappings":";AAGA,SAAgB,oBAAoB,aAAqB,UAAkC,CAAC,GAAW;CACrG,MAAM,MAAM;EACV,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM;EACN,SAAS,EACP,UAAU,UACZ;EACA,SAAS;GACP,OAAO;GACP,cAAc;GACd,aAAa;GACb,SAAS;GACT,YAAY;GACZ,SAAS;GACT,SAAS;GACT,aAAa;GACb,GAAG;EACL;CACF;CAEA,OAAO,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE;AACzC;AAEA,SAAgB,uBAA+B;CAC7C,OAAO;;;;;;;;;;AAUT;AAEA,SAAgB,mBAA2B;CACzC,OAAO,GAAG,KAAK,UAAU;EACvB,iBAAiB;GACf,QAAQ;GACR,QAAQ;GACR,OAAO,EACL,UAAU,CAAC,SAAS,EACtB;GACA,QAAQ;GACR,cAAc;GACd,sBAAsB;GACtB,iBAAiB;GACjB,QAAQ;GACR,OAAO,CAAC,MAAM;EAChB;EACA,SAAS,CAAC,KAAK;CACjB,GAAG,MAAM,CAAC,EAAE;AACd;AAEA,SAAgB,oBAA4B;CAC1C,OAAO;;;;;;;;AAQT;AAEA,SAAgB,gBAAgB,UAAiC;CAC/D,MAAM,UAAU,SAAS,KACvB,YAAW,YAAY,QAAQ,YAAY,WAAW,QAAQ,WAAW,EAC3E;CAEA,MAAM,WAAW,SAAS,SAAS,IAC/B,SAAS,KAAI,YAAW,OAAO,QAAQ,IAAI,IAAI,QAAQ,YAAY,IAAI,CAAC,CAAC,KAAK,IAAI,IAClF;CAEJ,MAAM,YAAY,SAAS,SAAS,IAChC,qBAAqB,SAAS,WAC9B;CAIJ,OAAO,GAFa,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,IAAI,EAAE,QAAQ,GAEjD;;;EAGtB,UAAU;;;;;;AAMZ;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;;;AAST;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;AAOT;AAEA,SAAgB,oBAAoB,KAA8B;CAChE,MAAM,QAAkB,CAAC;CAEzB,IAAI,IAAI,QACN,MAAM,KAAK,mCAAqC;CAGlD,IAAI,IAAI,IACN,MAAM,KAAK,4CAA4C;CAGzD,MAAM,OAAO,MAAM,SAAS,IAAI,GAAG,MAAM,KAAK,IAAI,EAAE,MAAM;CAG1D,OAAO;;;gDAFQ,MAAM,SAAS,IAAI,UAAU,KAKS;EACrD,KAAK;;;AAGP;;AAGA,SAAgB,0BAAkC;CAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DT"}
1
+ {"version":3,"file":"base.cjs","names":[],"sources":["../../../src/templates/base.ts"],"sourcesContent":["import type { BootBinding } from \"../addons/types.js\";\nimport type { ScaffoldContext } from \"../core/types.js\";\n\nexport function packageJsonTemplate(\n projectName: string,\n scripts: Record<string, string> = {},\n): string {\n const pkg = {\n name: projectName,\n version: \"1.0.0\",\n private: true,\n type: \"module\",\n imports: {\n \"#src/*\": \"./src/*\",\n },\n scripts: {\n dev: \"run-p dev:server dev:taser\",\n \"dev:server\": \"tsx watch src/index.ts\",\n \"dev:taser\": \"taser watch\",\n start: \"tsx src/index.ts\",\n generate: \"taser generate\",\n build: \"taser generate && tsdown\",\n serve: \"node dist/index.mjs\",\n typecheck: \"tsc --noEmit -p tsconfig.json\",\n ...scripts,\n },\n };\n\n return `${JSON.stringify(pkg, null, 2)}\\n`;\n}\n\nexport function tsdownConfigTemplate(): string {\n return `import { defineConfig } from 'tsdown'\n\nexport default defineConfig({\n entry: ['./src/index.ts'],\n platform: 'node',\n outDir: 'dist',\n clean: true,\n sourcemap: true,\n})\n`;\n}\n\nexport function tsconfigTemplate(): string {\n return `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"NodeNext\",\n paths: {\n \"#src/*\": [\"./src/*\"],\n },\n strict: true,\n skipLibCheck: true,\n verbatimModuleSyntax: true,\n isolatedModules: true,\n noEmit: true,\n types: [\"node\"],\n },\n include: [\"src\"],\n },\n null,\n 2,\n )}\\n`;\n}\n\nexport function gitignoreTemplate(): string {\n return `node_modules\ndist\n.DS_Store\n*.log\n.env\nlocal.db\ndrizzle\n`;\n}\n\nexport function contextTemplate(bindings: BootBinding[]): string {\n const imports = bindings.map(\n (binding) => `import { ${binding.factoryName} } from '${binding.importPath}'`,\n );\n\n const bootBody =\n bindings.length > 0\n ? bindings.map((binding) => ` ${binding.key}: ${binding.factoryName}(),`).join(\"\\n\")\n : \"\";\n\n const bootBlock = bindings.length > 0 ? ` boot: () => ({\\n${bootBody}\\n }),` : \"\";\n\n const importBlock = imports.length > 0 ? `${imports.join(\"\\n\")}\\n\\n` : \"\";\n\n return `${importBlock}import { createContext } from '@taserjs/router'\n\nexport const context = createContext({\n${bootBlock}\n request: () => ({\n requestId: crypto.randomUUID(),\n }),\n})\n`;\n}\n\nexport function rootLayoutTemplate(): string {\n return `import { bodyLimit } from '@taserjs/router/body-limit'\nimport { secureHeaders } from '@taserjs/router/secure-headers'\n\nimport { t } from '#src/taser.js'\n\nexport const Middleware = t.middleware('/$')\n .use(secureHeaders())\n .use(bodyLimit({ maxSize: 1_000_000 }))\n`;\n}\n\nexport function indexRouteTemplate(): string {\n return `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n\nexport const Route = t.get('/').handler(() => {\n return reply.json({ message: 'Welcome to Taser' })\n})\n`;\n}\n\nexport function healthRouteTemplate(ctx: ScaffoldContext): string {\n const lines: string[] = [];\n\n if (ctx.logger) {\n lines.push(\" ctx.logger.info('health check')\");\n }\n\n if (ctx.db) {\n lines.push(\" // ctx.db is available from context boot\");\n }\n\n const body = lines.length > 0 ? `${lines.join(\"\\n\")}\\n` : \"\";\n const ctxArg = lines.length > 0 ? \"(ctx)\" : \"()\";\n\n return `import { reply } from '@taserjs/router'\nimport { t } from '#src/taser.js'\n\nexport const Route = t.get('/health').handler(${ctxArg} => {\n${body} return reply.json({ ok: true })\n})\n`;\n}\n\n/** Minimal placeholder until `taser generate` runs. */\nexport function starterManifestTemplate(): string {\n return `/* eslint-disable */\n// Run \\`pnpm generate\\` (taser generate) to replace this file.\nimport { Middleware as RootSplatLayoutImport } from './routes/$.js'\nimport { Route as RootIndexGetRouteImport } from './routes/index.get.js'\nimport { Route as HealthGetRouteImport } from './routes/health.get.js'\n\nexport const routeManifest = {\n layouts: {\n '/$': {\n middlewares: RootSplatLayoutImport,\n },\n },\n routes: {\n '/': {\n GET: {\n layoutChain: ['/$'],\n route: RootIndexGetRouteImport,\n },\n },\n '/health': {\n GET: {\n layoutChain: ['/$'],\n route: HealthGetRouteImport,\n },\n },\n },\n} as const\n\nexport type RoutePathGen = '/' | '/health'\nexport type LayoutIdGen = '/$'\nexport type LayoutTreeGen = {\n '/$': {\n parent: null\n middlewares: typeof RootSplatLayoutImport\n }\n}\nexport type RouteByPathMethodGen = {\n '/': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof RootIndexGetRouteImport\n }\n }\n '/health': {\n GET: {\n parent: '/$'\n layoutChain: ['/$']\n route: typeof HealthGetRouteImport\n }\n }\n}\nexport type RouteManifest = typeof routeManifest\n\ndeclare module '@taserjs/router' {\n interface RouterRegister {\n RoutePath: RoutePathGen\n LayoutId: LayoutIdGen\n LayoutTree: LayoutTreeGen\n RouteByPathMethod: RouteByPathMethodGen\n }\n}\n`;\n}\n"],"mappings":";AAGA,SAAgB,oBACd,aACA,UAAkC,CAAC,GAC3B;CACR,MAAM,MAAM;EACV,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM;EACN,SAAS,EACP,UAAU,UACZ;EACA,SAAS;GACP,KAAK;GACL,cAAc;GACd,aAAa;GACb,OAAO;GACP,UAAU;GACV,OAAO;GACP,OAAO;GACP,WAAW;GACX,GAAG;EACL;CACF;CAEA,OAAO,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE;AACzC;AAEA,SAAgB,uBAA+B;CAC7C,OAAO;;;;;;;;;;AAUT;AAEA,SAAgB,mBAA2B;CACzC,OAAO,GAAG,KAAK,UACb;EACE,iBAAiB;GACf,QAAQ;GACR,QAAQ;GACR,OAAO,EACL,UAAU,CAAC,SAAS,EACtB;GACA,QAAQ;GACR,cAAc;GACd,sBAAsB;GACtB,iBAAiB;GACjB,QAAQ;GACR,OAAO,CAAC,MAAM;EAChB;EACA,SAAS,CAAC,KAAK;CACjB,GACA,MACA,CACF,EAAE;AACJ;AAEA,SAAgB,oBAA4B;CAC1C,OAAO;;;;;;;;AAQT;AAEA,SAAgB,gBAAgB,UAAiC;CAC/D,MAAM,UAAU,SAAS,KACtB,YAAY,YAAY,QAAQ,YAAY,WAAW,QAAQ,WAAW,EAC7E;CAEA,MAAM,WACJ,SAAS,SAAS,IACd,SAAS,KAAK,YAAY,OAAO,QAAQ,IAAI,IAAI,QAAQ,YAAY,IAAI,CAAC,CAAC,KAAK,IAAI,IACpF;CAEN,MAAM,YAAY,SAAS,SAAS,IAAI,qBAAqB,SAAS,WAAW;CAIjF,OAAO,GAFa,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,IAAI,EAAE,QAAQ,GAEjD;;;EAGtB,UAAU;;;;;;AAMZ;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;;;AAST;AAEA,SAAgB,qBAA6B;CAC3C,OAAO;;;;;;;AAOT;AAEA,SAAgB,oBAAoB,KAA8B;CAChE,MAAM,QAAkB,CAAC;CAEzB,IAAI,IAAI,QACN,MAAM,KAAK,mCAAmC;CAGhD,IAAI,IAAI,IACN,MAAM,KAAK,4CAA4C;CAGzD,MAAM,OAAO,MAAM,SAAS,IAAI,GAAG,MAAM,KAAK,IAAI,EAAE,MAAM;CAG1D,OAAO;;;gDAFQ,MAAM,SAAS,IAAI,UAAU,KAKS;EACrD,KAAK;;;AAGP;;AAGA,SAAgB,0BAAkC;CAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DT"}
@@ -1 +1 @@
1
- export type { Framework, DbOdm, DbDriver, LoggerId, ScaffoldOptions, ScaffoldResult, PackageGroups, } from './core/types.js';
1
+ export type { DbDriver, DbOdm, LoggerId, PackageGroups, ProjectType, ScaffoldOptions, ScaffoldResult, ValidatorId, } from './core/types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/arktype/index.ts"],"sourcesContent":["import { ValidatorAddon } from '../validators.js'\n\nexport const arktypeAddon = ValidatorAddon('arktype')\n"],"mappings":";;AAEA,IAAa,eAAe,eAAe,SAAS"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/arktype/index.ts"],"sourcesContent":["import { ValidatorAddon } from \"../validators.js\";\n\nexport const arktypeAddon = ValidatorAddon(\"arktype\");\n"],"mappings":";;AAEA,IAAa,eAAe,eAAe,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/drizzle/index.ts"],"sourcesContent":["import type { AddonDefinition } from '../types.js'\nimport type { DbDriver } from '../../core/types.js'\n\nfunction schemaSource(driver: DbDriver): string {\n switch (driver) {\n case 'postgres':\n return `import { pgTable, serial, text } from 'drizzle-orm/pg-core'\n\nexport const users = pgTable('users', {\n id: serial('id').primaryKey(),\n email: text('email').notNull(),\n})\n`\n case 'mysql':\n return `import { mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core'\n\nexport const users = mysqlTable('users', {\n id: serial('id').primaryKey(),\n email: varchar('email', { length: 255 }).notNull(),\n})\n`\n case 'sqlite':\n default:\n return `import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core'\n\nexport const users = sqliteTable('users', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n email: text('email').notNull(),\n})\n`\n }\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case 'postgres':\n return `import { drizzle } from 'drizzle-orm/node-postgres'\nimport pg from 'pg'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const pool = new pg.Pool({\n connectionString: process.env.DATABASE_URL,\n })\n return drizzle(pool, { schema })\n}\n`\n case 'mysql':\n return `import { drizzle } from 'drizzle-orm/mysql2'\nimport mysql from 'mysql2/promise'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const pool = mysql.createPool(process.env.DATABASE_URL ?? '')\n return drizzle(pool, { schema, mode: 'default' })\n}\n`\n case 'sqlite':\n default:\n return `import Database from 'better-sqlite3'\nimport { drizzle } from 'drizzle-orm/better-sqlite3'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const filePath = (process.env.DATABASE_URL ?? 'file:./local.db').replace(/^file:/, '')\n const client = new Database(filePath)\n return drizzle(client, { schema })\n}\n`\n }\n}\n\nfunction drizzleConfigSource(driver: DbDriver): string {\n const dialect = driver === 'postgres' ? 'postgresql' : driver === 'mysql' ? 'mysql' : 'sqlite'\n return `import { defineConfig } from 'drizzle-kit'\n\nexport default defineConfig({\n schema: './src/db/schema.ts',\n out: './drizzle',\n dialect: '${dialect}',\n dbCredentials: {\n url: process.env.DATABASE_URL ?? '',\n },\n})\n`\n}\n\nfunction envExample(driver: DbDriver): string {\n switch (driver) {\n case 'postgres':\n return 'DATABASE_URL=postgresql://user:password@localhost:5432/mydb\\n'\n case 'mysql':\n return 'DATABASE_URL=mysql://user:password@localhost:3306/mydb\\n'\n case 'sqlite':\n default:\n return 'DATABASE_URL=file:./local.db\\n'\n }\n}\n\nfunction driverPackages(driver: DbDriver): string[] {\n switch (driver) {\n case 'postgres':\n return ['pg']\n case 'mysql':\n return ['mysql2']\n case 'sqlite':\n default:\n return ['better-sqlite3']\n }\n}\n\nfunction driverDevPackages(driver: DbDriver): string[] {\n switch (driver) {\n case 'postgres':\n return ['@types/pg']\n case 'sqlite':\n return ['@types/better-sqlite3']\n case 'mysql':\n default:\n return []\n }\n}\n\nexport const drizzleAddon: AddonDefinition = {\n id: 'drizzle',\n category: 'database',\n dependencies(ctx) {\n const driver = ctx.driver ?? 'sqlite'\n return ['drizzle-orm', ...driverPackages(driver)]\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? 'sqlite'\n return ['drizzle-kit', ...driverDevPackages(driver)]\n },\n scripts() {\n return {\n 'db:generate': 'drizzle-kit generate',\n 'db:push': 'drizzle-kit push',\n }\n },\n bootBinding() {\n return {\n key: 'db',\n importPath: './db/index.js',\n factoryName: 'createDb',\n }\n },\n async apply(ctx, write) {\n const driver = ctx.driver ?? 'sqlite'\n await write('src/db/schema.ts', schemaSource(driver))\n await write('src/db/index.ts', dbIndexSource(driver))\n await write('drizzle.config.ts', drizzleConfigSource(driver))\n await write('.env.example', envExample(driver))\n },\n}\n"],"mappings":";AAGA,SAAS,aAAa,QAA0B;CAC9C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;EAOT,KAAK,SACH,OAAO;;;;;;;EAQT,SACE,OAAO;;;;;;;CAOX;AACF;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;;EAYT,KAAK,SACH,OAAO;;;;;;;;;;EAWT,SACE,OAAO;;;;;;;;;;;CAWX;AACF;AAEA,SAAS,oBAAoB,QAA0B;CAErD,OAAO;;;;;cADS,WAAW,aAAa,eAAe,WAAW,UAAU,UAAU,SAMlE;;;;;;AAMtB;AAEA,SAAS,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,eAAe,QAA4B;CAClD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,IAAI;EACd,KAAK,SACH,OAAO,CAAC,QAAQ;EAElB,SACE,OAAO,CAAC,gBAAgB;CAC5B;AACF;AAEA,SAAS,kBAAkB,QAA4B;CACrD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,WAAW;EACrB,KAAK,UACH,OAAO,CAAC,uBAAuB;EAEjC,SACE,OAAO,CAAC;CACZ;AACF;AAEA,IAAa,eAAgC;CAC3C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,eAAe,GAAG,eADX,IAAI,UAAU,QACkB,CAAC;CAClD;CACA,gBAAgB,KAAK;EAEnB,OAAO,CAAC,eAAe,GAAG,kBADX,IAAI,UAAU,QACqB,CAAC;CACrD;CACA,UAAU;EACR,OAAO;GACL,eAAe;GACf,WAAW;EACb;CACF;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,KAAK,OAAO;EACtB,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,MAAM,oBAAoB,aAAa,MAAM,CAAC;EACpD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,qBAAqB,oBAAoB,MAAM,CAAC;EAC5D,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/drizzle/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\nimport type { DbDriver } from \"../../core/types.js\";\n\nfunction schemaSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { pgTable, serial, text } from 'drizzle-orm/pg-core'\n\nexport const users = pgTable('users', {\n id: serial('id').primaryKey(),\n email: text('email').notNull(),\n})\n`;\n case \"mysql\":\n return `import { mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core'\n\nexport const users = mysqlTable('users', {\n id: serial('id').primaryKey(),\n email: varchar('email', { length: 255 }).notNull(),\n})\n`;\n case \"sqlite\":\n default:\n return `import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core'\n\nexport const users = sqliteTable('users', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n email: text('email').notNull(),\n})\n`;\n }\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { drizzle } from 'drizzle-orm/node-postgres'\nimport pg from 'pg'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const pool = new pg.Pool({\n connectionString: process.env.DATABASE_URL,\n })\n return drizzle(pool, { schema })\n}\n`;\n case \"mysql\":\n return `import { drizzle } from 'drizzle-orm/mysql2'\nimport mysql from 'mysql2/promise'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const pool = mysql.createPool(process.env.DATABASE_URL ?? '')\n return drizzle(pool, { schema, mode: 'default' })\n}\n`;\n case \"sqlite\":\n default:\n return `import Database from 'better-sqlite3'\nimport { drizzle } from 'drizzle-orm/better-sqlite3'\n\nimport * as schema from './schema.js'\n\nexport function createDb() {\n const filePath = (process.env.DATABASE_URL ?? 'file:./local.db').replace(/^file:/, '')\n const client = new Database(filePath)\n return drizzle(client, { schema })\n}\n`;\n }\n}\n\nfunction drizzleConfigSource(driver: DbDriver): string {\n const dialect = driver === \"postgres\" ? \"postgresql\" : driver === \"mysql\" ? \"mysql\" : \"sqlite\";\n return `import { defineConfig } from 'drizzle-kit'\n\nexport default defineConfig({\n schema: './src/db/schema.ts',\n out: './drizzle',\n dialect: '${dialect}',\n dbCredentials: {\n url: process.env.DATABASE_URL ?? '',\n },\n})\n`;\n}\n\nfunction envExample(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return \"DATABASE_URL=postgresql://user:password@localhost:5432/mydb\\n\";\n case \"mysql\":\n return \"DATABASE_URL=mysql://user:password@localhost:3306/mydb\\n\";\n case \"sqlite\":\n default:\n return \"DATABASE_URL=file:./local.db\\n\";\n }\n}\n\nfunction driverPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"pg\"];\n case \"mysql\":\n return [\"mysql2\"];\n case \"sqlite\":\n default:\n return [\"better-sqlite3\"];\n }\n}\n\nfunction driverDevPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"@types/pg\"];\n case \"sqlite\":\n return [\"@types/better-sqlite3\"];\n case \"mysql\":\n default:\n return [];\n }\n}\n\nexport const drizzleAddon: AddonDefinition = {\n id: \"drizzle\",\n category: \"database\",\n dependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"drizzle-orm\", ...driverPackages(driver)];\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"drizzle-kit\", ...driverDevPackages(driver)];\n },\n scripts() {\n return {\n \"db:generate\": \"drizzle-kit generate\",\n \"db:push\": \"drizzle-kit push\",\n };\n },\n bootBinding() {\n return {\n key: \"db\",\n importPath: \"./db/index.js\",\n factoryName: \"createDb\",\n };\n },\n async apply(ctx, write) {\n const driver = ctx.driver ?? \"sqlite\";\n await write(\"src/db/schema.ts\", schemaSource(driver));\n await write(\"src/db/index.ts\", dbIndexSource(driver));\n await write(\"drizzle.config.ts\", drizzleConfigSource(driver));\n await write(\".env.example\", envExample(driver));\n },\n};\n"],"mappings":";AAGA,SAAS,aAAa,QAA0B;CAC9C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;EAOT,KAAK,SACH,OAAO;;;;;;;EAQT,SACE,OAAO;;;;;;;CAOX;AACF;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;;EAYT,KAAK,SACH,OAAO;;;;;;;;;;EAWT,SACE,OAAO;;;;;;;;;;;CAWX;AACF;AAEA,SAAS,oBAAoB,QAA0B;CAErD,OAAO;;;;;cADS,WAAW,aAAa,eAAe,WAAW,UAAU,UAAU,SAMlE;;;;;;AAMtB;AAEA,SAAS,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,eAAe,QAA4B;CAClD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,IAAI;EACd,KAAK,SACH,OAAO,CAAC,QAAQ;EAElB,SACE,OAAO,CAAC,gBAAgB;CAC5B;AACF;AAEA,SAAS,kBAAkB,QAA4B;CACrD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,WAAW;EACrB,KAAK,UACH,OAAO,CAAC,uBAAuB;EAEjC,SACE,OAAO,CAAC;CACZ;AACF;AAEA,IAAa,eAAgC;CAC3C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,eAAe,GAAG,eADX,IAAI,UAAU,QACkB,CAAC;CAClD;CACA,gBAAgB,KAAK;EAEnB,OAAO,CAAC,eAAe,GAAG,kBADX,IAAI,UAAU,QACqB,CAAC;CACrD;CACA,UAAU;EACR,OAAO;GACL,eAAe;GACf,WAAW;EACb;CACF;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,KAAK,OAAO;EACtB,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,MAAM,oBAAoB,aAAa,MAAM,CAAC;EACpD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,qBAAqB,oBAAoB,MAAM,CAAC;EAC5D,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/kysely/index.ts"],"sourcesContent":["import type { AddonDefinition } from '../types.js'\nimport type { DbDriver } from '../../core/types.js'\n\nfunction schemaTypesSource(): string {\n return `export interface UserTable {\n id: number\n email: string\n}\n\nexport interface DB {\n users: UserTable\n}\n`\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case 'postgres':\n return `import { Kysely, PostgresDialect } from 'kysely'\nimport pg from 'pg'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const pool = new pg.Pool({\n connectionString: process.env.DATABASE_URL,\n })\n return new Kysely<DB>({\n dialect: new PostgresDialect({ pool }),\n })\n}\n`\n case 'mysql':\n return `import { Kysely, MysqlDialect } from 'kysely'\nimport { createPool } from 'mysql2'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const pool = createPool(process.env.DATABASE_URL ?? '')\n return new Kysely<DB>({\n dialect: new MysqlDialect({ pool }),\n })\n}\n`\n case 'sqlite':\n default:\n return `import Database from 'better-sqlite3'\nimport { Kysely, SqliteDialect } from 'kysely'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const filePath = (process.env.DATABASE_URL ?? 'file:./local.db').replace(/^file:/, '')\n const database = new Database(filePath)\n return new Kysely<DB>({\n dialect: new SqliteDialect({ database }),\n })\n}\n`\n }\n}\n\nfunction driverPackages(driver: DbDriver): string[] {\n switch (driver) {\n case 'postgres':\n return ['pg']\n case 'mysql':\n return ['mysql2']\n case 'sqlite':\n default:\n return ['better-sqlite3']\n }\n}\n\nfunction driverDevPackages(driver: DbDriver): string[] {\n switch (driver) {\n case 'postgres':\n return ['@types/pg']\n case 'sqlite':\n return ['@types/better-sqlite3']\n case 'mysql':\n default:\n return []\n }\n}\n\nfunction envExample(driver: DbDriver): string {\n switch (driver) {\n case 'postgres':\n return 'DATABASE_URL=postgresql://user:password@localhost:5432/mydb\\n'\n case 'mysql':\n return 'DATABASE_URL=mysql://user:password@localhost:3306/mydb\\n'\n case 'sqlite':\n default:\n return 'DATABASE_URL=file:./local.db\\n'\n }\n}\n\nexport const kyselyAddon: AddonDefinition = {\n id: 'kysely',\n category: 'database',\n dependencies(ctx) {\n const driver = ctx.driver ?? 'sqlite'\n return ['kysely', ...driverPackages(driver)]\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? 'sqlite'\n return driverDevPackages(driver)\n },\n bootBinding() {\n return {\n key: 'db',\n importPath: './db/index.js',\n factoryName: 'createDb',\n }\n },\n async apply(ctx, write) {\n const driver = ctx.driver ?? 'sqlite'\n await write('src/db/schema.ts', schemaTypesSource())\n await write('src/db/index.ts', dbIndexSource(driver))\n await write('.env.example', envExample(driver))\n },\n}\n"],"mappings":";AAGA,SAAS,oBAA4B;CACnC,OAAO;;;;;;;;;AAST;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;;;;EAcT,KAAK,SACH,OAAO;;;;;;;;;;;;EAaT,SACE,OAAO;;;;;;;;;;;;;CAaX;AACF;AAEA,SAAS,eAAe,QAA4B;CAClD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,IAAI;EACd,KAAK,SACH,OAAO,CAAC,QAAQ;EAElB,SACE,OAAO,CAAC,gBAAgB;CAC5B;AACF;AAEA,SAAS,kBAAkB,QAA4B;CACrD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,WAAW;EACrB,KAAK,UACH,OAAO,CAAC,uBAAuB;EAEjC,SACE,OAAO,CAAC;CACZ;AACF;AAEA,SAAS,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,IAAa,cAA+B;CAC1C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,UAAU,GAAG,eADN,IAAI,UAAU,QACa,CAAC;CAC7C;CACA,gBAAgB,KAAK;EAEnB,OAAO,kBADQ,IAAI,UAAU,QACE;CACjC;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,KAAK,OAAO;EACtB,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,MAAM,oBAAoB,kBAAkB,CAAC;EACnD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/kysely/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\nimport type { DbDriver } from \"../../core/types.js\";\n\nfunction schemaTypesSource(): string {\n return `export interface UserTable {\n id: number\n email: string\n}\n\nexport interface DB {\n users: UserTable\n}\n`;\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { Kysely, PostgresDialect } from 'kysely'\nimport pg from 'pg'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const pool = new pg.Pool({\n connectionString: process.env.DATABASE_URL,\n })\n return new Kysely<DB>({\n dialect: new PostgresDialect({ pool }),\n })\n}\n`;\n case \"mysql\":\n return `import { Kysely, MysqlDialect } from 'kysely'\nimport { createPool } from 'mysql2'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const pool = createPool(process.env.DATABASE_URL ?? '')\n return new Kysely<DB>({\n dialect: new MysqlDialect({ pool }),\n })\n}\n`;\n case \"sqlite\":\n default:\n return `import Database from 'better-sqlite3'\nimport { Kysely, SqliteDialect } from 'kysely'\n\nimport type { DB } from './schema.js'\n\nexport function createDb() {\n const filePath = (process.env.DATABASE_URL ?? 'file:./local.db').replace(/^file:/, '')\n const database = new Database(filePath)\n return new Kysely<DB>({\n dialect: new SqliteDialect({ database }),\n })\n}\n`;\n }\n}\n\nfunction driverPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"pg\"];\n case \"mysql\":\n return [\"mysql2\"];\n case \"sqlite\":\n default:\n return [\"better-sqlite3\"];\n }\n}\n\nfunction driverDevPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"@types/pg\"];\n case \"sqlite\":\n return [\"@types/better-sqlite3\"];\n case \"mysql\":\n default:\n return [];\n }\n}\n\nfunction envExample(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return \"DATABASE_URL=postgresql://user:password@localhost:5432/mydb\\n\";\n case \"mysql\":\n return \"DATABASE_URL=mysql://user:password@localhost:3306/mydb\\n\";\n case \"sqlite\":\n default:\n return \"DATABASE_URL=file:./local.db\\n\";\n }\n}\n\nexport const kyselyAddon: AddonDefinition = {\n id: \"kysely\",\n category: \"database\",\n dependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"kysely\", ...driverPackages(driver)];\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return driverDevPackages(driver);\n },\n bootBinding() {\n return {\n key: \"db\",\n importPath: \"./db/index.js\",\n factoryName: \"createDb\",\n };\n },\n async apply(ctx, write) {\n const driver = ctx.driver ?? \"sqlite\";\n await write(\"src/db/schema.ts\", schemaTypesSource());\n await write(\"src/db/index.ts\", dbIndexSource(driver));\n await write(\".env.example\", envExample(driver));\n },\n};\n"],"mappings":";AAGA,SAAS,oBAA4B;CACnC,OAAO;;;;;;;;;AAST;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;;;;EAcT,KAAK,SACH,OAAO;;;;;;;;;;;;EAaT,SACE,OAAO;;;;;;;;;;;;;CAaX;AACF;AAEA,SAAS,eAAe,QAA4B;CAClD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,IAAI;EACd,KAAK,SACH,OAAO,CAAC,QAAQ;EAElB,SACE,OAAO,CAAC,gBAAgB;CAC5B;AACF;AAEA,SAAS,kBAAkB,QAA4B;CACrD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,WAAW;EACrB,KAAK,UACH,OAAO,CAAC,uBAAuB;EAEjC,SACE,OAAO,CAAC;CACZ;AACF;AAEA,SAAS,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,IAAa,cAA+B;CAC1C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,UAAU,GAAG,eADN,IAAI,UAAU,QACa,CAAC;CAC7C;CACA,gBAAgB,KAAK;EAEnB,OAAO,kBADQ,IAAI,UAAU,QACE;CACjC;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,KAAK,OAAO;EACtB,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,MAAM,oBAAoB,kBAAkB,CAAC;EACnD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/pino/index.ts"],"sourcesContent":["import type { AddonDefinition } from '../types.js'\n\nexport const pinoAddon: AddonDefinition = {\n id: 'pino',\n category: 'logger',\n dependencies() {\n return ['pino']\n },\n devDependencies() {\n return []\n },\n bootBinding() {\n return {\n key: 'logger',\n importPath: './logger.js',\n factoryName: 'createLogger',\n }\n },\n async apply(_ctx, write) {\n await write(\n 'src/logger.ts',\n `import pino from 'pino'\n\nexport function createLogger() {\n return pino({ level: process.env.LOG_LEVEL ?? 'info' })\n}\n`,\n )\n },\n}\n"],"mappings":";AAEA,IAAa,YAA6B;CACxC,IAAI;CACJ,UAAU;CACV,eAAe;EACb,OAAO,CAAC,MAAM;CAChB;CACA,kBAAkB;EAChB,OAAO,CAAC;CACV;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,MAAM,OAAO;EACvB,MAAM,MACJ,iBACA;;;;;CAMF;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/pino/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\n\nexport const pinoAddon: AddonDefinition = {\n id: \"pino\",\n category: \"logger\",\n dependencies() {\n return [\"pino\"];\n },\n devDependencies() {\n return [];\n },\n bootBinding() {\n return {\n key: \"logger\",\n importPath: \"./logger.js\",\n factoryName: \"createLogger\",\n };\n },\n async apply(_ctx, write) {\n await write(\n \"src/logger.ts\",\n `import pino from 'pino'\n\nexport function createLogger() {\n return pino({ level: process.env.LOG_LEVEL ?? 'info' })\n}\n`,\n );\n },\n};\n"],"mappings":";AAEA,IAAa,YAA6B;CACxC,IAAI;CACJ,UAAU;CACV,eAAe;EACb,OAAO,CAAC,MAAM;CAChB;CACA,kBAAkB;EAChB,OAAO,CAAC;CACV;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,MAAM,OAAO;EACvB,MAAM,MACJ,iBACA;;;;;CAMF;CACF;AACF"}
@@ -13,14 +13,91 @@ function envExample(driver) {
13
13
  default: return "DATABASE_URL=file:./local.db\n";
14
14
  }
15
15
  }
16
+ function driverPackages(driver) {
17
+ switch (driver) {
18
+ case "postgres": return ["@prisma/adapter-pg", "pg"];
19
+ case "mysql": return ["@prisma/adapter-mariadb", "mariadb"];
20
+ default: return ["@prisma/adapter-better-sqlite3", "better-sqlite3"];
21
+ }
22
+ }
23
+ function driverDevPackages(driver) {
24
+ switch (driver) {
25
+ case "postgres": return ["@types/pg"];
26
+ case "sqlite": return ["@types/better-sqlite3"];
27
+ default: return [];
28
+ }
29
+ }
30
+ function dbIndexSource(driver) {
31
+ switch (driver) {
32
+ case "postgres": return `import { PrismaPg } from '@prisma/adapter-pg'
33
+
34
+ import { PrismaClient } from './prisma/client.js'
35
+
36
+ export function createDb() {
37
+ const adapter = new PrismaPg({
38
+ connectionString: process.env.DATABASE_URL,
39
+ })
40
+ return new PrismaClient({ adapter })
41
+ }
42
+ `;
43
+ case "mysql": return `import { PrismaMariaDb } from '@prisma/adapter-mariadb'
44
+
45
+ import { PrismaClient } from './prisma/client.js'
46
+
47
+ export function createDb() {
48
+ const adapter = new PrismaMariaDb(process.env.DATABASE_URL ?? 'mariadb://root:@localhost:3306/mydb')
49
+ return new PrismaClient({ adapter })
50
+ }
51
+ `;
52
+ default: return `import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'
53
+
54
+ import { PrismaClient } from './prisma/client.js'
55
+
56
+ export function createDb() {
57
+ const adapter = new PrismaBetterSqlite3({
58
+ url: process.env.DATABASE_URL ?? 'file:./local.db',
59
+ })
60
+ return new PrismaClient({ adapter })
61
+ }
62
+ `;
63
+ }
64
+ }
65
+ function prismaConfigSource() {
66
+ return `import 'dotenv/config'
67
+ import { defineConfig, env } from 'prisma/config'
68
+
69
+ export default defineConfig({
70
+ schema: 'prisma/schema.prisma',
71
+ datasource: {
72
+ url: env('DATABASE_URL'),
73
+ },
74
+ })
75
+ `;
76
+ }
77
+ function schemaSource(driver) {
78
+ return `generator client {
79
+ provider = "prisma-client"
80
+ output = "../src/db/prisma"
81
+ }
82
+
83
+ datasource db {
84
+ provider = "${prismaProvider(driver)}"
85
+ }
86
+
87
+ model User {
88
+ id Int @id @default(autoincrement())
89
+ email String
90
+ }
91
+ `;
92
+ }
16
93
  var prismaAddon = {
17
94
  id: "prisma",
18
95
  category: "database",
19
- dependencies() {
20
- return ["@prisma/client"];
96
+ dependencies(ctx) {
97
+ return ["@prisma/client", ...driverPackages(ctx.driver ?? "sqlite")];
21
98
  },
22
- devDependencies() {
23
- return ["prisma"];
99
+ devDependencies(ctx) {
100
+ return ["prisma", ...driverDevPackages(ctx.driver ?? "sqlite")];
24
101
  },
25
102
  scripts() {
26
103
  return {
@@ -37,26 +114,9 @@ var prismaAddon = {
37
114
  },
38
115
  async apply(ctx, write) {
39
116
  const driver = ctx.driver ?? "sqlite";
40
- await write("prisma/schema.prisma", `generator client {
41
- provider = "prisma-client-js"
42
- }
43
-
44
- datasource db {
45
- provider = "${prismaProvider(driver)}"
46
- url = env("DATABASE_URL")
47
- }
48
-
49
- model User {
50
- id Int @id @default(autoincrement())
51
- email String
52
- }
53
- `);
54
- await write("src/db/index.ts", `import { PrismaClient } from '@prisma/client'
55
-
56
- export function createDb() {
57
- return new PrismaClient()
58
- }
59
- `);
117
+ await write("prisma.config.ts", prismaConfigSource());
118
+ await write("prisma/schema.prisma", schemaSource(driver));
119
+ await write("src/db/index.ts", dbIndexSource(driver));
60
120
  await write(".env.example", envExample(driver));
61
121
  }
62
122
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/prisma/index.ts"],"sourcesContent":["import type { AddonDefinition } from '../types.js'\nimport type { DbDriver } from '../../core/types.js'\n\nfunction prismaProvider(driver: DbDriver): string {\n switch (driver) {\n case 'postgres':\n return 'postgresql'\n case 'mysql':\n return 'mysql'\n case 'sqlite':\n default:\n return 'sqlite'\n }\n}\n\nfunction envExample(driver: DbDriver): string {\n switch (driver) {\n case 'postgres':\n return 'DATABASE_URL=postgresql://user:password@localhost:5432/mydb\\n'\n case 'mysql':\n return 'DATABASE_URL=mysql://user:password@localhost:3306/mydb\\n'\n case 'sqlite':\n default:\n return 'DATABASE_URL=file:./local.db\\n'\n }\n}\n\nexport const prismaAddon: AddonDefinition = {\n id: 'prisma',\n category: 'database',\n dependencies() {\n return ['@prisma/client']\n },\n devDependencies() {\n return ['prisma']\n },\n scripts() {\n return {\n 'db:generate': 'prisma generate',\n 'db:push': 'prisma db push',\n }\n },\n bootBinding() {\n return {\n key: 'db',\n importPath: './db/index.js',\n factoryName: 'createDb',\n }\n },\n async apply(ctx, write) {\n const driver = ctx.driver ?? 'sqlite'\n const provider = prismaProvider(driver)\n await write(\n 'prisma/schema.prisma',\n `generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"${provider}\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n email String\n}\n`,\n )\n await write(\n 'src/db/index.ts',\n `import { PrismaClient } from '@prisma/client'\n\nexport function createDb() {\n return new PrismaClient()\n}\n`,\n )\n await write('.env.example', envExample(driver))\n },\n}\n"],"mappings":";AAGA,SAAS,eAAe,QAA0B;CAChD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,IAAa,cAA+B;CAC1C,IAAI;CACJ,UAAU;CACV,eAAe;EACb,OAAO,CAAC,gBAAgB;CAC1B;CACA,kBAAkB;EAChB,OAAO,CAAC,QAAQ;CAClB;CACA,UAAU;EACR,OAAO;GACL,eAAe;GACf,WAAW;EACb;CACF;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,KAAK,OAAO;EACtB,MAAM,SAAS,IAAI,UAAU;EAE7B,MAAM,MACJ,wBACA;;;;;gBAHe,eAAe,MAQpB,EAAS;;;;;;;;CASrB;EACA,MAAM,MACJ,mBACA;;;;;CAMF;EACA,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/addons/prisma/index.ts"],"sourcesContent":["import type { AddonDefinition } from \"../types.js\";\nimport type { DbDriver } from \"../../core/types.js\";\n\nfunction prismaProvider(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return \"postgresql\";\n case \"mysql\":\n return \"mysql\";\n case \"sqlite\":\n default:\n return \"sqlite\";\n }\n}\n\nfunction envExample(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return \"DATABASE_URL=postgresql://user:password@localhost:5432/mydb\\n\";\n case \"mysql\":\n return \"DATABASE_URL=mysql://user:password@localhost:3306/mydb\\n\";\n case \"sqlite\":\n default:\n return \"DATABASE_URL=file:./local.db\\n\";\n }\n}\n\nfunction driverPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"@prisma/adapter-pg\", \"pg\"];\n case \"mysql\":\n return [\"@prisma/adapter-mariadb\", \"mariadb\"];\n case \"sqlite\":\n default:\n return [\"@prisma/adapter-better-sqlite3\", \"better-sqlite3\"];\n }\n}\n\nfunction driverDevPackages(driver: DbDriver): string[] {\n switch (driver) {\n case \"postgres\":\n return [\"@types/pg\"];\n case \"sqlite\":\n return [\"@types/better-sqlite3\"];\n case \"mysql\":\n default:\n return [];\n }\n}\n\nfunction dbIndexSource(driver: DbDriver): string {\n switch (driver) {\n case \"postgres\":\n return `import { PrismaPg } from '@prisma/adapter-pg'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaPg({\n connectionString: process.env.DATABASE_URL,\n })\n return new PrismaClient({ adapter })\n}\n`;\n case \"mysql\":\n return `import { PrismaMariaDb } from '@prisma/adapter-mariadb'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaMariaDb(process.env.DATABASE_URL ?? 'mariadb://root:@localhost:3306/mydb')\n return new PrismaClient({ adapter })\n}\n`;\n case \"sqlite\":\n default:\n return `import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'\n\nimport { PrismaClient } from './prisma/client.js'\n\nexport function createDb() {\n const adapter = new PrismaBetterSqlite3({\n url: process.env.DATABASE_URL ?? 'file:./local.db',\n })\n return new PrismaClient({ adapter })\n}\n`;\n }\n}\n\nfunction prismaConfigSource(): string {\n return `import 'dotenv/config'\nimport { defineConfig, env } from 'prisma/config'\n\nexport default defineConfig({\n schema: 'prisma/schema.prisma',\n datasource: {\n url: env('DATABASE_URL'),\n },\n})\n`;\n}\n\nfunction schemaSource(driver: DbDriver): string {\n const provider = prismaProvider(driver);\n return `generator client {\n provider = \"prisma-client\"\n output = \"../src/db/prisma\"\n}\n\ndatasource db {\n provider = \"${provider}\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n email String\n}\n`;\n}\n\nexport const prismaAddon: AddonDefinition = {\n id: \"prisma\",\n category: \"database\",\n dependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"@prisma/client\", ...driverPackages(driver)];\n },\n devDependencies(ctx) {\n const driver = ctx.driver ?? \"sqlite\";\n return [\"prisma\", ...driverDevPackages(driver)];\n },\n scripts() {\n return {\n \"db:generate\": \"prisma generate\",\n \"db:push\": \"prisma db push\",\n };\n },\n bootBinding() {\n return {\n key: \"db\",\n importPath: \"./db/index.js\",\n factoryName: \"createDb\",\n };\n },\n async apply(ctx, write) {\n const driver = ctx.driver ?? \"sqlite\";\n await write(\"prisma.config.ts\", prismaConfigSource());\n await write(\"prisma/schema.prisma\", schemaSource(driver));\n await write(\"src/db/index.ts\", dbIndexSource(driver));\n await write(\".env.example\", envExample(driver));\n },\n};\n"],"mappings":";AAGA,SAAS,eAAe,QAA0B;CAChD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,WAAW,QAA0B;CAC5C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAS,eAAe,QAA4B;CAClD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,sBAAsB,IAAI;EACpC,KAAK,SACH,OAAO,CAAC,2BAA2B,SAAS;EAE9C,SACE,OAAO,CAAC,kCAAkC,gBAAgB;CAC9D;AACF;AAEA,SAAS,kBAAkB,QAA4B;CACrD,QAAQ,QAAR;EACE,KAAK,YACH,OAAO,CAAC,WAAW;EACrB,KAAK,UACH,OAAO,CAAC,uBAAuB;EAEjC,SACE,OAAO,CAAC;CACZ;AACF;AAEA,SAAS,cAAc,QAA0B;CAC/C,QAAQ,QAAR;EACE,KAAK,YACH,OAAO;;;;;;;;;;;EAWT,KAAK,SACH,OAAO;;;;;;;;;EAUT,SACE,OAAO;;;;;;;;;;;CAWX;AACF;AAEA,SAAS,qBAA6B;CACpC,OAAO;;;;;;;;;;AAUT;AAEA,SAAS,aAAa,QAA0B;CAE9C,OAAO;;;;;;gBADU,eAAe,MAOlB,EAAS;;;;;;;;AAQzB;AAEA,IAAa,cAA+B;CAC1C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,kBAAkB,GAAG,eADd,IAAI,UAAU,QACqB,CAAC;CACrD;CACA,gBAAgB,KAAK;EAEnB,OAAO,CAAC,UAAU,GAAG,kBADN,IAAI,UAAU,QACgB,CAAC;CAChD;CACA,UAAU;EACR,OAAO;GACL,eAAe;GACf,WAAW;EACb;CACF;CACA,cAAc;EACZ,OAAO;GACL,KAAK;GACL,YAAY;GACZ,aAAa;EACf;CACF;CACA,MAAM,MAAM,KAAK,OAAO;EACtB,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,MAAM,oBAAoB,mBAAmB,CAAC;EACpD,MAAM,MAAM,wBAAwB,aAAa,MAAM,CAAC;EACxD,MAAM,MAAM,mBAAmB,cAAc,MAAM,CAAC;EACpD,MAAM,MAAM,gBAAgB,WAAW,MAAM,CAAC;CAChD;AACF"}
@@ -6,7 +6,7 @@ import { prismaAddon } from "./prisma/index.js";
6
6
  import { valibotAddon } from "./valibot/index.js";
7
7
  import { winstonAddon } from "./winston/index.js";
8
8
  import { zodAddon } from "./zod/index.js";
9
- import { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, FRAMEWORKS, LOGGERS, VALIDATORS } from "../core/types.js";
9
+ import { DB_DRIVERS, DB_ODMS, DEFAULT_DB_DRIVER, LOGGERS, PROJECT_TYPES, VALIDATORS } from "../core/types.js";
10
10
  //#region src/addons/registry.ts
11
11
  var ALL_ADDONS = [
12
12
  drizzleAddon,
@@ -23,7 +23,7 @@ var LOGGER_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "logger");
23
23
  var VALIDATOR_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "validator");
24
24
  function getCapabilitiesCatalog() {
25
25
  return {
26
- frameworks: [...FRAMEWORKS],
26
+ types: [...PROJECT_TYPES],
27
27
  db: {
28
28
  odms: [...DB_ODMS],
29
29
  drivers: [...DB_DRIVERS],
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../../../src/addons/registry.ts"],"sourcesContent":["import { arktypeAddon } from './arktype/index.js'\nimport { drizzleAddon } from './drizzle/index.js'\nimport { kyselyAddon } from './kysely/index.js'\nimport { pinoAddon } from './pino/index.js'\nimport { prismaAddon } from './prisma/index.js'\nimport { valibotAddon } from './valibot/index.js'\nimport { winstonAddon } from './winston/index.js'\nimport { zodAddon } from './zod/index.js'\nimport type { AddonDefinition } from './types.js'\nimport type { CapabilitiesCatalog, ScaffoldContext } from '../core/types.js'\nimport {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n FRAMEWORKS,\n LOGGERS,\n VALIDATORS,\n} from '../core/types.js'\n\nconst ALL_ADDONS: AddonDefinition[] = [\n drizzleAddon,\n prismaAddon,\n kyselyAddon,\n pinoAddon,\n winstonAddon,\n zodAddon,\n arktypeAddon,\n valibotAddon,\n]\n\nconst DB_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'database')\nconst LOGGER_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'logger')\nconst VALIDATOR_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'validator')\n\nexport function getCapabilitiesCatalog(): CapabilitiesCatalog {\n return {\n frameworks: [...FRAMEWORKS],\n db: {\n odms: [...DB_ODMS],\n drivers: [...DB_DRIVERS],\n defaultDriver: DEFAULT_DB_DRIVER,\n },\n loggers: [...LOGGERS],\n validators: [...VALIDATORS],\n }\n}\n\nexport function resolveAddons(ctx: ScaffoldContext): AddonDefinition[] {\n const selected: AddonDefinition[] = []\n\n if (ctx.db) {\n const dbAddon = DB_ADDONS.find(addon => addon.id === ctx.db)\n if (!dbAddon) {\n throw new Error(`Unknown database addon \"${ctx.db}\"`)\n }\n selected.push(dbAddon)\n }\n\n if (ctx.logger) {\n const loggerAddon = LOGGER_ADDONS.find(addon => addon.id === ctx.logger)\n if (!loggerAddon) {\n throw new Error(`Unknown logger addon \"${ctx.logger}\"`)\n }\n selected.push(loggerAddon)\n }\n\n const dbCount = selected.filter(addon => addon.category === 'database').length\n if (dbCount > 1) {\n throw new Error('Only one database addon can be selected')\n }\n\n const loggerCount = selected.filter(addon => addon.category === 'logger').length\n if (loggerCount > 1) {\n throw new Error('Only one logger addon can be selected')\n }\n\n if (ctx.validator) {\n const validatorAddon = VALIDATOR_ADDONS.find(addon => addon.id === ctx.validator)\n if (!validatorAddon) {\n throw new Error(`Unknown validator addon \"${ctx.validator}\"`)\n }\n selected.push(validatorAddon)\n }\n\n const validatorCount = selected.filter(addon => addon.category === 'validator').length\n if (validatorCount > 1) {\n throw new Error('Only one validator addon can be selected')\n }\n\n return selected\n}\n\nexport function collectBootBindings(ctx: ScaffoldContext) {\n return resolveAddons(ctx)\n .map(addon => addon.bootBinding?.(ctx))\n .filter((v): v is NonNullable<typeof v> => Boolean(v))\n}\n"],"mappings":";;;;;;;;;;AAmBA,IAAM,aAAgC;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,IAAM,YAAY,WAAW,QAAO,UAAS,MAAM,aAAa,UAAU;AAC1E,IAAM,gBAAgB,WAAW,QAAO,UAAS,MAAM,aAAa,QAAQ;AAC5E,IAAM,mBAAmB,WAAW,QAAO,UAAS,MAAM,aAAa,WAAW;AAElF,SAAgB,yBAA8C;CAC5D,OAAO;EACL,YAAY,CAAC,GAAG,UAAU;EAC1B,IAAI;GACF,MAAM,CAAC,GAAG,OAAO;GACjB,SAAS,CAAC,GAAG,UAAU;GACvB,eAAe;EACjB;EACA,SAAS,CAAC,GAAG,OAAO;EACpB,YAAY,CAAC,GAAG,UAAU;CAC5B;AACF;AAEA,SAAgB,cAAc,KAAyC;CACrE,MAAM,WAA8B,CAAC;CAErC,IAAI,IAAI,IAAI;EACV,MAAM,UAAU,UAAU,MAAK,UAAS,MAAM,OAAO,IAAI,EAAE;EAC3D,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,2BAA2B,IAAI,GAAG,EAAE;EAEtD,SAAS,KAAK,OAAO;CACvB;CAEA,IAAI,IAAI,QAAQ;EACd,MAAM,cAAc,cAAc,MAAK,UAAS,MAAM,OAAO,IAAI,MAAM;EACvE,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,yBAAyB,IAAI,OAAO,EAAE;EAExD,SAAS,KAAK,WAAW;CAC3B;CAGA,IADgB,SAAS,QAAO,UAAS,MAAM,aAAa,UAAU,CAAC,CAAC,SAC1D,GACZ,MAAM,IAAI,MAAM,yCAAyC;CAI3D,IADoB,SAAS,QAAO,UAAS,MAAM,aAAa,QAAQ,CAAC,CAAC,SACxD,GAChB,MAAM,IAAI,MAAM,uCAAuC;CAGzD,IAAI,IAAI,WAAW;EACjB,MAAM,iBAAiB,iBAAiB,MAAK,UAAS,MAAM,OAAO,IAAI,SAAS;EAChF,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;EAE9D,SAAS,KAAK,cAAc;CAC9B;CAGA,IADuB,SAAS,QAAO,UAAS,MAAM,aAAa,WAAW,CAAC,CAAC,SAC3D,GACnB,MAAM,IAAI,MAAM,0CAA0C;CAG5D,OAAO;AACT;AAEA,SAAgB,oBAAoB,KAAsB;CACxD,OAAO,cAAc,GAAG,CAAC,CACtB,KAAI,UAAS,MAAM,cAAc,GAAG,CAAC,CAAC,CACtC,QAAQ,MAAkC,QAAQ,CAAC,CAAC;AACzD"}
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../../../src/addons/registry.ts"],"sourcesContent":["import { arktypeAddon } from \"./arktype/index.js\";\nimport { drizzleAddon } from \"./drizzle/index.js\";\nimport { kyselyAddon } from \"./kysely/index.js\";\nimport { pinoAddon } from \"./pino/index.js\";\nimport { prismaAddon } from \"./prisma/index.js\";\nimport { valibotAddon } from \"./valibot/index.js\";\nimport { winstonAddon } from \"./winston/index.js\";\nimport { zodAddon } from \"./zod/index.js\";\nimport type { AddonDefinition } from \"./types.js\";\nimport type { CapabilitiesCatalog, ScaffoldContext } from \"../core/types.js\";\nimport {\n DB_DRIVERS,\n DB_ODMS,\n DEFAULT_DB_DRIVER,\n LOGGERS,\n PROJECT_TYPES,\n VALIDATORS,\n} from \"../core/types.js\";\n\nconst ALL_ADDONS: AddonDefinition[] = [\n drizzleAddon,\n prismaAddon,\n kyselyAddon,\n pinoAddon,\n winstonAddon,\n zodAddon,\n arktypeAddon,\n valibotAddon,\n];\n\nconst DB_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"database\");\nconst LOGGER_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"logger\");\nconst VALIDATOR_ADDONS = ALL_ADDONS.filter((addon) => addon.category === \"validator\");\n\nexport function getCapabilitiesCatalog(): CapabilitiesCatalog {\n return {\n types: [...PROJECT_TYPES],\n db: {\n odms: [...DB_ODMS],\n drivers: [...DB_DRIVERS],\n defaultDriver: DEFAULT_DB_DRIVER,\n },\n loggers: [...LOGGERS],\n validators: [...VALIDATORS],\n };\n}\n\nexport function resolveAddons(ctx: ScaffoldContext): AddonDefinition[] {\n const selected: AddonDefinition[] = [];\n\n if (ctx.db) {\n const dbAddon = DB_ADDONS.find((addon) => addon.id === ctx.db);\n if (!dbAddon) {\n throw new Error(`Unknown database addon \"${ctx.db}\"`);\n }\n selected.push(dbAddon);\n }\n\n if (ctx.logger) {\n const loggerAddon = LOGGER_ADDONS.find((addon) => addon.id === ctx.logger);\n if (!loggerAddon) {\n throw new Error(`Unknown logger addon \"${ctx.logger}\"`);\n }\n selected.push(loggerAddon);\n }\n\n const dbCount = selected.filter((addon) => addon.category === \"database\").length;\n if (dbCount > 1) {\n throw new Error(\"Only one database addon can be selected\");\n }\n\n const loggerCount = selected.filter((addon) => addon.category === \"logger\").length;\n if (loggerCount > 1) {\n throw new Error(\"Only one logger addon can be selected\");\n }\n\n if (ctx.validator) {\n const validatorAddon = VALIDATOR_ADDONS.find((addon) => addon.id === ctx.validator);\n if (!validatorAddon) {\n throw new Error(`Unknown validator addon \"${ctx.validator}\"`);\n }\n selected.push(validatorAddon);\n }\n\n const validatorCount = selected.filter((addon) => addon.category === \"validator\").length;\n if (validatorCount > 1) {\n throw new Error(\"Only one validator addon can be selected\");\n }\n\n return selected;\n}\n\nexport function collectBootBindings(ctx: ScaffoldContext) {\n return resolveAddons(ctx)\n .map((addon) => addon.bootBinding?.(ctx))\n .filter((v): v is NonNullable<typeof v> => Boolean(v));\n}\n"],"mappings":";;;;;;;;;;AAmBA,IAAM,aAAgC;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,IAAM,YAAY,WAAW,QAAQ,UAAU,MAAM,aAAa,UAAU;AAC5E,IAAM,gBAAgB,WAAW,QAAQ,UAAU,MAAM,aAAa,QAAQ;AAC9E,IAAM,mBAAmB,WAAW,QAAQ,UAAU,MAAM,aAAa,WAAW;AAEpF,SAAgB,yBAA8C;CAC5D,OAAO;EACL,OAAO,CAAC,GAAG,aAAa;EACxB,IAAI;GACF,MAAM,CAAC,GAAG,OAAO;GACjB,SAAS,CAAC,GAAG,UAAU;GACvB,eAAe;EACjB;EACA,SAAS,CAAC,GAAG,OAAO;EACpB,YAAY,CAAC,GAAG,UAAU;CAC5B;AACF;AAEA,SAAgB,cAAc,KAAyC;CACrE,MAAM,WAA8B,CAAC;CAErC,IAAI,IAAI,IAAI;EACV,MAAM,UAAU,UAAU,MAAM,UAAU,MAAM,OAAO,IAAI,EAAE;EAC7D,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,2BAA2B,IAAI,GAAG,EAAE;EAEtD,SAAS,KAAK,OAAO;CACvB;CAEA,IAAI,IAAI,QAAQ;EACd,MAAM,cAAc,cAAc,MAAM,UAAU,MAAM,OAAO,IAAI,MAAM;EACzE,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,yBAAyB,IAAI,OAAO,EAAE;EAExD,SAAS,KAAK,WAAW;CAC3B;CAGA,IADgB,SAAS,QAAQ,UAAU,MAAM,aAAa,UAAU,CAAC,CAAC,SAC5D,GACZ,MAAM,IAAI,MAAM,yCAAyC;CAI3D,IADoB,SAAS,QAAQ,UAAU,MAAM,aAAa,QAAQ,CAAC,CAAC,SAC1D,GAChB,MAAM,IAAI,MAAM,uCAAuC;CAGzD,IAAI,IAAI,WAAW;EACjB,MAAM,iBAAiB,iBAAiB,MAAM,UAAU,MAAM,OAAO,IAAI,SAAS;EAClF,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;EAE9D,SAAS,KAAK,cAAc;CAC9B;CAGA,IADuB,SAAS,QAAQ,UAAU,MAAM,aAAa,WAAW,CAAC,CAAC,SAC7D,GACnB,MAAM,IAAI,MAAM,0CAA0C;CAG5D,OAAO;AACT;AAEA,SAAgB,oBAAoB,KAAsB;CACxD,OAAO,cAAc,GAAG,CAAC,CACtB,KAAK,UAAU,MAAM,cAAc,GAAG,CAAC,CAAC,CACxC,QAAQ,MAAkC,QAAQ,CAAC,CAAC;AACzD"}
@@ -7,7 +7,7 @@ export type BootBinding = {
7
7
  export type FileWriter = (filePath: string, contents: string) => Promise<void>;
8
8
  export type AddonDefinition = {
9
9
  id: string;
10
- category: 'database' | 'logger' | 'validator';
10
+ category: "database" | "logger" | "validator";
11
11
  dependencies: (ctx: ScaffoldContext) => string[];
12
12
  devDependencies: (ctx: ScaffoldContext) => string[];
13
13
  scripts?: (ctx: ScaffoldContext) => Record<string, string>;