create-taserjs 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +22 -0
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/addons/drizzle/index.cjs +124 -0
- package/dist/cjs/addons/drizzle/index.cjs.map +1 -0
- package/dist/cjs/addons/drizzle/index.d.cts +2 -0
- package/dist/cjs/addons/kysely/index.cjs +96 -0
- package/dist/cjs/addons/kysely/index.cjs.map +1 -0
- package/dist/cjs/addons/kysely/index.d.cts +2 -0
- package/dist/cjs/addons/pino/index.cjs +30 -0
- package/dist/cjs/addons/pino/index.cjs.map +1 -0
- package/dist/cjs/addons/pino/index.d.cts +2 -0
- package/dist/cjs/addons/prisma/index.cjs +66 -0
- package/dist/cjs/addons/prisma/index.cjs.map +1 -0
- package/dist/cjs/addons/prisma/index.d.cts +2 -0
- package/dist/cjs/addons/registry.cjs +52 -0
- package/dist/cjs/addons/registry.cjs.map +1 -0
- package/dist/cjs/addons/registry.d.cts +5 -0
- package/dist/cjs/addons/types.d.cts +16 -0
- package/dist/cjs/addons/winston/index.cjs +34 -0
- package/dist/cjs/addons/winston/index.cjs.map +1 -0
- package/dist/cjs/addons/winston/index.d.cts +2 -0
- package/dist/cjs/cli.cjs +56 -0
- package/dist/cjs/cli.cjs.map +1 -0
- package/dist/cjs/cli.d.cts +2 -0
- package/dist/cjs/commands/create.cjs +243 -0
- package/dist/cjs/commands/create.cjs.map +1 -0
- package/dist/cjs/commands/create.d.cts +11 -0
- package/dist/cjs/core/json-output.cjs +16 -0
- package/dist/cjs/core/json-output.cjs.map +1 -0
- package/dist/cjs/core/json-output.d.cts +4 -0
- package/dist/cjs/core/package-manager.cjs +64 -0
- package/dist/cjs/core/package-manager.cjs.map +1 -0
- package/dist/cjs/core/package-manager.d.cts +7 -0
- package/dist/cjs/core/parse-options.cjs +59 -0
- package/dist/cjs/core/parse-options.cjs.map +1 -0
- package/dist/cjs/core/parse-options.d.cts +18 -0
- package/dist/cjs/core/project-config.cjs +18 -0
- package/dist/cjs/core/project-config.cjs.map +1 -0
- package/dist/cjs/core/project-config.d.cts +2 -0
- package/dist/cjs/core/resolve-packages.cjs +52 -0
- package/dist/cjs/core/resolve-packages.cjs.map +1 -0
- package/dist/cjs/core/resolve-packages.d.cts +5 -0
- package/dist/cjs/core/scaffold-engine.cjs +73 -0
- package/dist/cjs/core/scaffold-engine.cjs.map +1 -0
- package/dist/cjs/core/scaffold-engine.d.cts +2 -0
- package/dist/cjs/core/types.cjs +27 -0
- package/dist/cjs/core/types.cjs.map +1 -0
- package/dist/cjs/core/types.d.cts +37 -0
- package/dist/cjs/core/validate-project-name.cjs +45 -0
- package/dist/cjs/core/validate-project-name.cjs.map +1 -0
- package/dist/cjs/core/validate-project-name.d.cts +1 -0
- package/dist/cjs/frameworks/index.cjs +106 -0
- package/dist/cjs/frameworks/index.cjs.map +1 -0
- package/dist/cjs/frameworks/index.d.cts +3 -0
- package/dist/cjs/scaffold.d.cts +3 -0
- package/dist/cjs/templates/base.cjs +186 -0
- package/dist/cjs/templates/base.cjs.map +1 -0
- package/dist/cjs/templates/base.d.cts +12 -0
- package/dist/cjs/types.d.cts +1 -0
- package/dist/esm/addons/drizzle/index.d.ts +2 -0
- package/dist/esm/addons/drizzle/index.js +124 -0
- package/dist/esm/addons/drizzle/index.js.map +1 -0
- package/dist/esm/addons/kysely/index.d.ts +2 -0
- package/dist/esm/addons/kysely/index.js +96 -0
- package/dist/esm/addons/kysely/index.js.map +1 -0
- package/dist/esm/addons/pino/index.d.ts +2 -0
- package/dist/esm/addons/pino/index.js +30 -0
- package/dist/esm/addons/pino/index.js.map +1 -0
- package/dist/esm/addons/prisma/index.d.ts +2 -0
- package/dist/esm/addons/prisma/index.js +66 -0
- package/dist/esm/addons/prisma/index.js.map +1 -0
- package/dist/esm/addons/registry.d.ts +5 -0
- package/dist/esm/addons/registry.js +50 -0
- package/dist/esm/addons/registry.js.map +1 -0
- package/dist/esm/addons/types.d.ts +16 -0
- package/dist/esm/addons/winston/index.d.ts +2 -0
- package/dist/esm/addons/winston/index.js +34 -0
- package/dist/esm/addons/winston/index.js.map +1 -0
- package/dist/esm/cli.d.ts +2 -0
- package/dist/esm/cli.js +53 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/commands/create.d.ts +11 -0
- package/dist/esm/commands/create.js +238 -0
- package/dist/esm/commands/create.js.map +1 -0
- package/dist/esm/core/json-output.d.ts +4 -0
- package/dist/esm/core/json-output.js +14 -0
- package/dist/esm/core/json-output.js.map +1 -0
- package/dist/esm/core/package-manager.d.ts +7 -0
- package/dist/esm/core/package-manager.js +62 -0
- package/dist/esm/core/package-manager.js.map +1 -0
- package/dist/esm/core/parse-options.d.ts +18 -0
- package/dist/esm/core/parse-options.js +56 -0
- package/dist/esm/core/parse-options.js.map +1 -0
- package/dist/esm/core/project-config.d.ts +2 -0
- package/dist/esm/core/project-config.js +16 -0
- package/dist/esm/core/project-config.js.map +1 -0
- package/dist/esm/core/resolve-packages.d.ts +5 -0
- package/dist/esm/core/resolve-packages.js +52 -0
- package/dist/esm/core/resolve-packages.js.map +1 -0
- package/dist/esm/core/scaffold-engine.d.ts +2 -0
- package/dist/esm/core/scaffold-engine.js +71 -0
- package/dist/esm/core/scaffold-engine.js.map +1 -0
- package/dist/esm/core/types.d.ts +37 -0
- package/dist/esm/core/types.js +23 -0
- package/dist/esm/core/types.js.map +1 -0
- package/dist/esm/core/validate-project-name.d.ts +1 -0
- package/dist/esm/core/validate-project-name.js +43 -0
- package/dist/esm/core/validate-project-name.js.map +1 -0
- package/dist/esm/frameworks/index.d.ts +3 -0
- package/dist/esm/frameworks/index.js +105 -0
- package/dist/esm/frameworks/index.js.map +1 -0
- package/dist/esm/scaffold.d.ts +3 -0
- package/dist/esm/templates/base.d.ts +12 -0
- package/dist/esm/templates/base.js +178 -0
- package/dist/esm/templates/base.js.map +1 -0
- package/dist/esm/types.d.ts +1 -0
- package/package.json +45 -0
- package/src/addons/drizzle/index.ts +145 -0
- package/src/addons/kysely/index.ts +111 -0
- package/src/addons/pino/index.ts +30 -0
- package/src/addons/prisma/index.ts +81 -0
- package/src/addons/registry.ts +73 -0
- package/src/addons/types.ts +19 -0
- package/src/addons/winston/index.ts +34 -0
- package/src/cli.ts +57 -0
- package/src/commands/create.ts +253 -0
- package/src/core/json-output.ts +13 -0
- package/src/core/package-manager.ts +68 -0
- package/src/core/parse-options.ts +97 -0
- package/src/core/project-config.ts +27 -0
- package/src/core/resolve-packages.ts +62 -0
- package/src/core/scaffold-engine.ts +82 -0
- package/src/core/types.ts +51 -0
- package/src/core/validate-project-name.ts +59 -0
- package/src/frameworks/index.ts +111 -0
- package/src/scaffold.ts +3 -0
- package/src/templates/base.ts +209 -0
- package/src/types.ts +9 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, Taserjs contributors
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
15
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# create-taserjs
|
|
2
|
+
|
|
3
|
+
Scaffold a new Taser application
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
**npm:**
|
|
8
|
+
```bash
|
|
9
|
+
npm create taserjs@latest
|
|
10
|
+
pnpm create taserjs@latest
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**JSR:**
|
|
14
|
+
```bash
|
|
15
|
+
npx jsr @taserjs/create
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
This will scaffold a new Taser application with your choice of framework adapter and optional add-ons.
|
|
19
|
+
|
|
20
|
+
## License
|
|
21
|
+
|
|
22
|
+
ISC
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
10
|
+
key = keys[i];
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
12
|
+
get: ((k) => from[k]).bind(null, key),
|
|
13
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
|
|
19
|
+
value: mod,
|
|
20
|
+
enumerable: true
|
|
21
|
+
}) : target, mod));
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.__toESM = __toESM;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//#region src/addons/drizzle/index.ts
|
|
2
|
+
function schemaSource(driver) {
|
|
3
|
+
switch (driver) {
|
|
4
|
+
case "postgres": return `import { pgTable, serial, text } from 'drizzle-orm/pg-core'
|
|
5
|
+
|
|
6
|
+
export const users = pgTable('users', {
|
|
7
|
+
id: serial('id').primaryKey(),
|
|
8
|
+
email: text('email').notNull(),
|
|
9
|
+
})
|
|
10
|
+
`;
|
|
11
|
+
case "mysql": return `import { mysqlTable, serial, varchar } from 'drizzle-orm/mysql-core'
|
|
12
|
+
|
|
13
|
+
export const users = mysqlTable('users', {
|
|
14
|
+
id: serial('id').primaryKey(),
|
|
15
|
+
email: varchar('email', { length: 255 }).notNull(),
|
|
16
|
+
})
|
|
17
|
+
`;
|
|
18
|
+
default: return `import { sqliteTable, integer, text } from 'drizzle-orm/sqlite-core'
|
|
19
|
+
|
|
20
|
+
export const users = sqliteTable('users', {
|
|
21
|
+
id: integer('id').primaryKey({ autoIncrement: true }),
|
|
22
|
+
email: text('email').notNull(),
|
|
23
|
+
})
|
|
24
|
+
`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function dbIndexSource(driver) {
|
|
28
|
+
switch (driver) {
|
|
29
|
+
case "postgres": return `import { drizzle } from 'drizzle-orm/node-postgres'
|
|
30
|
+
import pg from 'pg'
|
|
31
|
+
|
|
32
|
+
import * as schema from './schema.js'
|
|
33
|
+
|
|
34
|
+
export function createDb() {
|
|
35
|
+
const pool = new pg.Pool({
|
|
36
|
+
connectionString: process.env.DATABASE_URL,
|
|
37
|
+
})
|
|
38
|
+
return drizzle(pool, { schema })
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
case "mysql": return `import { drizzle } from 'drizzle-orm/mysql2'
|
|
42
|
+
import mysql from 'mysql2/promise'
|
|
43
|
+
|
|
44
|
+
import * as schema from './schema.js'
|
|
45
|
+
|
|
46
|
+
export function createDb() {
|
|
47
|
+
const pool = mysql.createPool(process.env.DATABASE_URL ?? '')
|
|
48
|
+
return drizzle(pool, { schema, mode: 'default' })
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
default: return `import Database from 'better-sqlite3'
|
|
52
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3'
|
|
53
|
+
|
|
54
|
+
import * as schema from './schema.js'
|
|
55
|
+
|
|
56
|
+
export function createDb() {
|
|
57
|
+
const filePath = (process.env.DATABASE_URL ?? 'file:./local.db').replace(/^file:/, '')
|
|
58
|
+
const client = new Database(filePath)
|
|
59
|
+
return drizzle(client, { schema })
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function drizzleConfigSource(driver) {
|
|
65
|
+
return `import { defineConfig } from 'drizzle-kit'
|
|
66
|
+
|
|
67
|
+
export default defineConfig({
|
|
68
|
+
schema: './src/db/schema.ts',
|
|
69
|
+
out: './drizzle',
|
|
70
|
+
dialect: '${driver === "postgres" ? "postgresql" : driver === "mysql" ? "mysql" : "sqlite"}',
|
|
71
|
+
dbCredentials: {
|
|
72
|
+
url: process.env.DATABASE_URL ?? '',
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
function envExample(driver) {
|
|
78
|
+
switch (driver) {
|
|
79
|
+
case "postgres": return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
|
|
80
|
+
case "mysql": return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
|
|
81
|
+
default: return "DATABASE_URL=file:./local.db\n";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function driverPackages(driver) {
|
|
85
|
+
switch (driver) {
|
|
86
|
+
case "postgres": return ["pg"];
|
|
87
|
+
case "mysql": return ["mysql2"];
|
|
88
|
+
default: return ["better-sqlite3"];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
var drizzleAddon = {
|
|
92
|
+
id: "drizzle",
|
|
93
|
+
category: "database",
|
|
94
|
+
dependencies(ctx) {
|
|
95
|
+
return ["drizzle-orm", ...driverPackages(ctx.driver ?? "sqlite")];
|
|
96
|
+
},
|
|
97
|
+
devDependencies() {
|
|
98
|
+
return ["drizzle-kit"];
|
|
99
|
+
},
|
|
100
|
+
scripts() {
|
|
101
|
+
return {
|
|
102
|
+
"db:generate": "drizzle-kit generate",
|
|
103
|
+
"db:push": "drizzle-kit push"
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
bootBinding() {
|
|
107
|
+
return {
|
|
108
|
+
key: "db",
|
|
109
|
+
importPath: "./db/index.js",
|
|
110
|
+
factoryName: "createDb"
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
async apply(ctx, write) {
|
|
114
|
+
const driver = ctx.driver ?? "sqlite";
|
|
115
|
+
await write("src/db/schema.ts", schemaSource(driver));
|
|
116
|
+
await write("src/db/index.ts", dbIndexSource(driver));
|
|
117
|
+
await write("drizzle.config.ts", drizzleConfigSource(driver));
|
|
118
|
+
await write(".env.example", envExample(driver));
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
//#endregion
|
|
122
|
+
exports.drizzleAddon = drizzleAddon;
|
|
123
|
+
|
|
124
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","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\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() {\n return ['drizzle-kit']\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,IAAa,eAAgC;CAC3C,IAAI;CACJ,UAAU;CACV,aAAa,KAAK;EAEhB,OAAO,CAAC,eAAe,GAAG,eADX,IAAI,UAAU,QACkB,CAAC;CAClD;CACA,kBAAkB;EAChB,OAAO,CAAC,aAAa;CACvB;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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//#region src/addons/kysely/index.ts
|
|
2
|
+
function schemaTypesSource() {
|
|
3
|
+
return `export interface UserTable {
|
|
4
|
+
id: number
|
|
5
|
+
email: string
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface DB {
|
|
9
|
+
users: UserTable
|
|
10
|
+
}
|
|
11
|
+
`;
|
|
12
|
+
}
|
|
13
|
+
function dbIndexSource(driver) {
|
|
14
|
+
switch (driver) {
|
|
15
|
+
case "postgres": return `import { Kysely, PostgresDialect } from 'kysely'
|
|
16
|
+
import pg from 'pg'
|
|
17
|
+
|
|
18
|
+
import type { DB } from './schema.js'
|
|
19
|
+
|
|
20
|
+
export function createDb() {
|
|
21
|
+
const pool = new pg.Pool({
|
|
22
|
+
connectionString: process.env.DATABASE_URL,
|
|
23
|
+
})
|
|
24
|
+
return new Kysely<DB>({
|
|
25
|
+
dialect: new PostgresDialect({ pool }),
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
29
|
+
case "mysql": return `import { Kysely, MysqlDialect } from 'kysely'
|
|
30
|
+
import { createPool } from 'mysql2'
|
|
31
|
+
|
|
32
|
+
import type { DB } from './schema.js'
|
|
33
|
+
|
|
34
|
+
export function createDb() {
|
|
35
|
+
const pool = createPool(process.env.DATABASE_URL ?? '')
|
|
36
|
+
return new Kysely<DB>({
|
|
37
|
+
dialect: new MysqlDialect({ pool }),
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
default: return `import Database from 'better-sqlite3'
|
|
42
|
+
import { Kysely, SqliteDialect } from 'kysely'
|
|
43
|
+
|
|
44
|
+
import type { DB } from './schema.js'
|
|
45
|
+
|
|
46
|
+
export function createDb() {
|
|
47
|
+
const filePath = (process.env.DATABASE_URL ?? 'file:./local.db').replace(/^file:/, '')
|
|
48
|
+
const database = new Database(filePath)
|
|
49
|
+
return new Kysely<DB>({
|
|
50
|
+
dialect: new SqliteDialect({ database }),
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function driverPackages(driver) {
|
|
57
|
+
switch (driver) {
|
|
58
|
+
case "postgres": return ["pg"];
|
|
59
|
+
case "mysql": return ["mysql2"];
|
|
60
|
+
default: return ["better-sqlite3"];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function envExample(driver) {
|
|
64
|
+
switch (driver) {
|
|
65
|
+
case "postgres": return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
|
|
66
|
+
case "mysql": return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
|
|
67
|
+
default: return "DATABASE_URL=file:./local.db\n";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
var kyselyAddon = {
|
|
71
|
+
id: "kysely",
|
|
72
|
+
category: "database",
|
|
73
|
+
dependencies(ctx) {
|
|
74
|
+
return ["kysely", ...driverPackages(ctx.driver ?? "sqlite")];
|
|
75
|
+
},
|
|
76
|
+
devDependencies() {
|
|
77
|
+
return [];
|
|
78
|
+
},
|
|
79
|
+
bootBinding() {
|
|
80
|
+
return {
|
|
81
|
+
key: "db",
|
|
82
|
+
importPath: "./db/index.js",
|
|
83
|
+
factoryName: "createDb"
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
async apply(ctx, write) {
|
|
87
|
+
const driver = ctx.driver ?? "sqlite";
|
|
88
|
+
await write("src/db/schema.ts", schemaTypesSource());
|
|
89
|
+
await write("src/db/index.ts", dbIndexSource(driver));
|
|
90
|
+
await write(".env.example", envExample(driver));
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
//#endregion
|
|
94
|
+
exports.kyselyAddon = kyselyAddon;
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","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 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() {\n return []\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,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,kBAAkB;EAChB,OAAO,CAAC;CACV;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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/addons/pino/index.ts
|
|
2
|
+
var pinoAddon = {
|
|
3
|
+
id: "pino",
|
|
4
|
+
category: "logger",
|
|
5
|
+
dependencies() {
|
|
6
|
+
return ["pino"];
|
|
7
|
+
},
|
|
8
|
+
devDependencies() {
|
|
9
|
+
return [];
|
|
10
|
+
},
|
|
11
|
+
bootBinding() {
|
|
12
|
+
return {
|
|
13
|
+
key: "logger",
|
|
14
|
+
importPath: "./logger.js",
|
|
15
|
+
factoryName: "createLogger"
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
async apply(_ctx, write) {
|
|
19
|
+
await write("src/logger.ts", `import pino from 'pino'
|
|
20
|
+
|
|
21
|
+
export function createLogger() {
|
|
22
|
+
return pino({ level: process.env.LOG_LEVEL ?? 'info' })
|
|
23
|
+
}
|
|
24
|
+
`);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
exports.pinoAddon = pinoAddon;
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
//#region src/addons/prisma/index.ts
|
|
2
|
+
function prismaProvider(driver) {
|
|
3
|
+
switch (driver) {
|
|
4
|
+
case "postgres": return "postgresql";
|
|
5
|
+
case "mysql": return "mysql";
|
|
6
|
+
default: return "sqlite";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function envExample(driver) {
|
|
10
|
+
switch (driver) {
|
|
11
|
+
case "postgres": return "DATABASE_URL=postgresql://user:password@localhost:5432/mydb\n";
|
|
12
|
+
case "mysql": return "DATABASE_URL=mysql://user:password@localhost:3306/mydb\n";
|
|
13
|
+
default: return "DATABASE_URL=file:./local.db\n";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
var prismaAddon = {
|
|
17
|
+
id: "prisma",
|
|
18
|
+
category: "database",
|
|
19
|
+
dependencies() {
|
|
20
|
+
return ["@prisma/client"];
|
|
21
|
+
},
|
|
22
|
+
devDependencies() {
|
|
23
|
+
return ["prisma"];
|
|
24
|
+
},
|
|
25
|
+
scripts() {
|
|
26
|
+
return {
|
|
27
|
+
"db:generate": "prisma generate",
|
|
28
|
+
"db:push": "prisma db push"
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
bootBinding() {
|
|
32
|
+
return {
|
|
33
|
+
key: "db",
|
|
34
|
+
importPath: "./db/index.js",
|
|
35
|
+
factoryName: "createDb"
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
async apply(ctx, write) {
|
|
39
|
+
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
|
+
`);
|
|
60
|
+
await write(".env.example", envExample(driver));
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
exports.prismaAddon = prismaAddon;
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const require_index = require("./drizzle/index.cjs");
|
|
2
|
+
const require_index$1 = require("./kysely/index.cjs");
|
|
3
|
+
const require_index$2 = require("./pino/index.cjs");
|
|
4
|
+
const require_index$3 = require("./prisma/index.cjs");
|
|
5
|
+
const require_index$4 = require("./winston/index.cjs");
|
|
6
|
+
const require_types = require("../core/types.cjs");
|
|
7
|
+
//#region src/addons/registry.ts
|
|
8
|
+
var ALL_ADDONS = [
|
|
9
|
+
require_index.drizzleAddon,
|
|
10
|
+
require_index$3.prismaAddon,
|
|
11
|
+
require_index$1.kyselyAddon,
|
|
12
|
+
require_index$2.pinoAddon,
|
|
13
|
+
require_index$4.winstonAddon
|
|
14
|
+
];
|
|
15
|
+
var DB_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "database");
|
|
16
|
+
var LOGGER_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "logger");
|
|
17
|
+
function getCapabilitiesCatalog() {
|
|
18
|
+
return {
|
|
19
|
+
frameworks: [...require_types.FRAMEWORKS],
|
|
20
|
+
db: {
|
|
21
|
+
odms: [...require_types.DB_ODMS],
|
|
22
|
+
drivers: [...require_types.DB_DRIVERS],
|
|
23
|
+
defaultDriver: require_types.DEFAULT_DB_DRIVER
|
|
24
|
+
},
|
|
25
|
+
loggers: [...require_types.LOGGERS]
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function resolveAddons(ctx) {
|
|
29
|
+
const selected = [];
|
|
30
|
+
if (ctx.db) {
|
|
31
|
+
const dbAddon = DB_ADDONS.find((addon) => addon.id === ctx.db);
|
|
32
|
+
if (!dbAddon) throw new Error(`Unknown database addon "${ctx.db}"`);
|
|
33
|
+
selected.push(dbAddon);
|
|
34
|
+
}
|
|
35
|
+
if (ctx.logger) {
|
|
36
|
+
const loggerAddon = LOGGER_ADDONS.find((addon) => addon.id === ctx.logger);
|
|
37
|
+
if (!loggerAddon) throw new Error(`Unknown logger addon "${ctx.logger}"`);
|
|
38
|
+
selected.push(loggerAddon);
|
|
39
|
+
}
|
|
40
|
+
if (selected.filter((addon) => addon.category === "database").length > 1) throw new Error("Only one database addon can be selected");
|
|
41
|
+
if (selected.filter((addon) => addon.category === "logger").length > 1) throw new Error("Only one logger addon can be selected");
|
|
42
|
+
return selected;
|
|
43
|
+
}
|
|
44
|
+
function collectBootBindings(ctx) {
|
|
45
|
+
return resolveAddons(ctx).map((addon) => addon.bootBinding(ctx));
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
exports.collectBootBindings = collectBootBindings;
|
|
49
|
+
exports.getCapabilitiesCatalog = getCapabilitiesCatalog;
|
|
50
|
+
exports.resolveAddons = resolveAddons;
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=registry.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.cjs","names":[],"sources":["../../../src/addons/registry.ts"],"sourcesContent":["import { drizzleAddon } from './drizzle/index.js'\nimport { kyselyAddon } from './kysely/index.js'\nimport { pinoAddon } from './pino/index.js'\nimport { prismaAddon } from './prisma/index.js'\nimport type { AddonDefinition } from './types.js'\nimport { winstonAddon } from './winston/index.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} from '../core/types.js'\n\nconst ALL_ADDONS: AddonDefinition[] = [\n drizzleAddon,\n prismaAddon,\n kyselyAddon,\n pinoAddon,\n winstonAddon,\n]\n\nconst DB_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'database')\nconst LOGGER_ADDONS = ALL_ADDONS.filter(addon => addon.category === 'logger')\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 }\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 return selected\n}\n\nexport function collectBootBindings(ctx: ScaffoldContext) {\n return resolveAddons(ctx).map(addon => addon.bootBinding(ctx))\n}\n"],"mappings":";;;;;;;AAeA,IAAM,aAAgC;CACpC,cAAA;CACA,gBAAA;CACA,gBAAA;CACA,gBAAA;CACA,gBAAA;AACF;AAEA,IAAM,YAAY,WAAW,QAAO,UAAS,MAAM,aAAa,UAAU;AAC1E,IAAM,gBAAgB,WAAW,QAAO,UAAS,MAAM,aAAa,QAAQ;AAE5E,SAAgB,yBAA8C;CAC5D,OAAO;EACL,YAAY,CAAC,GAAG,cAAA,UAAU;EAC1B,IAAI;GACF,MAAM,CAAC,GAAG,cAAA,OAAO;GACjB,SAAS,CAAC,GAAG,cAAA,UAAU;GACvB,eAAe,cAAA;EACjB;EACA,SAAS,CAAC,GAAG,cAAA,OAAO;CACtB;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,OAAO;AACT;AAEA,SAAgB,oBAAoB,KAAsB;CACxD,OAAO,cAAc,GAAG,CAAC,CAAC,KAAI,UAAS,MAAM,YAAY,GAAG,CAAC;AAC/D"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { AddonDefinition } from './types.js';
|
|
2
|
+
import { CapabilitiesCatalog, ScaffoldContext } from '../core/types.js';
|
|
3
|
+
export declare function getCapabilitiesCatalog(): CapabilitiesCatalog;
|
|
4
|
+
export declare function resolveAddons(ctx: ScaffoldContext): AddonDefinition[];
|
|
5
|
+
export declare function collectBootBindings(ctx: ScaffoldContext): import('./types.js').BootBinding[];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ScaffoldContext } from '../core/types.js';
|
|
2
|
+
export type BootBinding = {
|
|
3
|
+
key: string;
|
|
4
|
+
importPath: string;
|
|
5
|
+
factoryName: string;
|
|
6
|
+
};
|
|
7
|
+
export type FileWriter = (filePath: string, contents: string) => Promise<void>;
|
|
8
|
+
export type AddonDefinition = {
|
|
9
|
+
id: string;
|
|
10
|
+
category: 'database' | 'logger';
|
|
11
|
+
dependencies: (ctx: ScaffoldContext) => string[];
|
|
12
|
+
devDependencies: (ctx: ScaffoldContext) => string[];
|
|
13
|
+
scripts?: (ctx: ScaffoldContext) => Record<string, string>;
|
|
14
|
+
bootBinding: (ctx: ScaffoldContext) => BootBinding;
|
|
15
|
+
apply: (ctx: ScaffoldContext, write: FileWriter) => Promise<void>;
|
|
16
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/addons/winston/index.ts
|
|
2
|
+
var winstonAddon = {
|
|
3
|
+
id: "winston",
|
|
4
|
+
category: "logger",
|
|
5
|
+
dependencies() {
|
|
6
|
+
return ["winston"];
|
|
7
|
+
},
|
|
8
|
+
devDependencies() {
|
|
9
|
+
return [];
|
|
10
|
+
},
|
|
11
|
+
bootBinding() {
|
|
12
|
+
return {
|
|
13
|
+
key: "logger",
|
|
14
|
+
importPath: "./logger.js",
|
|
15
|
+
factoryName: "createLogger"
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
async apply(_ctx, write) {
|
|
19
|
+
await write("src/logger.ts", `import winston from 'winston'
|
|
20
|
+
|
|
21
|
+
export function createLogger() {
|
|
22
|
+
return winston.createLogger({
|
|
23
|
+
level: process.env.LOG_LEVEL ?? 'info',
|
|
24
|
+
format: winston.format.json(),
|
|
25
|
+
transports: [new winston.transports.Console()],
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
exports.winstonAddon = winstonAddon;
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/addons/winston/index.ts"],"sourcesContent":["import type { AddonDefinition } from '../types.js'\n\nexport const winstonAddon: AddonDefinition = {\n id: 'winston',\n category: 'logger',\n dependencies() {\n return ['winston']\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 winston from 'winston'\n\nexport function createLogger() {\n return winston.createLogger({\n level: process.env.LOG_LEVEL ?? 'info',\n format: winston.format.json(),\n transports: [new winston.transports.Console()],\n })\n}\n`,\n )\n },\n}\n"],"mappings":";AAEA,IAAa,eAAgC;CAC3C,IAAI;CACJ,UAAU;CACV,eAAe;EACb,OAAO,CAAC,SAAS;CACnB;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;;;;;;;;;CAUF;CACF;AACF"}
|
package/dist/cjs/cli.cjs
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
3
|
+
const require_json_output = require("./core/json-output.cjs");
|
|
4
|
+
const require_create = require("./commands/create.cjs");
|
|
5
|
+
let node_util = require("node:util");
|
|
6
|
+
let _clack_prompts = require("@clack/prompts");
|
|
7
|
+
_clack_prompts = require_runtime.__toESM(_clack_prompts, 1);
|
|
8
|
+
let picocolors = require("picocolors");
|
|
9
|
+
picocolors = require_runtime.__toESM(picocolors, 1);
|
|
10
|
+
//#region src/cli.ts
|
|
11
|
+
async function main() {
|
|
12
|
+
const { values, positionals } = (0, node_util.parseArgs)({
|
|
13
|
+
args: process.argv.slice(2),
|
|
14
|
+
options: {
|
|
15
|
+
framework: { type: "string" },
|
|
16
|
+
db: { type: "string" },
|
|
17
|
+
logger: { type: "string" },
|
|
18
|
+
y: {
|
|
19
|
+
type: "boolean",
|
|
20
|
+
short: "y"
|
|
21
|
+
},
|
|
22
|
+
noInstall: { type: "boolean" },
|
|
23
|
+
json: { type: "boolean" }
|
|
24
|
+
},
|
|
25
|
+
allowPositionals: true
|
|
26
|
+
});
|
|
27
|
+
const parsed = require_create.buildParsedArgsFromCli({
|
|
28
|
+
...values.framework !== void 0 ? { framework: values.framework } : {},
|
|
29
|
+
...values.db !== void 0 ? { db: values.db } : {},
|
|
30
|
+
...values.logger !== void 0 ? { logger: values.logger } : {},
|
|
31
|
+
...values.y !== void 0 ? { y: values.y } : {},
|
|
32
|
+
...values.noInstall !== void 0 ? { noInstall: values.noInstall } : {},
|
|
33
|
+
...values.json !== void 0 ? { json: values.json } : {}
|
|
34
|
+
}, positionals);
|
|
35
|
+
if (!parsed.json) {
|
|
36
|
+
console.clear();
|
|
37
|
+
_clack_prompts.intro(picocolors.default.bgCyan(picocolors.default.black(" create-taser ")));
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
await require_create.runCreateCommand(parsed);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
if (parsed.json) {
|
|
44
|
+
require_json_output.printJsonError(message);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
main().catch((error) => {
|
|
51
|
+
console.error(error);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
});
|
|
54
|
+
//#endregion
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=cli.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":[],"sources":["../../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { parseArgs } from 'node:util'\n\nimport * as p from '@clack/prompts'\nimport color from 'picocolors'\n\nimport { buildParsedArgsFromCli, runCreateCommand } from './commands/create.js'\nimport { printJsonError } from './core/json-output.js'\n\nasync function main(): Promise<void> {\n const { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n options: {\n framework: { type: 'string' },\n db: { type: 'string' },\n logger: { type: 'string' },\n y: { type: 'boolean', short: 'y' },\n noInstall: { type: 'boolean' },\n json: { type: 'boolean' },\n },\n allowPositionals: true,\n })\n\n const parsed = buildParsedArgsFromCli(\n {\n ...(values.framework !== undefined ? { framework: values.framework } : {}),\n ...(values.db !== undefined ? { db: values.db } : {}),\n ...(values.logger !== undefined ? { logger: values.logger } : {}),\n ...(values.y !== undefined ? { y: values.y } : {}),\n ...(values.noInstall !== undefined ? { noInstall: values.noInstall } : {}),\n ...(values.json !== undefined ? { json: values.json } : {}),\n },\n positionals,\n )\n\n if (!parsed.json) {\n console.clear()\n p.intro(color.bgCyan(color.black(' create-taser ')))\n }\n\n try {\n await runCreateCommand(parsed)\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (parsed.json) {\n printJsonError(message)\n process.exit(1)\n }\n throw error\n }\n}\n\nmain().catch((error: unknown) => {\n console.error(error)\n process.exit(1)\n})\n"],"mappings":";;;;;;;;;;AASA,eAAe,OAAsB;CACnC,MAAM,EAAE,QAAQ,iBAAA,GAAgB,UAAA,UAAA,CAAU;EACxC,MAAM,QAAQ,KAAK,MAAM,CAAC;EAC1B,SAAS;GACP,WAAW,EAAE,MAAM,SAAS;GAC5B,IAAI,EAAE,MAAM,SAAS;GACrB,QAAQ,EAAE,MAAM,SAAS;GACzB,GAAG;IAAE,MAAM;IAAW,OAAO;GAAI;GACjC,WAAW,EAAE,MAAM,UAAU;GAC7B,MAAM,EAAE,MAAM,UAAU;EAC1B;EACA,kBAAkB;CACpB,CAAC;CAED,MAAM,SAAS,eAAA,uBACb;EACE,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACxE,GAAI,OAAO,OAAO,KAAA,IAAY,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC;EACnD,GAAI,OAAO,WAAW,KAAA,IAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;EAC/D,GAAI,OAAO,MAAM,KAAA,IAAY,EAAE,GAAG,OAAO,EAAE,IAAI,CAAC;EAChD,GAAI,OAAO,cAAc,KAAA,IAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;EACxE,GAAI,OAAO,SAAS,KAAA,IAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;CAC3D,GACA,WACF;CAEA,IAAI,CAAC,OAAO,MAAM;EAChB,QAAQ,MAAM;EACd,eAAE,MAAM,WAAA,QAAM,OAAO,WAAA,QAAM,MAAM,gBAAgB,CAAC,CAAC;CACrD;CAEA,IAAI;EACF,MAAM,eAAA,iBAAiB,MAAM;CAC/B,SACO,OAAO;EACZ,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACrE,IAAI,OAAO,MAAM;GACf,oBAAA,eAAe,OAAO;GACtB,QAAQ,KAAK,CAAC;EAChB;EACA,MAAM;CACR;AACF;AAEA,KAAK,CAAC,CAAC,OAAO,UAAmB;CAC/B,QAAQ,MAAM,KAAK;CACnB,QAAQ,KAAK,CAAC;AAChB,CAAC"}
|