duronto 0.0.0-stage → 0.1.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.
Files changed (98) hide show
  1. package/README.md +22 -2
  2. package/dist/cli/commands/check.d.ts +2 -0
  3. package/dist/cli/commands/check.d.ts.map +1 -0
  4. package/dist/cli/commands/check.js +22 -0
  5. package/dist/cli/commands/check.js.map +1 -0
  6. package/dist/cli/commands/diff.d.ts +2 -0
  7. package/dist/cli/commands/diff.d.ts.map +1 -0
  8. package/dist/cli/commands/diff.js +26 -0
  9. package/dist/cli/commands/diff.js.map +1 -0
  10. package/dist/cli/commands/generate.d.ts +6 -0
  11. package/dist/cli/commands/generate.d.ts.map +1 -0
  12. package/dist/cli/commands/generate.js +51 -0
  13. package/dist/cli/commands/generate.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +2 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -0
  16. package/dist/cli/commands/init.js +36 -0
  17. package/dist/cli/commands/init.js.map +1 -0
  18. package/dist/cli/commands/sql.d.ts +2 -0
  19. package/dist/cli/commands/sql.d.ts.map +1 -0
  20. package/dist/cli/commands/sql.js +24 -0
  21. package/dist/cli/commands/sql.js.map +1 -0
  22. package/dist/cli/commands/types.d.ts +2 -0
  23. package/dist/cli/commands/types.d.ts.map +1 -0
  24. package/dist/cli/commands/types.js +32 -0
  25. package/dist/cli/commands/types.js.map +1 -0
  26. package/dist/cli/config.d.ts +9 -0
  27. package/dist/cli/config.d.ts.map +1 -0
  28. package/dist/cli/config.js +29 -0
  29. package/dist/cli/config.js.map +1 -0
  30. package/dist/cli/index.d.ts +3 -0
  31. package/dist/cli/index.d.ts.map +1 -0
  32. package/dist/cli/index.js +61 -0
  33. package/dist/cli/index.js.map +1 -0
  34. package/dist/compiler/compile.d.ts +5 -0
  35. package/dist/compiler/compile.d.ts.map +1 -0
  36. package/dist/compiler/compile.js +221 -0
  37. package/dist/compiler/compile.js.map +1 -0
  38. package/dist/compiler/validate.d.ts +23 -0
  39. package/dist/compiler/validate.d.ts.map +1 -0
  40. package/dist/compiler/validate.js +68 -0
  41. package/dist/compiler/validate.js.map +1 -0
  42. package/dist/core/column.d.ts +55 -0
  43. package/dist/core/column.d.ts.map +1 -0
  44. package/dist/core/column.js +122 -0
  45. package/dist/core/column.js.map +1 -0
  46. package/dist/core/errors.d.ts +7 -0
  47. package/dist/core/errors.d.ts.map +1 -0
  48. package/dist/core/errors.js +15 -0
  49. package/dist/core/errors.js.map +1 -0
  50. package/dist/core/ir.d.ts +57 -0
  51. package/dist/core/ir.d.ts.map +1 -0
  52. package/dist/core/ir.js +2 -0
  53. package/dist/core/ir.js.map +1 -0
  54. package/dist/core/naming.d.ts +2 -0
  55. package/dist/core/naming.d.ts.map +1 -0
  56. package/dist/core/naming.js +8 -0
  57. package/dist/core/naming.js.map +1 -0
  58. package/dist/core/table.d.ts +40 -0
  59. package/dist/core/table.d.ts.map +1 -0
  60. package/dist/core/table.js +75 -0
  61. package/dist/core/table.js.map +1 -0
  62. package/dist/core/types.d.ts +16 -0
  63. package/dist/core/types.d.ts.map +1 -0
  64. package/dist/core/types.js +2 -0
  65. package/dist/core/types.js.map +1 -0
  66. package/dist/dialects/postgres/index.d.ts +3 -0
  67. package/dist/dialects/postgres/index.d.ts.map +1 -0
  68. package/dist/dialects/postgres/index.js +156 -0
  69. package/dist/dialects/postgres/index.js.map +1 -0
  70. package/dist/dialects/sqlite/index.d.ts +13 -0
  71. package/dist/dialects/sqlite/index.d.ts.map +1 -0
  72. package/dist/dialects/sqlite/index.js +218 -0
  73. package/dist/dialects/sqlite/index.js.map +1 -0
  74. package/dist/dialects/types.d.ts +10 -0
  75. package/dist/dialects/types.d.ts.map +1 -0
  76. package/dist/dialects/types.js +2 -0
  77. package/dist/dialects/types.js.map +1 -0
  78. package/dist/diff/diff.d.ts +4 -0
  79. package/dist/diff/diff.d.ts.map +1 -0
  80. package/dist/diff/diff.js +102 -0
  81. package/dist/diff/diff.js.map +1 -0
  82. package/dist/diff/index.d.ts +3 -0
  83. package/dist/diff/index.d.ts.map +1 -0
  84. package/dist/diff/index.js +3 -0
  85. package/dist/diff/index.js.map +1 -0
  86. package/dist/diff/types.d.ts +60 -0
  87. package/dist/diff/types.d.ts.map +1 -0
  88. package/dist/diff/types.js +2 -0
  89. package/dist/diff/types.js.map +1 -0
  90. package/dist/index.d.ts +20 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +22 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/snapshot.d.ts +6 -0
  95. package/dist/snapshot.d.ts.map +1 -0
  96. package/dist/snapshot.js +29 -0
  97. package/dist/snapshot.js.map +1 -0
  98. package/package.json +40 -3
