@zeronsh/orbit 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.
@@ -0,0 +1,253 @@
1
+ import { table, relationships, createSchema, number, boolean, json, string, optional } from './chunk-N2NAKHMU.js';
2
+
3
+ // orm-core/src/adapter.ts
4
+ function defineAdapter(adapter) {
5
+ return adapter;
6
+ }
7
+
8
+ // orm-core/src/build.ts
9
+ function makeColumn(c) {
10
+ const base = c.type === "number" ? number() : c.type === "boolean" ? boolean() : c.type === "json" ? json() : string();
11
+ return c.optional ? optional(base) : base;
12
+ }
13
+ function buildOrbitSchema(ir) {
14
+ const tableDefs = /* @__PURE__ */ new Map();
15
+ const tables = [];
16
+ for (const t of ir.tables) {
17
+ const columns = {};
18
+ for (const c of t.columns) columns[c.name] = makeColumn(c);
19
+ const pk = t.primaryKey.length ? t.primaryKey : ["id"];
20
+ const def = table(t.name).columns(columns).primaryKey(...pk);
21
+ tableDefs.set(t.name, def);
22
+ tables.push(def);
23
+ }
24
+ const byTable = /* @__PURE__ */ new Map();
25
+ for (const r of ir.relationships) {
26
+ const list = byTable.get(r.table) ?? [];
27
+ list.push(r);
28
+ byTable.set(r.table, list);
29
+ }
30
+ const rels = [];
31
+ for (const [tableName, list] of byTable) {
32
+ const src = tableDefs.get(tableName);
33
+ if (!src) continue;
34
+ rels.push(
35
+ relationships(src, ({ one, many }) => {
36
+ const out = {};
37
+ for (const r of list) {
38
+ const last = r.chain[r.chain.length - 1];
39
+ const connect = last.cardinality === "one" ? one : many;
40
+ const args = r.chain.map((c) => {
41
+ const dest = tableDefs.get(c.destSchema);
42
+ if (!dest) throw new Error(`@orbit/orm-core: relationship "${tableName}.${r.name}" references unknown table "${c.destSchema}"`);
43
+ return { sourceField: [...c.sourceField], destField: [...c.destField], destSchema: dest };
44
+ });
45
+ out[r.name] = connect(...args);
46
+ }
47
+ return out;
48
+ })
49
+ );
50
+ }
51
+ return createSchema({ tables, relationships: rels });
52
+ }
53
+
54
+ // orm-core/src/emit.ts
55
+ var RESERVED = /* @__PURE__ */ new Set([
56
+ "break",
57
+ "case",
58
+ "catch",
59
+ "class",
60
+ "const",
61
+ "continue",
62
+ "debugger",
63
+ "default",
64
+ "delete",
65
+ "do",
66
+ "else",
67
+ "export",
68
+ "extends",
69
+ "false",
70
+ "finally",
71
+ "for",
72
+ "function",
73
+ "if",
74
+ "import",
75
+ "in",
76
+ "instanceof",
77
+ "new",
78
+ "null",
79
+ "return",
80
+ "super",
81
+ "switch",
82
+ "this",
83
+ "throw",
84
+ "true",
85
+ "try",
86
+ "typeof",
87
+ "var",
88
+ "void",
89
+ "while",
90
+ "with",
91
+ "yield",
92
+ "let",
93
+ "static",
94
+ "enum",
95
+ "await",
96
+ "implements",
97
+ "package",
98
+ "protected",
99
+ "interface",
100
+ "private",
101
+ "public",
102
+ "schema",
103
+ "table",
104
+ "string",
105
+ "number",
106
+ "boolean",
107
+ "json",
108
+ "optional",
109
+ "createSchema",
110
+ "relationships",
111
+ "RowOf",
112
+ "one",
113
+ "many"
114
+ ]);
115
+ var IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
116
+ function isValidIdent(s) {
117
+ return IDENT_RE.test(s);
118
+ }
119
+ function tableIdentifiers(tables) {
120
+ const out = /* @__PURE__ */ new Map();
121
+ const used = /* @__PURE__ */ new Set();
122
+ for (const t of tables) {
123
+ let base = t.name.replace(/[^A-Za-z0-9_$]/g, "_");
124
+ if (!IDENT_RE.test(base) || base.startsWith("_") === false && /^[0-9]/.test(base)) base = `t_${base}`;
125
+ if (RESERVED.has(base)) base = `${base}_`;
126
+ let ident = base;
127
+ let i = 2;
128
+ while (used.has(ident)) ident = `${base}${i++}`;
129
+ used.add(ident);
130
+ out.set(t.name, ident);
131
+ }
132
+ return out;
133
+ }
134
+ function pascal(name) {
135
+ return name.split(/[^A-Za-z0-9]+/).filter(Boolean).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join("") || "Row";
136
+ }
137
+ function keyLiteral(name) {
138
+ return isValidIdent(name) && !RESERVED.has(name) ? name : JSON.stringify(name);
139
+ }
140
+ function fieldArray(fields) {
141
+ return `[${fields.map((f) => JSON.stringify(f)).join(", ")}]`;
142
+ }
143
+ function columnExpr(c) {
144
+ const generic = c.customType ? `<${c.customType}>` : "";
145
+ const call = `${c.type}${generic}()`;
146
+ return c.optional ? `optional(${call})` : call;
147
+ }
148
+ function emitTable(t, ident) {
149
+ const cols = t.columns.map((c) => ` ${keyLiteral(c.name)}: ${columnExpr(c)},`).join("\n");
150
+ const pk = (t.primaryKey.length ? t.primaryKey : ["id"]).map((k) => JSON.stringify(k)).join(", ");
151
+ return `const ${ident} = table(${JSON.stringify(t.name)})
152
+ .columns({
153
+ ${cols}
154
+ })
155
+ .primaryKey(${pk});`;
156
+ }
157
+ function emitRelationshipsBlock(tableName, rels, idents) {
158
+ const srcIdent = idents.get(tableName);
159
+ const entries = rels.map((r) => {
160
+ const last = r.chain[r.chain.length - 1];
161
+ const fn = last.cardinality === "one" ? "one" : "many";
162
+ const hops = r.chain.map((c) => {
163
+ const destIdent = idents.get(c.destSchema);
164
+ if (!destIdent) throw new Error(`@orbit/orm-core: relationship "${tableName}.${r.name}" references unknown table "${c.destSchema}"`);
165
+ return `{ sourceField: ${fieldArray(c.sourceField)}, destField: ${fieldArray(c.destField)}, destSchema: ${destIdent} }`;
166
+ });
167
+ const body = hops.length === 1 ? `${fn}(${hops[0]})` : `${fn}(
168
+ ${hops.join(",\n ")},
169
+ )`;
170
+ return ` ${keyLiteral(r.name)}: ${body},`;
171
+ }).join("\n");
172
+ return ` relationships(${srcIdent}, ({ one, many }) => ({
173
+ ${entries}
174
+ })),`;
175
+ }
176
+ function emitSchema(ir, options = {}) {
177
+ const {
178
+ importFrom = "@zeronsh/orbit/client",
179
+ jsExtension = false,
180
+ schemaName = "schema",
181
+ rowTypes = true,
182
+ header = ["Generated by @orbit/orm-core \u2014 do not edit by hand."]
183
+ } = options;
184
+ const idents = tableIdentifiers(ir.tables);
185
+ const used = /* @__PURE__ */ new Set(["createSchema", "table"]);
186
+ for (const t of ir.tables) {
187
+ for (const c of t.columns) {
188
+ used.add(c.type);
189
+ if (c.optional) used.add("optional");
190
+ }
191
+ }
192
+ const hasRels = ir.relationships.length > 0;
193
+ if (hasRels) used.add("relationships");
194
+ if (rowTypes) used.add("RowOf");
195
+ const valueImports = [...used].filter((u) => u !== "RowOf");
196
+ const order = ["createSchema", "relationships", "table", "string", "number", "boolean", "json", "optional"];
197
+ valueImports.sort((a, b) => {
198
+ const ia = order.indexOf(a);
199
+ const ib = order.indexOf(b);
200
+ return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib);
201
+ });
202
+ const spec = jsExtension ? `${importFrom}` : importFrom;
203
+ const lines = [];
204
+ for (const h of header) lines.push(`// ${h}`);
205
+ if (header.length) lines.push("");
206
+ lines.push(`import {`);
207
+ for (const v of valueImports) lines.push(` ${v},`);
208
+ lines.push(`} from ${JSON.stringify(spec)};`);
209
+ if (rowTypes) lines.push(`import type { RowOf } from ${JSON.stringify(spec)};`);
210
+ for (const imp of options.typeImports ?? []) {
211
+ if (imp.names.length) lines.push(`import type { ${[...imp.names].join(", ")} } from ${JSON.stringify(imp.module)};`);
212
+ }
213
+ lines.push("");
214
+ for (const t of ir.tables) {
215
+ lines.push(emitTable(t, idents.get(t.name)));
216
+ lines.push("");
217
+ }
218
+ const tableList = ir.tables.map((t) => idents.get(t.name)).join(", ");
219
+ lines.push(`export const ${schemaName} = createSchema({`);
220
+ lines.push(` tables: [${tableList}],`);
221
+ if (hasRels) {
222
+ const byTable = /* @__PURE__ */ new Map();
223
+ for (const r of ir.relationships) {
224
+ const l = byTable.get(r.table) ?? [];
225
+ l.push(r);
226
+ byTable.set(r.table, l);
227
+ }
228
+ lines.push(` relationships: [`);
229
+ for (const t of ir.tables) {
230
+ const list = byTable.get(t.name);
231
+ if (list && list.length) lines.push(emitRelationshipsBlock(t.name, list, idents));
232
+ }
233
+ lines.push(` ],`);
234
+ }
235
+ lines.push(`});`);
236
+ lines.push("");
237
+ lines.push(`export type ${pascal(schemaName)} = typeof ${schemaName};`);
238
+ if (rowTypes) {
239
+ lines.push("");
240
+ const seen = /* @__PURE__ */ new Set([pascal(schemaName)]);
241
+ for (const t of ir.tables) {
242
+ let name = pascal(t.name);
243
+ while (seen.has(name)) name = `${name}Row`;
244
+ seen.add(name);
245
+ lines.push(`export type ${name} = RowOf<typeof ${idents.get(t.name)}>;`);
246
+ }
247
+ }
248
+ return lines.join("\n") + "\n";
249
+ }
250
+
251
+ export { buildOrbitSchema, defineAdapter, emitSchema };
252
+ //# sourceMappingURL=chunk-7CMFTRDQ.js.map
253
+ //# sourceMappingURL=chunk-7CMFTRDQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../orm-core/src/adapter.ts","../orm-core/src/build.ts","../orm-core/src/emit.ts"],"names":[],"mappings":"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","file":"chunk-7CMFTRDQ.js","sourcesContent":["// The adapter contract. An ORM adapter converts its native schema into the\n// {@link SchemaIR}. That's the entire surface a new ORM has to implement —\n// everything downstream (runtime build + codegen) is shared.\n\nimport type { SchemaIR } from './ir.ts';\n\n/**\n * Converts an ORM's native schema (`Input`) into Orbit's normalized {@link SchemaIR}.\n *\n * @typeParam Input the ORM's schema object (e.g. a Drizzle `* as schema` import).\n * @typeParam Config adapter-specific options (table/column selection, casing, …).\n */\nexport interface OrmAdapter<Input = unknown, Config = unknown> {\n /** Stable adapter id, e.g. `'drizzle'`. Used in generated-file headers. */\n readonly name: string;\n /** Produce the normalized IR for the given schema + options. */\n toIR(input: Input, config?: Config): SchemaIR;\n}\n\n/** Helper to define an adapter with inferred generics. */\nexport function defineAdapter<Input, Config>(adapter: OrmAdapter<Input, Config>): OrmAdapter<Input, Config> {\n return adapter;\n}\n","// Runtime: turn a {@link SchemaIR} into a live Orbit `SchemaDef` (the same object\n// `createSchema(...)` would produce). Used by adapters' `defineOrbitSchema(...)`\n// runtime entry point. Custom `$type<>()` types are type-level only and do not\n// exist at runtime, so this produces the plain column types; for full custom-type\n// fidelity, use the codegen emitter (`emit.ts`) instead.\n\nimport {\n boolean as boolCol,\n createSchema,\n json as jsonCol,\n number as numCol,\n optional,\n relationships,\n string as strCol,\n table,\n type Column,\n type RelationshipsDef,\n type SchemaDef,\n type TableDef,\n} from '../../client/src/index.ts';\nimport type { IRColumn, IRRelationship, SchemaIR } from './ir.ts';\n\nfunction makeColumn(c: IRColumn): Column {\n const base =\n c.type === 'number' ? numCol() : c.type === 'boolean' ? boolCol() : c.type === 'json' ? jsonCol() : strCol();\n return c.optional ? optional(base as Column) : (base as Column);\n}\n\n/** Build a live Orbit schema object from the IR. */\nexport function buildOrbitSchema(ir: SchemaIR): SchemaDef {\n const tableDefs = new Map<string, TableDef>();\n const tables: TableDef[] = [];\n\n for (const t of ir.tables) {\n const columns: Record<string, Column> = {};\n for (const c of t.columns) columns[c.name] = makeColumn(c);\n const pk = (t.primaryKey.length ? t.primaryKey : ['id']) as [string, ...string[]];\n const def = table(t.name)\n .columns(columns as never)\n .primaryKey(...pk) as unknown as TableDef;\n tableDefs.set(t.name, def);\n tables.push(def);\n }\n\n // `relationships()` is per source table, and `createSchema` rejects a table\n // whose relationships are declared twice — so group all of a table's\n // relationships into one call.\n const byTable = new Map<string, IRRelationship[]>();\n for (const r of ir.relationships) {\n const list = byTable.get(r.table) ?? [];\n list.push(r);\n byTable.set(r.table, list);\n }\n\n const rels: RelationshipsDef[] = [];\n for (const [tableName, list] of byTable) {\n const src = tableDefs.get(tableName);\n if (!src) continue;\n rels.push(\n relationships(src, ({ one, many }) => {\n const out: Record<string, unknown> = {};\n for (const r of list) {\n const last = r.chain[r.chain.length - 1];\n const connect = last.cardinality === 'one' ? one : many;\n const args = r.chain.map((c) => {\n const dest = tableDefs.get(c.destSchema);\n if (!dest) throw new Error(`@orbit/orm-core: relationship \"${tableName}.${r.name}\" references unknown table \"${c.destSchema}\"`);\n return { sourceField: [...c.sourceField], destField: [...c.destField], destSchema: dest };\n });\n // `one`/`many` accept 1 (direct) or 2 (junction) hops.\n out[r.name] = (connect as (...a: unknown[]) => unknown)(...args);\n }\n return out as never;\n }),\n );\n }\n\n return createSchema({ tables: tables as never, relationships: rels as never });\n}\n","// Codegen: turn a {@link SchemaIR} into Orbit-schema TypeScript *source*. Unlike\n// the runtime builder, this preserves each column's custom `$type<>()` and enum\n// types (emitted as `string<...>()` / `json<...>()`), so the generated schema is\n// fully typed. Output is plain text; the CLI optionally runs Prettier over it.\n\nimport type { IRColumn, IRRelationship, IRTable, SchemaIR } from './ir.ts';\n\nexport interface EmitOptions {\n /** Module the Orbit schema helpers are imported from. Default `@orbit/client`. */\n readonly importFrom?: string;\n /** Append `.js` to the import (Node16/NodeNext ESM). Default false. */\n readonly jsExtension?: boolean;\n /** Exported schema const name. Default `schema`. */\n readonly schemaName?: string;\n /** Also emit `export type <Table> = RowOf<typeof <table>>` for each table. Default true. */\n readonly rowTypes?: boolean;\n /** Header comment lines (without leading `//`). */\n readonly header?: readonly string[];\n /**\n * Extra `import type { ... } from '...'` lines to prepend — used to bring in the\n * named TypeScript types referenced by resolved custom column types (e.g. a\n * `jsonb().$type<PostMeta>()` resolves to `PostMeta`, imported from the schema).\n */\n readonly typeImports?: readonly { readonly module: string; readonly names: readonly string[] }[];\n}\n\nconst RESERVED = new Set([\n 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else',\n 'export', 'extends', 'false', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof', 'new',\n 'null', 'return', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof', 'var', 'void', 'while',\n 'with', 'yield', 'let', 'static', 'enum', 'await', 'implements', 'package', 'protected', 'interface',\n 'private', 'public', 'schema', 'table', 'string', 'number', 'boolean', 'json', 'optional', 'createSchema',\n 'relationships', 'RowOf', 'one', 'many',\n]);\n\nconst IDENT_RE = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\nfunction isValidIdent(s: string): boolean {\n return IDENT_RE.test(s);\n}\n\n/** A stable, collision-free identifier for each table name (used as the const). */\nfunction tableIdentifiers(tables: readonly IRTable[]): Map<string, string> {\n const out = new Map<string, string>();\n const used = new Set<string>();\n for (const t of tables) {\n let base = t.name.replace(/[^A-Za-z0-9_$]/g, '_');\n if (!IDENT_RE.test(base) || base.startsWith('_') === false && /^[0-9]/.test(base)) base = `t_${base}`;\n if (RESERVED.has(base)) base = `${base}_`;\n let ident = base;\n let i = 2;\n while (used.has(ident)) ident = `${base}${i++}`;\n used.add(ident);\n out.set(t.name, ident);\n }\n return out;\n}\n\nfunction pascal(name: string): string {\n return name\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((p) => p.charAt(0).toUpperCase() + p.slice(1))\n .join('') || 'Row';\n}\n\nfunction keyLiteral(name: string): string {\n return isValidIdent(name) && !RESERVED.has(name) ? name : JSON.stringify(name);\n}\n\nfunction fieldArray(fields: readonly string[]): string {\n return `[${fields.map((f) => JSON.stringify(f)).join(', ')}]`;\n}\n\nfunction columnExpr(c: IRColumn): string {\n const generic = c.customType ? `<${c.customType}>` : '';\n const call = `${c.type}${generic}()`;\n return c.optional ? `optional(${call})` : call;\n}\n\nfunction emitTable(t: IRTable, ident: string): string {\n const cols = t.columns.map((c) => ` ${keyLiteral(c.name)}: ${columnExpr(c)},`).join('\\n');\n const pk = (t.primaryKey.length ? t.primaryKey : ['id']).map((k) => JSON.stringify(k)).join(', ');\n return `const ${ident} = table(${JSON.stringify(t.name)})\\n .columns({\\n${cols}\\n })\\n .primaryKey(${pk});`;\n}\n\nfunction emitRelationshipsBlock(\n tableName: string,\n rels: readonly IRRelationship[],\n idents: Map<string, string>,\n): string {\n const srcIdent = idents.get(tableName)!;\n const entries = rels\n .map((r) => {\n const last = r.chain[r.chain.length - 1];\n const fn = last.cardinality === 'one' ? 'one' : 'many';\n const hops = r.chain.map((c) => {\n const destIdent = idents.get(c.destSchema);\n if (!destIdent) throw new Error(`@orbit/orm-core: relationship \"${tableName}.${r.name}\" references unknown table \"${c.destSchema}\"`);\n return `{ sourceField: ${fieldArray(c.sourceField)}, destField: ${fieldArray(c.destField)}, destSchema: ${destIdent} }`;\n });\n const body = hops.length === 1 ? `${fn}(${hops[0]})` : `${fn}(\\n ${hops.join(',\\n ')},\\n )`;\n return ` ${keyLiteral(r.name)}: ${body},`;\n })\n .join('\\n');\n return ` relationships(${srcIdent}, ({ one, many }) => ({\\n${entries}\\n })),`;\n}\n\n/** Emit the full Orbit-schema TypeScript source for an IR. */\nexport function emitSchema(ir: SchemaIR, options: EmitOptions = {}): string {\n const {\n importFrom = '@zeronsh/orbit/client',\n jsExtension = false,\n schemaName = 'schema',\n rowTypes = true,\n header = ['Generated by @orbit/orm-core — do not edit by hand.'],\n } = options;\n\n const idents = tableIdentifiers(ir.tables);\n\n // Which helpers do we actually use?\n const used = new Set<string>(['createSchema', 'table']);\n for (const t of ir.tables) {\n for (const c of t.columns) {\n used.add(c.type);\n if (c.optional) used.add('optional');\n }\n }\n const hasRels = ir.relationships.length > 0;\n if (hasRels) used.add('relationships');\n if (rowTypes) used.add('RowOf');\n\n // `RowOf` is a type-only export; keep it in a separate `import type` for clarity.\n const valueImports = [...used].filter((u) => u !== 'RowOf');\n const order = ['createSchema', 'relationships', 'table', 'string', 'number', 'boolean', 'json', 'optional'];\n valueImports.sort((a, b) => {\n const ia = order.indexOf(a);\n const ib = order.indexOf(b);\n return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib);\n });\n\n const spec = jsExtension ? `${importFrom}` : importFrom; // import path unchanged; subpath rarely needs .js\n const lines: string[] = [];\n\n for (const h of header) lines.push(`// ${h}`);\n if (header.length) lines.push('');\n\n lines.push(`import {`);\n for (const v of valueImports) lines.push(` ${v},`);\n lines.push(`} from ${JSON.stringify(spec)};`);\n if (rowTypes) lines.push(`import type { RowOf } from ${JSON.stringify(spec)};`);\n for (const imp of options.typeImports ?? []) {\n if (imp.names.length) lines.push(`import type { ${[...imp.names].join(', ')} } from ${JSON.stringify(imp.module)};`);\n }\n lines.push('');\n\n // Tables.\n for (const t of ir.tables) {\n lines.push(emitTable(t, idents.get(t.name)!));\n lines.push('');\n }\n\n // Schema.\n const tableList = ir.tables.map((t) => idents.get(t.name)!).join(', ');\n lines.push(`export const ${schemaName} = createSchema({`);\n lines.push(` tables: [${tableList}],`);\n if (hasRels) {\n const byTable = new Map<string, IRRelationship[]>();\n for (const r of ir.relationships) {\n const l = byTable.get(r.table) ?? [];\n l.push(r);\n byTable.set(r.table, l);\n }\n lines.push(` relationships: [`);\n for (const t of ir.tables) {\n const list = byTable.get(t.name);\n if (list && list.length) lines.push(emitRelationshipsBlock(t.name, list, idents));\n }\n lines.push(` ],`);\n }\n lines.push(`});`);\n lines.push('');\n lines.push(`export type ${pascal(schemaName)} = typeof ${schemaName};`);\n\n // Row types.\n if (rowTypes) {\n lines.push('');\n const seen = new Set<string>([pascal(schemaName)]);\n for (const t of ir.tables) {\n let name = pascal(t.name);\n while (seen.has(name)) name = `${name}Row`;\n seen.add(name);\n lines.push(`export type ${name} = RowOf<typeof ${idents.get(t.name)!}>;`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n"]}