@kattebak/typespec-drizzle-orm-generator 1.0.1 → 2.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.
Files changed (69) hide show
  1. package/dist/assembler.d.ts +13 -0
  2. package/dist/assembler.d.ts.map +1 -0
  3. package/dist/assembler.js +44 -0
  4. package/dist/assembler.js.map +1 -0
  5. package/dist/codegen/ast-helpers.d.ts +20 -0
  6. package/dist/codegen/ast-helpers.d.ts.map +1 -0
  7. package/dist/codegen/ast-helpers.js +67 -0
  8. package/dist/codegen/ast-helpers.js.map +1 -0
  9. package/dist/codegen/index.d.ts +4 -0
  10. package/dist/codegen/index.d.ts.map +1 -0
  11. package/dist/codegen/index.js +3 -0
  12. package/dist/codegen/index.js.map +1 -0
  13. package/dist/codegen/stringify.d.ts +6 -0
  14. package/dist/codegen/stringify.d.ts.map +1 -0
  15. package/dist/codegen/stringify.js +61 -0
  16. package/dist/codegen/stringify.js.map +1 -0
  17. package/dist/decorators.d.ts +18 -0
  18. package/dist/decorators.d.ts.map +1 -0
  19. package/dist/decorators.js +60 -0
  20. package/dist/decorators.js.map +1 -0
  21. package/dist/generators/column-mapper.d.ts +3 -0
  22. package/dist/generators/column-mapper.d.ts.map +1 -0
  23. package/dist/generators/column-mapper.js +76 -0
  24. package/dist/generators/column-mapper.js.map +1 -0
  25. package/dist/generators/describe-generator.d.ts +4 -0
  26. package/dist/generators/describe-generator.d.ts.map +1 -0
  27. package/dist/generators/describe-generator.js +61 -0
  28. package/dist/generators/describe-generator.js.map +1 -0
  29. package/dist/generators/index-generator.d.ts +2 -0
  30. package/dist/generators/index-generator.d.ts.map +1 -0
  31. package/dist/generators/index-generator.js +12 -0
  32. package/dist/generators/index-generator.js.map +1 -0
  33. package/dist/generators/naming.d.ts +15 -0
  34. package/dist/generators/naming.d.ts.map +1 -0
  35. package/dist/generators/naming.js +30 -0
  36. package/dist/generators/naming.js.map +1 -0
  37. package/dist/generators/relations-generator.d.ts +4 -0
  38. package/dist/generators/relations-generator.d.ts.map +1 -0
  39. package/dist/generators/relations-generator.js +53 -0
  40. package/dist/generators/relations-generator.js.map +1 -0
  41. package/dist/generators/schema-generator.d.ts +3 -0
  42. package/dist/generators/schema-generator.d.ts.map +1 -0
  43. package/dist/generators/schema-generator.js +189 -0
  44. package/dist/generators/schema-generator.js.map +1 -0
  45. package/dist/generators/types-generator.d.ts +2 -0
  46. package/dist/generators/types-generator.d.ts.map +1 -0
  47. package/dist/generators/types-generator.js +26 -0
  48. package/dist/generators/types-generator.js.map +1 -0
  49. package/dist/index.d.ts +9 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +22 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/ir/builder.d.ts +33 -0
  54. package/dist/ir/builder.d.ts.map +1 -0
  55. package/dist/ir/builder.js +231 -0
  56. package/dist/ir/builder.js.map +1 -0
  57. package/dist/ir/relation-graph.d.ts +46 -0
  58. package/dist/ir/relation-graph.d.ts.map +1 -0
  59. package/dist/ir/relation-graph.js +93 -0
  60. package/dist/ir/relation-graph.js.map +1 -0
  61. package/dist/ir/types.d.ts +96 -0
  62. package/dist/ir/types.d.ts.map +1 -0
  63. package/dist/ir/types.js +2 -0
  64. package/dist/ir/types.js.map +1 -0
  65. package/dist/lib.d.ts +5 -0
  66. package/dist/lib.d.ts.map +1 -0
  67. package/dist/lib.js +25 -0
  68. package/dist/lib.js.map +1 -0
  69. package/package.json +10 -4