package/README.md CHANGED
@@ -1,3 +1,23 @@
1
- # Temporary Holding Version
1
+ # duronto
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Development-time-only tool for designing database schemas in TypeScript and converting them to SQL.
4
+
5
+ - Write schemas in a simple, strictly typed TypeScript API.
6
+ - CLI turns them into SQL (`CREATE TABLE`, `ALTER TABLE`, ...) and TypeScript types.
7
+ - Installed as a `devDependency`; nothing ships in the production bundle.
8
+
9
+ ## Quick start
10
+
11
+ ```bash
12
+ npm i -D duronto
13
+ npx duronto init
14
+ npx duronto sql
15
+ ```
16
+
17
+ ## Documentation
18
+
19
+ See the [`docs/`](./docs) folder.
20
+
21
+ ## License
22
+
23
+ MIT
@@ -0,0 +1,2 @@
1
+ export declare function runCheck(cwd?: string): Promise<boolean>;
2
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AASA,wBAAsB,QAAQ,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAW5E"}
@@ -0,0 +1,22 @@
1
+ import path from "node:path";
2
+ import { existsSync } from "node:fs";
3
+ import { pathToFileURL } from "node:url";
4
+ import { createJiti } from "jiti";
5
+ import { loadConfig } from "../config.js";
6
+ import { compileSchema } from "../../compiler/compile.js";
7
+ import { diff } from "../../diff/diff.js";
8
+ import { loadSnapshot } from "../../snapshot.js";
9
+ export async function runCheck(cwd = process.cwd()) {
10
+ const cfg = await loadConfig(cwd);
11
+ const schemaPath = path.resolve(cwd, cfg.schema);
12
+ if (!existsSync(schemaPath))
13
+ throw new Error(`Schema file not found: ${schemaPath}`);
14
+ const jiti = createJiti(pathToFileURL(schemaPath).href, { moduleCache: false });
15
+ const mod = (await jiti.import(schemaPath));
16
+ const ir = compileSchema(mod);
17
+ const outDir = path.resolve(cwd, cfg.out);
18
+ const oldIR = loadSnapshot(outDir);
19
+ const result = diff(oldIR, ir);
20
+ return result.ops.length === 0;
21
+ }
22
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACxD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAA4B,CAAC;IACvE,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runDiff(cwd?: string, json?: boolean): Promise<string>;
2
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"AASA,wBAAsB,OAAO,CAAC,GAAG,GAAE,MAAsB,EAAE,IAAI,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAajG"}
@@ -0,0 +1,26 @@
1
+ import path from "node:path";
2
+ import { existsSync } from "node:fs";
3
+ import { pathToFileURL } from "node:url";
4
+ import { createJiti } from "jiti";
5
+ import { loadConfig } from "../config.js";
6
+ import { compileSchema } from "../../compiler/compile.js";
7
+ import { diff } from "../../diff/diff.js";
8
+ import { loadSnapshot } from "../../snapshot.js";
9
+ export async function runDiff(cwd = process.cwd(), json = false) {
10
+ const cfg = await loadConfig(cwd);
11
+ const schemaPath = path.resolve(cwd, cfg.schema);
12
+ if (!existsSync(schemaPath))
13
+ throw new Error(`Schema file not found: ${schemaPath}`);
14
+ const jiti = createJiti(pathToFileURL(schemaPath).href, { moduleCache: false });
15
+ const mod = (await jiti.import(schemaPath));
16
+ const ir = compileSchema(mod);
17
+ const outDir = path.resolve(cwd, cfg.out);
18
+ const oldIR = loadSnapshot(outDir);
19
+ const result = diff(oldIR, ir);
20
+ if (json)
21
+ return JSON.stringify({ ops: result.ops }, null, 2) + "\n";
22
+ if (result.ops.length === 0)
23
+ return "No pending changes.\n";
24
+ return result.ops.map((o) => `${o.kind}`).join("\n") + "\n";
25
+ }
26
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/cli/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,OAAgB,KAAK;IAC9E,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAA4B,CAAC;IACvE,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACrE,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,uBAAuB,CAAC;IAC5D,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface GenerateOptions {
2
+ name?: string;
3
+ allowDestructive?: boolean;
4
+ }
5
+ export declare function runGenerate(cwd?: string, opts?: GenerateOptions): Promise<string>;
6
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,WAAW,CAAC,GAAG,GAAE,MAAsB,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8C1G"}
@@ -0,0 +1,51 @@
1
+ import path from "node:path";
2
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { pathToFileURL } from "node:url";
4
+ import { createJiti } from "jiti";
5
+ import { loadConfig } from "../config.js";
6
+ import { compileSchema } from "../../compiler/compile.js";
7
+ import { diff } from "../../diff/diff.js";
8
+ import { getDialect } from "../../index.js";
9
+ import { loadSnapshot, saveSnapshot, nextMigrationNumber } from "../../snapshot.js";
10
+ export async function runGenerate(cwd = process.cwd(), opts = {}) {
11
+ const cfg = await loadConfig(cwd);
12
+ const schemaPath = path.resolve(cwd, cfg.schema);
13
+ if (!existsSync(schemaPath))
14
+ throw new Error(`Schema file not found: ${schemaPath}`);
15
+ const jiti = createJiti(pathToFileURL(schemaPath).href, { moduleCache: false });
16
+ const mod = (await jiti.import(schemaPath));
17
+ const ir = compileSchema(mod);
18
+ const outDir = path.resolve(cwd, cfg.out);
19
+ mkdirSync(outDir, { recursive: true });
20
+ const oldIR = loadSnapshot(outDir);
21
+ const result = diff(oldIR, ir);
22
+ if (result.destructive && !opts.allowDestructive) {
23
+ const destructiveOps = result.ops.filter((o) => o.destructive);
24
+ throw new Error(`Destructive changes detected (${destructiveOps.length}). Re-run with --allow-destructive to apply:\n` +
25
+ destructiveOps.map((o) => ` - ${o.kind}`).join("\n"));
26
+ }
27
+ const dialect = getDialect(cfg.dialect);
28
+ const lines = [];
29
+ // new tables
30
+ for (const op of result.ops) {
31
+ if (op.kind === "createTable") {
32
+ lines.push(...dialect.createTable(ir.tables[op.table]));
33
+ lines.push("");
34
+ }
35
+ }
36
+ // other ops
37
+ const changeOps = result.ops.filter((o) => o.kind !== "createTable");
38
+ lines.push(...dialect.alterOps(changeOps));
39
+ if (lines.length && lines[lines.length - 1] !== "")
40
+ lines.push("");
41
+ const num = nextMigrationNumber(outDir);
42
+ const baseName = opts.name ?? "migration";
43
+ const fileName = `${String(num).padStart(4, "0")}_${baseName}.sql`;
44
+ const filePath = path.join(outDir, fileName);
45
+ writeFileSync(filePath, lines.join("\n").trim() + "\n");
46
+ saveSnapshot(outDir, ir, "latest.json");
47
+ // also save numbered snapshot
48
+ saveSnapshot(outDir, ir, `${String(num).padStart(4, "0")}.json`);
49
+ return filePath;
50
+ }
51
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runInit(cwd?: string): void;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAGA,wBAAgB,OAAO,CAAC,GAAG,GAAE,MAAsB,GAAG,IAAI,CAoCzD"}
@@ -0,0 +1,36 @@
1
+ import { writeFileSync, mkdirSync, existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ export function runInit(cwd = process.cwd()) {
4
+ const configPath = path.join(cwd, "tinyschema.config.ts");
5
+ if (!existsSync(configPath)) {
6
+ writeFileSync(configPath, `import { defineConfig } from "tinyschema";
7
+
8
+ export default defineConfig({
9
+ schema: "./src/db/schema.ts",
10
+ out: "./migrations",
11
+ dialect: "sqlite",
12
+ naming: "snake_case",
13
+ });
14
+ `);
15
+ }
16
+ const migDir = path.join(cwd, "migrations");
17
+ if (!existsSync(migDir))
18
+ mkdirSync(migDir, { recursive: true });
19
+ const schemaDir = path.join(cwd, "src", "db");
20
+ if (!existsSync(schemaDir))
21
+ mkdirSync(schemaDir, { recursive: true });
22
+ const schemaPath = path.join(schemaDir, "schema.ts");
23
+ if (!existsSync(schemaPath)) {
24
+ writeFileSync(schemaPath, `import { table, id, text, int, bool, timestamp, ref } from "tinyschema";
25
+
26
+ export const user = table("user", {
27
+ id: id(),
28
+ email: text().unique().notNull(),
29
+ name: text().notNull(),
30
+ age: int(),
31
+ createdAt: timestamp().defaultNow().notNull(),
32
+ });
33
+ `);
34
+ }
35
+ }
36
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,OAAO,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,aAAa,CACX,UAAU,EACV;;;;;;;;CAQL,CACI,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,aAAa,CACX,UAAU,EACV;;;;;;;;;CASL,CACI,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runSql(cwd?: string): Promise<string>;
2
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sql.ts"],"names":[],"mappings":"AAQA,wBAAsB,MAAM,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAczE"}
@@ -0,0 +1,24 @@
1
+ import path from "node:path";
2
+ import { existsSync } from "node:fs";
3
+ import { pathToFileURL } from "node:url";
4
+ import { createJiti } from "jiti";
5
+ import { loadConfig } from "../config.js";
6
+ import { compileSchema } from "../../compiler/compile.js";
7
+ import { getDialect } from "../../index.js";
8
+ export async function runSql(cwd = process.cwd()) {
9
+ const cfg = await loadConfig(cwd);
10
+ const schemaPath = path.resolve(cwd, cfg.schema);
11
+ if (!existsSync(schemaPath))
12
+ throw new Error(`Schema file not found: ${schemaPath}`);
13
+ const jiti = createJiti(pathToFileURL(schemaPath).href, { moduleCache: false });
14
+ const mod = (await jiti.import(schemaPath));
15
+ const ir = compileSchema(mod);
16
+ const dialect = getDialect(cfg.dialect);
17
+ const lines = [];
18
+ for (const t of Object.values(ir.tables)) {
19
+ lines.push(...dialect.createTable(t));
20
+ lines.push("");
21
+ }
22
+ return lines.join("\n").trim() + "\n";
23
+ }
24
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../src/cli/commands/sql.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACtD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAA4B,CAAC;IACvE,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;AACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runTypes(cwd?: string, outFile?: string): Promise<string>;
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/types.ts"],"names":[],"mappings":"AAOA,wBAAsB,QAAQ,CAAC,GAAG,GAAE,MAAsB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB7F"}
@@ -0,0 +1,32 @@
1
+ import path from "node:path";
2
+ import { existsSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { pathToFileURL } from "node:url";
4
+ import { createJiti } from "jiti";
5
+ import { loadConfig } from "../config.js";
6
+ import { collectTables } from "../../compiler/compile.js";
7
+ export async function runTypes(cwd = process.cwd(), outFile) {
8
+ const cfg = await loadConfig(cwd);
9
+ const schemaPath = path.resolve(cwd, cfg.schema);
10
+ if (!existsSync(schemaPath))
11
+ throw new Error(`Schema file not found: ${schemaPath}`);
12
+ const jiti = createJiti(pathToFileURL(schemaPath).href, { moduleCache: false });
13
+ const mod = (await jiti.import(schemaPath));
14
+ const tables = collectTables(mod);
15
+ const defaultOut = path.join(path.dirname(schemaPath), "schema.gen.d.ts");
16
+ const outPath = outFile ? path.resolve(cwd, outFile) : defaultOut;
17
+ mkdirSync(path.dirname(outPath), { recursive: true });
18
+ const lines = [];
19
+ lines.push("// Generated by tinyschema. Do not edit.");
20
+ lines.push(`import { ${tables.map((t) => t.tableName).join(", ")} } from "./${path.basename(schemaPath, ".ts")}";`);
21
+ lines.push("");
22
+ for (const t of tables) {
23
+ const name = t.tableName;
24
+ const pascal = name.charAt(0).toUpperCase() + name.slice(1);
25
+ lines.push(`export type ${pascal} = import("tinyschema").InferSelect<typeof ${name}>;`);
26
+ lines.push(`export type New${pascal} = import("tinyschema").InferInsert<typeof ${name}>;`);
27
+ lines.push(`export type ${pascal}Patch = import("tinyschema").InferUpdate<typeof ${name}>;`);
28
+ }
29
+ writeFileSync(outPath, lines.join("\n") + "\n");
30
+ return outPath;
31
+ }
32
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,OAAgB;IAC1E,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAA4B,CAAC;IACvE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAElC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAClE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACpH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,8CAA8C,IAAI,IAAI,CAAC,CAAC;QACxF,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,8CAA8C,IAAI,IAAI,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,mDAAmD,IAAI,IAAI,CAAC,CAAC;IAC/F,CAAC;IACD,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface LoadedConfig {
2
+ schema: string;
3
+ out: string;
4
+ dialect: string;
5
+ naming: string;
6
+ root: string;
7
+ }
8
+ export declare function loadConfig(cwd?: string): Promise<LoadedConfig>;
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoBnF"}
@@ -0,0 +1,29 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { existsSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { createJiti } from "jiti";
5
+ export async function loadConfig(cwd = process.cwd()) {
6
+ const candidates = ["tinyschema.config.ts", "tinyschema.config.mts", "tinyschema.config.js", "tinyschema.config.mjs"];
7
+ let configPath;
8
+ for (const c of candidates) {
9
+ const p = path.join(cwd, c);
10
+ if (existsSync(p)) {
11
+ configPath = p;
12
+ break;
13
+ }
14
+ }
15
+ if (!configPath) {
16
+ throw new Error("No tinyschema.config.* found. Run `tinyschema init` first.");
17
+ }
18
+ const jiti = createJiti(pathToFileURL(configPath).href, { moduleCache: false });
19
+ const mod = (await jiti.import(configPath));
20
+ const cfg = (mod.default ?? mod);
21
+ return {
22
+ schema: String(cfg.schema ?? "./src/db/schema.ts"),
23
+ out: String(cfg.out ?? "./migrations"),
24
+ dialect: String(cfg.dialect ?? "sqlite"),
25
+ naming: String(cfg.naming ?? "snake_case"),
26
+ root: cwd,
27
+ };
28
+ }
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAUlC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,MAAM,UAAU,GAAG,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,uBAAuB,CAAC,CAAC;IACtH,IAAI,UAA8B,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,UAAU,GAAG,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAA0B,CAAC;IACrE,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAA4B,CAAC;IAC5D,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,oBAAoB,CAAC;QAClD,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,cAAc,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;QACxC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,YAAY,CAAC;QAC1C,IAAI,EAAE,GAAG;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ import { runSql } from "./commands/sql.js";
3
+ import { runInit } from "./commands/init.js";
4
+ import { runTypes } from "./commands/types.js";
5
+ import { runGenerate } from "./commands/generate.js";
6
+ import { runDiff } from "./commands/diff.js";
7
+ import { runCheck } from "./commands/check.js";
8
+ async function main() {
9
+ const args = process.argv.slice(2);
10
+ const cmd = args[0];
11
+ const cwd = process.cwd();
12
+ try {
13
+ if (cmd === "sql") {
14
+ const out = await runSql(cwd);
15
+ process.stdout.write(out);
16
+ }
17
+ else if (cmd === "init") {
18
+ runInit(cwd);
19
+ console.log("Initialized tinyschema project.");
20
+ }
21
+ else if (cmd === "types") {
22
+ const out = await runTypes(cwd, args[1] === "--out" ? args[2] : undefined);
23
+ console.log(`Wrote ${out}`);
24
+ }
25
+ else if (cmd === "generate") {
26
+ const nameIdx = args.indexOf("--name");
27
+ const name = nameIdx >= 0 ? args[nameIdx + 1] : undefined;
28
+ const allow = args.includes("--allow-destructive");
29
+ const opts = { allowDestructive: allow };
30
+ if (name !== undefined)
31
+ opts.name = name;
32
+ const out = await runGenerate(cwd, opts);
33
+ console.log(`Wrote ${out}`);
34
+ }
35
+ else if (cmd === "diff") {
36
+ const out = await runDiff(cwd, args.includes("--json"));
37
+ process.stdout.write(out);
38
+ }
39
+ else if (cmd === "check") {
40
+ const ok = await runCheck(cwd);
41
+ if (!ok) {
42
+ console.error("Schema differs from latest snapshot.");
43
+ process.exit(1);
44
+ }
45
+ console.log("Schema matches latest snapshot.");
46
+ }
47
+ else if (cmd === "help" || !cmd) {
48
+ console.log("Usage: tinyschema <sql|init|types|generate|diff|check>");
49
+ }
50
+ else {
51
+ console.error(`Unknown command: ${cmd}`);
52
+ process.exit(1);
53
+ }
54
+ }
55
+ catch (e) {
56
+ console.error(e instanceof Error ? e.message : String(e));
57
+ process.exit(1);
58
+ }
59
+ }
60
+ main();
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { TableImpl } from "../core/table.js";
2
+ import type { IR } from "../core/ir.js";
3
+ export declare function collectTables(mod: Record<string, unknown>): TableImpl<any>[];
4
+ export declare function compileSchema(mod: Record<string, unknown>): IR;
5
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,kBAAkB,CAAC;AAExE,OAAO,KAAK,EAAE,EAAE,EAAyD,MAAM,eAAe,CAAC;AAa/F,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAM5E;AAgBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,CA8M9D"}