create-taserjs 0.1.12 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -44
- package/dist/cli-CBhdDKHU.cjs +1398 -0
- package/dist/cli-hL7a4VS0.js +1237 -0
- package/dist/cli-hL7a4VS0.js.map +1 -0
- package/dist/cli.cjs +4 -0
- package/dist/cli.d.cts +4 -0
- package/dist/cli.d.cts.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3 -0
- package/dist/index.cjs +25 -0
- package/dist/index.d.cts +119 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +119 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/package.json +39 -9
- package/src/addons/drizzle/index.ts +37 -40
- package/src/addons/kysely/index.ts +19 -22
- package/src/addons/pino/index.ts +2 -2
- package/src/addons/prisma/index.ts +18 -22
- package/src/addons/registry.ts +37 -73
- package/src/addons/types.ts +12 -13
- package/src/addons/validators.ts +22 -23
- package/src/addons/winston/index.ts +3 -3
- package/src/cli.ts +96 -56
- package/src/commands/create.ts +118 -249
- package/src/core/package-manager.ts +36 -55
- package/src/core/scaffold-engine.ts +100 -75
- package/src/core/targets.ts +19 -55
- package/src/core/types.ts +18 -53
- package/src/index.ts +8 -0
- package/src/templates/base.ts +139 -51
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +0 -23
- package/dist/cjs/addons/arktype/index.cjs +0 -6
- package/dist/cjs/addons/arktype/index.cjs.map +0 -1
- package/dist/cjs/addons/arktype/index.d.cts +0 -1
- package/dist/cjs/addons/drizzle/index.cjs +0 -131
- package/dist/cjs/addons/drizzle/index.cjs.map +0 -1
- package/dist/cjs/addons/drizzle/index.d.cts +0 -2
- package/dist/cjs/addons/kysely/index.cjs +0 -103
- package/dist/cjs/addons/kysely/index.cjs.map +0 -1
- package/dist/cjs/addons/kysely/index.d.cts +0 -2
- package/dist/cjs/addons/pino/index.cjs +0 -30
- package/dist/cjs/addons/pino/index.cjs.map +0 -1
- package/dist/cjs/addons/pino/index.d.cts +0 -2
- package/dist/cjs/addons/prisma/index.cjs +0 -133
- package/dist/cjs/addons/prisma/index.cjs.map +0 -1
- package/dist/cjs/addons/prisma/index.d.cts +0 -2
- package/dist/cjs/addons/registry.cjs +0 -65
- package/dist/cjs/addons/registry.cjs.map +0 -1
- package/dist/cjs/addons/registry.d.cts +0 -5
- package/dist/cjs/addons/types.d.cts +0 -16
- package/dist/cjs/addons/valibot/index.cjs +0 -6
- package/dist/cjs/addons/valibot/index.cjs.map +0 -1
- package/dist/cjs/addons/valibot/index.d.cts +0 -1
- package/dist/cjs/addons/validators.cjs +0 -38
- package/dist/cjs/addons/validators.cjs.map +0 -1
- package/dist/cjs/addons/validators.d.cts +0 -5
- package/dist/cjs/addons/winston/index.cjs +0 -34
- package/dist/cjs/addons/winston/index.cjs.map +0 -1
- package/dist/cjs/addons/winston/index.d.cts +0 -2
- package/dist/cjs/addons/zod/index.cjs +0 -6
- package/dist/cjs/addons/zod/index.cjs.map +0 -1
- package/dist/cjs/addons/zod/index.d.cts +0 -1
- package/dist/cjs/cli.cjs +0 -65
- package/dist/cjs/cli.cjs.map +0 -1
- package/dist/cjs/cli.d.cts +0 -2
- package/dist/cjs/commands/create.cjs +0 -332
- package/dist/cjs/commands/create.cjs.map +0 -1
- package/dist/cjs/commands/create.d.cts +0 -14
- package/dist/cjs/core/json-output.cjs +0 -16
- package/dist/cjs/core/json-output.cjs.map +0 -1
- package/dist/cjs/core/json-output.d.cts +0 -4
- package/dist/cjs/core/package-manager.cjs +0 -56
- package/dist/cjs/core/package-manager.cjs.map +0 -1
- package/dist/cjs/core/package-manager.d.cts +0 -8
- package/dist/cjs/core/parse-options.cjs +0 -95
- package/dist/cjs/core/parse-options.cjs.map +0 -1
- package/dist/cjs/core/parse-options.d.cts +0 -35
- package/dist/cjs/core/project-config.cjs +0 -23
- package/dist/cjs/core/project-config.cjs.map +0 -1
- package/dist/cjs/core/project-config.d.cts +0 -2
- package/dist/cjs/core/resolve-packages.cjs +0 -58
- package/dist/cjs/core/resolve-packages.cjs.map +0 -1
- package/dist/cjs/core/resolve-packages.d.cts +0 -2
- package/dist/cjs/core/scaffold-engine.cjs +0 -72
- package/dist/cjs/core/scaffold-engine.cjs.map +0 -1
- package/dist/cjs/core/scaffold-engine.d.cts +0 -2
- package/dist/cjs/core/targets.cjs +0 -171
- package/dist/cjs/core/targets.cjs.map +0 -1
- package/dist/cjs/core/targets.d.cts +0 -49
- package/dist/cjs/core/types.cjs +0 -52
- package/dist/cjs/core/types.cjs.map +0 -1
- package/dist/cjs/core/types.d.cts +0 -57
- package/dist/cjs/core/validate-project-name.cjs +0 -44
- package/dist/cjs/core/validate-project-name.cjs.map +0 -1
- package/dist/cjs/core/validate-project-name.d.cts +0 -1
- package/dist/cjs/frameworks/index.cjs +0 -116
- package/dist/cjs/frameworks/index.cjs.map +0 -1
- package/dist/cjs/frameworks/index.d.cts +0 -18
- package/dist/cjs/scaffold.d.cts +0 -3
- package/dist/cjs/templates/base.cjs +0 -97
- package/dist/cjs/templates/base.cjs.map +0 -1
- package/dist/cjs/templates/base.d.cts +0 -9
- package/dist/cjs/types.d.cts +0 -1
- package/dist/esm/addons/arktype/index.d.ts +0 -1
- package/dist/esm/addons/arktype/index.js +0 -7
- package/dist/esm/addons/arktype/index.js.map +0 -1
- package/dist/esm/addons/drizzle/index.d.ts +0 -2
- package/dist/esm/addons/drizzle/index.js +0 -131
- package/dist/esm/addons/drizzle/index.js.map +0 -1
- package/dist/esm/addons/kysely/index.d.ts +0 -2
- package/dist/esm/addons/kysely/index.js +0 -103
- package/dist/esm/addons/kysely/index.js.map +0 -1
- package/dist/esm/addons/pino/index.d.ts +0 -2
- package/dist/esm/addons/pino/index.js +0 -30
- package/dist/esm/addons/pino/index.js.map +0 -1
- package/dist/esm/addons/prisma/index.d.ts +0 -2
- package/dist/esm/addons/prisma/index.js +0 -133
- package/dist/esm/addons/prisma/index.js.map +0 -1
- package/dist/esm/addons/registry.d.ts +0 -5
- package/dist/esm/addons/registry.js +0 -63
- package/dist/esm/addons/registry.js.map +0 -1
- package/dist/esm/addons/types.d.ts +0 -16
- package/dist/esm/addons/valibot/index.d.ts +0 -1
- package/dist/esm/addons/valibot/index.js +0 -7
- package/dist/esm/addons/valibot/index.js.map +0 -1
- package/dist/esm/addons/validators.d.ts +0 -5
- package/dist/esm/addons/validators.js +0 -36
- package/dist/esm/addons/validators.js.map +0 -1
- package/dist/esm/addons/winston/index.d.ts +0 -2
- package/dist/esm/addons/winston/index.js +0 -34
- package/dist/esm/addons/winston/index.js.map +0 -1
- package/dist/esm/addons/zod/index.d.ts +0 -1
- package/dist/esm/addons/zod/index.js +0 -7
- package/dist/esm/addons/zod/index.js.map +0 -1
- package/dist/esm/cli.d.ts +0 -2
- package/dist/esm/cli.js +0 -62
- package/dist/esm/cli.js.map +0 -1
- package/dist/esm/commands/create.d.ts +0 -14
- package/dist/esm/commands/create.js +0 -327
- package/dist/esm/commands/create.js.map +0 -1
- package/dist/esm/core/json-output.d.ts +0 -4
- package/dist/esm/core/json-output.js +0 -14
- package/dist/esm/core/json-output.js.map +0 -1
- package/dist/esm/core/package-manager.d.ts +0 -8
- package/dist/esm/core/package-manager.js +0 -53
- package/dist/esm/core/package-manager.js.map +0 -1
- package/dist/esm/core/parse-options.d.ts +0 -35
- package/dist/esm/core/parse-options.js +0 -89
- package/dist/esm/core/parse-options.js.map +0 -1
- package/dist/esm/core/project-config.d.ts +0 -2
- package/dist/esm/core/project-config.js +0 -21
- package/dist/esm/core/project-config.js.map +0 -1
- package/dist/esm/core/resolve-packages.d.ts +0 -2
- package/dist/esm/core/resolve-packages.js +0 -58
- package/dist/esm/core/resolve-packages.js.map +0 -1
- package/dist/esm/core/scaffold-engine.d.ts +0 -2
- package/dist/esm/core/scaffold-engine.js +0 -70
- package/dist/esm/core/scaffold-engine.js.map +0 -1
- package/dist/esm/core/targets.d.ts +0 -49
- package/dist/esm/core/targets.js +0 -166
- package/dist/esm/core/targets.js.map +0 -1
- package/dist/esm/core/types.d.ts +0 -57
- package/dist/esm/core/types.js +0 -45
- package/dist/esm/core/types.js.map +0 -1
- package/dist/esm/core/validate-project-name.d.ts +0 -1
- package/dist/esm/core/validate-project-name.js +0 -42
- package/dist/esm/core/validate-project-name.js.map +0 -1
- package/dist/esm/frameworks/index.d.ts +0 -18
- package/dist/esm/frameworks/index.js +0 -112
- package/dist/esm/frameworks/index.js.map +0 -1
- package/dist/esm/scaffold.d.ts +0 -3
- package/dist/esm/templates/base.d.ts +0 -9
- package/dist/esm/templates/base.js +0 -91
- package/dist/esm/templates/base.js.map +0 -1
- package/dist/esm/types.d.ts +0 -1
- package/src/addons/arktype/index.ts +0 -3
- package/src/addons/valibot/index.ts +0 -3
- package/src/addons/zod/index.ts +0 -3
- package/src/core/json-output.ts +0 -13
- package/src/core/parse-options.ts +0 -167
- package/src/core/project-config.ts +0 -32
- package/src/core/resolve-packages.ts +0 -69
- package/src/core/validate-project-name.ts +0 -55
- package/src/frameworks/index.ts +0 -120
- package/src/scaffold.ts +0 -3
- package/src/types.ts +0 -12
|
@@ -4,29 +4,29 @@ import type { DbDriver } from "../../core/types.js";
|
|
|
4
4
|
function schemaSource(driver: DbDriver): string {
|
|
5
5
|
switch (driver) {
|
|
6
6
|
case "postgres":
|
|
7
|
-
return `import { pgTable, serial, text } from
|
|
7
|
+
return `import { pgTable, serial, text } from "drizzle-orm/pg-core";
|
|
8
8
|
|
|
9
|
-
export const users = pgTable(
|
|
10
|
-
id: serial(
|
|
11
|
-
email: text(
|
|
12
|
-
})
|
|
9
|
+
export const users = pgTable("users", {
|
|
10
|
+
id: serial("id").primaryKey(),
|
|
11
|
+
email: text("email").notNull(),
|
|
12
|
+
});
|
|
13
13
|
`;
|
|
14
14
|
case "mysql":
|
|
15
|
-
return `import { mysqlTable, serial, varchar } from
|
|
15
|
+
return `import { mysqlTable, serial, varchar } from "drizzle-orm/mysql-core";
|
|
16
16
|
|
|
17
|
-
export const users = mysqlTable(
|
|
18
|
-
id: serial(
|
|
19
|
-
email: varchar(
|
|
20
|
-
})
|
|
17
|
+
export const users = mysqlTable("users", {
|
|
18
|
+
id: serial("id").primaryKey(),
|
|
19
|
+
email: varchar("email", { length: 255 }).notNull(),
|
|
20
|
+
});
|
|
21
21
|
`;
|
|
22
22
|
case "sqlite":
|
|
23
23
|
default:
|
|
24
|
-
return `import { sqliteTable, integer, text } from
|
|
24
|
+
return `import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core";
|
|
25
25
|
|
|
26
|
-
export const users = sqliteTable(
|
|
27
|
-
id: integer(
|
|
28
|
-
email: text(
|
|
29
|
-
})
|
|
26
|
+
export const users = sqliteTable("users", {
|
|
27
|
+
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
28
|
+
email: text("email").notNull(),
|
|
29
|
+
});
|
|
30
30
|
`;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -34,40 +34,37 @@ export const users = sqliteTable('users', {
|
|
|
34
34
|
function dbIndexSource(driver: DbDriver): string {
|
|
35
35
|
switch (driver) {
|
|
36
36
|
case "postgres":
|
|
37
|
-
return `import { drizzle } from
|
|
38
|
-
import pg from
|
|
39
|
-
|
|
40
|
-
import * as schema from './schema.js'
|
|
37
|
+
return `import { drizzle } from "drizzle-orm/node-postgres";
|
|
38
|
+
import pg from "pg";
|
|
39
|
+
import * as schema from "./schema.js";
|
|
41
40
|
|
|
42
41
|
export function createDb() {
|
|
43
42
|
const pool = new pg.Pool({
|
|
44
43
|
connectionString: process.env.DATABASE_URL,
|
|
45
|
-
})
|
|
46
|
-
return drizzle(pool, { schema })
|
|
44
|
+
});
|
|
45
|
+
return drizzle(pool, { schema });
|
|
47
46
|
}
|
|
48
47
|
`;
|
|
49
48
|
case "mysql":
|
|
50
|
-
return `import { drizzle } from
|
|
51
|
-
import mysql from
|
|
52
|
-
|
|
53
|
-
import * as schema from './schema.js'
|
|
49
|
+
return `import { drizzle } from "drizzle-orm/mysql2";
|
|
50
|
+
import mysql from "mysql2/promise";
|
|
51
|
+
import * as schema from "./schema.js";
|
|
54
52
|
|
|
55
53
|
export function createDb() {
|
|
56
|
-
const pool = mysql.createPool(process.env.DATABASE_URL ??
|
|
57
|
-
return drizzle(pool, { schema, mode:
|
|
54
|
+
const pool = mysql.createPool(process.env.DATABASE_URL ?? "");
|
|
55
|
+
return drizzle(pool, { schema, mode: "default" });
|
|
58
56
|
}
|
|
59
57
|
`;
|
|
60
58
|
case "sqlite":
|
|
61
59
|
default:
|
|
62
|
-
return `import Database from
|
|
63
|
-
import { drizzle } from
|
|
64
|
-
|
|
65
|
-
import * as schema from './schema.js'
|
|
60
|
+
return `import Database from "better-sqlite3";
|
|
61
|
+
import { drizzle } from "drizzle-orm/better-sqlite3";
|
|
62
|
+
import * as schema from "./schema.js";
|
|
66
63
|
|
|
67
64
|
export function createDb() {
|
|
68
|
-
const filePath = (process.env.DATABASE_URL ??
|
|
69
|
-
const client = new Database(filePath)
|
|
70
|
-
return drizzle(client, { schema })
|
|
65
|
+
const filePath = (process.env.DATABASE_URL ?? "file:./local.db").replace(/^file:/, "");
|
|
66
|
+
const client = new Database(filePath);
|
|
67
|
+
return drizzle(client, { schema });
|
|
71
68
|
}
|
|
72
69
|
`;
|
|
73
70
|
}
|
|
@@ -75,16 +72,16 @@ export function createDb() {
|
|
|
75
72
|
|
|
76
73
|
function drizzleConfigSource(driver: DbDriver): string {
|
|
77
74
|
const dialect = driver === "postgres" ? "postgresql" : driver === "mysql" ? "mysql" : "sqlite";
|
|
78
|
-
return `import { defineConfig } from
|
|
75
|
+
return `import { defineConfig } from "drizzle-kit";
|
|
79
76
|
|
|
80
77
|
export default defineConfig({
|
|
81
|
-
schema:
|
|
82
|
-
out:
|
|
83
|
-
dialect:
|
|
78
|
+
schema: "./src/db/schema.ts",
|
|
79
|
+
out: "./drizzle",
|
|
80
|
+
dialect: "${dialect}",
|
|
84
81
|
dbCredentials: {
|
|
85
|
-
url: process.env.DATABASE_URL ??
|
|
82
|
+
url: process.env.DATABASE_URL ?? "",
|
|
86
83
|
},
|
|
87
|
-
})
|
|
84
|
+
});
|
|
88
85
|
`;
|
|
89
86
|
}
|
|
90
87
|
|
|
@@ -3,12 +3,12 @@ import type { DbDriver } from "../../core/types.js";
|
|
|
3
3
|
|
|
4
4
|
function schemaTypesSource(): string {
|
|
5
5
|
return `export interface UserTable {
|
|
6
|
-
id: number
|
|
7
|
-
email: string
|
|
6
|
+
id: number;
|
|
7
|
+
email: string;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export interface DB {
|
|
11
|
-
users: UserTable
|
|
11
|
+
users: UserTable;
|
|
12
12
|
}
|
|
13
13
|
`;
|
|
14
14
|
}
|
|
@@ -16,46 +16,43 @@ export interface DB {
|
|
|
16
16
|
function dbIndexSource(driver: DbDriver): string {
|
|
17
17
|
switch (driver) {
|
|
18
18
|
case "postgres":
|
|
19
|
-
return `import { Kysely, PostgresDialect } from
|
|
20
|
-
import pg from
|
|
21
|
-
|
|
22
|
-
import type { DB } from './schema.js'
|
|
19
|
+
return `import { Kysely, PostgresDialect } from "kysely";
|
|
20
|
+
import pg from "pg";
|
|
21
|
+
import type { DB } from "./schema.js";
|
|
23
22
|
|
|
24
23
|
export function createDb() {
|
|
25
24
|
const pool = new pg.Pool({
|
|
26
25
|
connectionString: process.env.DATABASE_URL,
|
|
27
|
-
})
|
|
26
|
+
});
|
|
28
27
|
return new Kysely<DB>({
|
|
29
28
|
dialect: new PostgresDialect({ pool }),
|
|
30
|
-
})
|
|
29
|
+
});
|
|
31
30
|
}
|
|
32
31
|
`;
|
|
33
32
|
case "mysql":
|
|
34
|
-
return `import { Kysely, MysqlDialect } from
|
|
35
|
-
import { createPool } from
|
|
36
|
-
|
|
37
|
-
import type { DB } from './schema.js'
|
|
33
|
+
return `import { Kysely, MysqlDialect } from "kysely";
|
|
34
|
+
import { createPool } from "mysql2";
|
|
35
|
+
import type { DB } from "./schema.js";
|
|
38
36
|
|
|
39
37
|
export function createDb() {
|
|
40
|
-
const pool = createPool(process.env.DATABASE_URL ??
|
|
38
|
+
const pool = createPool(process.env.DATABASE_URL ?? "");
|
|
41
39
|
return new Kysely<DB>({
|
|
42
40
|
dialect: new MysqlDialect({ pool }),
|
|
43
|
-
})
|
|
41
|
+
});
|
|
44
42
|
}
|
|
45
43
|
`;
|
|
46
44
|
case "sqlite":
|
|
47
45
|
default:
|
|
48
|
-
return `import Database from
|
|
49
|
-
import { Kysely, SqliteDialect } from
|
|
50
|
-
|
|
51
|
-
import type { DB } from './schema.js'
|
|
46
|
+
return `import Database from "better-sqlite3";
|
|
47
|
+
import { Kysely, SqliteDialect } from "kysely";
|
|
48
|
+
import type { DB } from "./schema.js";
|
|
52
49
|
|
|
53
50
|
export function createDb() {
|
|
54
|
-
const filePath = (process.env.DATABASE_URL ??
|
|
55
|
-
const database = new Database(filePath)
|
|
51
|
+
const filePath = (process.env.DATABASE_URL ?? "file:./local.db").replace(/^file:/, "");
|
|
52
|
+
const database = new Database(filePath);
|
|
56
53
|
return new Kysely<DB>({
|
|
57
54
|
dialect: new SqliteDialect({ database }),
|
|
58
|
-
})
|
|
55
|
+
});
|
|
59
56
|
}
|
|
60
57
|
`;
|
|
61
58
|
}
|
package/src/addons/pino/index.ts
CHANGED
|
@@ -19,10 +19,10 @@ export const pinoAddon: AddonDefinition = {
|
|
|
19
19
|
async apply(_ctx, write) {
|
|
20
20
|
await write(
|
|
21
21
|
"src/logger.ts",
|
|
22
|
-
`import pino from
|
|
22
|
+
`import pino from "pino";
|
|
23
23
|
|
|
24
24
|
export function createLogger() {
|
|
25
|
-
return pino({ level: process.env.LOG_LEVEL ??
|
|
25
|
+
return pino({ level: process.env.LOG_LEVEL ?? "info" });
|
|
26
26
|
}
|
|
27
27
|
`,
|
|
28
28
|
);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { AddonDefinition } from "../types.js";
|
|
2
2
|
import type { DbDriver } from "../../core/types.js";
|
|
3
3
|
|
|
4
|
-
/** Latest Prisma ORM v7 release line — keep all @prisma/* packages on this range. */
|
|
5
4
|
const PRISMA_VERSION = "^7.10.0";
|
|
6
5
|
|
|
7
6
|
function prismaPackage(name: string): string {
|
|
@@ -59,53 +58,50 @@ function driverDevPackages(driver: DbDriver): string[] {
|
|
|
59
58
|
function dbIndexSource(driver: DbDriver): string {
|
|
60
59
|
switch (driver) {
|
|
61
60
|
case "postgres":
|
|
62
|
-
return `import { PrismaPg } from
|
|
63
|
-
|
|
64
|
-
import { PrismaClient } from './prisma/client.js'
|
|
61
|
+
return `import { PrismaPg } from "@prisma/adapter-pg";
|
|
62
|
+
import { PrismaClient } from "./prisma/client.js";
|
|
65
63
|
|
|
66
64
|
export function createDb() {
|
|
67
65
|
const adapter = new PrismaPg({
|
|
68
66
|
connectionString: process.env.DATABASE_URL,
|
|
69
|
-
})
|
|
70
|
-
return new PrismaClient({ adapter })
|
|
67
|
+
});
|
|
68
|
+
return new PrismaClient({ adapter });
|
|
71
69
|
}
|
|
72
70
|
`;
|
|
73
71
|
case "mysql":
|
|
74
|
-
return `import { PrismaMariaDb } from
|
|
75
|
-
|
|
76
|
-
import { PrismaClient } from './prisma/client.js'
|
|
72
|
+
return `import { PrismaMariaDb } from "@prisma/adapter-mariadb";
|
|
73
|
+
import { PrismaClient } from "./prisma/client.js";
|
|
77
74
|
|
|
78
75
|
export function createDb() {
|
|
79
|
-
const adapter = new PrismaMariaDb(process.env.DATABASE_URL ??
|
|
80
|
-
return new PrismaClient({ adapter })
|
|
76
|
+
const adapter = new PrismaMariaDb(process.env.DATABASE_URL ?? "mariadb://root:@localhost:3306/mydb");
|
|
77
|
+
return new PrismaClient({ adapter });
|
|
81
78
|
}
|
|
82
79
|
`;
|
|
83
80
|
case "sqlite":
|
|
84
81
|
default:
|
|
85
|
-
return `import { PrismaBetterSqlite3 } from
|
|
86
|
-
|
|
87
|
-
import { PrismaClient } from './prisma/client.js'
|
|
82
|
+
return `import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
|
|
83
|
+
import { PrismaClient } from "./prisma/client.js";
|
|
88
84
|
|
|
89
85
|
export function createDb() {
|
|
90
86
|
const adapter = new PrismaBetterSqlite3({
|
|
91
|
-
url: process.env.DATABASE_URL ??
|
|
92
|
-
})
|
|
93
|
-
return new PrismaClient({ adapter })
|
|
87
|
+
url: process.env.DATABASE_URL ?? "file:./local.db",
|
|
88
|
+
});
|
|
89
|
+
return new PrismaClient({ adapter });
|
|
94
90
|
}
|
|
95
91
|
`;
|
|
96
92
|
}
|
|
97
93
|
}
|
|
98
94
|
|
|
99
95
|
function prismaConfigSource(): string {
|
|
100
|
-
return `import
|
|
101
|
-
import { defineConfig, env } from
|
|
96
|
+
return `import "dotenv/config";
|
|
97
|
+
import { defineConfig, env } from "prisma/config";
|
|
102
98
|
|
|
103
99
|
export default defineConfig({
|
|
104
|
-
schema:
|
|
100
|
+
schema: "prisma/schema.prisma",
|
|
105
101
|
datasource: {
|
|
106
|
-
url: env(
|
|
102
|
+
url: env("DATABASE_URL"),
|
|
107
103
|
},
|
|
108
|
-
})
|
|
104
|
+
});
|
|
109
105
|
`;
|
|
110
106
|
}
|
|
111
107
|
|
package/src/addons/registry.ts
CHANGED
|
@@ -1,86 +1,50 @@
|
|
|
1
|
-
import { arktypeAddon } from "./arktype/index.js";
|
|
2
1
|
import { drizzleAddon } from "./drizzle/index.js";
|
|
3
2
|
import { kyselyAddon } from "./kysely/index.js";
|
|
4
3
|
import { pinoAddon } from "./pino/index.js";
|
|
5
4
|
import { prismaAddon } from "./prisma/index.js";
|
|
6
|
-
import {
|
|
5
|
+
import type { AddonDefinition, BootBinding } from "./types.js";
|
|
6
|
+
import { ValidatorAddon } from "./validators.js";
|
|
7
7
|
import { winstonAddon } from "./winston/index.js";
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
} from "../core/types.js";
|
|
21
|
-
|
|
22
|
-
const ALL_ADDONS: AddonDefinition[] = [
|
|
23
|
-
drizzleAddon,
|
|
24
|
-
prismaAddon,
|
|
25
|
-
kyselyAddon,
|
|
26
|
-
pinoAddon,
|
|
27
|
-
winstonAddon,
|
|
28
|
-
zodAddon,
|
|
29
|
-
arktypeAddon,
|
|
30
|
-
valibotAddon,
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
const DB_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "database");
|
|
34
|
-
const LOGGER_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "logger");
|
|
35
|
-
const VALIDATOR_ADDONS = ALL_ADDONS.filter((addon) => addon.category === "validator");
|
|
36
|
-
|
|
37
|
-
export function getCapabilitiesCatalog(): CapabilitiesCatalog {
|
|
38
|
-
return {
|
|
39
|
-
frameworks: [...FRAMEWORKS],
|
|
40
|
-
deployTargets: [...DEPLOY_TARGETS],
|
|
41
|
-
runtimes: [...RUNTIMES],
|
|
42
|
-
db: {
|
|
43
|
-
odms: [...DB_ODMS],
|
|
44
|
-
drivers: [...DB_DRIVERS],
|
|
45
|
-
defaultDriver: DEFAULT_DB_DRIVER,
|
|
46
|
-
},
|
|
47
|
-
loggers: [...LOGGERS],
|
|
48
|
-
validators: [...VALIDATORS],
|
|
49
|
-
};
|
|
50
|
-
}
|
|
8
|
+
import type { ScaffoldContext } from "../core/types.js";
|
|
9
|
+
|
|
10
|
+
export const ADDONS: Record<string, AddonDefinition> = {
|
|
11
|
+
drizzle: drizzleAddon,
|
|
12
|
+
prisma: prismaAddon,
|
|
13
|
+
kysely: kyselyAddon,
|
|
14
|
+
pino: pinoAddon,
|
|
15
|
+
winston: winstonAddon,
|
|
16
|
+
zod: ValidatorAddon("zod"),
|
|
17
|
+
arktype: ValidatorAddon("arktype"),
|
|
18
|
+
valibot: ValidatorAddon("valibot"),
|
|
19
|
+
};
|
|
51
20
|
|
|
52
21
|
export function resolveAddons(ctx: ScaffoldContext): AddonDefinition[] {
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (!dbAddon) {
|
|
58
|
-
throw new Error(`Unknown database addon "${ctx.db}"`);
|
|
59
|
-
}
|
|
60
|
-
selected.push(dbAddon);
|
|
22
|
+
const result: AddonDefinition[] = [];
|
|
23
|
+
if (ctx.db && ADDONS[ctx.db]) {
|
|
24
|
+
const addon = ADDONS[ctx.db];
|
|
25
|
+
if (addon) result.push(addon);
|
|
61
26
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (!loggerAddon) {
|
|
66
|
-
throw new Error(`Unknown logger addon "${ctx.logger}"`);
|
|
67
|
-
}
|
|
68
|
-
selected.push(loggerAddon);
|
|
27
|
+
if (ctx.logger && ADDONS[ctx.logger]) {
|
|
28
|
+
const addon = ADDONS[ctx.logger];
|
|
29
|
+
if (addon) result.push(addon);
|
|
69
30
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (!validatorAddon) {
|
|
74
|
-
throw new Error(`Unknown validator addon "${ctx.validator}"`);
|
|
75
|
-
}
|
|
76
|
-
selected.push(validatorAddon);
|
|
31
|
+
if (ctx.validator && ADDONS[ctx.validator]) {
|
|
32
|
+
const addon = ADDONS[ctx.validator];
|
|
33
|
+
if (addon) result.push(addon);
|
|
77
34
|
}
|
|
78
|
-
|
|
79
|
-
return selected;
|
|
35
|
+
return result;
|
|
80
36
|
}
|
|
81
37
|
|
|
82
|
-
export function collectBootBindings(ctx: ScaffoldContext) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
38
|
+
export function collectBootBindings(ctx: ScaffoldContext): BootBinding[] {
|
|
39
|
+
const addons = resolveAddons(ctx);
|
|
40
|
+
const bindings: BootBinding[] = [];
|
|
41
|
+
for (const addon of addons) {
|
|
42
|
+
if (addon.bootBinding) {
|
|
43
|
+
const binding = addon.bootBinding(ctx);
|
|
44
|
+
if (binding) {
|
|
45
|
+
bindings.push(binding);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return bindings;
|
|
86
50
|
}
|
package/src/addons/types.ts
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export type BootBinding = {
|
|
1
|
+
export interface BootBinding {
|
|
4
2
|
key: string;
|
|
5
3
|
importPath: string;
|
|
6
4
|
factoryName: string;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export type FileWriter = (filePath: string, contents: string) => Promise<void>;
|
|
5
|
+
}
|
|
10
6
|
|
|
11
|
-
export
|
|
7
|
+
export interface AddonDefinition {
|
|
12
8
|
id: string;
|
|
13
9
|
category: "database" | "logger" | "validator";
|
|
14
|
-
dependencies
|
|
15
|
-
devDependencies
|
|
16
|
-
scripts
|
|
17
|
-
bootBinding
|
|
18
|
-
apply
|
|
19
|
-
|
|
10
|
+
dependencies(ctx: import("../core/types.js").ScaffoldContext): string[];
|
|
11
|
+
devDependencies(ctx: import("../core/types.js").ScaffoldContext): string[];
|
|
12
|
+
scripts?(ctx: import("../core/types.js").ScaffoldContext): Record<string, string>;
|
|
13
|
+
bootBinding?(ctx: import("../core/types.js").ScaffoldContext): BootBinding | undefined;
|
|
14
|
+
apply(
|
|
15
|
+
ctx: import("../core/types.js").ScaffoldContext,
|
|
16
|
+
write: (path: string, content: string) => Promise<void> | void,
|
|
17
|
+
): Promise<void>;
|
|
18
|
+
}
|
package/src/addons/validators.ts
CHANGED
|
@@ -1,37 +1,36 @@
|
|
|
1
|
-
import type { ValidatorId } from "../core/types";
|
|
2
|
-
import type { AddonDefinition } from "./types";
|
|
1
|
+
import type { ValidatorId } from "../core/types.js";
|
|
2
|
+
import type { AddonDefinition } from "./types.js";
|
|
3
3
|
|
|
4
4
|
export const IMPORT_LINES: Record<ValidatorId, string> = {
|
|
5
|
-
zod: `import { z } from
|
|
6
|
-
arktype: `import { type } from
|
|
7
|
-
valibot: `import * as v from
|
|
5
|
+
zod: `import { z } from "zod";`,
|
|
6
|
+
arktype: `import { type } from "arktype";`,
|
|
7
|
+
valibot: `import * as v from "valibot";`,
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
export const
|
|
11
|
-
zod: `
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
.query(type({ 'name?': 'string = "Taser.js"' }))`,
|
|
15
|
-
valibot: `
|
|
16
|
-
.query(v.object({ name: v.optional(v.string(), 'Taser.js') }))`,
|
|
10
|
+
export const QUERY_SCHEMA_EXPR: Record<ValidatorId, string> = {
|
|
11
|
+
zod: `z.object({ name: z.string().default("Taser.js") })`,
|
|
12
|
+
arktype: `type({ "name?": 'string = "Taser.js"' })`,
|
|
13
|
+
valibot: `v.object({ name: v.optional(v.string(), "Taser.js") })`,
|
|
17
14
|
};
|
|
18
15
|
|
|
19
|
-
const ROUTE_TEMPLATE = (validator: ValidatorId) => `import { t } from '@taserjs/router'
|
|
20
|
-
import { json } from '@taserjs/router/reply'
|
|
21
|
-
${IMPORT_LINES[validator]}
|
|
22
|
-
|
|
23
|
-
export default t.get('/')${VALIDATION_BLOCK_TEMPLATE[validator]}
|
|
24
|
-
.handler((ctx) => {
|
|
25
|
-
return json({ message: \`Hello, \${ctx.query.name}!\` })
|
|
26
|
-
})
|
|
27
|
-
`;
|
|
28
|
-
|
|
29
16
|
export const ValidatorAddon = (validator: ValidatorId): AddonDefinition => {
|
|
30
17
|
return {
|
|
31
18
|
id: validator,
|
|
32
19
|
category: "validator",
|
|
33
20
|
dependencies: () => [validator],
|
|
34
21
|
devDependencies: () => [],
|
|
35
|
-
apply: (
|
|
22
|
+
apply: async (_ctx, write) => {
|
|
23
|
+
const content = `import { t } from "@taserjs/router";
|
|
24
|
+
${IMPORT_LINES[validator]}
|
|
25
|
+
|
|
26
|
+
export default t
|
|
27
|
+
.get("/")
|
|
28
|
+
.query(${QUERY_SCHEMA_EXPR[validator]})
|
|
29
|
+
.handler(({ req }) => {
|
|
30
|
+
return Response.json({ message: \`Hello, \${req.query.name}!\` });
|
|
31
|
+
});
|
|
32
|
+
`;
|
|
33
|
+
await write("src/routes/index.get.ts", content);
|
|
34
|
+
},
|
|
36
35
|
};
|
|
37
36
|
};
|
|
@@ -19,14 +19,14 @@ export const winstonAddon: AddonDefinition = {
|
|
|
19
19
|
async apply(_ctx, write) {
|
|
20
20
|
await write(
|
|
21
21
|
"src/logger.ts",
|
|
22
|
-
`import winston from
|
|
22
|
+
`import winston from "winston";
|
|
23
23
|
|
|
24
24
|
export function createLogger() {
|
|
25
25
|
return winston.createLogger({
|
|
26
|
-
level: process.env.LOG_LEVEL ??
|
|
26
|
+
level: process.env.LOG_LEVEL ?? "info",
|
|
27
27
|
format: winston.format.json(),
|
|
28
28
|
transports: [new winston.transports.Console()],
|
|
29
|
-
})
|
|
29
|
+
});
|
|
30
30
|
}
|
|
31
31
|
`,
|
|
32
32
|
);
|