neoorm 0.8.4 → 0.8.6

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 (79) hide show
  1. package/README.md +2 -0
  2. package/dist/bin/neoorm.js +52 -9
  3. package/dist/bin/neoorm.js.map +1 -1
  4. package/dist/codegen/emit-models.d.ts.map +1 -1
  5. package/dist/codegen/emit-models.js +93 -40
  6. package/dist/codegen/emit-models.js.map +1 -1
  7. package/dist/codegen/emit-query-types.d.ts.map +1 -1
  8. package/dist/codegen/emit-query-types.js +36 -67
  9. package/dist/codegen/emit-query-types.js.map +1 -1
  10. package/dist/docs/pages.d.ts.map +1 -1
  11. package/dist/docs/pages.js +1 -0
  12. package/dist/docs/pages.js.map +1 -1
  13. package/dist/docs/server.d.ts.map +1 -1
  14. package/dist/docs/server.js +1 -11
  15. package/dist/docs/server.js.map +1 -1
  16. package/dist/migrate/dev-lock.d.ts +6 -0
  17. package/dist/migrate/dev-lock.d.ts.map +1 -1
  18. package/dist/migrate/dev-lock.js +71 -13
  19. package/dist/migrate/dev-lock.js.map +1 -1
  20. package/dist/runtime/client.d.ts +2 -0
  21. package/dist/runtime/client.d.ts.map +1 -1
  22. package/dist/runtime/client.js.map +1 -1
  23. package/dist/runtime/query/compile-write.d.ts.map +1 -1
  24. package/dist/runtime/query/compile-write.js +5 -5
  25. package/dist/runtime/query/compile-write.js.map +1 -1
  26. package/dist/runtime/query/delete.d.ts.map +1 -1
  27. package/dist/runtime/query/delete.js +7 -6
  28. package/dist/runtime/query/delete.js.map +1 -1
  29. package/dist/runtime/query/table-index.d.ts +2 -0
  30. package/dist/runtime/query/table-index.d.ts.map +1 -1
  31. package/dist/runtime/query/table-index.js +10 -2
  32. package/dist/runtime/query/table-index.js.map +1 -1
  33. package/dist/runtime/query/unique.d.ts +16 -0
  34. package/dist/runtime/query/unique.d.ts.map +1 -1
  35. package/dist/runtime/query/unique.js +124 -5
  36. package/dist/runtime/query/unique.js.map +1 -1
  37. package/dist/runtime/query/unique.test.js +144 -1
  38. package/dist/runtime/query/unique.test.js.map +1 -1
  39. package/dist/runtime/query/update.d.ts.map +1 -1
  40. package/dist/runtime/query/update.js +8 -7
  41. package/dist/runtime/query/update.js.map +1 -1
  42. package/dist/schema/types.d.ts +2 -2
  43. package/dist/schema/types.d.ts.map +1 -1
  44. package/dist/studio/codec.d.ts +32 -0
  45. package/dist/studio/codec.d.ts.map +1 -0
  46. package/dist/studio/codec.js +151 -0
  47. package/dist/studio/codec.js.map +1 -0
  48. package/dist/studio/csv.d.ts +12 -0
  49. package/dist/studio/csv.d.ts.map +1 -0
  50. package/dist/studio/csv.js +144 -0
  51. package/dist/studio/csv.js.map +1 -0
  52. package/dist/studio/errors.d.ts +17 -0
  53. package/dist/studio/errors.d.ts.map +1 -0
  54. package/dist/studio/errors.js +77 -0
  55. package/dist/studio/errors.js.map +1 -0
  56. package/dist/studio/graph.d.ts +27 -0
  57. package/dist/studio/graph.d.ts.map +1 -0
  58. package/dist/studio/graph.js +47 -0
  59. package/dist/studio/graph.js.map +1 -0
  60. package/dist/studio/meta.d.ts +76 -0
  61. package/dist/studio/meta.d.ts.map +1 -0
  62. package/dist/studio/meta.js +99 -0
  63. package/dist/studio/meta.js.map +1 -0
  64. package/dist/studio/open-browser.d.ts +3 -0
  65. package/dist/studio/open-browser.d.ts.map +1 -0
  66. package/dist/studio/open-browser.js +13 -0
  67. package/dist/studio/open-browser.js.map +1 -0
  68. package/dist/studio/server.d.ts +66 -0
  69. package/dist/studio/server.d.ts.map +1 -0
  70. package/dist/studio/server.js +1045 -0
  71. package/dist/studio/server.js.map +1 -0
  72. package/dist/studio-ui/assets/index-Leicgvwr.js +36 -0
  73. package/dist/studio-ui/assets/index-wQS4sFQ_.css +1 -0
  74. package/dist/studio-ui/index.html +13 -0
  75. package/docs/cli.md +18 -0
  76. package/docs/getting-started.md +8 -0
  77. package/docs/queries.md +11 -3
  78. package/docs/studio.md +52 -0
  79. package/package.json +25 -4
