create-taserjs 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/cjs/addons/arktype/index.cjs +6 -0
- package/dist/cjs/addons/arktype/index.cjs.map +1 -0
- package/dist/cjs/addons/drizzle/index.cjs +9 -2
- package/dist/cjs/addons/drizzle/index.cjs.map +1 -1
- package/dist/cjs/addons/kysely/index.cjs +9 -2
- package/dist/cjs/addons/kysely/index.cjs.map +1 -1
- package/dist/cjs/addons/pino/index.cjs.map +1 -1
- package/dist/cjs/addons/prisma/index.cjs +84 -24
- package/dist/cjs/addons/prisma/index.cjs.map +1 -1
- package/dist/cjs/addons/registry.cjs +17 -13
- package/dist/cjs/addons/registry.cjs.map +1 -1
- package/dist/cjs/addons/types.d.cts +1 -1
- package/dist/cjs/addons/valibot/index.cjs +6 -0
- package/dist/cjs/addons/valibot/index.cjs.map +1 -0
- package/dist/cjs/addons/validators.cjs +2 -2
- package/dist/cjs/addons/validators.cjs.map +1 -1
- package/dist/cjs/addons/winston/index.cjs.map +1 -1
- package/dist/cjs/addons/zod/index.cjs.map +1 -1
- package/dist/cjs/cli.cjs +7 -0
- package/dist/cjs/cli.cjs.map +1 -1
- package/dist/cjs/commands/create.cjs +45 -11
- package/dist/cjs/commands/create.cjs.map +1 -1
- package/dist/cjs/commands/create.d.cts +2 -0
- package/dist/cjs/core/json-output.cjs.map +1 -1
- package/dist/cjs/core/package-manager.cjs +5 -13
- package/dist/cjs/core/package-manager.cjs.map +1 -1
- package/dist/cjs/core/package-manager.d.cts +3 -2
- package/dist/cjs/core/parse-options.cjs +17 -7
- package/dist/cjs/core/parse-options.cjs.map +1 -1
- package/dist/cjs/core/parse-options.d.cts +4 -3
- package/dist/cjs/core/project-config.cjs +2 -1
- package/dist/cjs/core/project-config.cjs.map +1 -1
- package/dist/cjs/core/resolve-packages.cjs +41 -7
- package/dist/cjs/core/resolve-packages.cjs.map +1 -1
- package/dist/cjs/core/resolve-packages.d.cts +2 -2
- package/dist/cjs/core/scaffold-engine.cjs +37 -8
- package/dist/cjs/core/scaffold-engine.cjs.map +1 -1
- package/dist/cjs/core/types.cjs +11 -3
- package/dist/cjs/core/types.cjs.map +1 -1
- package/dist/cjs/core/types.d.cts +8 -8
- package/dist/cjs/core/validate-project-name.cjs.map +1 -1
- package/dist/cjs/frameworks/index.cjs +138 -17
- package/dist/cjs/frameworks/index.cjs.map +1 -1
- package/dist/cjs/frameworks/index.d.cts +3 -3
- package/dist/cjs/scaffold.d.cts +1 -1
- package/dist/cjs/templates/base.cjs +15 -12
- package/dist/cjs/templates/base.cjs.map +1 -1
- package/dist/cjs/types.d.cts +1 -1
- package/dist/esm/addons/arktype/index.js +7 -0
- package/dist/esm/addons/arktype/index.js.map +1 -0
- package/dist/esm/addons/drizzle/index.js +9 -2
- package/dist/esm/addons/drizzle/index.js.map +1 -1
- package/dist/esm/addons/kysely/index.js +9 -2
- package/dist/esm/addons/kysely/index.js.map +1 -1
- package/dist/esm/addons/pino/index.js.map +1 -1
- package/dist/esm/addons/prisma/index.js +84 -24
- package/dist/esm/addons/prisma/index.js.map +1 -1
- package/dist/esm/addons/registry.js +8 -4
- package/dist/esm/addons/registry.js.map +1 -1
- package/dist/esm/addons/types.d.ts +1 -1
- package/dist/esm/addons/valibot/index.js +7 -0
- package/dist/esm/addons/valibot/index.js.map +1 -0
- package/dist/esm/addons/validators.js +2 -2
- package/dist/esm/addons/validators.js.map +1 -1
- package/dist/esm/addons/winston/index.js.map +1 -1
- package/dist/esm/addons/zod/index.js.map +1 -1
- package/dist/esm/cli.js +7 -0
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/create.d.ts +2 -0
- package/dist/esm/commands/create.js +47 -13
- package/dist/esm/commands/create.js.map +1 -1
- package/dist/esm/core/json-output.js.map +1 -1
- package/dist/esm/core/package-manager.d.ts +3 -2
- package/dist/esm/core/package-manager.js +5 -14
- package/dist/esm/core/package-manager.js.map +1 -1
- package/dist/esm/core/parse-options.d.ts +4 -3
- package/dist/esm/core/parse-options.js +17 -8
- package/dist/esm/core/parse-options.js.map +1 -1
- package/dist/esm/core/project-config.js +2 -1
- package/dist/esm/core/project-config.js.map +1 -1
- package/dist/esm/core/resolve-packages.d.ts +2 -2
- package/dist/esm/core/resolve-packages.js +41 -7
- package/dist/esm/core/resolve-packages.js.map +1 -1
- package/dist/esm/core/scaffold-engine.js +38 -9
- package/dist/esm/core/scaffold-engine.js.map +1 -1
- package/dist/esm/core/types.d.ts +8 -8
- package/dist/esm/core/types.js +11 -3
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/core/validate-project-name.js.map +1 -1
- package/dist/esm/frameworks/index.d.ts +3 -3
- package/dist/esm/frameworks/index.js +138 -17
- package/dist/esm/frameworks/index.js.map +1 -1
- package/dist/esm/scaffold.d.ts +1 -1
- package/dist/esm/templates/base.js +15 -12
- package/dist/esm/templates/base.js.map +1 -1
- package/dist/esm/types.d.ts +1 -1
- package/package.json +13 -13
- package/src/addons/arktype/index.ts +2 -2
- package/src/addons/drizzle/index.ts +60 -47
- package/src/addons/kysely/index.ts +49 -36
- package/src/addons/pino/index.ts +12 -12
- package/src/addons/prisma/index.ts +128 -55
- package/src/addons/registry.ts +39 -35
- package/src/addons/types.ts +14 -14
- package/src/addons/valibot/index.ts +2 -2
- package/src/addons/validators.ts +11 -11
- package/src/addons/winston/index.ts +12 -12
- package/src/addons/zod/index.ts +2 -2
- package/src/cli.ts +28 -25
- package/src/commands/create.ts +185 -150
- package/src/core/json-output.ts +4 -4
- package/src/core/package-manager.ts +39 -35
- package/src/core/parse-options.ts +62 -43
- package/src/core/project-config.ts +13 -13
- package/src/core/resolve-packages.ts +79 -41
- package/src/core/scaffold-engine.ts +108 -36
- package/src/core/types.ts +61 -36
- package/src/core/validate-project-name.ts +40 -40
- package/src/frameworks/index.ts +164 -29
- package/src/scaffold.ts +3 -3
- package/src/templates/base.ts +65 -56
- package/src/types.ts +5 -4
|
@@ -7,14 +7,14 @@ function packageJsonTemplate(projectName, scripts = {}) {
|
|
|
7
7
|
type: "module",
|
|
8
8
|
imports: { "#src/*": "./src/*" },
|
|
9
9
|
scripts: {
|
|
10
|
-
|
|
10
|
+
dev: "run-p dev:server dev:taser",
|
|
11
11
|
"dev:server": "tsx watch src/index.ts",
|
|
12
12
|
"dev:taser": "taser watch",
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
};
|
|
@@ -84,10 +84,11 @@ export const Middleware = t.middleware('/$')
|
|
|
84
84
|
`;
|
|
85
85
|
}
|
|
86
86
|
function indexRouteTemplate() {
|
|
87
|
-
return `import {
|
|
87
|
+
return `import { reply } from '@taserjs/router'
|
|
88
|
+
import { t } from '#src/taser.js'
|
|
88
89
|
|
|
89
|
-
export const Route = t.get('/').handler((
|
|
90
|
-
return
|
|
90
|
+
export const Route = t.get('/').handler(() => {
|
|
91
|
+
return reply.json({ message: 'Welcome to Taser' })
|
|
91
92
|
})
|
|
92
93
|
`;
|
|
93
94
|
}
|
|
@@ -95,10 +96,12 @@ function healthRouteTemplate(ctx) {
|
|
|
95
96
|
const lines = [];
|
|
96
97
|
if (ctx.logger) lines.push(" ctx.logger.info('health check')");
|
|
97
98
|
if (ctx.db) lines.push(" // ctx.db is available from context boot");
|
|
98
|
-
|
|
99
|
+
const body = lines.length > 0 ? `${lines.join("\n")}\n` : "";
|
|
100
|
+
return `import { reply } from '@taserjs/router'
|
|
101
|
+
import { t } from '#src/taser.js'
|
|
99
102
|
|
|
100
|
-
export const Route = t.get('/health').handler((ctx) => {
|
|
101
|
-
${
|
|
103
|
+
export const Route = t.get('/health').handler(${lines.length > 0 ? "(ctx)" : "()"} => {
|
|
104
|
+
${body} return reply.json({ ok: true })
|
|
102
105
|
})
|
|
103
106
|
`;
|
|
104
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","names":[],"sources":["../../../src/templates/base.ts"],"sourcesContent":["import type { BootBinding } from
|
|
1
|
+
{"version":3,"file":"base.js","names":[],"sources":["../../../src/templates/base.ts"],"sourcesContent":["import type { BootBinding } from \"../addons/types.js\";\nimport type { ScaffoldContext } from \"../core/types.js\";\n\nexport function packageJsonTemplate(\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"}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export type {
|
|
1
|
+
export type { DbDriver, DbOdm, LoggerId, PackageGroups, ProjectType, ScaffoldOptions, ScaffoldResult, ValidatorId, } from './core/types.js';
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-taserjs",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Scaffold a new Taser application",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"license": "ISC",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/taserjs/taserjs.git",
|
|
9
|
+
"directory": "packages/create-taserjs"
|
|
10
|
+
},
|
|
7
11
|
"bin": {
|
|
8
12
|
"create-taserjs": "./dist/esm/cli.js"
|
|
9
13
|
},
|
|
@@ -11,6 +15,12 @@
|
|
|
11
15
|
"dist",
|
|
12
16
|
"src"
|
|
13
17
|
],
|
|
18
|
+
"type": "module",
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public",
|
|
22
|
+
"registry": "https://registry.npmjs.org"
|
|
23
|
+
},
|
|
14
24
|
"dependencies": {
|
|
15
25
|
"@clack/prompts": "^0.11.0",
|
|
16
26
|
"package-manager-detector": "^1.8.0",
|
|
@@ -26,16 +36,6 @@
|
|
|
26
36
|
"engines": {
|
|
27
37
|
"node": ">=20.19"
|
|
28
38
|
},
|
|
29
|
-
"license": "ISC",
|
|
30
|
-
"repository": {
|
|
31
|
-
"type": "git",
|
|
32
|
-
"url": "git+https://github.com/taserjs/taserjs.git",
|
|
33
|
-
"directory": "packages/create-taserjs"
|
|
34
|
-
},
|
|
35
|
-
"publishConfig": {
|
|
36
|
-
"access": "public",
|
|
37
|
-
"registry": "https://registry.npmjs.org"
|
|
38
|
-
},
|
|
39
39
|
"scripts": {
|
|
40
40
|
"clean": "rimraf dist",
|
|
41
41
|
"build": "vite build && publint --strict",
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ValidatorAddon } from
|
|
1
|
+
import { ValidatorAddon } from "../validators.js";
|
|
2
2
|
|
|
3
|
-
export const arktypeAddon = ValidatorAddon(
|
|
3
|
+
export const arktypeAddon = ValidatorAddon("arktype");
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import type { AddonDefinition } from
|
|
2
|
-
import type { DbDriver } from
|
|
1
|
+
import type { AddonDefinition } from "../types.js";
|
|
2
|
+
import type { DbDriver } from "../../core/types.js";
|
|
3
3
|
|
|
4
4
|
function schemaSource(driver: DbDriver): string {
|
|
5
5
|
switch (driver) {
|
|
6
|
-
case
|
|
6
|
+
case "postgres":
|
|
7
7
|
return `import { pgTable, serial, text } from 'drizzle-orm/pg-core'
|
|
8
8
|
|
|
9
9
|
export const users = pgTable('users', {
|
|
10
10
|
id: serial('id').primaryKey(),
|
|
11
11
|
email: text('email').notNull(),
|
|
12
12
|
})
|
|
13
|
-
|
|
14
|
-
case
|
|
13
|
+
`;
|
|
14
|
+
case "mysql":
|
|
15
15
|
return `import { mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core'
|
|
16
16
|
|
|
17
17
|
export const users = mysqlTable('users', {
|
|
18
18
|
id: serial('id').primaryKey(),
|
|
19
19
|
email: varchar('email', { length: 255 }).notNull(),
|
|
20
20
|
})
|
|
21
|
-
|
|
22
|
-
case
|
|
21
|
+
`;
|
|
22
|
+
case "sqlite":
|
|
23
23
|
default:
|
|
24
24
|
return `import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core'
|
|
25
25
|
|
|
@@ -27,13 +27,13 @@ export const users = sqliteTable('users', {
|
|
|
27
27
|
id: integer('id').primaryKey({ autoIncrement: true }),
|
|
28
28
|
email: text('email').notNull(),
|
|
29
29
|
})
|
|
30
|
-
|
|
30
|
+
`;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
function dbIndexSource(driver: DbDriver): string {
|
|
35
35
|
switch (driver) {
|
|
36
|
-
case
|
|
36
|
+
case "postgres":
|
|
37
37
|
return `import { drizzle } from 'drizzle-orm/node-postgres'
|
|
38
38
|
import pg from 'pg'
|
|
39
39
|
|
|
@@ -45,8 +45,8 @@ export function createDb() {
|
|
|
45
45
|
})
|
|
46
46
|
return drizzle(pool, { schema })
|
|
47
47
|
}
|
|
48
|
-
|
|
49
|
-
case
|
|
48
|
+
`;
|
|
49
|
+
case "mysql":
|
|
50
50
|
return `import { drizzle } from 'drizzle-orm/mysql2'
|
|
51
51
|
import mysql from 'mysql2/promise'
|
|
52
52
|
|
|
@@ -56,8 +56,8 @@ export function createDb() {
|
|
|
56
56
|
const pool = mysql.createPool(process.env.DATABASE_URL ?? '')
|
|
57
57
|
return drizzle(pool, { schema, mode: 'default' })
|
|
58
58
|
}
|
|
59
|
-
|
|
60
|
-
case
|
|
59
|
+
`;
|
|
60
|
+
case "sqlite":
|
|
61
61
|
default:
|
|
62
62
|
return `import Database from 'better-sqlite3'
|
|
63
63
|
import { drizzle } from 'drizzle-orm/better-sqlite3'
|
|
@@ -69,12 +69,12 @@ export function createDb() {
|
|
|
69
69
|
const client = new Database(filePath)
|
|
70
70
|
return drizzle(client, { schema })
|
|
71
71
|
}
|
|
72
|
-
|
|
72
|
+
`;
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
function drizzleConfigSource(driver: DbDriver): string {
|
|
77
|
-
const dialect = driver ===
|
|
77
|
+
const dialect = driver === "postgres" ? "postgresql" : driver === "mysql" ? "mysql" : "sqlite";
|
|
78
78
|
return `import { defineConfig } from 'drizzle-kit'
|
|
79
79
|
|
|
80
80
|
export default defineConfig({
|
|
@@ -85,61 +85,74 @@ export default defineConfig({
|
|
|
85
85
|
url: process.env.DATABASE_URL ?? '',
|
|
86
86
|
},
|
|
87
87
|
})
|
|
88
|
-
|
|
88
|
+
`;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
function envExample(driver: DbDriver): string {
|
|
92
92
|
switch (driver) {
|
|
93
|
-
case
|
|
94
|
-
return
|
|
95
|
-
case
|
|
96
|
-
return
|
|
97
|
-
case
|
|
93
|
+
case "postgres":
|
|
94
|
+
return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
|
|
95
|
+
case "mysql":
|
|
96
|
+
return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
|
|
97
|
+
case "sqlite":
|
|
98
98
|
default:
|
|
99
|
-
return
|
|
99
|
+
return "DATABASE_URL=file:./local.db\n";
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
function driverPackages(driver: DbDriver): string[] {
|
|
104
104
|
switch (driver) {
|
|
105
|
-
case
|
|
106
|
-
return [
|
|
107
|
-
case
|
|
108
|
-
return [
|
|
109
|
-
case
|
|
105
|
+
case "postgres":
|
|
106
|
+
return ["pg"];
|
|
107
|
+
case "mysql":
|
|
108
|
+
return ["mysql2"];
|
|
109
|
+
case "sqlite":
|
|
110
110
|
default:
|
|
111
|
-
return [
|
|
111
|
+
return ["better-sqlite3"];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function driverDevPackages(driver: DbDriver): string[] {
|
|
116
|
+
switch (driver) {
|
|
117
|
+
case "postgres":
|
|
118
|
+
return ["@types/pg"];
|
|
119
|
+
case "sqlite":
|
|
120
|
+
return ["@types/better-sqlite3"];
|
|
121
|
+
case "mysql":
|
|
122
|
+
default:
|
|
123
|
+
return [];
|
|
112
124
|
}
|
|
113
125
|
}
|
|
114
126
|
|
|
115
127
|
export const drizzleAddon: AddonDefinition = {
|
|
116
|
-
id:
|
|
117
|
-
category:
|
|
128
|
+
id: "drizzle",
|
|
129
|
+
category: "database",
|
|
118
130
|
dependencies(ctx) {
|
|
119
|
-
const driver = ctx.driver ??
|
|
120
|
-
return [
|
|
131
|
+
const driver = ctx.driver ?? "sqlite";
|
|
132
|
+
return ["drizzle-orm", ...driverPackages(driver)];
|
|
121
133
|
},
|
|
122
|
-
devDependencies() {
|
|
123
|
-
|
|
134
|
+
devDependencies(ctx) {
|
|
135
|
+
const driver = ctx.driver ?? "sqlite";
|
|
136
|
+
return ["drizzle-kit", ...driverDevPackages(driver)];
|
|
124
137
|
},
|
|
125
138
|
scripts() {
|
|
126
139
|
return {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
140
|
+
"db:generate": "drizzle-kit generate",
|
|
141
|
+
"db:push": "drizzle-kit push",
|
|
142
|
+
};
|
|
130
143
|
},
|
|
131
144
|
bootBinding() {
|
|
132
145
|
return {
|
|
133
|
-
key:
|
|
134
|
-
importPath:
|
|
135
|
-
factoryName:
|
|
136
|
-
}
|
|
146
|
+
key: "db",
|
|
147
|
+
importPath: "./db/index.js",
|
|
148
|
+
factoryName: "createDb",
|
|
149
|
+
};
|
|
137
150
|
},
|
|
138
151
|
async apply(ctx, write) {
|
|
139
|
-
const driver = ctx.driver ??
|
|
140
|
-
await write(
|
|
141
|
-
await write(
|
|
142
|
-
await write(
|
|
143
|
-
await write(
|
|
152
|
+
const driver = ctx.driver ?? "sqlite";
|
|
153
|
+
await write("src/db/schema.ts", schemaSource(driver));
|
|
154
|
+
await write("src/db/index.ts", dbIndexSource(driver));
|
|
155
|
+
await write("drizzle.config.ts", drizzleConfigSource(driver));
|
|
156
|
+
await write(".env.example", envExample(driver));
|
|
144
157
|
},
|
|
145
|
-
}
|
|
158
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AddonDefinition } from
|
|
2
|
-
import type { DbDriver } from
|
|
1
|
+
import type { AddonDefinition } from "../types.js";
|
|
2
|
+
import type { DbDriver } from "../../core/types.js";
|
|
3
3
|
|
|
4
4
|
function schemaTypesSource(): string {
|
|
5
5
|
return `export interface UserTable {
|
|
@@ -10,12 +10,12 @@ function schemaTypesSource(): string {
|
|
|
10
10
|
export interface DB {
|
|
11
11
|
users: UserTable
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
`;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
function dbIndexSource(driver: DbDriver): string {
|
|
17
17
|
switch (driver) {
|
|
18
|
-
case
|
|
18
|
+
case "postgres":
|
|
19
19
|
return `import { Kysely, PostgresDialect } from 'kysely'
|
|
20
20
|
import pg from 'pg'
|
|
21
21
|
|
|
@@ -29,8 +29,8 @@ export function createDb() {
|
|
|
29
29
|
dialect: new PostgresDialect({ pool }),
|
|
30
30
|
})
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
case
|
|
32
|
+
`;
|
|
33
|
+
case "mysql":
|
|
34
34
|
return `import { Kysely, MysqlDialect } from 'kysely'
|
|
35
35
|
import { createPool } from 'mysql2'
|
|
36
36
|
|
|
@@ -42,8 +42,8 @@ export function createDb() {
|
|
|
42
42
|
dialect: new MysqlDialect({ pool }),
|
|
43
43
|
})
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
case
|
|
45
|
+
`;
|
|
46
|
+
case "sqlite":
|
|
47
47
|
default:
|
|
48
48
|
return `import Database from 'better-sqlite3'
|
|
49
49
|
import { Kysely, SqliteDialect } from 'kysely'
|
|
@@ -57,55 +57,68 @@ export function createDb() {
|
|
|
57
57
|
dialect: new SqliteDialect({ database }),
|
|
58
58
|
})
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
`;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
function driverPackages(driver: DbDriver): string[] {
|
|
65
65
|
switch (driver) {
|
|
66
|
-
case
|
|
67
|
-
return [
|
|
68
|
-
case
|
|
69
|
-
return [
|
|
70
|
-
case
|
|
66
|
+
case "postgres":
|
|
67
|
+
return ["pg"];
|
|
68
|
+
case "mysql":
|
|
69
|
+
return ["mysql2"];
|
|
70
|
+
case "sqlite":
|
|
71
71
|
default:
|
|
72
|
-
return [
|
|
72
|
+
return ["better-sqlite3"];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function driverDevPackages(driver: DbDriver): string[] {
|
|
77
|
+
switch (driver) {
|
|
78
|
+
case "postgres":
|
|
79
|
+
return ["@types/pg"];
|
|
80
|
+
case "sqlite":
|
|
81
|
+
return ["@types/better-sqlite3"];
|
|
82
|
+
case "mysql":
|
|
83
|
+
default:
|
|
84
|
+
return [];
|
|
73
85
|
}
|
|
74
86
|
}
|
|
75
87
|
|
|
76
88
|
function envExample(driver: DbDriver): string {
|
|
77
89
|
switch (driver) {
|
|
78
|
-
case
|
|
79
|
-
return
|
|
80
|
-
case
|
|
81
|
-
return
|
|
82
|
-
case
|
|
90
|
+
case "postgres":
|
|
91
|
+
return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
|
|
92
|
+
case "mysql":
|
|
93
|
+
return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
|
|
94
|
+
case "sqlite":
|
|
83
95
|
default:
|
|
84
|
-
return
|
|
96
|
+
return "DATABASE_URL=file:./local.db\n";
|
|
85
97
|
}
|
|
86
98
|
}
|
|
87
99
|
|
|
88
100
|
export const kyselyAddon: AddonDefinition = {
|
|
89
|
-
id:
|
|
90
|
-
category:
|
|
101
|
+
id: "kysely",
|
|
102
|
+
category: "database",
|
|
91
103
|
dependencies(ctx) {
|
|
92
|
-
const driver = ctx.driver ??
|
|
93
|
-
return [
|
|
104
|
+
const driver = ctx.driver ?? "sqlite";
|
|
105
|
+
return ["kysely", ...driverPackages(driver)];
|
|
94
106
|
},
|
|
95
|
-
devDependencies() {
|
|
96
|
-
|
|
107
|
+
devDependencies(ctx) {
|
|
108
|
+
const driver = ctx.driver ?? "sqlite";
|
|
109
|
+
return driverDevPackages(driver);
|
|
97
110
|
},
|
|
98
111
|
bootBinding() {
|
|
99
112
|
return {
|
|
100
|
-
key:
|
|
101
|
-
importPath:
|
|
102
|
-
factoryName:
|
|
103
|
-
}
|
|
113
|
+
key: "db",
|
|
114
|
+
importPath: "./db/index.js",
|
|
115
|
+
factoryName: "createDb",
|
|
116
|
+
};
|
|
104
117
|
},
|
|
105
118
|
async apply(ctx, write) {
|
|
106
|
-
const driver = ctx.driver ??
|
|
107
|
-
await write(
|
|
108
|
-
await write(
|
|
109
|
-
await write(
|
|
119
|
+
const driver = ctx.driver ?? "sqlite";
|
|
120
|
+
await write("src/db/schema.ts", schemaTypesSource());
|
|
121
|
+
await write("src/db/index.ts", dbIndexSource(driver));
|
|
122
|
+
await write(".env.example", envExample(driver));
|
|
110
123
|
},
|
|
111
|
-
}
|
|
124
|
+
};
|
package/src/addons/pino/index.ts
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import type { AddonDefinition } from
|
|
1
|
+
import type { AddonDefinition } from "../types.js";
|
|
2
2
|
|
|
3
3
|
export const pinoAddon: AddonDefinition = {
|
|
4
|
-
id:
|
|
5
|
-
category:
|
|
4
|
+
id: "pino",
|
|
5
|
+
category: "logger",
|
|
6
6
|
dependencies() {
|
|
7
|
-
return [
|
|
7
|
+
return ["pino"];
|
|
8
8
|
},
|
|
9
9
|
devDependencies() {
|
|
10
|
-
return []
|
|
10
|
+
return [];
|
|
11
11
|
},
|
|
12
12
|
bootBinding() {
|
|
13
13
|
return {
|
|
14
|
-
key:
|
|
15
|
-
importPath:
|
|
16
|
-
factoryName:
|
|
17
|
-
}
|
|
14
|
+
key: "logger",
|
|
15
|
+
importPath: "./logger.js",
|
|
16
|
+
factoryName: "createLogger",
|
|
17
|
+
};
|
|
18
18
|
},
|
|
19
19
|
async apply(_ctx, write) {
|
|
20
20
|
await write(
|
|
21
|
-
|
|
21
|
+
"src/logger.ts",
|
|
22
22
|
`import pino from 'pino'
|
|
23
23
|
|
|
24
24
|
export function createLogger() {
|
|
25
25
|
return pino({ level: process.env.LOG_LEVEL ?? 'info' })
|
|
26
26
|
}
|
|
27
27
|
`,
|
|
28
|
-
)
|
|
28
|
+
);
|
|
29
29
|
},
|
|
30
|
-
}
|
|
30
|
+
};
|