@@ -0,0 +1,13 @@
1
+ import type { EnumDef, TableDef } from "./ir/types.js";
2
+ export interface EmitterConfig {
3
+ packageName: string;
4
+ packageVersion: string;
5
+ }
6
+ /**
7
+ * Assembles the complete output package from IR.
8
+ *
9
+ * Returns a Map<filename, content> for all 6 output files:
10
+ * package.json, types.ts, schema.ts, relations.ts, describe.ts, index.ts
11
+ */
12
+ export declare function assemblePackage(tables: TableDef[], enums: EnumDef[], config: EmitterConfig): Map<string, string>;
13
+ //# sourceMappingURL=assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.d.ts","sourceRoot":"","sources":["../src/assembler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,QAAQ,EAAE,EAClB,KAAK,EAAE,OAAO,EAAE,EAChB,MAAM,EAAE,aAAa,GACpB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWrB"}
@@ -0,0 +1,44 @@
1
+ import { generateDescribe } from "./generators/describe-generator.js";
2
+ import { generateIndex } from "./generators/index-generator.js";
3
+ import { generateRelations } from "./generators/relations-generator.js";
4
+ import { generateSchema } from "./generators/schema-generator.js";
5
+ import { generateTypes } from "./generators/types-generator.js";
6
+ import { buildRelationGraph } from "./ir/relation-graph.js";
7
+ /**
8
+ * Assembles the complete output package from IR.
9
+ *
10
+ * Returns a Map<filename, content> for all 6 output files:
11
+ * package.json, types.ts, schema.ts, relations.ts, describe.ts, index.ts
12
+ */
13
+ export function assemblePackage(tables, enums, config) {
14
+ const graph = buildRelationGraph(tables);
15
+ return new Map([
16
+ ["package.json", generatePackageJson(config)],
17
+ ["types.ts", generateTypes()],
18
+ ["schema.ts", generateSchema(tables, enums)],
19
+ ["relations.ts", generateRelations(tables, graph)],
20
+ ["describe.ts", generateDescribe(tables, graph)],
21
+ ["index.ts", generateIndex()],
22
+ ]);
23
+ }
24
+ function generatePackageJson(config) {
25
+ const pkg = {
26
+ name: config.packageName,
27
+ version: config.packageVersion,
28
+ type: "module",
29
+ main: "index.js",
30
+ types: "index.d.ts",
31
+ exports: {
32
+ ".": {
33
+ types: "./index.d.ts",
34
+ import: "./index.js",
35
+ },
36
+ },
37
+ dependencies: {
38
+ "drizzle-orm": "^1.0.0",
39
+ "short-uuid": "^5.2.0",
40
+ },
41
+ };
42
+ return `${JSON.stringify(pkg, null, 2)}\n`;
43
+ }
44
+ //# sourceMappingURL=assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.js","sourceRoot":"","sources":["../src/assembler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAQ5D;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAkB,EAClB,KAAgB,EAChB,MAAqB,EACA;IACrB,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAEzC,OAAO,IAAI,GAAG,CAAC;QACb,CAAC,cAAc,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC;QAC7B,CAAC,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC,cAAc,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC,aAAa,EAAE,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC;KAC9B,CAAC,CAAC;AAAA,CACJ;AAED,SAAS,mBAAmB,CAAC,MAAqB,EAAU;IAC1D,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,MAAM,CAAC,WAAW;QACxB,OAAO,EAAE,MAAM,CAAC,cAAc;QAC9B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE;YACP,GAAG,EAAE;gBACH,KAAK,EAAE,cAAc;gBACrB,MAAM,EAAE,YAAY;aACrB;SACF;QACD,YAAY,EAAE;YACZ,aAAa,EAAE,QAAQ;YACvB,YAAY,EAAE,QAAQ;SACvB;KACF,CAAC;IAEF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAAA,CAC5C"}
@@ -0,0 +1,20 @@
1
+ import { RawCode } from "./stringify.js";
2
+ export declare function quoted(value: string): string;
3
+ export declare function fnCall(name: string, args: string[]): string;
4
+ export interface ChainMethod {
5
+ method: string;
6
+ args?: string[];
7
+ }
8
+ export declare function chainCall(base: string, calls: ChainMethod[]): string;
9
+ export declare function objectLiteral(entries: [string, string | RawCode][], options?: {
10
+ concise?: boolean;
11
+ }): string;
12
+ export declare function importDecl(specifiers: string[], source: string, options?: {
13
+ type?: boolean;
14
+ namespace?: string;
15
+ }): string;
16
+ export declare function exportConst(name: string, value: string): string;
17
+ export declare function arrayLiteral(items: string[]): string;
18
+ export declare function arrowFn(params: string[], body: string): string;
19
+ export declare function formatCode(code: string): string;
20
+ //# sourceMappingURL=ast-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-helpers.d.ts","sourceRoot":"","sources":["../../src/codegen/ast-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAUzC,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAG3D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAOpE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,EACrC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,MAAM,CAmBR;AAED,wBAAgB,UAAU,CACxB,UAAU,EAAE,MAAM,EAAE,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,MAAM,CASR;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEpD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C"}
@@ -0,0 +1,67 @@
1
+ import { generate } from "@babel/generator";
2
+ import { parse, parseExpression } from "@babel/parser";
3
+ import { RawCode } from "./stringify.js";
4
+ function isObjectExpression(node) {
5
+ return (typeof node === "object" &&
6
+ node !== null &&
7
+ node.type === "ObjectExpression");
8
+ }
9
+ export function quoted(value) {
10
+ return `"${value}"`;
11
+ }
12
+ export function fnCall(name, args) {
13
+ const inner = args.join(", ");
14
+ return `${name}(${inner})`;
15
+ }
16
+ export function chainCall(base, calls) {
17
+ let result = base;
18
+ for (const call of calls) {
19
+ const args = call.args ? call.args.join(", ") : "";
20
+ result = `${result}.${call.method}(${args})`;
21
+ }
22
+ return result;
23
+ }
24
+ export function objectLiteral(entries, options) {
25
+ const ast = parseExpression("{}");
26
+ if (!isObjectExpression(ast)) {
27
+ throw new Error("Failed to parse empty object expression");
28
+ }
29
+ for (const [key, value] of entries) {
30
+ const raw = value instanceof RawCode ? value.code : value;
31
+ const kvAst = parseExpression(`{ ${key}: ${raw} }`, {
32
+ plugins: ["typescript"],
33
+ });
34
+ if (!isObjectExpression(kvAst)) {
35
+ throw new Error(`Expected ObjectExpression for key "${key}"`);
36
+ }
37
+ ast.properties.push(...kvAst.properties);
38
+ }
39
+ return generate(ast, { concise: options?.concise }).code;
40
+ }
41
+ export function importDecl(specifiers, source, options) {
42
+ if (options?.namespace) {
43
+ const prefix = options.type ? "import type" : "import";
44
+ return `${prefix} * as ${options.namespace} from ${quoted(source)};`;
45
+ }
46
+ const prefix = options?.type ? "import type" : "import";
47
+ const specs = specifiers.join(", ");
48
+ return `${prefix} { ${specs} } from ${quoted(source)};`;
49
+ }
50
+ export function exportConst(name, value) {
51
+ return `export const ${name} = ${value};`;
52
+ }
53
+ export function arrayLiteral(items) {
54
+ return `[${items.join(", ")}]`;
55
+ }
56
+ export function arrowFn(params, body) {
57
+ const paramList = params.join(", ");
58
+ return `(${paramList}) => ${body}`;
59
+ }
60
+ export function formatCode(code) {
61
+ const ast = parse(code, {
62
+ sourceType: "module",
63
+ plugins: ["typescript"],
64
+ });
65
+ return generate(ast).code;
66
+ }
67
+ //# sourceMappingURL=ast-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-helpers.js","sourceRoot":"","sources":["../../src/codegen/ast-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { ChainMethod } from "./ast-helpers.js";
2
+ export { arrayLiteral, arrowFn, chainCall, exportConst, fnCall, formatCode, importDecl, objectLiteral, quoted, } from "./ast-helpers.js";
3
+ export { RawCode, stringifyObject } from "./stringify.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,YAAY,EACZ,OAAO,EACP,SAAS,EACT,WAAW,EACX,MAAM,EACN,UAAU,EACV,UAAU,EACV,aAAa,EACb,MAAM,GACP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { arrayLiteral, arrowFn, chainCall, exportConst, fnCall, formatCode, importDecl, objectLiteral, quoted, } from "./ast-helpers.js";
2
+ export { RawCode, stringifyObject } from "./stringify.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,SAAS,EACT,WAAW,EACX,MAAM,EACN,UAAU,EACV,UAAU,EACV,aAAa,EACb,MAAM,GACP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class RawCode {
2
+ readonly code: string;
3
+ constructor(code: string);
4
+ }
5
+ export declare function stringifyObject(object: Record<string, unknown>): string;
6
+ //# sourceMappingURL=stringify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify.d.ts","sourceRoot":"","sources":["../../src/codegen/stringify.ts"],"names":[],"mappings":"AAIA,qBAAa,OAAO;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,YAAY,IAAI,EAAE,MAAM,EAEvB;CACF;AAkDD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAavE"}
@@ -0,0 +1,61 @@
1
+ import { generate } from "@babel/generator";
2
+ import { parseExpression } from "@babel/parser";
3
+ export class RawCode {
4
+ code;
5
+ constructor(code) {
6
+ this.code = code;
7
+ }
8
+ }
9
+ function isObjectExpression(node) {
10
+ return (typeof node === "object" &&
11
+ node !== null &&
12
+ node.type === "ObjectExpression");
13
+ }
14
+ function stringifyValue(value) {
15
+ switch (typeof value) {
16
+ case "undefined":
17
+ return "undefined";
18
+ case "string":
19
+ return `"${value}"`;
20
+ case "number":
21
+ case "boolean":
22
+ return String(value);
23
+ case "function":
24
+ return value.toString();
25
+ case "object": {
26
+ if (value === null)
27
+ return "null";
28
+ if (value instanceof RawCode)
29
+ return value.code;
30
+ if (Array.isArray(value))
31
+ return stringifyArray(value);
32
+ return stringifyObject(value);
33
+ }
34
+ }
35
+ throw new Error(`Unsupported value type: ${typeof value}`);
36
+ }
37
+ function stringifyArray(items) {
38
+ const inner = items.map((item) => stringifyValue(item)).join(", ");
39
+ return `[${inner}]`;
40
+ }
41
+ function stringifyKeyValue(key, value) {
42
+ const ast = parseExpression(`{ ${key}: ${stringifyValue(value)} }`, {
43
+ plugins: ["typescript"],
44
+ });
45
+ if (!isObjectExpression(ast)) {
46
+ throw new Error(`Expected ObjectExpression for key "${key}", got ${ast.type}`);
47
+ }
48
+ return ast;
49
+ }
50
+ export function stringifyObject(object) {
51
+ const ast = parseExpression("{}");
52
+ if (!isObjectExpression(ast)) {
53
+ throw new Error("Failed to parse empty object expression");
54
+ }
55
+ for (const [key, value] of Object.entries(object)) {
56
+ const kvAst = stringifyKeyValue(key, value);
57
+ ast.properties.push(...kvAst.properties);
58
+ }
59
+ return generate(ast).code;
60
+ }
61
+ //# sourceMappingURL=stringify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify.js","sourceRoot":"","sources":["../../src/codegen/stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,OAAO,OAAO;IACT,IAAI,CAAS;IACtB,YAAY,IAAY,EAAE;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAAA,CAClB;CACF;AAED,SAAS,kBAAkB,CAAC,IAAa,EAA4B;IACnE,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACZ,IAA0B,CAAC,IAAI,KAAK,kBAAkB,CACxD,CAAC;AAAA,CACH;AAED,SAAS,cAAc,CAAC,KAAc,EAAU;IAC9C,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,IAAI,KAAK,GAAG,CAAC;QACtB,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,KAAK,UAAU;YACb,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,KAAK,QAAQ,EAAE,CAAC;YACd,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC;YAClC,IAAI,KAAK,YAAY,OAAO;gBAAE,OAAO,KAAK,CAAC,IAAI,CAAC;YAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;YACvD,OAAO,eAAe,CAAC,KAAgC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC;AAAA,CAC5D;AAED,SAAS,cAAc,CAAC,KAAgB,EAAU;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,IAAI,KAAK,GAAG,CAAC;AAAA,CACrB;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,KAAc,EAAoB;IACxE,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,GAAG,KAAK,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE;QAClE,OAAO,EAAE,CAAC,YAAY,CAAC;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,sCAAsC,GAAG,UAAW,GAAwB,CAAC,IAAI,EAAE,CACpF,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,eAAe,CAAC,MAA+B,EAAU;IACvE,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5C,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAAA,CAC3B"}
@@ -0,0 +1,18 @@
1
+ import type { DecoratorContext, Model, ModelProperty } from "@typespec/compiler";
2
+ export declare function $table(context: DecoratorContext, target: Model, name: string, service: string): void;
3
+ export declare function $primaryKey(context: DecoratorContext, target: Model, tableName: string): void;
4
+ export declare function $pk(context: DecoratorContext, target: ModelProperty): void;
5
+ export declare function $references(context: DecoratorContext, target: ModelProperty, ref: ModelProperty): void;
6
+ export declare function $junction(context: DecoratorContext, target: Model): void;
7
+ export declare function $uuid(context: DecoratorContext, target: ModelProperty, encoding: string, autoGenerate?: boolean): void;
8
+ export declare function $createdAt(context: DecoratorContext, target: ModelProperty): void;
9
+ export declare function $updatedAt(context: DecoratorContext, target: ModelProperty): void;
10
+ export declare function $unique(context: DecoratorContext, target: ModelProperty): void;
11
+ export declare function $compositeUnique(context: DecoratorContext, target: Model, name: string, columns: ModelProperty[]): void;
12
+ export declare function $check(context: DecoratorContext, target: ModelProperty, expression: string): void;
13
+ export declare function $indexDef(context: DecoratorContext, target: Model, name: string, columns: ModelProperty[], unique?: boolean): void;
14
+ export declare function $foreignKeyDef(context: DecoratorContext, target: Model, name: string, columns: ModelProperty[], foreignColumns: ModelProperty[]): void;
15
+ export declare function $minValue(context: DecoratorContext, target: ModelProperty, value: number): void;
16
+ export declare function $maxValue(context: DecoratorContext, target: ModelProperty, value: number): void;
17
+ export declare function $visibility(context: DecoratorContext, target: ModelProperty, value: string): void;
18
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGjF,wBAAgB,MAAM,CACpB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,KAAK,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,IAAI,CAEN;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAE7F;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAE1E;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,aAAa,GACjB,IAAI,CAEN;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,CAExE;AAED,wBAAgB,KAAK,CACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,OAAO,GACrB,IAAI,CAKN;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAEjF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAEjF;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAE9E;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,KAAK,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EAAE,GACvB,IAAI,CAQN;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAEjG;AAED,wBAAgB,SAAS,CACvB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,KAAK,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EAAE,EACxB,MAAM,CAAC,EAAE,OAAO,GACf,IAAI,CAQN;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,KAAK,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EAAE,EACxB,cAAc,EAAE,aAAa,EAAE,GAC9B,IAAI,CAQN;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/F;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjG"}
@@ -0,0 +1,60 @@
1
+ import { StateKeys } from "./lib.js";
2
+ export function $table(context, target, name, service) {
3
+ context.program.stateMap(StateKeys.table).set(target, { name, service });
4
+ }
5
+ export function $primaryKey(context, target, tableName) {
6
+ context.program.stateMap(StateKeys.primaryKey).set(target, { tableName });
7
+ }
8
+ export function $pk(context, target) {
9
+ context.program.stateSet(StateKeys.pk).add(target);
10
+ }
11
+ export function $references(context, target, ref) {
12
+ context.program.stateMap(StateKeys.references).set(target, ref);
13
+ }
14
+ export function $junction(context, target) {
15
+ context.program.stateSet(StateKeys.junction).add(target);
16
+ }
17
+ export function $uuid(context, target, encoding, autoGenerate) {
18
+ context.program.stateMap(StateKeys.uuid).set(target, {
19
+ encoding,
20
+ autoGenerate: autoGenerate ?? false,
21
+ });
22
+ }
23
+ export function $createdAt(context, target) {
24
+ context.program.stateSet(StateKeys.createdAt).add(target);
25
+ }
26
+ export function $updatedAt(context, target) {
27
+ context.program.stateSet(StateKeys.updatedAt).add(target);
28
+ }
29
+ export function $unique(context, target) {
30
+ context.program.stateSet(StateKeys.unique).add(target);
31
+ }
32
+ export function $compositeUnique(context, target, name, columns) {
33
+ const existing = (context.program.stateMap(StateKeys.compositeUnique).get(target) ??
34
+ []);
35
+ existing.push({ name, columns });
36
+ context.program.stateMap(StateKeys.compositeUnique).set(target, existing);
37
+ }
38
+ export function $check(context, target, expression) {
39
+ context.program.stateMap(StateKeys.check).set(target, expression);
40
+ }
41
+ export function $indexDef(context, target, name, columns, unique) {
42
+ const existing = (context.program.stateMap(StateKeys.indexDef).get(target) ?? []);
43
+ existing.push({ name, columns, unique: unique ?? false });
44
+ context.program.stateMap(StateKeys.indexDef).set(target, existing);
45
+ }
46
+ export function $foreignKeyDef(context, target, name, columns, foreignColumns) {
47
+ const existing = (context.program.stateMap(StateKeys.foreignKeyDef).get(target) ?? []);
48
+ existing.push({ name, columns, foreignColumns });
49
+ context.program.stateMap(StateKeys.foreignKeyDef).set(target, existing);
50
+ }
51
+ export function $minValue(context, target, value) {
52
+ context.program.stateMap(StateKeys.minValue).set(target, value);
53
+ }
54
+ export function $maxValue(context, target, value) {
55
+ context.program.stateMap(StateKeys.maxValue).set(target, value);
56
+ }
57
+ export function $visibility(context, target, value) {
58
+ context.program.stateMap(StateKeys.visibility).set(target, value);
59
+ }
60
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FieldDef, TableDef } from "../ir/types.js";
2
+ export declare function mapFieldToColumn(field: FieldDef, table: TableDef): string;
3
+ //# sourceMappingURL=column-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-mapper.d.ts","sourceRoot":"","sources":["../../src/generators/column-mapper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGzD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,CAkCzE"}
@@ -0,0 +1,76 @@
1
+ import { chainCall, fnCall, objectLiteral, quoted } from "../codegen/index.js";
2
+ import { toTableVariableName } from "./naming.js";
3
+ export function mapFieldToColumn(field, table) {
4
+ const calls = [];
5
+ if (isPrimaryKey(field, table)) {
6
+ calls.push({ method: "primaryKey" });
7
+ }
8
+ if (field.uuid?.autoGenerate) {
9
+ calls.push({ method: "defaultRandom" });
10
+ }
11
+ if (!field.nullable && !isPrimaryKey(field, table)) {
12
+ calls.push({ method: "notNull" });
13
+ }
14
+ if (field.references) {
15
+ const targetVar = toTableVariableName(field.references.tableName);
16
+ const targetField = field.references.fieldName;
17
+ calls.push({ method: "references", args: [`() => ${targetVar}.${targetField}`] });
18
+ }
19
+ if (field.createdAt || field.updatedAt) {
20
+ calls.push({ method: "defaultNow" });
21
+ }
22
+ if (field.constraints?.unique) {
23
+ calls.push({ method: "unique" });
24
+ }
25
+ if (field.defaultValue !== undefined && !field.createdAt && !field.updatedAt) {
26
+ calls.push({ method: "default", args: [mapDefault(field.defaultValue)] });
27
+ }
28
+ return chainCall(mapBaseType(field), calls);
29
+ }
30
+ function mapBaseType(field) {
31
+ const col = quoted(field.columnName);
32
+ if (field.uuid) {
33
+ return fnCall("base36Uuid", [col]);
34
+ }
35
+ switch (field.type.kind) {
36
+ case "text":
37
+ return fnCall("text", [col]);
38
+ case "varchar":
39
+ return fnCall("varchar", [
40
+ col,
41
+ objectLiteral([["length", String(field.type.length)]], { concise: true }),
42
+ ]);
43
+ case "integer":
44
+ return fnCall("integer", [col]);
45
+ case "bigint":
46
+ return fnCall("bigint", [
47
+ col,
48
+ objectLiteral([["mode", quoted("number")]], { concise: true }),
49
+ ]);
50
+ case "real":
51
+ return fnCall("real", [col]);
52
+ case "doublePrecision":
53
+ return fnCall("doublePrecision", [col]);
54
+ case "boolean":
55
+ return fnCall("boolean", [col]);
56
+ case "timestamp":
57
+ return fnCall("timestamp", [
58
+ col,
59
+ objectLiteral([["withTimezone", "true"]], { concise: true }),
60
+ ]);
61
+ case "uuid":
62
+ return fnCall("base36Uuid", [col]);
63
+ case "enum":
64
+ return fnCall(field.type.enumName, [col]);
65
+ }
66
+ }
67
+ function isPrimaryKey(field, table) {
68
+ return !table.primaryKey.isComposite && table.primaryKey.columns.includes(field.name);
69
+ }
70
+ function mapDefault(value) {
71
+ if (typeof value === "string") {
72
+ return quoted(value);
73
+ }
74
+ return String(value);
75
+ }
76
+ //# sourceMappingURL=column-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-mapper.js","sourceRoot":"","sources":["../../src/generators/column-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RelationGraph } from "../ir/relation-graph.js";
2
+ import type { TableDef } from "../ir/types.js";
3
+ export declare function generateDescribe(tables: TableDef[], graph: RelationGraph): string;
4
+ //# sourceMappingURL=describe-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-generator.d.ts","sourceRoot":"","sources":["../../src/generators/describe-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAiBjF"}
@@ -0,0 +1,61 @@
1
+ import { importDecl, objectLiteral } from "../codegen/index.js";
2
+ import { toTableVariableName } from "./naming.js";
3
+ export function generateDescribe(tables, graph) {
4
+ const lines = [];
5
+ lines.push(importDecl(["DrizzleClient"], "./types.js", { type: true }));
6
+ lines.push(importDecl([], "./schema.js", { namespace: "schema" }));
7
+ for (const table of tables) {
8
+ if (table.isJunction)
9
+ continue;
10
+ const rels = graph.get(table.name) || [];
11
+ lines.push("");
12
+ lines.push(...generateDescribeBlock(table, rels));
13
+ }
14
+ lines.push("");
15
+ return lines.join("\n");
16
+ }
17
+ function generateDescribeBlock(table, relations) {
18
+ const lines = [];
19
+ const tableVar = toTableVariableName(table.name);
20
+ const pkField = table.primaryKey.columns[0];
21
+ const funcName = `describe${table.name}`;
22
+ const typeName = `${table.name}Description`;
23
+ lines.push(...generateDescriptionType(table, relations, typeName, tableVar));
24
+ lines.push(`export const ${funcName} = (`, ` db: DrizzleClient,`, ` ${pkField}: string,`, `): Promise<${typeName} | undefined> =>`);
25
+ if (relations.length > 0) {
26
+ const withObj = objectLiteral(relations.map((rel) => [rel.name, "true"]), { concise: true });
27
+ lines.push(` db.query.${tableVar}.findFirst({`, ` where: { ${pkField} },`, ` with: ${withObj},`, " });");
28
+ }
29
+ else {
30
+ lines.push(` db.query.${tableVar}.findFirst({`, ` where: { ${pkField} },`, " });");
31
+ }
32
+ return lines;
33
+ }
34
+ function generateDescriptionType(_table, relations, typeName, tableVar) {
35
+ const lines = [];
36
+ lines.push(`export type ${typeName} = typeof schema.${tableVar}.$inferSelect & {`);
37
+ for (const rel of relations) {
38
+ lines.push(` ${rel.name}: ${getRelationTypeExpression(rel)};`);
39
+ }
40
+ lines.push("};");
41
+ lines.push("");
42
+ return lines;
43
+ }
44
+ function getRelationTypeExpression(rel) {
45
+ switch (rel.kind) {
46
+ case "one": {
47
+ const targetTableVar = toTableVariableName(rel.toTable);
48
+ const base = `typeof schema.${targetTableVar}.$inferSelect`;
49
+ return rel.optional ? `${base} | null` : base;
50
+ }
51
+ case "many": {
52
+ const manyTableVar = toTableVariableName(rel.table);
53
+ return `(typeof schema.${manyTableVar}.$inferSelect)[]`;
54
+ }
55
+ case "many-through": {
56
+ const targetTableVar = toTableVariableName(rel.toTable);
57
+ return `(typeof schema.${targetTableVar}.$inferSelect)[]`;
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=describe-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-generator.js","sourceRoot":"","sources":["../../src/generators/describe-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function generateIndex(): string;
2
+ //# sourceMappingURL=index-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-generator.d.ts","sourceRoot":"","sources":["../../src/generators/index-generator.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,IAAI,MAAM,CAUtC"}
@@ -0,0 +1,12 @@
1
+ import { quoted } from "../codegen/index.js";
2
+ export function generateIndex() {
3
+ const lines = [
4
+ `export * from ${quoted("./types.js")};`,
5
+ `export * from ${quoted("./schema.js")};`,
6
+ `export { relations } from ${quoted("./relations.js")};`,
7
+ `export * from ${quoted("./describe.js")};`,
8
+ "",
9
+ ];
10
+ return lines.join("\n");
11
+ }
12
+ //# sourceMappingURL=index-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-generator.js","sourceRoot":"","sources":["../../src/generators/index-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,UAAU,aAAa,GAAW;IACtC,MAAM,KAAK,GAAa;QACtB,iBAAiB,MAAM,CAAC,YAAY,CAAC,GAAG;QACxC,iBAAiB,MAAM,CAAC,aAAa,CAAC,GAAG;QACzC,6BAA6B,MAAM,CAAC,gBAAgB,CAAC,GAAG;QACxD,iBAAiB,MAAM,CAAC,eAAe,CAAC,GAAG;QAC3C,EAAE;KACH,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACzB"}
@@ -0,0 +1,15 @@
1
+ /** Convert camelCase to snake_case: "authorId" → "author_id" */
2
+ export declare function toSnakeCase(str: string): string;
3
+ /** Convert snake_case to camelCase: "author_id" → "authorId" */
4
+ export declare function toCamelCase(str: string): string;
5
+ /**
6
+ * Convert PascalCase table name to camelCase table variable name.
7
+ * "BookGenre" → "bookGenres" (pluralized for table variables)
8
+ */
9
+ export declare function toTableVariableName(name: string): string;
10
+ /**
11
+ * Naive pluralization sufficient for the bookstore domain.
12
+ * Handles: consonant+y → ies, s/sh/ch/x/z → es, default → s
13
+ */
14
+ export declare function pluralize(word: string): string;
15
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/generators/naming.ts"],"names":[],"mappings":"AAAA,kEAAgE;AAChE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,kEAAgE;AAChE,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ9C"}
@@ -0,0 +1,30 @@
1
+ /** Convert camelCase to snake_case: "authorId" → "author_id" */
2
+ export function toSnakeCase(str) {
3
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
4
+ }
5
+ /** Convert snake_case to camelCase: "author_id" → "authorId" */
6
+ export function toCamelCase(str) {
7
+ return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
8
+ }
9
+ /**
10
+ * Convert PascalCase table name to camelCase table variable name.
11
+ * "BookGenre" → "bookGenres" (pluralized for table variables)
12
+ */
13
+ export function toTableVariableName(name) {
14
+ const camel = name[0].toLowerCase() + name.slice(1);
15
+ return pluralize(camel);
16
+ }
17
+ /**
18
+ * Naive pluralization sufficient for the bookstore domain.
19
+ * Handles: consonant+y → ies, s/sh/ch/x/z → es, default → s
20
+ */
21
+ export function pluralize(word) {
22
+ if (word.endsWith("y") && !/[aeiou]y$/.test(word)) {
23
+ return `${word.slice(0, -1)}ies`;
24
+ }
25
+ if (/(?:s|sh|ch|x|z)$/.test(word)) {
26
+ return `${word}es`;
27
+ }
28
+ return `${word}s`;
29
+ }
30
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/generators/naming.ts"],"names":[],"mappings":"AAAA,kEAAgE;AAChE,MAAM,UAAU,WAAW,CAAC,GAAW,EAAU;IAC/C,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAAA,CACtE;AAED,kEAAgE;AAChE,MAAM,UAAU,WAAW,CAAC,GAAW,EAAU;IAC/C,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAAA,CAC9E;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAU;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;AAAA,CACzB;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAU;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACnC,CAAC;IACD,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,CAAC;AAAA,CACnB"}
@@ -0,0 +1,4 @@
1
+ import type { RelationGraph } from "../ir/relation-graph.js";
2
+ import type { TableDef } from "../ir/types.js";
3
+ export declare function generateRelations(tables: TableDef[], graph: RelationGraph): string;
4
+ //# sourceMappingURL=relations-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations-generator.d.ts","sourceRoot":"","sources":["../../src/generators/relations-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAyBlF"}