@@ -0,0 +1,151 @@
1
+ export function isStudioMarker(value) {
2
+ if (typeof value !== "object" || value === null)
3
+ return false;
4
+ const tag = value.__neoorm;
5
+ return tag === "bigint" || tag === "date" || tag === "bytes";
6
+ }
7
+ function encodeValue(value) {
8
+ if (value === undefined)
9
+ return null;
10
+ if (typeof value === "bigint")
11
+ return { __neoorm: "bigint", value: value.toString() };
12
+ if (value instanceof Date) {
13
+ return Number.isNaN(value.getTime())
14
+ ? null
15
+ : { __neoorm: "date", value: value.toISOString() };
16
+ }
17
+ if (value instanceof Uint8Array) {
18
+ return {
19
+ __neoorm: "bytes",
20
+ base64: Buffer.from(value).toString("base64"),
21
+ };
22
+ }
23
+ if (Array.isArray(value))
24
+ return value.map(encodeValue);
25
+ if (typeof value === "object" && value !== null) {
26
+ const out = {};
27
+ for (const [k, v] of Object.entries(value)) {
28
+ if (typeof v === "function")
29
+ continue;
30
+ out[k] = encodeValue(v);
31
+ }
32
+ return out;
33
+ }
34
+ return value;
35
+ }
36
+ /** Encode a result row (or aggregate payload) so `JSON.stringify` never throws. */
37
+ export function encodeStudioRow(row) {
38
+ return encodeValue(row);
39
+ }
40
+ export function encodeStudioRows(rows) {
41
+ return rows.map(encodeStudioRow);
42
+ }
43
+ function reviveMarker(marker) {
44
+ switch (marker.__neoorm) {
45
+ case "bigint":
46
+ return BigInt(marker.value);
47
+ case "date":
48
+ return new Date(marker.value);
49
+ case "bytes":
50
+ return Buffer.from(marker.base64, "base64");
51
+ default: {
52
+ const _never = marker;
53
+ return _never;
54
+ }
55
+ }
56
+ }
57
+ /** Recursively revive `__neoorm` markers in arbitrary input (where, params, ...). */
58
+ export function decodeStudioValue(value) {
59
+ if (isStudioMarker(value))
60
+ return reviveMarker(value);
61
+ if (Array.isArray(value))
62
+ return value.map(decodeStudioValue);
63
+ if (typeof value === "object" && value !== null) {
64
+ const out = {};
65
+ for (const [k, v] of Object.entries(value)) {
66
+ out[k] = decodeStudioValue(v);
67
+ }
68
+ return out;
69
+ }
70
+ return value;
71
+ }
72
+ const BIGINT_KINDS = new Set(["bigint"]);
73
+ const TIMESTAMP_KINDS = new Set(["timestamp"]);
74
+ const JSON_KINDS = new Set(["json", "jsonb"]);
75
+ const BYTES_KINDS = new Set(["bytea"]);
76
+ function columnKind(table, tsName) {
77
+ return table.columns.find((c) => c.tsName === tsName)?.kind;
78
+ }
79
+ /**
80
+ * Column-aware coercion for `data` payloads:
81
+ * - `bigint` columns accept decimal strings (JSON cannot carry BigInt)
82
+ * - `timestamp` columns accept ISO strings (converted to `Date`)
83
+ * - `json`/`jsonb` columns accept JSON text (parsed to a value)
84
+ * - `bytea` columns accept `{__neoorm:"bytes"}` markers
85
+ */
86
+ export function decodeStudioData(table, data) {
87
+ const out = {};
88
+ for (const [key, raw] of Object.entries(data)) {
89
+ const value = decodeStudioValue(raw);
90
+ const kind = columnKind(table, key);
91
+ if (value === null || value === undefined || kind === undefined) {
92
+ out[key] = value;
93
+ continue;
94
+ }
95
+ if (BIGINT_KINDS.has(kind) &&
96
+ typeof value === "string" &&
97
+ value.trim() !== "") {
98
+ try {
99
+ out[key] = BigInt(value.trim());
100
+ continue;
101
+ }
102
+ catch {
103
+ out[key] = value;
104
+ continue;
105
+ }
106
+ }
107
+ if (TIMESTAMP_KINDS.has(kind) &&
108
+ typeof value === "string" &&
109
+ value !== "") {
110
+ out[key] = new Date(value);
111
+ continue;
112
+ }
113
+ if (JSON_KINDS.has(kind) && typeof value === "string") {
114
+ const trimmed = value.trim();
115
+ if (trimmed === "") {
116
+ out[key] = table.columns.find((c) => c.tsName === key)?.nullable
117
+ ? null
118
+ : value;
119
+ continue;
120
+ }
121
+ try {
122
+ out[key] = JSON.parse(value);
123
+ }
124
+ catch {
125
+ out[key] = value;
126
+ }
127
+ continue;
128
+ }
129
+ if (BYTES_KINDS.has(kind) &&
130
+ typeof value === "string" &&
131
+ value !== "") {
132
+ try {
133
+ out[key] = Buffer.from(value, "base64");
134
+ continue;
135
+ }
136
+ catch {
137
+ out[key] = value;
138
+ continue;
139
+ }
140
+ }
141
+ out[key] = value;
142
+ }
143
+ return out;
144
+ }
145
+ /** Decode `where`/`orderBy` inputs: revive markers, leave everything else as-is. */
146
+ export function decodeStudioWhere(where) {
147
+ if (where === undefined || where === null)
148
+ return undefined;
149
+ return decodeStudioValue(where);
150
+ }
151
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/studio/codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Minimal CSV parse/serialize for Studio import/export (no external deps). */
2
+ export declare function parseCsv(text: string): {
3
+ headers: string[];
4
+ rows: Record<string, string>[];
5
+ };
6
+ /** Serialize JSON-safe rows to CSV. Markers become compact JSON strings. */
7
+ export declare function toCsv(headers: string[], rows: Record<string, unknown>[]): string;
8
+ /** Serialize rows to a GitHub-flavored Markdown table. */
9
+ export declare function toMarkdown(headers: string[], rows: Record<string, unknown>[]): string;
10
+ /** Serialize rows to `INSERT` statements (dev convenience, not a migration). */
11
+ export declare function toSqlInserts(qualifiedTable: string, quoteIdentifier: (name: string) => string, sqlColumns: string[], tsColumns: string[], rows: Record<string, unknown>[]): string;
12
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/studio/csv.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAC/B,CAwEA;AAMD,4EAA4E;AAC5E,wBAAgB,KAAK,CACpB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAC7B,MAAM,CAiBR;AAWD,0DAA0D;AAC1D,wBAAgB,UAAU,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAC7B,MAAM,CAOR;AA0BD,gFAAgF;AAChF,wBAAgB,YAAY,CAC3B,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACzC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAC7B,MAAM,CASR"}
@@ -0,0 +1,144 @@
1
+ /** Minimal CSV parse/serialize for Studio import/export (no external deps). */
2
+ export function parseCsv(text) {
3
+ const cells = [];
4
+ let row = [];
5
+ let cell = "";
6
+ let inQuotes = false;
7
+ let i = 0;
8
+ const pushCell = () => {
9
+ row.push(cell);
10
+ cell = "";
11
+ };
12
+ const pushRow = () => {
13
+ pushCell();
14
+ cells.push(row);
15
+ row = [];
16
+ };
17
+ while (i < text.length) {
18
+ const ch = text[i];
19
+ if (inQuotes) {
20
+ if (ch === '"') {
21
+ if (text[i + 1] === '"') {
22
+ cell += '"';
23
+ i += 2;
24
+ continue;
25
+ }
26
+ inQuotes = false;
27
+ i++;
28
+ continue;
29
+ }
30
+ cell += ch;
31
+ i++;
32
+ continue;
33
+ }
34
+ if (ch === '"') {
35
+ inQuotes = true;
36
+ i++;
37
+ continue;
38
+ }
39
+ if (ch === ",") {
40
+ pushCell();
41
+ i++;
42
+ continue;
43
+ }
44
+ if (ch === "\r") {
45
+ i++;
46
+ continue;
47
+ }
48
+ if (ch === "\n") {
49
+ pushRow();
50
+ i++;
51
+ continue;
52
+ }
53
+ cell += ch;
54
+ i++;
55
+ }
56
+ pushRow();
57
+ while (cells.length > 0 &&
58
+ cells[cells.length - 1]?.every((c) => c === "")) {
59
+ cells.pop();
60
+ }
61
+ if (cells.length === 0)
62
+ return { headers: [], rows: [] };
63
+ const headers = (cells[0] ?? []).map((h) => h.trim());
64
+ const rows = cells.slice(1).map((values) => {
65
+ const record = {};
66
+ for (let c = 0; c < headers.length; c++) {
67
+ const header = headers[c];
68
+ if (header !== undefined)
69
+ record[header] = values[c] ?? "";
70
+ }
71
+ return record;
72
+ });
73
+ return { headers, rows };
74
+ }
75
+ function escapeCsvCell(value) {
76
+ return /[",\n\r]/.test(value) ? `"${value.replaceAll('"', '""')}"` : value;
77
+ }
78
+ /** Serialize JSON-safe rows to CSV. Markers become compact JSON strings. */
79
+ export function toCsv(headers, rows) {
80
+ const lines = [headers.map(escapeCsvCell).join(",")];
81
+ for (const row of rows) {
82
+ lines.push(headers
83
+ .map((h) => {
84
+ const value = row[h];
85
+ if (value === null || value === undefined)
86
+ return "";
87
+ if (typeof value === "string")
88
+ return escapeCsvCell(value);
89
+ if (typeof value === "number" || typeof value === "boolean")
90
+ return String(value);
91
+ return escapeCsvCell(JSON.stringify(value) ?? "");
92
+ })
93
+ .join(","));
94
+ }
95
+ return `${lines.join("\n")}\n`;
96
+ }
97
+ function mdCell(value) {
98
+ if (value === null || value === undefined)
99
+ return "NULL";
100
+ if (typeof value === "string")
101
+ return value.replaceAll("|", "\\|").replaceAll("\n", "<br>");
102
+ if (typeof value === "number" || typeof value === "boolean")
103
+ return String(value);
104
+ return `\`${(JSON.stringify(value) ?? "").replaceAll("|", "\\|")}\``;
105
+ }
106
+ /** Serialize rows to a GitHub-flavored Markdown table. */
107
+ export function toMarkdown(headers, rows) {
108
+ const head = `| ${headers.join(" | ")} |`;
109
+ const divider = `| ${headers.map(() => "---").join(" | ")} |`;
110
+ const body = rows.map((row) => `| ${headers.map((h) => mdCell(row[h])).join(" | ")} |`);
111
+ return [head, divider, ...body].join("\n");
112
+ }
113
+ function sqlLiteral(value) {
114
+ if (value === null || value === undefined)
115
+ return "NULL";
116
+ if (typeof value === "boolean")
117
+ return value ? "TRUE" : "FALSE";
118
+ if (typeof value === "number")
119
+ return Number.isFinite(value) ? String(value) : "NULL";
120
+ if (typeof value === "string")
121
+ return `'${value.replaceAll("'", "''")}'`;
122
+ if (typeof value === "object" &&
123
+ value !== null &&
124
+ "__neoorm" in value) {
125
+ const marker = value;
126
+ if (marker.__neoorm === "bigint")
127
+ return marker.value ?? "NULL";
128
+ if (marker.__neoorm === "date")
129
+ return `'${marker.value ?? ""}'`;
130
+ if (marker.__neoorm === "bytes")
131
+ return `'\\x${Buffer.from(marker.base64 ?? "", "base64").toString("hex")}'`;
132
+ }
133
+ return `'${(JSON.stringify(value) ?? "").replaceAll("'", "''")}'`;
134
+ }
135
+ /** Serialize rows to `INSERT` statements (dev convenience, not a migration). */
136
+ export function toSqlInserts(qualifiedTable, quoteIdentifier, sqlColumns, tsColumns, rows) {
137
+ if (rows.length === 0)
138
+ return `-- no rows\n`;
139
+ const columns = sqlColumns.map(quoteIdentifier).join(", ");
140
+ return rows
141
+ .map((row) => `INSERT INTO ${qualifiedTable} (${columns}) VALUES (${tsColumns.map((c) => sqlLiteral(row[c])).join(", ")});`)
142
+ .join("\n");
143
+ }
144
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../src/studio/csv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type StudioErrorBody = {
2
+ error: {
3
+ code: string;
4
+ message: string;
5
+ tableAccessor?: string;
6
+ columnTsName?: string;
7
+ columnSqlName?: string;
8
+ constraint?: string;
9
+ detail?: string;
10
+ };
11
+ };
12
+ /** Map a thrown error to an HTTP status + JSON body for Studio API responses. */
13
+ export declare function toStudioError(err: unknown): {
14
+ status: number;
15
+ body: StudioErrorBody;
16
+ };
17
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/studio/errors.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACF,CAAC;AA2BF,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;CACtB,CAqDA"}
@@ -0,0 +1,77 @@
1
+ import { QueryErrorCode } from "../runtime/error-codes.js";
2
+ import { NeoOrmError } from "../runtime/errors.js";
3
+ const CLIENT_ERROR_CODES = new Set([
4
+ QueryErrorCode.unique_violation,
5
+ QueryErrorCode.not_null_violation,
6
+ QueryErrorCode.foreign_key_violation,
7
+ QueryErrorCode.check_violation,
8
+ QueryErrorCode.invalid_input,
9
+ QueryErrorCode.unknown_table,
10
+ QueryErrorCode.unknown_column,
11
+ QueryErrorCode.unknown_relation,
12
+ QueryErrorCode.unique_where_invalid,
13
+ QueryErrorCode.where_required,
14
+ QueryErrorCode.invalid_args,
15
+ QueryErrorCode.invalid_cursor,
16
+ QueryErrorCode.invalid_nested_write,
17
+ QueryErrorCode.missing_primary_key,
18
+ QueryErrorCode.unsupported_operation,
19
+ QueryErrorCode.relation_not_found,
20
+ QueryErrorCode.column_not_found,
21
+ ]);
22
+ const UNAVAILABLE_CODES = new Set([
23
+ QueryErrorCode.connection_error,
24
+ QueryErrorCode.driver_error,
25
+ ]);
26
+ /** Map a thrown error to an HTTP status + JSON body for Studio API responses. */
27
+ export function toStudioError(err) {
28
+ if (err instanceof NeoOrmError) {
29
+ const context = err.context ?? {};
30
+ const tableAccessor = typeof context.tableAccessor === "string"
31
+ ? context.tableAccessor
32
+ : undefined;
33
+ const columnTsName = typeof context.columnTsName === "string"
34
+ ? context.columnTsName
35
+ : undefined;
36
+ const columnSqlName = typeof context.columnSqlName === "string"
37
+ ? context.columnSqlName
38
+ : undefined;
39
+ const constraint = typeof context.constraint === "string"
40
+ ? context.constraint
41
+ : undefined;
42
+ const detail = typeof context.detail === "string" ? context.detail : undefined;
43
+ const body = {
44
+ error: {
45
+ code: err.code,
46
+ message: err.message,
47
+ ...(tableAccessor !== undefined ? { tableAccessor } : {}),
48
+ ...(columnTsName !== undefined ? { columnTsName } : {}),
49
+ ...(columnSqlName !== undefined ? { columnSqlName } : {}),
50
+ ...(constraint !== undefined ? { constraint } : {}),
51
+ ...(detail !== undefined ? { detail } : {}),
52
+ },
53
+ };
54
+ if (UNAVAILABLE_CODES.has(err.code))
55
+ return { status: 503, body };
56
+ if (CLIENT_ERROR_CODES.has(err.code))
57
+ return { status: 400, body };
58
+ return { status: 500, body };
59
+ }
60
+ if (err instanceof SyntaxError) {
61
+ return {
62
+ status: 400,
63
+ body: { error: { code: "invalid_json", message: err.message } },
64
+ };
65
+ }
66
+ if (err instanceof Error) {
67
+ return {
68
+ status: 500,
69
+ body: { error: { code: "internal", message: err.message } },
70
+ };
71
+ }
72
+ return {
73
+ status: 500,
74
+ body: { error: { code: "internal", message: String(err) } },
75
+ };
76
+ }
77
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/studio/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Manifest } from "../dialect/types.js";
2
+ export type StudioGraphNode = {
3
+ accessor: string;
4
+ sqlName: string;
5
+ junction: boolean;
6
+ columns: {
7
+ tsName: string;
8
+ kind: string;
9
+ primary: boolean;
10
+ hidden: boolean;
11
+ }[];
12
+ };
13
+ export type StudioGraphEdge = {
14
+ from: string;
15
+ to: string;
16
+ label: string;
17
+ cardinality: "one" | "many";
18
+ m2m: boolean;
19
+ through?: string;
20
+ };
21
+ export type StudioGraph = {
22
+ nodes: StudioGraphNode[];
23
+ edges: StudioGraphEdge[];
24
+ };
25
+ /** Build ER nodes/edges from the manifest (FK + M2M, junction hops collapsed). */
26
+ export declare function toStudioGraph(manifest: Manifest): StudioGraph;
27
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/studio/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC;KAChB,EAAE,CAAC;CACJ,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,KAAK,EAAE,eAAe,EAAE,CAAC;CACzB,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAkD7D"}
@@ -0,0 +1,47 @@
1
+ import { effectiveRelations } from "../codegen/manifest-relations.js";
2
+ /** Build ER nodes/edges from the manifest (FK + M2M, junction hops collapsed). */
3
+ export function toStudioGraph(manifest) {
4
+ const junctions = new Set(manifest.manyToMany.map((m) => m.throughAccessor));
5
+ const nodes = Object.values(manifest.tables).map((table) => ({
6
+ accessor: table.accessor,
7
+ sqlName: table.sqlName,
8
+ junction: junctions.has(table.accessor),
9
+ columns: table.columns.map((c) => ({
10
+ tsName: c.tsName,
11
+ kind: c.kind,
12
+ primary: c.primary,
13
+ hidden: c.hidden ?? false,
14
+ })),
15
+ }));
16
+ const edges = [];
17
+ const seen = new Set();
18
+ const m2mPairs = new Map();
19
+ for (const m of manifest.manyToMany) {
20
+ m2mPairs.set([m.leftAccessor, m.rightAccessor].sort().join("~"), m);
21
+ }
22
+ for (const table of Object.values(manifest.tables)) {
23
+ for (const rel of effectiveRelations(manifest, table)) {
24
+ const pair = [table.accessor, rel.targetAccessor].sort().join("~");
25
+ const m2m = m2mPairs.get(pair);
26
+ const key = m2m
27
+ ? `m2m:${pair}:${m2m.throughAccessor}`
28
+ : `fk:${pair}:${rel.fkSqlColumn}`;
29
+ if (seen.has(key))
30
+ continue;
31
+ seen.add(key);
32
+ const label = rel.name === rel.inverse
33
+ ? rel.name
34
+ : `${table.accessor}.${rel.name} ↔ ${rel.targetAccessor}.${rel.inverse}`;
35
+ edges.push({
36
+ from: table.accessor,
37
+ to: rel.targetAccessor,
38
+ label,
39
+ cardinality: rel.cardinality,
40
+ m2m: m2m !== undefined,
41
+ ...(m2m ? { through: m2m.throughAccessor } : {}),
42
+ });
43
+ }
44
+ }
45
+ return { nodes, edges };
46
+ }
47
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/studio/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { DatabaseProvider } from "../datasource-provider.js";
2
+ import type { Manifest, ManifestForeignKey, ManifestIndex, ManifestManyToMany } from "../dialect/types.js";
3
+ export type StudioColumnMeta = {
4
+ tsName: string;
5
+ sqlName: string;
6
+ kind: string;
7
+ nullable: boolean;
8
+ unique: boolean;
9
+ primary: boolean;
10
+ index: boolean;
11
+ hidden: boolean;
12
+ generated: boolean;
13
+ defaultNow: boolean;
14
+ updatedAt: boolean;
15
+ defaultValue: unknown;
16
+ checkExpression?: string;
17
+ typeOptions: Record<string, unknown>;
18
+ fkTarget?: string;
19
+ fkAs?: string;
20
+ fkInverse?: string;
21
+ onDelete?: string;
22
+ onUpdate?: string;
23
+ /** TS names this column can be uniquely addressed by (single-column group it belongs to). */
24
+ uniqueGroups: string[][];
25
+ };
26
+ export type StudioRelationMeta = {
27
+ name: string;
28
+ targetTable: string;
29
+ targetAccessor: string;
30
+ cardinality: "one" | "many";
31
+ inverse: string;
32
+ fkColumn: string;
33
+ fkSqlColumn: string;
34
+ targetColumn: string;
35
+ /** True for M2M aliases synthesized by effectiveRelations. */
36
+ m2m: boolean;
37
+ };
38
+ export type StudioTableMeta = {
39
+ accessor: string;
40
+ sqlName: string;
41
+ schemaName?: string;
42
+ columns: StudioColumnMeta[];
43
+ relations: StudioRelationMeta[];
44
+ indexes: ManifestIndex[];
45
+ primaryKey: readonly string[];
46
+ foreignKeys: ManifestForeignKey[];
47
+ /** TS-name groups usable as unique `where` (PK first). */
48
+ uniqueKeys: string[][];
49
+ /** True when this table is an M2M junction table. */
50
+ junction: boolean;
51
+ /** False when the table has no usable unique key (browse/create only). */
52
+ mutable: boolean;
53
+ };
54
+ export type StudioForeignKeyMeta = ManifestForeignKey;
55
+ export type StudioMeta = {
56
+ provider?: DatabaseProvider;
57
+ pgSchema?: string;
58
+ enumMode?: "check" | "union" | "native";
59
+ enumTypes: Record<string, {
60
+ values: readonly string[];
61
+ }>;
62
+ extensions: string[];
63
+ tables: Record<string, StudioTableMeta>;
64
+ manyToMany: ManifestManyToMany[];
65
+ /** Where the metadata came from: live `schema.ts` compile or `snapshot.json`. */
66
+ metaSource: "schema" | "snapshot";
67
+ };
68
+ /**
69
+ * Strip secrets and internals from a manifest for the Studio browser.
70
+ * `manifest.url` (the datasource connection string) is never exposed.
71
+ */
72
+ export declare function toStudioMeta(manifest: Manifest, options?: {
73
+ metaSource?: "schema" | "snapshot";
74
+ pgSchema?: string;
75
+ }): StudioMeta;
76
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/studio/meta.ts"],"names":[],"mappings":"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"}