@kurotako/ir 0.2.0 → 0.3.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.
package/dist/index.js CHANGED
@@ -61,6 +61,8 @@ var FieldTypeSchema = v.lazy(
61
61
  v.object({ kind: v.literal("enum"), ref: v.string() }),
62
62
  v.object({ kind: v.literal("unknown"), hint: v.optional(v.string()) }),
63
63
  v.object({ kind: v.literal("ref"), ref: v.string() }),
64
+ v.object({ kind: v.literal("map"), value: FieldTypeSchema }),
65
+ v.object({ kind: v.literal("array"), element: FieldTypeSchema }),
64
66
  v.object({
65
67
  kind: v.literal("union"),
66
68
  variants: v.array(FieldTypeSchema),
@@ -145,6 +147,7 @@ var CompositeUniqueSchema = v.object({
145
147
  var EntitySchema = v.object({
146
148
  name: v.string(),
147
149
  fields: v.array(FieldSchema),
150
+ additionalProperties: v.optional(FieldTypeSchema),
148
151
  relations: v.array(RelationSchema),
149
152
  enums: v.optional(v.record(v.string(), EnumDefSchema)),
150
153
  primaryKey: v.optional(v.array(v.string())),
@@ -170,7 +173,7 @@ var IrSchema = v.object({
170
173
  import * as v2 from "valibot";
171
174
 
172
175
  // src/version.ts
173
- var IR_VERSION = "2";
176
+ var IR_VERSION = "4";
174
177
  function isCompatible(irVersion) {
175
178
  return irVersion === IR_VERSION;
176
179
  }
@@ -268,6 +271,19 @@ function walkFieldType(type, path, entity, source, issues, info) {
268
271
  }
269
272
  return;
270
273
  }
274
+ case "map":
275
+ walkFieldType(type.value, `${path}.value`, entity, source, issues, info);
276
+ return;
277
+ case "array":
278
+ walkFieldType(
279
+ type.element,
280
+ `${path}.element`,
281
+ entity,
282
+ source,
283
+ issues,
284
+ info
285
+ );
286
+ return;
271
287
  case "union": {
272
288
  if (type.variants.length < 2) {
273
289
  pushIssue(
@@ -314,6 +330,10 @@ function collectRefs(type, out) {
314
330
  for (const variant2 of type.variants) {
315
331
  collectRefs(variant2, out);
316
332
  }
333
+ } else if (type.kind === "map") {
334
+ collectRefs(type.value, out);
335
+ } else if (type.kind === "array") {
336
+ collectRefs(type.element, out);
317
337
  }
318
338
  }
319
339
  function checkRefCycles(namespace, source, info) {
@@ -403,6 +423,16 @@ function checkSource(namespace, source, lookupEntity, isNamespacePresent, issues
403
423
  checkConstraints(issues, `${fPath}.constraints`, field.constraints);
404
424
  walkFieldType(field.type, fPath, entity, source, issues, info);
405
425
  }
426
+ if (entity.additionalProperties !== void 0) {
427
+ walkFieldType(
428
+ entity.additionalProperties,
429
+ `${ePath}.additionalProperties`,
430
+ entity,
431
+ source,
432
+ issues,
433
+ info
434
+ );
435
+ }
406
436
  for (const [localKey, def] of Object.entries(entity.enums ?? {})) {
407
437
  if (def.name !== localKey) {
408
438
  pushIssue(
@@ -653,6 +683,18 @@ var UnionBuilderImpl = class _UnionBuilderImpl {
653
683
  }
654
684
  return this;
655
685
  }
686
+ map(build) {
687
+ const value = new TypeAliasBuilderImpl(this.#path, "map-value");
688
+ build(value);
689
+ this.#variants.push({ kind: "map", value: value.build().type });
690
+ return this;
691
+ }
692
+ array(build) {
693
+ const element = new TypeAliasBuilderImpl(this.#path, "array-element");
694
+ build(element);
695
+ this.#variants.push({ kind: "array", element: element.build().type });
696
+ return this;
697
+ }
656
698
  unknown(hint) {
657
699
  this.#variants.push(
658
700
  hint === void 0 ? { kind: "unknown" } : { kind: "unknown", hint }
@@ -694,7 +736,7 @@ var UnionBuilderImpl = class _UnionBuilderImpl {
694
736
  return type;
695
737
  }
696
738
  };
697
- var TypeAliasBuilderImpl = class {
739
+ var TypeAliasBuilderImpl = class _TypeAliasBuilderImpl {
698
740
  #path;
699
741
  #name;
700
742
  #type = { kind: "unknown" };
@@ -721,6 +763,18 @@ var TypeAliasBuilderImpl = class {
721
763
  this.#type = nested.build();
722
764
  return this;
723
765
  }
766
+ map(build) {
767
+ const value = new _TypeAliasBuilderImpl(this.#path, "map-value");
768
+ build(value);
769
+ this.#type = { kind: "map", value: value.build().type };
770
+ return this;
771
+ }
772
+ array(build) {
773
+ const element = new _TypeAliasBuilderImpl(this.#path, "array-element");
774
+ build(element);
775
+ this.#type = { kind: "array", element: element.build().type };
776
+ return this;
777
+ }
724
778
  unknown(hint) {
725
779
  this.#type = hint === void 0 ? { kind: "unknown" } : { kind: "unknown", hint };
726
780
  return this;
@@ -774,6 +828,18 @@ var FieldBuilderImpl = class {
774
828
  this.#field.type = builder.build();
775
829
  return this;
776
830
  }
831
+ map(build) {
832
+ const value = new TypeAliasBuilderImpl(this.#path, "map-value");
833
+ build(value);
834
+ this.#field.type = { kind: "map", value: value.build().type };
835
+ return this;
836
+ }
837
+ array(build) {
838
+ const element = new TypeAliasBuilderImpl(this.#path, "array-element");
839
+ build(element);
840
+ this.#field.type = { kind: "array", element: element.build().type };
841
+ return this;
842
+ }
777
843
  unknown(hint) {
778
844
  this.#field.type = hint === void 0 ? { kind: "unknown" } : { kind: "unknown", hint };
779
845
  return this;
@@ -917,6 +983,7 @@ var EntityBuilderImpl = class {
917
983
  #uniques = [];
918
984
  #doc;
919
985
  #dbName;
986
+ #additionalProperties;
920
987
  constructor(namespace, name) {
921
988
  this.#namespace = namespace;
922
989
  this.#name = name;
@@ -943,6 +1010,15 @@ var EntityBuilderImpl = class {
943
1010
  this.#fields.push(builder);
944
1011
  return this;
945
1012
  }
1013
+ additionalProperties(def) {
1014
+ const value = new TypeAliasBuilderImpl(
1015
+ `${this.#namespace}.${this.#name}.additionalProperties`,
1016
+ "additionalProperties"
1017
+ );
1018
+ def(value);
1019
+ this.#additionalProperties = value.build().type;
1020
+ return this;
1021
+ }
946
1022
  relation(name, def) {
947
1023
  const builder = new RelationBuilderImpl(name);
948
1024
  def(builder);
@@ -1008,6 +1084,9 @@ var EntityBuilderImpl = class {
1008
1084
  if (this.#dbName !== void 0) {
1009
1085
  entity.dbName = this.#dbName;
1010
1086
  }
1087
+ if (this.#additionalProperties !== void 0) {
1088
+ entity.additionalProperties = this.#additionalProperties;
1089
+ }
1011
1090
  return entity;
1012
1091
  }
1013
1092
  };
@@ -1126,6 +1205,10 @@ function collectRefNames(type, into = /* @__PURE__ */ new Set()) {
1126
1205
  for (const variant2 of type.variants) {
1127
1206
  collectRefNames(variant2, into);
1128
1207
  }
1208
+ } else if (type.kind === "map") {
1209
+ collectRefNames(type.value, into);
1210
+ } else if (type.kind === "array") {
1211
+ collectRefNames(type.element, into);
1129
1212
  }
1130
1213
  return into;
1131
1214
  }
@@ -1147,6 +1230,9 @@ function refCycleMembers(source) {
1147
1230
  for (const field of entity.fields) {
1148
1231
  collectRefNames(field.type, set);
1149
1232
  }
1233
+ if (entity.additionalProperties !== void 0) {
1234
+ collectRefNames(entity.additionalProperties, set);
1235
+ }
1150
1236
  }
1151
1237
  const canReachSelf = (start) => {
1152
1238
  const seen = /* @__PURE__ */ new Set();
@@ -1187,6 +1273,10 @@ function fieldTypeKey(type) {
1187
1273
  return `ref:${type.ref}`;
1188
1274
  case "unknown":
1189
1275
  return `unknown:${type.hint ?? ""}`;
1276
+ case "map":
1277
+ return `map:${fieldTypeKey(type.value)}`;
1278
+ case "array":
1279
+ return `array:${fieldTypeKey(type.element)}`;
1190
1280
  case "union":
1191
1281
  return `union:${flattenUnion(type).map(fieldTypeKey).join(",")}`;
1192
1282
  }
@@ -1274,6 +1364,12 @@ function scalarTsType(type) {
1274
1364
  return flattenUnion(type).map(
1275
1365
  (variant2) => variant2.kind === "union" ? `(${scalarTsType(variant2)})` : scalarTsType(variant2)
1276
1366
  ).join(" | ");
1367
+ case "map":
1368
+ return `Record<string, ${scalarTsType(type.value)}>`;
1369
+ case "array": {
1370
+ const element = scalarTsType(type.element);
1371
+ return type.element.kind === "union" ? `(${element})[]` : `${element}[]`;
1372
+ }
1277
1373
  }
1278
1374
  }
1279
1375
  function mapScalar(scalar) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/builder.ts","../src/schemas.ts","../src/validate.ts","../src/version.ts","../src/helpers.ts"],"sourcesContent":["/**\n * Fluent `SourceIR` builder with incremental validation.\n *\n * A parser builds one `SourceIR`; `@kurotako/core` merges them. Incremental\n * checks throw immediately with a located path (`pg.User.email`); `build()` runs\n * the full `assertSourceIR` as the final gate.\n */\nimport * as v from 'valibot';\nimport { ScalarTypeSchema } from './schemas.js';\nimport type {\n DefaultValue,\n Entity,\n EnumDef,\n EnumValue,\n Field,\n FieldType,\n IndexDef,\n IndexType,\n ReferentialAction,\n Relation,\n ScalarType,\n SourceIR,\n StringFormat,\n TypeAlias,\n} from './types.js';\nimport { assertSourceIR, type IrIssue, IrValidationError } from './validate.js';\n\nexport class IrBuildError extends Error {\n readonly path: string;\n readonly issues: IrIssue[] | undefined;\n\n constructor(path: string, message: string, issues?: IrIssue[]) {\n super(`${path}: ${message}`);\n this.name = 'IrBuildError';\n this.path = path;\n this.issues = issues;\n }\n}\n\n// --- public builder interfaces -----------------------------------------------\n\nexport interface EnumBuilder {\n value(name: string, opts?: { dbName?: string; doc?: string }): this;\n doc(text: string): this;\n dbName(name: string): this;\n}\n\n/** Type-setters shared by `UnionBuilder` and `TypeAliasBuilder`. */\nexport interface TypeVariantBuilder {\n scalar(t: ScalarType): this;\n enum(ref: string): this;\n ref(name: string): this;\n union(build: (u: UnionBuilder) => void): this;\n unknown(hint?: string): this;\n}\n\nexport interface UnionBuilder extends TypeVariantBuilder {\n /** `mapping` values must name a `ref` variant of this union. */\n discriminator(propertyName: string, mapping?: Record<string, string>): this;\n}\n\nexport interface TypeAliasBuilder extends TypeVariantBuilder {\n doc(text: string): this;\n}\n\nexport interface FieldBuilder {\n scalar(t: ScalarType): this;\n enum(ref: string): this;\n ref(name: string): this;\n union(build: (u: UnionBuilder) => void): this;\n unknown(hint?: string): this;\n list(): this;\n optional(): this;\n nullable(): this;\n primary(): this;\n unique(): this;\n min(n: number): this;\n max(n: number): this;\n minLength(n: number): this;\n maxLength(n: number): this;\n regex(src: string): this;\n format(f: StringFormat): this;\n default(d: DefaultValue): this;\n doc(text: string): this;\n dbName(name: string): this;\n}\n\nexport interface RelationBuilder {\n to(namespace: string, entity: string): this;\n one(): this;\n many(): this;\n optional(): this;\n owning(): this;\n backRelation(name: string): this;\n fkFields(...fields: string[]): this;\n references(...fields: string[]): this;\n onDelete(action: ReferentialAction): this;\n onUpdate(action: ReferentialAction): this;\n}\n\nexport interface EntityBuilder {\n field(name: string, def: (f: FieldBuilder) => void): this;\n relation(name: string, def: (r: RelationBuilder) => void): this;\n localEnum(name: string, def: (e: EnumBuilder) => void): this;\n primaryKey(...fields: string[]): this;\n index(fields: string[], opts?: { name?: string; type?: IndexType }): this;\n unique(fields: string[], opts?: { name?: string }): this;\n doc(text: string): this;\n dbName(name: string): this;\n}\n\nexport interface SourceIrBuilder {\n addEnum(name: string, def: (e: EnumBuilder) => void): this;\n addEntity(name: string, def: (e: EntityBuilder) => void): this;\n addTypeAlias(name: string, def: (t: TypeAliasBuilder) => void): this;\n build(): SourceIR;\n}\n\n// --- implementations -----------------------------------------------------------\n\nclass EnumBuilderImpl implements EnumBuilder {\n #def: EnumDef;\n\n constructor(name: string) {\n this.#def = { name, values: [] };\n }\n\n value(name: string, opts?: { dbName?: string; doc?: string }): this {\n const entry: EnumValue = { name };\n if (opts?.dbName !== undefined) {\n entry.dbName = opts.dbName;\n }\n if (opts?.doc !== undefined) {\n entry.doc = opts.doc;\n }\n this.#def.values.push(entry);\n return this;\n }\n\n doc(text: string): this {\n this.#def.doc = text;\n return this;\n }\n\n dbName(name: string): this {\n this.#def.dbName = name;\n return this;\n }\n\n build(): EnumDef {\n return this.#def;\n }\n}\n\nfunction checkedScalar(path: string, t: ScalarType): FieldType {\n if (!v.is(ScalarTypeSchema, t)) {\n throw new IrBuildError(path, `unknown scalar type '${t}'`);\n }\n return { kind: 'scalar', scalar: t };\n}\n\nclass UnionBuilderImpl implements UnionBuilder {\n #path: string;\n #variants: FieldType[] = [];\n #discriminator:\n | { propertyName: string; mapping?: Record<string, string> }\n | undefined;\n\n constructor(path: string) {\n this.#path = path;\n }\n\n scalar(t: ScalarType): this {\n this.#variants.push(checkedScalar(this.#path, t));\n return this;\n }\n\n enum(ref: string): this {\n this.#variants.push({ kind: 'enum', ref });\n return this;\n }\n\n ref(name: string): this {\n this.#variants.push({ kind: 'ref', ref: name });\n return this;\n }\n\n union(build: (u: UnionBuilder) => void): this {\n const nested = new UnionBuilderImpl(this.#path);\n build(nested);\n // Nested unions are flattened into this one on build.\n for (const variant of nested.#variants) {\n this.#variants.push(variant);\n }\n return this;\n }\n\n unknown(hint?: string): this {\n this.#variants.push(\n hint === undefined ? { kind: 'unknown' } : { kind: 'unknown', hint },\n );\n return this;\n }\n\n discriminator(propertyName: string, mapping?: Record<string, string>): this {\n this.#discriminator =\n mapping === undefined ? { propertyName } : { propertyName, mapping };\n return this;\n }\n\n build(): Extract<FieldType, { kind: 'union' }> {\n if (this.#variants.length < 2) {\n throw new IrBuildError(\n this.#path,\n `union() needs at least 2 variants, got ${this.#variants.length}`,\n );\n }\n const mapping = this.#discriminator?.mapping;\n if (mapping !== undefined) {\n const refVariants = new Set(\n this.#variants.flatMap((vv) => (vv.kind === 'ref' ? [vv.ref] : [])),\n );\n for (const [key, target] of Object.entries(mapping)) {\n if (!refVariants.has(target)) {\n throw new IrBuildError(\n this.#path,\n `discriminator mapping '${key}' -> '${target}' names no ref variant`,\n );\n }\n }\n }\n const type: Extract<FieldType, { kind: 'union' }> = {\n kind: 'union',\n variants: this.#variants,\n };\n if (this.#discriminator !== undefined) {\n type.discriminator = this.#discriminator;\n }\n return type;\n }\n}\n\nclass TypeAliasBuilderImpl implements TypeAliasBuilder {\n #path: string;\n #name: string;\n #type: FieldType = { kind: 'unknown' };\n #doc: string | undefined;\n\n constructor(path: string, name: string) {\n this.#path = path;\n this.#name = name;\n }\n\n scalar(t: ScalarType): this {\n this.#type = checkedScalar(this.#path, t);\n return this;\n }\n\n enum(ref: string): this {\n this.#type = { kind: 'enum', ref };\n return this;\n }\n\n ref(name: string): this {\n this.#type = { kind: 'ref', ref: name };\n return this;\n }\n\n union(build: (u: UnionBuilder) => void): this {\n const nested = new UnionBuilderImpl(this.#path);\n build(nested);\n this.#type = nested.build();\n return this;\n }\n\n unknown(hint?: string): this {\n this.#type =\n hint === undefined ? { kind: 'unknown' } : { kind: 'unknown', hint };\n return this;\n }\n\n doc(text: string): this {\n this.#doc = text;\n return this;\n }\n\n build(): TypeAlias {\n const alias: TypeAlias = { name: this.#name, type: this.#type };\n if (this.#doc !== undefined) {\n alias.doc = this.#doc;\n }\n return alias;\n }\n}\n\nclass FieldBuilderImpl implements FieldBuilder {\n #path: string;\n #field: Field;\n #onPrimary: (name: string) => void;\n\n constructor(path: string, name: string, onPrimary: (name: string) => void) {\n this.#path = path;\n this.#onPrimary = onPrimary;\n this.#field = {\n name,\n type: { kind: 'unknown' },\n list: false,\n optional: false,\n nullable: false,\n constraints: {},\n };\n }\n\n scalar(t: ScalarType): this {\n if (!v.is(ScalarTypeSchema, t)) {\n throw new IrBuildError(this.#path, `unknown scalar type '${t}'`);\n }\n this.#field.type = { kind: 'scalar', scalar: t };\n return this;\n }\n\n enum(ref: string): this {\n this.#field.type = { kind: 'enum', ref };\n return this;\n }\n\n ref(name: string): this {\n this.#field.type = { kind: 'ref', ref: name };\n return this;\n }\n\n union(build: (u: UnionBuilder) => void): this {\n const builder = new UnionBuilderImpl(this.#path);\n build(builder);\n this.#field.type = builder.build();\n return this;\n }\n\n unknown(hint?: string): this {\n this.#field.type =\n hint === undefined ? { kind: 'unknown' } : { kind: 'unknown', hint };\n return this;\n }\n\n list(): this {\n this.#field.list = true;\n return this;\n }\n\n optional(): this {\n this.#field.optional = true;\n return this;\n }\n\n nullable(): this {\n this.#field.nullable = true;\n return this;\n }\n\n primary(): this {\n if (this.#field.list) {\n throw new IrBuildError(\n this.#path,\n 'primary() cannot be used on a list field',\n );\n }\n this.#onPrimary(this.#field.name);\n return this;\n }\n\n unique(): this {\n this.#field.constraints.unique = true;\n return this;\n }\n\n min(n: number): this {\n this.#field.constraints.min = n;\n return this;\n }\n\n max(n: number): this {\n this.#field.constraints.max = n;\n return this;\n }\n\n minLength(n: number): this {\n this.#field.constraints.minLength = n;\n return this;\n }\n\n maxLength(n: number): this {\n this.#field.constraints.maxLength = n;\n return this;\n }\n\n regex(src: string): this {\n this.#field.constraints.regex = src;\n return this;\n }\n\n format(f: StringFormat): this {\n if (\n this.#field.type.kind !== 'scalar' ||\n this.#field.type.scalar !== 'string'\n ) {\n throw new IrBuildError(\n this.#path,\n 'format() requires a string scalar field',\n );\n }\n this.#field.constraints.format = f;\n return this;\n }\n\n default(d: DefaultValue): this {\n this.#field.default = d;\n return this;\n }\n\n doc(text: string): this {\n this.#field.doc = text;\n return this;\n }\n\n dbName(name: string): this {\n this.#field.dbName = name;\n return this;\n }\n\n build(): Field {\n return this.#field;\n }\n}\n\nclass RelationBuilderImpl implements RelationBuilder {\n #rel: Relation;\n\n constructor(name: string) {\n this.#rel = {\n name,\n target: { namespace: '', entity: '' },\n cardinality: 'one',\n optional: false,\n owning: false,\n };\n }\n\n to(namespace: string, entity: string): this {\n this.#rel.target = { namespace, entity };\n return this;\n }\n\n one(): this {\n this.#rel.cardinality = 'one';\n return this;\n }\n\n many(): this {\n this.#rel.cardinality = 'many';\n return this;\n }\n\n optional(): this {\n this.#rel.optional = true;\n return this;\n }\n\n owning(): this {\n this.#rel.owning = true;\n return this;\n }\n\n backRelation(name: string): this {\n this.#rel.backRelation = name;\n return this;\n }\n\n fkFields(...fields: string[]): this {\n this.#rel.fkFields = fields;\n return this;\n }\n\n references(...fields: string[]): this {\n this.#rel.references = fields;\n return this;\n }\n\n onDelete(action: ReferentialAction): this {\n this.#rel.onDelete = action;\n return this;\n }\n\n onUpdate(action: ReferentialAction): this {\n this.#rel.onUpdate = action;\n return this;\n }\n\n build(): Relation {\n return this.#rel;\n }\n}\n\nclass EntityBuilderImpl implements EntityBuilder {\n #namespace: string;\n #name: string;\n #fields: FieldBuilderImpl[] = [];\n #fieldNames = new Set<string>();\n #relations: RelationBuilderImpl[] = [];\n #localEnums: Record<string, EnumDef> = {};\n #primaryKey: string[] = [];\n #indexes: IndexDef[] = [];\n #uniques: { fields: string[]; name?: string }[] = [];\n #doc: string | undefined;\n #dbName: string | undefined;\n\n constructor(namespace: string, name: string) {\n this.#namespace = namespace;\n this.#name = name;\n }\n\n #addPrimary(field: string): void {\n if (!this.#primaryKey.includes(field)) {\n this.#primaryKey.push(field);\n }\n }\n\n field(name: string, def: (f: FieldBuilder) => void): this {\n if (this.#fieldNames.has(name)) {\n throw new IrBuildError(\n `${this.#namespace}.${this.#name}.${name}`,\n `duplicate field '${name}'`,\n );\n }\n this.#fieldNames.add(name);\n const builder = new FieldBuilderImpl(\n `${this.#namespace}.${this.#name}.${name}`,\n name,\n (pk) => this.#addPrimary(pk),\n );\n def(builder);\n this.#fields.push(builder);\n return this;\n }\n\n relation(name: string, def: (r: RelationBuilder) => void): this {\n const builder = new RelationBuilderImpl(name);\n def(builder);\n this.#relations.push(builder);\n return this;\n }\n\n localEnum(name: string, def: (e: EnumBuilder) => void): this {\n const builder = new EnumBuilderImpl(name);\n def(builder);\n this.#localEnums[name] = builder.build();\n return this;\n }\n\n primaryKey(...fields: string[]): this {\n for (const field of fields) {\n this.#addPrimary(field);\n }\n return this;\n }\n\n index(fields: string[], opts?: { name?: string; type?: IndexType }): this {\n const idx: IndexDef = { fields };\n if (opts?.name !== undefined) {\n idx.name = opts.name;\n }\n if (opts?.type !== undefined) {\n idx.type = opts.type;\n }\n this.#indexes.push(idx);\n return this;\n }\n\n unique(fields: string[], opts?: { name?: string }): this {\n const entry: { fields: string[]; name?: string } = { fields };\n if (opts?.name !== undefined) {\n entry.name = opts.name;\n }\n this.#uniques.push(entry);\n return this;\n }\n\n doc(text: string): this {\n this.#doc = text;\n return this;\n }\n\n dbName(name: string): this {\n this.#dbName = name;\n return this;\n }\n\n build(): Entity {\n const entity: Entity = {\n name: this.#name,\n fields: this.#fields.map((f) => f.build()),\n relations: this.#relations.map((r) => r.build()),\n indexes: this.#indexes,\n uniques: this.#uniques,\n };\n if (Object.keys(this.#localEnums).length > 0) {\n entity.enums = this.#localEnums;\n }\n if (this.#primaryKey.length > 0) {\n entity.primaryKey = this.#primaryKey;\n }\n if (this.#doc !== undefined) {\n entity.doc = this.#doc;\n }\n if (this.#dbName !== undefined) {\n entity.dbName = this.#dbName;\n }\n return entity;\n }\n}\n\nclass SourceIrBuilderImpl implements SourceIrBuilder {\n #namespace: string;\n #parser: string;\n #parserVersion: string | undefined;\n #entities: EntityBuilderImpl[] = [];\n #entityNames = new Set<string>();\n #enums: Record<string, EnumDef> = {};\n #typeAliases: Record<string, TypeAlias> = {};\n\n constructor(init: {\n namespace: string;\n parser: string;\n parserVersion?: string;\n }) {\n this.#namespace = init.namespace;\n this.#parser = init.parser;\n this.#parserVersion = init.parserVersion;\n }\n\n addEnum(name: string, def: (e: EnumBuilder) => void): this {\n const builder = new EnumBuilderImpl(name);\n def(builder);\n this.#enums[name] = builder.build();\n return this;\n }\n\n addEntity(name: string, def: (e: EntityBuilder) => void): this {\n if (this.#entityNames.has(name)) {\n throw new IrBuildError(\n `${this.#namespace}.${name}`,\n `duplicate entity '${name}'`,\n );\n }\n this.#entityNames.add(name);\n const builder = new EntityBuilderImpl(this.#namespace, name);\n def(builder);\n this.#entities.push(builder);\n return this;\n }\n\n addTypeAlias(name: string, def: (t: TypeAliasBuilder) => void): this {\n if (name in this.#typeAliases) {\n throw new IrBuildError(\n `${this.#namespace}.typeAliases.${name}`,\n `duplicate type alias '${name}'`,\n );\n }\n const builder = new TypeAliasBuilderImpl(\n `${this.#namespace}.typeAliases.${name}`,\n name,\n );\n def(builder);\n this.#typeAliases[name] = builder.build();\n return this;\n }\n\n build(): SourceIR {\n const source: SourceIR = {\n namespace: this.#namespace,\n parser: this.#parser,\n entities: Object.fromEntries(\n this.#entities.map((e) => {\n const built = e.build();\n return [built.name, built];\n }),\n ),\n enums: this.#enums,\n };\n if (this.#parserVersion !== undefined) {\n source.parserVersion = this.#parserVersion;\n }\n if (Object.keys(this.#typeAliases).length > 0) {\n source.typeAliases = this.#typeAliases;\n }\n\n try {\n assertSourceIR(source);\n } catch (err) {\n if (err instanceof IrValidationError) {\n const first = err.issues[0];\n throw new IrBuildError(\n first?.path ?? this.#namespace,\n first?.message ?? 'invalid SourceIR',\n err.issues,\n );\n }\n throw err;\n }\n return source;\n }\n}\n\nexport function createSourceIR(init: {\n namespace: string;\n parser: string;\n parserVersion?: string;\n}): SourceIrBuilder {\n return new SourceIrBuilderImpl(init);\n}\n","/**\n * Valibot schemas — the single source of truth for the IR format.\n *\n * `types.ts` derives every type alias from these schemas via `v.InferOutput`;\n * `validate.ts` runs `v.safeParse` against them before the cross-reference pass.\n * Every schema stays plain and JSON-serializable by construction: only object,\n * array, record, picklist, variant and primitives — no `Date`, `RegExp`, classes\n * or functions. This is what keeps `--emit-ir` and `parseIR` trivial.\n */\nimport * as v from 'valibot';\nimport type { FieldType } from './types.js';\n\n/** Recursive JSON value. Hand-written because `v.lazy` needs an explicit type. */\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport const JsonValueSchema: v.GenericSchema<JsonValue> = v.lazy(() =>\n v.union([\n v.null(),\n v.boolean(),\n v.number(),\n v.string(),\n v.array(JsonValueSchema),\n v.record(v.string(), JsonValueSchema),\n ]),\n);\n\n// --- closed unions -----------------------------------------------------------\n\nexport const ScalarTypeSchema = v.picklist([\n 'string',\n 'boolean',\n 'int',\n 'bigint',\n 'float',\n 'decimal',\n 'date',\n 'datetime',\n 'uuid',\n 'bytes',\n 'json',\n]);\n\nexport const StringFormatSchema = v.picklist([\n 'email',\n 'url',\n 'uuid',\n 'cuid',\n 'cuid2',\n 'ulid',\n 'datetime',\n 'date',\n 'time',\n 'duration',\n 'ipv4',\n 'ipv6',\n]);\n\nexport const ReferentialActionSchema = v.picklist([\n 'cascade',\n 'restrict',\n 'setNull',\n 'setDefault',\n 'noAction',\n]);\n\nexport const IndexTypeSchema = v.picklist([\n 'btree',\n 'hash',\n 'gin',\n 'gist',\n 'brin',\n 'spgist',\n]);\n\n// --- field types -----------------------------------------------------------\n\n/**\n * Recursive because of the `union` variant — wrapped in `v.lazy` with an explicit\n * `v.GenericSchema<FieldType>` annotation, exactly like `JsonValueSchema`. The\n * schema does **not** enforce `variants.length >= 2`: degenerate unions are\n * tolerated on read and normalised in the cross-reference pass.\n */\nexport const FieldTypeSchema: v.GenericSchema<FieldType> = v.lazy(() =>\n v.variant('kind', [\n v.object({ kind: v.literal('scalar'), scalar: ScalarTypeSchema }),\n v.object({ kind: v.literal('enum'), ref: v.string() }),\n v.object({ kind: v.literal('unknown'), hint: v.optional(v.string()) }),\n v.object({ kind: v.literal('ref'), ref: v.string() }),\n v.object({\n kind: v.literal('union'),\n variants: v.array(FieldTypeSchema),\n discriminator: v.optional(\n v.object({\n propertyName: v.string(),\n mapping: v.optional(v.record(v.string(), v.string())),\n }),\n ),\n }),\n ]),\n);\n\nexport const TypeAliasSchema = v.object({\n name: v.string(),\n type: FieldTypeSchema,\n doc: v.optional(v.string()),\n});\n\nexport const ConstraintsSchema = v.object({\n min: v.optional(v.number()),\n max: v.optional(v.number()),\n minLength: v.optional(v.number()),\n maxLength: v.optional(v.number()),\n regex: v.optional(v.string()),\n format: v.optional(StringFormatSchema),\n unique: v.optional(v.boolean()),\n});\n\nexport const DefaultValueSchema = v.variant('kind', [\n v.object({ kind: v.literal('value'), value: JsonValueSchema }),\n v.object({\n kind: v.literal('expr'),\n expr: v.string(),\n args: v.optional(v.array(JsonValueSchema)),\n }),\n]);\n\nexport const FieldSchema = v.object({\n name: v.string(),\n type: FieldTypeSchema,\n list: v.boolean(),\n optional: v.boolean(),\n nullable: v.boolean(),\n constraints: ConstraintsSchema,\n default: v.optional(DefaultValueSchema),\n doc: v.optional(v.string()),\n dbName: v.optional(v.string()),\n});\n\n// --- relations -----------------------------------------------------------\n\nexport const RelationTargetSchema = v.object({\n namespace: v.string(),\n entity: v.string(),\n});\n\nexport const RelationSchema = v.object({\n name: v.string(),\n target: RelationTargetSchema,\n cardinality: v.picklist(['one', 'many']),\n optional: v.boolean(),\n owning: v.boolean(),\n backRelation: v.optional(v.string()),\n fkFields: v.optional(v.array(v.string())),\n references: v.optional(v.array(v.string())),\n onDelete: v.optional(ReferentialActionSchema),\n onUpdate: v.optional(ReferentialActionSchema),\n});\n\n// --- enums -----------------------------------------------------------\n\nexport const EnumValueSchema = v.object({\n name: v.string(),\n dbName: v.optional(v.string()),\n doc: v.optional(v.string()),\n});\n\nexport const EnumDefSchema = v.object({\n name: v.string(),\n values: v.array(EnumValueSchema),\n doc: v.optional(v.string()),\n dbName: v.optional(v.string()),\n});\n\n// --- indexes -----------------------------------------------------------\n\nexport const IndexDefSchema = v.object({\n fields: v.array(v.string()),\n name: v.optional(v.string()),\n type: v.optional(IndexTypeSchema),\n});\n\nexport const CompositeUniqueSchema = v.object({\n fields: v.array(v.string()),\n name: v.optional(v.string()),\n});\n\n// --- entities and roots -----------------------------------------------------------\n\nexport const EntitySchema = v.object({\n name: v.string(),\n fields: v.array(FieldSchema),\n relations: v.array(RelationSchema),\n enums: v.optional(v.record(v.string(), EnumDefSchema)),\n primaryKey: v.optional(v.array(v.string())),\n indexes: v.array(IndexDefSchema),\n uniques: v.array(CompositeUniqueSchema),\n doc: v.optional(v.string()),\n dbName: v.optional(v.string()),\n});\n\nexport const SourceIrSchema = v.object({\n namespace: v.string(),\n parser: v.string(),\n parserVersion: v.optional(v.string()),\n entities: v.record(v.string(), EntitySchema),\n enums: v.record(v.string(), EnumDefSchema),\n typeAliases: v.optional(v.record(v.string(), TypeAliasSchema)),\n});\n\nexport const IrSchema = v.object({\n irVersion: v.string(),\n sources: v.record(v.string(), SourceIrSchema),\n});\n","/**\n * Runtime validation of the IR.\n *\n * Schema-first: `v.safeParse` against `schemas.ts` covers structural shape,\n * closed-union membership, required/optional keys and tagged-union narrowing.\n * This module adds the cross-reference pass — the checks Valibot cannot express\n * structurally (enum-ref resolution, relation-target / back-relation resolution,\n * field-name references, `min <= max`, regex compilation, key/name invariants).\n *\n * Valibot issues and cross-ref issues are both normalised to the stable\n * `IrIssue` surface (dotted, located paths) so consumers are unaffected.\n */\nimport * as v from 'valibot';\nimport { IrSchema, SourceIrSchema } from './schemas.js';\nimport type { Constraints, Entity, FieldType, IR, SourceIR } from './types.js';\nimport { IR_VERSION, isCompatible } from './version.js';\n\nexport type IrIssueCode =\n | 'version_incompatible'\n | 'namespace_key_mismatch'\n | 'entity_key_mismatch'\n | 'duplicate_field'\n | 'duplicate_enum_value'\n | 'unresolved_enum_ref'\n | 'unresolved_field_ref'\n | 'unresolved_relation_target'\n | 'unresolved_back_relation'\n | 'unresolved_ref'\n | 'unresolved_type_alias'\n | 'type_alias_key_mismatch'\n | 'degenerate_union'\n | 'union_cycle'\n | 'invalid_constraint'\n | 'invalid_regex'\n | 'shape';\n\nexport interface IrIssue {\n path: string;\n code: IrIssueCode;\n message: string;\n}\n\nexport type IrValidation<T> =\n | { ok: true; value: T; info?: IrIssue[] }\n | { ok: false; issues: IrIssue[] };\n\nexport class IrValidationError extends Error {\n readonly issues: IrIssue[];\n\n constructor(issues: IrIssue[]) {\n const detail = issues\n .map((i) => `${i.path === '' ? '<root>' : i.path}: ${i.message}`)\n .join('; ');\n super(`invalid IR: ${detail}`);\n this.name = 'IrValidationError';\n this.issues = issues;\n }\n}\n\nfunction normaliseValibotIssues(\n issues: readonly v.BaseIssue<unknown>[],\n): IrIssue[] {\n return issues.map((issue) => ({\n path: v.getDotPath(issue) ?? '',\n code: 'shape' as const,\n message: issue.message,\n }));\n}\n\nfunction pushIssue(\n issues: IrIssue[],\n path: string,\n code: IrIssueCode,\n message: string,\n): void {\n issues.push({ path, code, message });\n}\n\nfunction checkConstraints(\n issues: IrIssue[],\n path: string,\n c: Constraints,\n): void {\n if (c.min !== undefined && c.max !== undefined && c.min > c.max) {\n pushIssue(\n issues,\n path,\n 'invalid_constraint',\n `min (${c.min}) is greater than max (${c.max})`,\n );\n }\n if (\n c.minLength !== undefined &&\n c.maxLength !== undefined &&\n c.minLength > c.maxLength\n ) {\n pushIssue(\n issues,\n path,\n 'invalid_constraint',\n `minLength (${c.minLength}) is greater than maxLength (${c.maxLength})`,\n );\n }\n if (c.regex !== undefined) {\n try {\n new RegExp(c.regex);\n } catch {\n pushIssue(\n issues,\n path,\n 'invalid_regex',\n `regex does not compile: ${c.regex}`,\n );\n }\n }\n}\n\nfunction checkEnumValues(\n issues: IrIssue[],\n path: string,\n values: readonly { name: string }[],\n): void {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value.name)) {\n pushIssue(\n issues,\n `${path}.${value.name}`,\n 'duplicate_enum_value',\n `duplicate enum value '${value.name}'`,\n );\n }\n seen.add(value.name);\n }\n}\n\n/**\n * Recursive field-type check. `enum` keeps its entity-local → source-level\n * resolution; `ref` must resolve against `source.entities` then\n * `source.typeAliases`; `union` recurses into every variant and, when it carries\n * a `discriminator.mapping`, every value must name a `ref` variant of the union.\n * A union with fewer than two variants is tolerated on read — it feeds the\n * non-fatal `info` channel (`degenerate_union`), not `issues`.\n */\nfunction walkFieldType(\n type: FieldType,\n path: string,\n entity: Entity | undefined,\n source: SourceIR,\n issues: IrIssue[],\n info: IrIssue[],\n): void {\n switch (type.kind) {\n case 'scalar':\n case 'unknown':\n return;\n case 'enum': {\n const resolved = entity?.enums?.[type.ref] ?? source.enums[type.ref];\n if (resolved === undefined) {\n pushIssue(\n issues,\n path,\n 'unresolved_enum_ref',\n `field type references unknown enum '${type.ref}'`,\n );\n }\n return;\n }\n case 'ref': {\n const known =\n source.entities[type.ref] !== undefined ||\n source.typeAliases?.[type.ref] !== undefined;\n if (!known) {\n pushIssue(\n issues,\n path,\n 'unresolved_ref',\n `ref '${type.ref}' resolves to no entity and no type alias`,\n );\n }\n return;\n }\n case 'union': {\n if (type.variants.length < 2) {\n pushIssue(\n info,\n path,\n 'degenerate_union',\n `union has ${type.variants.length} variant(s); expected at least 2`,\n );\n }\n type.variants.forEach((variant, i) => {\n walkFieldType(\n variant,\n `${path}.variants.${i}`,\n entity,\n source,\n issues,\n info,\n );\n });\n const mapping = type.discriminator?.mapping;\n if (mapping !== undefined) {\n const refVariants = new Set(\n type.variants.flatMap((vv) => (vv.kind === 'ref' ? [vv.ref] : [])),\n );\n for (const [key, target] of Object.entries(mapping)) {\n if (!refVariants.has(target)) {\n pushIssue(\n issues,\n `${path}.discriminator.mapping.${key}`,\n 'unresolved_type_alias',\n `discriminator mapping '${key}' -> '${target}' names no ref variant of the union`,\n );\n }\n }\n }\n return;\n }\n }\n}\n\n/** Every `ref` name reachable from a field type, following nested unions. */\nfunction collectRefs(type: FieldType, out: Set<string>): void {\n if (type.kind === 'ref') {\n out.add(type.ref);\n } else if (type.kind === 'union') {\n for (const variant of type.variants) {\n collectRefs(variant, out);\n }\n }\n}\n\n/**\n * Informational cycle detection over `ref` edges (entity fields, alias types,\n * union variants). Recursion is allowed — a cycle never produces a fatal issue,\n * it only feeds the `info` channel (`union_cycle`) so a generator can log it and\n * fall back to a lazy reference.\n */\nfunction checkRefCycles(\n namespace: string,\n source: SourceIR,\n info: IrIssue[],\n): void {\n const adjacency = new Map<string, Set<string>>();\n for (const [key, alias] of Object.entries(source.typeAliases ?? {})) {\n const refs = new Set<string>();\n collectRefs(alias.type, refs);\n adjacency.set(key, refs);\n }\n for (const [key, entity] of Object.entries(source.entities)) {\n const refs = adjacency.get(key) ?? new Set<string>();\n for (const field of entity.fields) {\n collectRefs(field.type, refs);\n }\n adjacency.set(key, refs);\n }\n\n const state = new Map<string, 'gray' | 'black'>();\n const stack: string[] = [];\n const reported = new Set<string>();\n\n const visit = (node: string): void => {\n state.set(node, 'gray');\n stack.push(node);\n for (const next of adjacency.get(node) ?? []) {\n if (!adjacency.has(next)) {\n continue;\n }\n const seen = state.get(next);\n if (seen === 'gray') {\n const cycle = stack.slice(stack.indexOf(next));\n const signature = [...cycle].sort().join('|');\n if (!reported.has(signature)) {\n reported.add(signature);\n pushIssue(\n info,\n namespace,\n 'union_cycle',\n `reference cycle: ${[...cycle, next].join(' -> ')}`,\n );\n }\n } else if (seen === undefined) {\n visit(next);\n }\n }\n stack.pop();\n state.set(node, 'black');\n };\n\n for (const node of adjacency.keys()) {\n if (state.get(node) === undefined) {\n visit(node);\n }\n }\n}\n\n/**\n * Run every cross-reference check on one source. `lookupEntity` and\n * `isNamespacePresent` give access to the cross-namespace view (full in\n * `validateIR`, this-source-only in `validateSourceIR`). Non-fatal observations\n * (degenerate unions, reference cycles) are collected in `info`.\n */\nfunction checkSource(\n namespace: string,\n source: SourceIR,\n lookupEntity: (ns: string, name: string) => Entity | undefined,\n isNamespacePresent: (ns: string) => boolean,\n issues: IrIssue[],\n info: IrIssue[],\n): void {\n for (const [key, def] of Object.entries(source.enums)) {\n if (def.name !== key) {\n pushIssue(\n issues,\n `${namespace}.enums.${key}`,\n 'entity_key_mismatch',\n `enum key '${key}' does not match enum name '${def.name}'`,\n );\n }\n checkEnumValues(issues, `${namespace}.enums.${key}`, def.values);\n }\n\n for (const [key, entity] of Object.entries(source.entities)) {\n const ePath = `${namespace}.${key}`;\n if (entity.name !== key) {\n pushIssue(\n issues,\n ePath,\n 'entity_key_mismatch',\n `entity key '${key}' does not match entity name '${entity.name}'`,\n );\n }\n\n const fieldNames = new Set<string>();\n for (const field of entity.fields) {\n const fPath = `${ePath}.${field.name}`;\n if (fieldNames.has(field.name)) {\n pushIssue(\n issues,\n fPath,\n 'duplicate_field',\n `duplicate field '${field.name}'`,\n );\n }\n fieldNames.add(field.name);\n checkConstraints(issues, `${fPath}.constraints`, field.constraints);\n walkFieldType(field.type, fPath, entity, source, issues, info);\n }\n\n for (const [localKey, def] of Object.entries(entity.enums ?? {})) {\n if (def.name !== localKey) {\n pushIssue(\n issues,\n `${ePath}.enums.${localKey}`,\n 'entity_key_mismatch',\n `local enum key '${localKey}' does not match name '${def.name}'`,\n );\n }\n checkEnumValues(issues, `${ePath}.enums.${localKey}`, def.values);\n }\n\n const hasField = (name: string): boolean => fieldNames.has(name);\n\n for (const pk of entity.primaryKey ?? []) {\n if (!hasField(pk)) {\n pushIssue(\n issues,\n `${ePath}.primaryKey`,\n 'unresolved_field_ref',\n `primaryKey references unknown field '${pk}'`,\n );\n }\n }\n entity.indexes.forEach((idx, i) => {\n for (const f of idx.fields) {\n if (!hasField(f)) {\n pushIssue(\n issues,\n `${ePath}.indexes.${i}`,\n 'unresolved_field_ref',\n `index references unknown field '${f}'`,\n );\n }\n }\n });\n entity.uniques.forEach((u, i) => {\n for (const f of u.fields) {\n if (!hasField(f)) {\n pushIssue(\n issues,\n `${ePath}.uniques.${i}`,\n 'unresolved_field_ref',\n `unique references unknown field '${f}'`,\n );\n }\n }\n });\n\n entity.relations.forEach((rel, i) => {\n const rPath = `${ePath}.relations.${rel.name === '' ? i : rel.name}`;\n\n for (const fk of rel.fkFields ?? []) {\n if (!hasField(fk)) {\n pushIssue(\n issues,\n rPath,\n 'unresolved_field_ref',\n `relation '${rel.name}' fkField references unknown field '${fk}'`,\n );\n }\n }\n\n const targetNs = rel.target.namespace;\n // Namespace absent: informational only, v1 drivers ignore cross-source.\n if (targetNs === '') {\n return;\n }\n const sameNs = targetNs === namespace;\n if (!sameNs && !isNamespacePresent(targetNs)) {\n // Other namespace, not present in this view: ignored (shape-level info).\n return;\n }\n\n const targetEntity = lookupEntity(targetNs, rel.target.entity);\n if (targetEntity === undefined) {\n pushIssue(\n issues,\n rPath,\n 'unresolved_relation_target',\n `relation '${rel.name}' target ${targetNs}.${rel.target.entity} does not exist`,\n );\n return;\n }\n if (\n rel.backRelation !== undefined &&\n !targetEntity.relations.some((r) => r.name === rel.backRelation)\n ) {\n pushIssue(\n issues,\n rPath,\n 'unresolved_back_relation',\n `backRelation '${rel.backRelation}' not found on ${targetNs}.${rel.target.entity}`,\n );\n }\n for (const ref of rel.references ?? []) {\n if (!targetEntity.fields.some((f) => f.name === ref)) {\n pushIssue(\n issues,\n rPath,\n 'unresolved_field_ref',\n `relation '${rel.name}' references unknown field '${ref}' on ${targetNs}.${rel.target.entity}`,\n );\n }\n }\n });\n }\n\n for (const [key, alias] of Object.entries(source.typeAliases ?? {})) {\n const aPath = `${namespace}.typeAliases.${key}`;\n if (alias.name !== key) {\n pushIssue(\n issues,\n aPath,\n 'type_alias_key_mismatch',\n `type alias key '${key}' does not match name '${alias.name}'`,\n );\n }\n walkFieldType(alias.type, `${aPath}.type`, undefined, source, issues, info);\n }\n\n checkRefCycles(namespace, source, info);\n}\n\nexport function validateSourceIR(value: unknown): IrValidation<SourceIR> {\n const parsed = v.safeParse(SourceIrSchema, value);\n if (!parsed.success) {\n return { ok: false, issues: normaliseValibotIssues(parsed.issues) };\n }\n const source = parsed.output;\n const issues: IrIssue[] = [];\n const info: IrIssue[] = [];\n const lookup = (ns: string, name: string): Entity | undefined =>\n ns === source.namespace ? source.entities[name] : undefined;\n const isPresent = (ns: string): boolean => ns === source.namespace;\n checkSource(source.namespace, source, lookup, isPresent, issues, info);\n if (issues.length > 0) {\n return { ok: false, issues };\n }\n return info.length > 0\n ? { ok: true, value: source, info }\n : { ok: true, value: source };\n}\n\nexport function validateIR(value: unknown): IrValidation<IR> {\n const parsed = v.safeParse(IrSchema, value);\n if (!parsed.success) {\n return { ok: false, issues: normaliseValibotIssues(parsed.issues) };\n }\n const ir = parsed.output;\n const issues: IrIssue[] = [];\n const info: IrIssue[] = [];\n\n if (!isCompatible(ir.irVersion)) {\n pushIssue(\n issues,\n 'irVersion',\n 'version_incompatible',\n `IR version '${ir.irVersion}' is not compatible with supported version '${IR_VERSION}'`,\n );\n }\n\n const lookup = (ns: string, name: string): Entity | undefined =>\n ir.sources[ns]?.entities[name];\n const isPresent = (ns: string): boolean => ns in ir.sources;\n\n for (const [key, source] of Object.entries(ir.sources)) {\n if (source.namespace !== key) {\n pushIssue(\n issues,\n `sources.${key}`,\n 'namespace_key_mismatch',\n `source key '${key}' does not match namespace '${source.namespace}'`,\n );\n }\n checkSource(source.namespace, source, lookup, isPresent, issues, info);\n }\n\n if (issues.length > 0) {\n return { ok: false, issues };\n }\n return info.length > 0\n ? { ok: true, value: ir, info }\n : { ok: true, value: ir };\n}\n\nexport function assertIR(value: unknown): asserts value is IR {\n const result = validateIR(value);\n if (!result.ok) {\n throw new IrValidationError(result.issues);\n }\n}\n\nexport function assertSourceIR(value: unknown): asserts value is SourceIR {\n const result = validateSourceIR(value);\n if (!result.ok) {\n throw new IrValidationError(result.issues);\n }\n}\n\nexport function parseIR(json: string): IR {\n const value = JSON.parse(json) as unknown;\n assertIR(value);\n return value;\n}\n","/**\n * IR format version. Orthogonal to the npm semver of `@kurotako/ir`\n * (independent versioning): a single string, bumped only on a breaking change\n * to the format itself.\n */\nexport const IR_VERSION = '2';\n\n/**\n * Whether an IR produced against `irVersion` can be consumed by this build.\n * v1 rule: strict equality.\n */\nexport function isCompatible(irVersion: string): boolean {\n return irVersion === IR_VERSION;\n}\n","/**\n * Traversal / resolution helpers. All pure, none throw — they return `undefined`\n * on a miss. `resolveEnum` implements the entity-local → source-level precedence\n * in one place so every generator agrees.\n */\nimport type {\n Entity,\n EnumDef,\n Field,\n FieldType,\n IR,\n Relation,\n ScalarType,\n SourceIR,\n TypeAlias,\n} from './types.js';\n\nexport function getSource(ir: IR, namespace: string): SourceIR | undefined {\n return ir.sources[namespace];\n}\n\nexport function resolveEntity(\n ir: IR,\n namespace: string,\n name: string,\n): Entity | undefined {\n return ir.sources[namespace]?.entities[name];\n}\n\n/** Entity-local enums shadow source-level enums of the same name. */\nexport function resolveEnum(\n source: SourceIR,\n entity: Entity | undefined,\n ref: string,\n): EnumDef | undefined {\n return entity?.enums?.[ref] ?? source.enums[ref];\n}\n\n/**\n * Resolve a `{ kind: 'ref' }` name against the same source: an entity first,\n * then a type alias. Same-namespace only — v1 has no namespace qualifier.\n */\nexport function resolveRef(\n source: SourceIR,\n ref: string,\n): Entity | TypeAlias | undefined {\n return source.entities[ref] ?? source.typeAliases?.[ref];\n}\n\nexport function resolveTypeAlias(\n source: SourceIR,\n name: string,\n): TypeAlias | undefined {\n return source.typeAliases?.[name];\n}\n\nexport function* iterTypeAliases(\n ir: IR,\n): Iterable<{ namespace: string; alias: TypeAlias }> {\n for (const [namespace, source] of Object.entries(ir.sources)) {\n for (const alias of Object.values(source.typeAliases ?? {})) {\n yield { namespace, alias };\n }\n }\n}\n\n/** Every `{ kind: 'ref' }` name reachable from a field type (through unions). */\nexport function collectRefNames(\n type: FieldType,\n into: Set<string> = new Set(),\n): Set<string> {\n if (type.kind === 'ref') {\n into.add(type.ref);\n } else if (type.kind === 'union') {\n for (const variant of type.variants) {\n collectRefNames(variant, into);\n }\n }\n return into;\n}\n\n/**\n * Names of entities / type aliases that take part in at least one `ref` cycle\n * within `source` — following field-type `ref`, alias `type` `ref` and union\n * variant `ref` edges. Mirrors the informational `union_cycle` pass in\n * `validate.ts`; a generator consumes this (through `GenerateContext.cycles`)\n * to decide which references must be `z.lazy`-wrapped / widened rather than\n * emitted as a bare forward reference.\n */\nexport function refCycleMembers(source: SourceIR): Set<string> {\n const adjacency = new Map<string, Set<string>>();\n const edgesFor = (key: string): Set<string> => {\n let set = adjacency.get(key);\n if (set === undefined) {\n set = new Set<string>();\n adjacency.set(key, set);\n }\n return set;\n };\n for (const [key, alias] of Object.entries(source.typeAliases ?? {})) {\n collectRefNames(alias.type, edgesFor(key));\n }\n for (const [key, entity] of Object.entries(source.entities)) {\n const set = edgesFor(key);\n for (const field of entity.fields) {\n collectRefNames(field.type, set);\n }\n }\n\n const canReachSelf = (start: string): boolean => {\n const seen = new Set<string>();\n const stack = [...(adjacency.get(start) ?? [])];\n while (stack.length > 0) {\n const node = stack.pop();\n if (node === undefined) {\n break;\n }\n if (node === start) {\n return true;\n }\n if (seen.has(node) || !adjacency.has(node)) {\n continue;\n }\n seen.add(node);\n for (const next of adjacency.get(node) ?? []) {\n stack.push(next);\n }\n }\n return false;\n };\n\n const members = new Set<string>();\n for (const node of adjacency.keys()) {\n if (canReachSelf(node)) {\n members.add(node);\n }\n }\n return members;\n}\n\n/** Stable structural key for a non-union `FieldType`, for deduplication. */\nfunction fieldTypeKey(type: FieldType): string {\n switch (type.kind) {\n case 'scalar':\n return `scalar:${type.scalar}`;\n case 'enum':\n return `enum:${type.ref}`;\n case 'ref':\n return `ref:${type.ref}`;\n case 'unknown':\n return `unknown:${type.hint ?? ''}`;\n case 'union':\n return `union:${flattenUnion(type).map(fieldTypeKey).join(',')}`;\n }\n}\n\n/**\n * Flatten nested unions into a single variant list and drop\n * structurally-identical duplicates, preserving first-seen order. The\n * discriminator of a nested union is not carried up.\n */\nexport function flattenUnion(\n type: Extract<FieldType, { kind: 'union' }>,\n): FieldType[] {\n const out: FieldType[] = [];\n const seen = new Set<string>();\n const push = (t: FieldType): void => {\n if (t.kind === 'union') {\n for (const variant of t.variants) {\n push(variant);\n }\n return;\n }\n const key = fieldTypeKey(t);\n if (!seen.has(key)) {\n seen.add(key);\n out.push(t);\n }\n };\n for (const variant of type.variants) {\n push(variant);\n }\n return out;\n}\n\n/**\n * A relation is cross-source when its target namespace is anything other than\n * the entity's own namespace — including the \"absent\" (empty) namespace, which\n * v1 drivers treat as an unresolved cross-source reference.\n */\nexport function isCrossSource(fromNamespace: string, rel: Relation): boolean {\n return rel.target.namespace !== fromNamespace;\n}\n\n/**\n * Resolve the target entity of a relation. Returns `undefined` when the target\n * namespace is absent or not present in the IR, or when the entity is missing.\n */\nexport function resolveRelationTarget(\n ir: IR,\n fromNamespace: string,\n rel: Relation,\n): Entity | undefined {\n const ns = isCrossSource(fromNamespace, rel)\n ? rel.target.namespace\n : fromNamespace;\n return ir.sources[ns]?.entities[rel.target.entity];\n}\n\nexport function* iterEntities(\n ir: IR,\n): Iterable<{ namespace: string; entity: Entity }> {\n for (const [namespace, source] of Object.entries(ir.sources)) {\n for (const entity of Object.values(source.entities)) {\n yield { namespace, entity };\n }\n }\n}\n\nexport function* iterFields(entity: Entity): Iterable<Field> {\n yield* entity.fields;\n}\n\n/** Fields named by `entity.primaryKey`, in declaration order. */\nexport function primaryKeyFields(entity: Entity): Field[] {\n const pk = entity.primaryKey;\n if (pk === undefined) {\n return [];\n }\n const byName = new Map(entity.fields.map((f) => [f.name, f]));\n const out: Field[] = [];\n for (const name of pk) {\n const field = byName.get(name);\n if (field !== undefined) {\n out.push(field);\n }\n }\n return out;\n}\n\n// --- shared-decision helpers ------------------------------------------------\n//\n// Principle: any modelling rule that a parser or a generator would otherwise\n// re-implement \"in its own way\" lives here as a pure helper, so the whole\n// pipeline reads it from one place. `generator-zod` (#34) and `generator-angular`\n// (#39) MUST consume these rather than re-encode the create/update payload-shape\n// rules or the scalar -> TS type mapping.\n\n/** Closed set of scalar TS type tokens `scalarTsType` may return for a scalar. */\nexport type ScalarTsType =\n | 'string'\n | 'number'\n | 'bigint'\n | 'boolean'\n | 'Date'\n | 'Uint8Array'\n | 'JsonValue'\n | 'unknown';\n\n/**\n * The value is assigned by the DB/server (an `expr` default: `now()`,\n * `autoincrement()`, `uuid()`, `dbgenerated(\"…\")`, …) and is never supplied on a\n * create payload.\n */\nexport function isDbAssigned(field: Field): boolean {\n return field.default?.kind === 'expr';\n}\n\n/**\n * Fields to include in a \"create\" payload: `entity.fields` minus the ones whose\n * only value source is db-side (a primary-key member that is `isDbAssigned`).\n */\nexport function createFields(entity: Entity): Field[] {\n const pk = new Set(entity.primaryKey ?? []);\n return entity.fields.filter(\n (field) => !(pk.has(field.name) && isDbAssigned(field)),\n );\n}\n\n/**\n * A create-payload field the caller may omit:\n * `field.optional || field.default != null || isDbAssigned(field)`.\n */\nexport function isCreateOptional(field: Field): boolean {\n return field.optional || field.default !== undefined || isDbAssigned(field);\n}\n\n/**\n * Fields to include in an \"update\" payload: `entity.fields` minus primary-key\n * members; the caller treats every one as optional (partial).\n */\nexport function updateFields(entity: Entity): Field[] {\n const pk = new Set(entity.primaryKey ?? []);\n return entity.fields.filter((field) => !pk.has(field.name));\n}\n\n/**\n * The TS type a non-nullable, non-list value of this field maps to, as a source\n * string every generator's typed output must agree on. Returns a `ScalarTsType`\n * token for scalars (`bytes -> 'Uint8Array'`, `json -> 'JsonValue'`, `decimal`\n * kept as `'string'` to preserve precision — runtime representation stays each\n * generator's choice), the enum type name for `{ kind: 'enum' }` (identifiers are\n * never prefixed, ADR-0004), and `'unknown'` for `{ kind: 'unknown' }`.\n */\nexport function scalarTsType(type: FieldType): string {\n switch (type.kind) {\n case 'enum':\n return type.ref;\n case 'ref':\n return type.ref;\n case 'unknown':\n return 'unknown';\n case 'scalar':\n return mapScalar(type.scalar);\n case 'union':\n return flattenUnion(type)\n .map((variant) =>\n variant.kind === 'union'\n ? `(${scalarTsType(variant)})`\n : scalarTsType(variant),\n )\n .join(' | ');\n }\n}\n\nfunction mapScalar(scalar: ScalarType): ScalarTsType {\n switch (scalar) {\n case 'string':\n case 'uuid':\n case 'decimal':\n return 'string';\n case 'boolean':\n return 'boolean';\n case 'int':\n case 'float':\n return 'number';\n case 'bigint':\n return 'bigint';\n case 'date':\n case 'datetime':\n return 'Date';\n case 'bytes':\n return 'Uint8Array';\n case 'json':\n return 'JsonValue';\n }\n}\n"],"mappings":"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","names":["v","v","variant","variant","variant"]}
1
+ {"version":3,"sources":["../src/builder.ts","../src/schemas.ts","../src/validate.ts","../src/version.ts","../src/helpers.ts"],"sourcesContent":["/**\n * Fluent `SourceIR` builder with incremental validation.\n *\n * A parser builds one `SourceIR`; `@kurotako/core` merges them. Incremental\n * checks throw immediately with a located path (`pg.User.email`); `build()` runs\n * the full `assertSourceIR` as the final gate.\n */\nimport * as v from 'valibot';\nimport { ScalarTypeSchema } from './schemas.js';\nimport type {\n DefaultValue,\n Entity,\n EnumDef,\n EnumValue,\n Field,\n FieldType,\n IndexDef,\n IndexType,\n ReferentialAction,\n Relation,\n ScalarType,\n SourceIR,\n StringFormat,\n TypeAlias,\n} from './types.js';\nimport { assertSourceIR, type IrIssue, IrValidationError } from './validate.js';\n\nexport class IrBuildError extends Error {\n readonly path: string;\n readonly issues: IrIssue[] | undefined;\n\n constructor(path: string, message: string, issues?: IrIssue[]) {\n super(`${path}: ${message}`);\n this.name = 'IrBuildError';\n this.path = path;\n this.issues = issues;\n }\n}\n\n// --- public builder interfaces -----------------------------------------------\n\nexport interface EnumBuilder {\n value(name: string, opts?: { dbName?: string; doc?: string }): this;\n doc(text: string): this;\n dbName(name: string): this;\n}\n\n/** Type-setters shared by `UnionBuilder` and `TypeAliasBuilder`. */\nexport interface TypeVariantBuilder {\n scalar(t: ScalarType): this;\n enum(ref: string): this;\n ref(name: string): this;\n union(build: (u: UnionBuilder) => void): this;\n map(build: (value: TypeVariantBuilder) => void): this;\n array(build: (element: TypeVariantBuilder) => void): this;\n unknown(hint?: string): this;\n}\n\nexport interface UnionBuilder extends TypeVariantBuilder {\n /** `mapping` values must name a `ref` variant of this union. */\n discriminator(propertyName: string, mapping?: Record<string, string>): this;\n}\n\nexport interface TypeAliasBuilder extends TypeVariantBuilder {\n doc(text: string): this;\n}\n\nexport interface FieldBuilder {\n scalar(t: ScalarType): this;\n enum(ref: string): this;\n ref(name: string): this;\n union(build: (u: UnionBuilder) => void): this;\n map(build: (value: TypeVariantBuilder) => void): this;\n array(build: (element: TypeVariantBuilder) => void): this;\n unknown(hint?: string): this;\n list(): this;\n optional(): this;\n nullable(): this;\n primary(): this;\n unique(): this;\n min(n: number): this;\n max(n: number): this;\n minLength(n: number): this;\n maxLength(n: number): this;\n regex(src: string): this;\n format(f: StringFormat): this;\n default(d: DefaultValue): this;\n doc(text: string): this;\n dbName(name: string): this;\n}\n\nexport interface RelationBuilder {\n to(namespace: string, entity: string): this;\n one(): this;\n many(): this;\n optional(): this;\n owning(): this;\n backRelation(name: string): this;\n fkFields(...fields: string[]): this;\n references(...fields: string[]): this;\n onDelete(action: ReferentialAction): this;\n onUpdate(action: ReferentialAction): this;\n}\n\nexport interface EntityBuilder {\n field(name: string, def: (f: FieldBuilder) => void): this;\n additionalProperties(def: (value: TypeVariantBuilder) => void): this;\n relation(name: string, def: (r: RelationBuilder) => void): this;\n localEnum(name: string, def: (e: EnumBuilder) => void): this;\n primaryKey(...fields: string[]): this;\n index(fields: string[], opts?: { name?: string; type?: IndexType }): this;\n unique(fields: string[], opts?: { name?: string }): this;\n doc(text: string): this;\n dbName(name: string): this;\n}\n\nexport interface SourceIrBuilder {\n addEnum(name: string, def: (e: EnumBuilder) => void): this;\n addEntity(name: string, def: (e: EntityBuilder) => void): this;\n addTypeAlias(name: string, def: (t: TypeAliasBuilder) => void): this;\n build(): SourceIR;\n}\n\n// --- implementations -----------------------------------------------------------\n\nclass EnumBuilderImpl implements EnumBuilder {\n #def: EnumDef;\n\n constructor(name: string) {\n this.#def = { name, values: [] };\n }\n\n value(name: string, opts?: { dbName?: string; doc?: string }): this {\n const entry: EnumValue = { name };\n if (opts?.dbName !== undefined) {\n entry.dbName = opts.dbName;\n }\n if (opts?.doc !== undefined) {\n entry.doc = opts.doc;\n }\n this.#def.values.push(entry);\n return this;\n }\n\n doc(text: string): this {\n this.#def.doc = text;\n return this;\n }\n\n dbName(name: string): this {\n this.#def.dbName = name;\n return this;\n }\n\n build(): EnumDef {\n return this.#def;\n }\n}\n\nfunction checkedScalar(path: string, t: ScalarType): FieldType {\n if (!v.is(ScalarTypeSchema, t)) {\n throw new IrBuildError(path, `unknown scalar type '${t}'`);\n }\n return { kind: 'scalar', scalar: t };\n}\n\nclass UnionBuilderImpl implements UnionBuilder {\n #path: string;\n #variants: FieldType[] = [];\n #discriminator:\n | { propertyName: string; mapping?: Record<string, string> }\n | undefined;\n\n constructor(path: string) {\n this.#path = path;\n }\n\n scalar(t: ScalarType): this {\n this.#variants.push(checkedScalar(this.#path, t));\n return this;\n }\n\n enum(ref: string): this {\n this.#variants.push({ kind: 'enum', ref });\n return this;\n }\n\n ref(name: string): this {\n this.#variants.push({ kind: 'ref', ref: name });\n return this;\n }\n\n union(build: (u: UnionBuilder) => void): this {\n const nested = new UnionBuilderImpl(this.#path);\n build(nested);\n // Nested unions are flattened into this one on build.\n for (const variant of nested.#variants) {\n this.#variants.push(variant);\n }\n return this;\n }\n\n map(build: (value: TypeVariantBuilder) => void): this {\n const value = new TypeAliasBuilderImpl(this.#path, 'map-value');\n build(value);\n this.#variants.push({ kind: 'map', value: value.build().type });\n return this;\n }\n\n array(build: (element: TypeVariantBuilder) => void): this {\n const element = new TypeAliasBuilderImpl(this.#path, 'array-element');\n build(element);\n this.#variants.push({ kind: 'array', element: element.build().type });\n return this;\n }\n\n unknown(hint?: string): this {\n this.#variants.push(\n hint === undefined ? { kind: 'unknown' } : { kind: 'unknown', hint },\n );\n return this;\n }\n\n discriminator(propertyName: string, mapping?: Record<string, string>): this {\n this.#discriminator =\n mapping === undefined ? { propertyName } : { propertyName, mapping };\n return this;\n }\n\n build(): Extract<FieldType, { kind: 'union' }> {\n if (this.#variants.length < 2) {\n throw new IrBuildError(\n this.#path,\n `union() needs at least 2 variants, got ${this.#variants.length}`,\n );\n }\n const mapping = this.#discriminator?.mapping;\n if (mapping !== undefined) {\n const refVariants = new Set(\n this.#variants.flatMap((vv) => (vv.kind === 'ref' ? [vv.ref] : [])),\n );\n for (const [key, target] of Object.entries(mapping)) {\n if (!refVariants.has(target)) {\n throw new IrBuildError(\n this.#path,\n `discriminator mapping '${key}' -> '${target}' names no ref variant`,\n );\n }\n }\n }\n const type: Extract<FieldType, { kind: 'union' }> = {\n kind: 'union',\n variants: this.#variants,\n };\n if (this.#discriminator !== undefined) {\n type.discriminator = this.#discriminator;\n }\n return type;\n }\n}\n\nclass TypeAliasBuilderImpl implements TypeAliasBuilder {\n #path: string;\n #name: string;\n #type: FieldType = { kind: 'unknown' };\n #doc: string | undefined;\n\n constructor(path: string, name: string) {\n this.#path = path;\n this.#name = name;\n }\n\n scalar(t: ScalarType): this {\n this.#type = checkedScalar(this.#path, t);\n return this;\n }\n\n enum(ref: string): this {\n this.#type = { kind: 'enum', ref };\n return this;\n }\n\n ref(name: string): this {\n this.#type = { kind: 'ref', ref: name };\n return this;\n }\n\n union(build: (u: UnionBuilder) => void): this {\n const nested = new UnionBuilderImpl(this.#path);\n build(nested);\n this.#type = nested.build();\n return this;\n }\n\n map(build: (value: TypeVariantBuilder) => void): this {\n const value = new TypeAliasBuilderImpl(this.#path, 'map-value');\n build(value);\n this.#type = { kind: 'map', value: value.build().type };\n return this;\n }\n\n array(build: (element: TypeVariantBuilder) => void): this {\n const element = new TypeAliasBuilderImpl(this.#path, 'array-element');\n build(element);\n this.#type = { kind: 'array', element: element.build().type };\n return this;\n }\n\n unknown(hint?: string): this {\n this.#type =\n hint === undefined ? { kind: 'unknown' } : { kind: 'unknown', hint };\n return this;\n }\n\n doc(text: string): this {\n this.#doc = text;\n return this;\n }\n\n build(): TypeAlias {\n const alias: TypeAlias = { name: this.#name, type: this.#type };\n if (this.#doc !== undefined) {\n alias.doc = this.#doc;\n }\n return alias;\n }\n}\n\nclass FieldBuilderImpl implements FieldBuilder {\n #path: string;\n #field: Field;\n #onPrimary: (name: string) => void;\n\n constructor(path: string, name: string, onPrimary: (name: string) => void) {\n this.#path = path;\n this.#onPrimary = onPrimary;\n this.#field = {\n name,\n type: { kind: 'unknown' },\n list: false,\n optional: false,\n nullable: false,\n constraints: {},\n };\n }\n\n scalar(t: ScalarType): this {\n if (!v.is(ScalarTypeSchema, t)) {\n throw new IrBuildError(this.#path, `unknown scalar type '${t}'`);\n }\n this.#field.type = { kind: 'scalar', scalar: t };\n return this;\n }\n\n enum(ref: string): this {\n this.#field.type = { kind: 'enum', ref };\n return this;\n }\n\n ref(name: string): this {\n this.#field.type = { kind: 'ref', ref: name };\n return this;\n }\n\n union(build: (u: UnionBuilder) => void): this {\n const builder = new UnionBuilderImpl(this.#path);\n build(builder);\n this.#field.type = builder.build();\n return this;\n }\n\n map(build: (value: TypeVariantBuilder) => void): this {\n const value = new TypeAliasBuilderImpl(this.#path, 'map-value');\n build(value);\n this.#field.type = { kind: 'map', value: value.build().type };\n return this;\n }\n\n array(build: (element: TypeVariantBuilder) => void): this {\n const element = new TypeAliasBuilderImpl(this.#path, 'array-element');\n build(element);\n this.#field.type = { kind: 'array', element: element.build().type };\n return this;\n }\n\n unknown(hint?: string): this {\n this.#field.type =\n hint === undefined ? { kind: 'unknown' } : { kind: 'unknown', hint };\n return this;\n }\n\n list(): this {\n this.#field.list = true;\n return this;\n }\n\n optional(): this {\n this.#field.optional = true;\n return this;\n }\n\n nullable(): this {\n this.#field.nullable = true;\n return this;\n }\n\n primary(): this {\n if (this.#field.list) {\n throw new IrBuildError(\n this.#path,\n 'primary() cannot be used on a list field',\n );\n }\n this.#onPrimary(this.#field.name);\n return this;\n }\n\n unique(): this {\n this.#field.constraints.unique = true;\n return this;\n }\n\n min(n: number): this {\n this.#field.constraints.min = n;\n return this;\n }\n\n max(n: number): this {\n this.#field.constraints.max = n;\n return this;\n }\n\n minLength(n: number): this {\n this.#field.constraints.minLength = n;\n return this;\n }\n\n maxLength(n: number): this {\n this.#field.constraints.maxLength = n;\n return this;\n }\n\n regex(src: string): this {\n this.#field.constraints.regex = src;\n return this;\n }\n\n format(f: StringFormat): this {\n if (\n this.#field.type.kind !== 'scalar' ||\n this.#field.type.scalar !== 'string'\n ) {\n throw new IrBuildError(\n this.#path,\n 'format() requires a string scalar field',\n );\n }\n this.#field.constraints.format = f;\n return this;\n }\n\n default(d: DefaultValue): this {\n this.#field.default = d;\n return this;\n }\n\n doc(text: string): this {\n this.#field.doc = text;\n return this;\n }\n\n dbName(name: string): this {\n this.#field.dbName = name;\n return this;\n }\n\n build(): Field {\n return this.#field;\n }\n}\n\nclass RelationBuilderImpl implements RelationBuilder {\n #rel: Relation;\n\n constructor(name: string) {\n this.#rel = {\n name,\n target: { namespace: '', entity: '' },\n cardinality: 'one',\n optional: false,\n owning: false,\n };\n }\n\n to(namespace: string, entity: string): this {\n this.#rel.target = { namespace, entity };\n return this;\n }\n\n one(): this {\n this.#rel.cardinality = 'one';\n return this;\n }\n\n many(): this {\n this.#rel.cardinality = 'many';\n return this;\n }\n\n optional(): this {\n this.#rel.optional = true;\n return this;\n }\n\n owning(): this {\n this.#rel.owning = true;\n return this;\n }\n\n backRelation(name: string): this {\n this.#rel.backRelation = name;\n return this;\n }\n\n fkFields(...fields: string[]): this {\n this.#rel.fkFields = fields;\n return this;\n }\n\n references(...fields: string[]): this {\n this.#rel.references = fields;\n return this;\n }\n\n onDelete(action: ReferentialAction): this {\n this.#rel.onDelete = action;\n return this;\n }\n\n onUpdate(action: ReferentialAction): this {\n this.#rel.onUpdate = action;\n return this;\n }\n\n build(): Relation {\n return this.#rel;\n }\n}\n\nclass EntityBuilderImpl implements EntityBuilder {\n #namespace: string;\n #name: string;\n #fields: FieldBuilderImpl[] = [];\n #fieldNames = new Set<string>();\n #relations: RelationBuilderImpl[] = [];\n #localEnums: Record<string, EnumDef> = {};\n #primaryKey: string[] = [];\n #indexes: IndexDef[] = [];\n #uniques: { fields: string[]; name?: string }[] = [];\n #doc: string | undefined;\n #dbName: string | undefined;\n #additionalProperties: FieldType | undefined;\n\n constructor(namespace: string, name: string) {\n this.#namespace = namespace;\n this.#name = name;\n }\n\n #addPrimary(field: string): void {\n if (!this.#primaryKey.includes(field)) {\n this.#primaryKey.push(field);\n }\n }\n\n field(name: string, def: (f: FieldBuilder) => void): this {\n if (this.#fieldNames.has(name)) {\n throw new IrBuildError(\n `${this.#namespace}.${this.#name}.${name}`,\n `duplicate field '${name}'`,\n );\n }\n this.#fieldNames.add(name);\n const builder = new FieldBuilderImpl(\n `${this.#namespace}.${this.#name}.${name}`,\n name,\n (pk) => this.#addPrimary(pk),\n );\n def(builder);\n this.#fields.push(builder);\n return this;\n }\n\n additionalProperties(def: (value: TypeVariantBuilder) => void): this {\n const value = new TypeAliasBuilderImpl(\n `${this.#namespace}.${this.#name}.additionalProperties`,\n 'additionalProperties',\n );\n def(value);\n this.#additionalProperties = value.build().type;\n return this;\n }\n\n relation(name: string, def: (r: RelationBuilder) => void): this {\n const builder = new RelationBuilderImpl(name);\n def(builder);\n this.#relations.push(builder);\n return this;\n }\n\n localEnum(name: string, def: (e: EnumBuilder) => void): this {\n const builder = new EnumBuilderImpl(name);\n def(builder);\n this.#localEnums[name] = builder.build();\n return this;\n }\n\n primaryKey(...fields: string[]): this {\n for (const field of fields) {\n this.#addPrimary(field);\n }\n return this;\n }\n\n index(fields: string[], opts?: { name?: string; type?: IndexType }): this {\n const idx: IndexDef = { fields };\n if (opts?.name !== undefined) {\n idx.name = opts.name;\n }\n if (opts?.type !== undefined) {\n idx.type = opts.type;\n }\n this.#indexes.push(idx);\n return this;\n }\n\n unique(fields: string[], opts?: { name?: string }): this {\n const entry: { fields: string[]; name?: string } = { fields };\n if (opts?.name !== undefined) {\n entry.name = opts.name;\n }\n this.#uniques.push(entry);\n return this;\n }\n\n doc(text: string): this {\n this.#doc = text;\n return this;\n }\n\n dbName(name: string): this {\n this.#dbName = name;\n return this;\n }\n\n build(): Entity {\n const entity: Entity = {\n name: this.#name,\n fields: this.#fields.map((f) => f.build()),\n relations: this.#relations.map((r) => r.build()),\n indexes: this.#indexes,\n uniques: this.#uniques,\n };\n if (Object.keys(this.#localEnums).length > 0) {\n entity.enums = this.#localEnums;\n }\n if (this.#primaryKey.length > 0) {\n entity.primaryKey = this.#primaryKey;\n }\n if (this.#doc !== undefined) {\n entity.doc = this.#doc;\n }\n if (this.#dbName !== undefined) {\n entity.dbName = this.#dbName;\n }\n if (this.#additionalProperties !== undefined) {\n entity.additionalProperties = this.#additionalProperties;\n }\n return entity;\n }\n}\n\nclass SourceIrBuilderImpl implements SourceIrBuilder {\n #namespace: string;\n #parser: string;\n #parserVersion: string | undefined;\n #entities: EntityBuilderImpl[] = [];\n #entityNames = new Set<string>();\n #enums: Record<string, EnumDef> = {};\n #typeAliases: Record<string, TypeAlias> = {};\n\n constructor(init: {\n namespace: string;\n parser: string;\n parserVersion?: string;\n }) {\n this.#namespace = init.namespace;\n this.#parser = init.parser;\n this.#parserVersion = init.parserVersion;\n }\n\n addEnum(name: string, def: (e: EnumBuilder) => void): this {\n const builder = new EnumBuilderImpl(name);\n def(builder);\n this.#enums[name] = builder.build();\n return this;\n }\n\n addEntity(name: string, def: (e: EntityBuilder) => void): this {\n if (this.#entityNames.has(name)) {\n throw new IrBuildError(\n `${this.#namespace}.${name}`,\n `duplicate entity '${name}'`,\n );\n }\n this.#entityNames.add(name);\n const builder = new EntityBuilderImpl(this.#namespace, name);\n def(builder);\n this.#entities.push(builder);\n return this;\n }\n\n addTypeAlias(name: string, def: (t: TypeAliasBuilder) => void): this {\n if (name in this.#typeAliases) {\n throw new IrBuildError(\n `${this.#namespace}.typeAliases.${name}`,\n `duplicate type alias '${name}'`,\n );\n }\n const builder = new TypeAliasBuilderImpl(\n `${this.#namespace}.typeAliases.${name}`,\n name,\n );\n def(builder);\n this.#typeAliases[name] = builder.build();\n return this;\n }\n\n build(): SourceIR {\n const source: SourceIR = {\n namespace: this.#namespace,\n parser: this.#parser,\n entities: Object.fromEntries(\n this.#entities.map((e) => {\n const built = e.build();\n return [built.name, built];\n }),\n ),\n enums: this.#enums,\n };\n if (this.#parserVersion !== undefined) {\n source.parserVersion = this.#parserVersion;\n }\n if (Object.keys(this.#typeAliases).length > 0) {\n source.typeAliases = this.#typeAliases;\n }\n\n try {\n assertSourceIR(source);\n } catch (err) {\n if (err instanceof IrValidationError) {\n const first = err.issues[0];\n throw new IrBuildError(\n first?.path ?? this.#namespace,\n first?.message ?? 'invalid SourceIR',\n err.issues,\n );\n }\n throw err;\n }\n return source;\n }\n}\n\nexport function createSourceIR(init: {\n namespace: string;\n parser: string;\n parserVersion?: string;\n}): SourceIrBuilder {\n return new SourceIrBuilderImpl(init);\n}\n","/**\n * Valibot schemas — the single source of truth for the IR format.\n *\n * `types.ts` derives every type alias from these schemas via `v.InferOutput`;\n * `validate.ts` runs `v.safeParse` against them before the cross-reference pass.\n * Every schema stays plain and JSON-serializable by construction: only object,\n * array, record, picklist, variant and primitives — no `Date`, `RegExp`, classes\n * or functions. This is what keeps `--emit-ir` and `parseIR` trivial.\n */\nimport * as v from 'valibot';\nimport type { FieldType } from './types.js';\n\n/** Recursive JSON value. Hand-written because `v.lazy` needs an explicit type. */\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport const JsonValueSchema: v.GenericSchema<JsonValue> = v.lazy(() =>\n v.union([\n v.null(),\n v.boolean(),\n v.number(),\n v.string(),\n v.array(JsonValueSchema),\n v.record(v.string(), JsonValueSchema),\n ]),\n);\n\n// --- closed unions -----------------------------------------------------------\n\nexport const ScalarTypeSchema = v.picklist([\n 'string',\n 'boolean',\n 'int',\n 'bigint',\n 'float',\n 'decimal',\n 'date',\n 'datetime',\n 'uuid',\n 'bytes',\n 'json',\n]);\n\nexport const StringFormatSchema = v.picklist([\n 'email',\n 'url',\n 'uuid',\n 'cuid',\n 'cuid2',\n 'ulid',\n 'datetime',\n 'date',\n 'time',\n 'duration',\n 'ipv4',\n 'ipv6',\n]);\n\nexport const ReferentialActionSchema = v.picklist([\n 'cascade',\n 'restrict',\n 'setNull',\n 'setDefault',\n 'noAction',\n]);\n\nexport const IndexTypeSchema = v.picklist([\n 'btree',\n 'hash',\n 'gin',\n 'gist',\n 'brin',\n 'spgist',\n]);\n\n// --- field types -----------------------------------------------------------\n\n/**\n * Recursive because of the `union` variant — wrapped in `v.lazy` with an explicit\n * `v.GenericSchema<FieldType>` annotation, exactly like `JsonValueSchema`. The\n * schema does **not** enforce `variants.length >= 2`: degenerate unions are\n * tolerated on read and normalised in the cross-reference pass.\n */\nexport const FieldTypeSchema: v.GenericSchema<FieldType> = v.lazy(() =>\n v.variant('kind', [\n v.object({ kind: v.literal('scalar'), scalar: ScalarTypeSchema }),\n v.object({ kind: v.literal('enum'), ref: v.string() }),\n v.object({ kind: v.literal('unknown'), hint: v.optional(v.string()) }),\n v.object({ kind: v.literal('ref'), ref: v.string() }),\n v.object({ kind: v.literal('map'), value: FieldTypeSchema }),\n v.object({ kind: v.literal('array'), element: FieldTypeSchema }),\n v.object({\n kind: v.literal('union'),\n variants: v.array(FieldTypeSchema),\n discriminator: v.optional(\n v.object({\n propertyName: v.string(),\n mapping: v.optional(v.record(v.string(), v.string())),\n }),\n ),\n }),\n ]),\n);\n\nexport const TypeAliasSchema = v.object({\n name: v.string(),\n type: FieldTypeSchema,\n doc: v.optional(v.string()),\n});\n\nexport const ConstraintsSchema = v.object({\n min: v.optional(v.number()),\n max: v.optional(v.number()),\n minLength: v.optional(v.number()),\n maxLength: v.optional(v.number()),\n regex: v.optional(v.string()),\n format: v.optional(StringFormatSchema),\n unique: v.optional(v.boolean()),\n});\n\nexport const DefaultValueSchema = v.variant('kind', [\n v.object({ kind: v.literal('value'), value: JsonValueSchema }),\n v.object({\n kind: v.literal('expr'),\n expr: v.string(),\n args: v.optional(v.array(JsonValueSchema)),\n }),\n]);\n\nexport const FieldSchema = v.object({\n name: v.string(),\n type: FieldTypeSchema,\n list: v.boolean(),\n optional: v.boolean(),\n nullable: v.boolean(),\n constraints: ConstraintsSchema,\n default: v.optional(DefaultValueSchema),\n doc: v.optional(v.string()),\n dbName: v.optional(v.string()),\n});\n\n// --- relations -----------------------------------------------------------\n\nexport const RelationTargetSchema = v.object({\n namespace: v.string(),\n entity: v.string(),\n});\n\nexport const RelationSchema = v.object({\n name: v.string(),\n target: RelationTargetSchema,\n cardinality: v.picklist(['one', 'many']),\n optional: v.boolean(),\n owning: v.boolean(),\n backRelation: v.optional(v.string()),\n fkFields: v.optional(v.array(v.string())),\n references: v.optional(v.array(v.string())),\n onDelete: v.optional(ReferentialActionSchema),\n onUpdate: v.optional(ReferentialActionSchema),\n});\n\n// --- enums -----------------------------------------------------------\n\nexport const EnumValueSchema = v.object({\n name: v.string(),\n dbName: v.optional(v.string()),\n doc: v.optional(v.string()),\n});\n\nexport const EnumDefSchema = v.object({\n name: v.string(),\n values: v.array(EnumValueSchema),\n doc: v.optional(v.string()),\n dbName: v.optional(v.string()),\n});\n\n// --- indexes -----------------------------------------------------------\n\nexport const IndexDefSchema = v.object({\n fields: v.array(v.string()),\n name: v.optional(v.string()),\n type: v.optional(IndexTypeSchema),\n});\n\nexport const CompositeUniqueSchema = v.object({\n fields: v.array(v.string()),\n name: v.optional(v.string()),\n});\n\n// --- entities and roots -----------------------------------------------------------\n\nexport const EntitySchema = v.object({\n name: v.string(),\n fields: v.array(FieldSchema),\n additionalProperties: v.optional(FieldTypeSchema),\n relations: v.array(RelationSchema),\n enums: v.optional(v.record(v.string(), EnumDefSchema)),\n primaryKey: v.optional(v.array(v.string())),\n indexes: v.array(IndexDefSchema),\n uniques: v.array(CompositeUniqueSchema),\n doc: v.optional(v.string()),\n dbName: v.optional(v.string()),\n});\n\nexport const SourceIrSchema = v.object({\n namespace: v.string(),\n parser: v.string(),\n parserVersion: v.optional(v.string()),\n entities: v.record(v.string(), EntitySchema),\n enums: v.record(v.string(), EnumDefSchema),\n typeAliases: v.optional(v.record(v.string(), TypeAliasSchema)),\n});\n\nexport const IrSchema = v.object({\n irVersion: v.string(),\n sources: v.record(v.string(), SourceIrSchema),\n});\n","/**\n * Runtime validation of the IR.\n *\n * Schema-first: `v.safeParse` against `schemas.ts` covers structural shape,\n * closed-union membership, required/optional keys and tagged-union narrowing.\n * This module adds the cross-reference pass — the checks Valibot cannot express\n * structurally (enum-ref resolution, relation-target / back-relation resolution,\n * field-name references, `min <= max`, regex compilation, key/name invariants).\n *\n * Valibot issues and cross-ref issues are both normalised to the stable\n * `IrIssue` surface (dotted, located paths) so consumers are unaffected.\n */\nimport * as v from 'valibot';\nimport { IrSchema, SourceIrSchema } from './schemas.js';\nimport type { Constraints, Entity, FieldType, IR, SourceIR } from './types.js';\nimport { IR_VERSION, isCompatible } from './version.js';\n\nexport type IrIssueCode =\n | 'version_incompatible'\n | 'namespace_key_mismatch'\n | 'entity_key_mismatch'\n | 'duplicate_field'\n | 'duplicate_enum_value'\n | 'unresolved_enum_ref'\n | 'unresolved_field_ref'\n | 'unresolved_relation_target'\n | 'unresolved_back_relation'\n | 'unresolved_ref'\n | 'unresolved_type_alias'\n | 'type_alias_key_mismatch'\n | 'degenerate_union'\n | 'union_cycle'\n | 'invalid_constraint'\n | 'invalid_regex'\n | 'shape';\n\nexport interface IrIssue {\n path: string;\n code: IrIssueCode;\n message: string;\n}\n\nexport type IrValidation<T> =\n | { ok: true; value: T; info?: IrIssue[] }\n | { ok: false; issues: IrIssue[] };\n\nexport class IrValidationError extends Error {\n readonly issues: IrIssue[];\n\n constructor(issues: IrIssue[]) {\n const detail = issues\n .map((i) => `${i.path === '' ? '<root>' : i.path}: ${i.message}`)\n .join('; ');\n super(`invalid IR: ${detail}`);\n this.name = 'IrValidationError';\n this.issues = issues;\n }\n}\n\nfunction normaliseValibotIssues(\n issues: readonly v.BaseIssue<unknown>[],\n): IrIssue[] {\n return issues.map((issue) => ({\n path: v.getDotPath(issue) ?? '',\n code: 'shape' as const,\n message: issue.message,\n }));\n}\n\nfunction pushIssue(\n issues: IrIssue[],\n path: string,\n code: IrIssueCode,\n message: string,\n): void {\n issues.push({ path, code, message });\n}\n\nfunction checkConstraints(\n issues: IrIssue[],\n path: string,\n c: Constraints,\n): void {\n if (c.min !== undefined && c.max !== undefined && c.min > c.max) {\n pushIssue(\n issues,\n path,\n 'invalid_constraint',\n `min (${c.min}) is greater than max (${c.max})`,\n );\n }\n if (\n c.minLength !== undefined &&\n c.maxLength !== undefined &&\n c.minLength > c.maxLength\n ) {\n pushIssue(\n issues,\n path,\n 'invalid_constraint',\n `minLength (${c.minLength}) is greater than maxLength (${c.maxLength})`,\n );\n }\n if (c.regex !== undefined) {\n try {\n new RegExp(c.regex);\n } catch {\n pushIssue(\n issues,\n path,\n 'invalid_regex',\n `regex does not compile: ${c.regex}`,\n );\n }\n }\n}\n\nfunction checkEnumValues(\n issues: IrIssue[],\n path: string,\n values: readonly { name: string }[],\n): void {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value.name)) {\n pushIssue(\n issues,\n `${path}.${value.name}`,\n 'duplicate_enum_value',\n `duplicate enum value '${value.name}'`,\n );\n }\n seen.add(value.name);\n }\n}\n\n/**\n * Recursive field-type check. `enum` keeps its entity-local → source-level\n * resolution; `ref` must resolve against `source.entities` then\n * `source.typeAliases`; `union` recurses into every variant and, when it carries\n * a `discriminator.mapping`, every value must name a `ref` variant of the union.\n * A union with fewer than two variants is tolerated on read — it feeds the\n * non-fatal `info` channel (`degenerate_union`), not `issues`.\n */\nfunction walkFieldType(\n type: FieldType,\n path: string,\n entity: Entity | undefined,\n source: SourceIR,\n issues: IrIssue[],\n info: IrIssue[],\n): void {\n switch (type.kind) {\n case 'scalar':\n case 'unknown':\n return;\n case 'enum': {\n const resolved = entity?.enums?.[type.ref] ?? source.enums[type.ref];\n if (resolved === undefined) {\n pushIssue(\n issues,\n path,\n 'unresolved_enum_ref',\n `field type references unknown enum '${type.ref}'`,\n );\n }\n return;\n }\n case 'ref': {\n const known =\n source.entities[type.ref] !== undefined ||\n source.typeAliases?.[type.ref] !== undefined;\n if (!known) {\n pushIssue(\n issues,\n path,\n 'unresolved_ref',\n `ref '${type.ref}' resolves to no entity and no type alias`,\n );\n }\n return;\n }\n case 'map':\n walkFieldType(type.value, `${path}.value`, entity, source, issues, info);\n return;\n case 'array':\n walkFieldType(\n type.element,\n `${path}.element`,\n entity,\n source,\n issues,\n info,\n );\n return;\n case 'union': {\n if (type.variants.length < 2) {\n pushIssue(\n info,\n path,\n 'degenerate_union',\n `union has ${type.variants.length} variant(s); expected at least 2`,\n );\n }\n type.variants.forEach((variant, i) => {\n walkFieldType(\n variant,\n `${path}.variants.${i}`,\n entity,\n source,\n issues,\n info,\n );\n });\n const mapping = type.discriminator?.mapping;\n if (mapping !== undefined) {\n const refVariants = new Set(\n type.variants.flatMap((vv) => (vv.kind === 'ref' ? [vv.ref] : [])),\n );\n for (const [key, target] of Object.entries(mapping)) {\n if (!refVariants.has(target)) {\n pushIssue(\n issues,\n `${path}.discriminator.mapping.${key}`,\n 'unresolved_type_alias',\n `discriminator mapping '${key}' -> '${target}' names no ref variant of the union`,\n );\n }\n }\n }\n return;\n }\n }\n}\n\n/** Every `ref` name reachable from a field type, following nested unions. */\nfunction collectRefs(type: FieldType, out: Set<string>): void {\n if (type.kind === 'ref') {\n out.add(type.ref);\n } else if (type.kind === 'union') {\n for (const variant of type.variants) {\n collectRefs(variant, out);\n }\n } else if (type.kind === 'map') {\n collectRefs(type.value, out);\n } else if (type.kind === 'array') {\n collectRefs(type.element, out);\n }\n}\n\n/**\n * Informational cycle detection over `ref` edges (entity fields, alias types,\n * union variants). Recursion is allowed — a cycle never produces a fatal issue,\n * it only feeds the `info` channel (`union_cycle`) so a generator can log it and\n * fall back to a lazy reference.\n */\nfunction checkRefCycles(\n namespace: string,\n source: SourceIR,\n info: IrIssue[],\n): void {\n const adjacency = new Map<string, Set<string>>();\n for (const [key, alias] of Object.entries(source.typeAliases ?? {})) {\n const refs = new Set<string>();\n collectRefs(alias.type, refs);\n adjacency.set(key, refs);\n }\n for (const [key, entity] of Object.entries(source.entities)) {\n const refs = adjacency.get(key) ?? new Set<string>();\n for (const field of entity.fields) {\n collectRefs(field.type, refs);\n }\n adjacency.set(key, refs);\n }\n\n const state = new Map<string, 'gray' | 'black'>();\n const stack: string[] = [];\n const reported = new Set<string>();\n\n const visit = (node: string): void => {\n state.set(node, 'gray');\n stack.push(node);\n for (const next of adjacency.get(node) ?? []) {\n if (!adjacency.has(next)) {\n continue;\n }\n const seen = state.get(next);\n if (seen === 'gray') {\n const cycle = stack.slice(stack.indexOf(next));\n const signature = [...cycle].sort().join('|');\n if (!reported.has(signature)) {\n reported.add(signature);\n pushIssue(\n info,\n namespace,\n 'union_cycle',\n `reference cycle: ${[...cycle, next].join(' -> ')}`,\n );\n }\n } else if (seen === undefined) {\n visit(next);\n }\n }\n stack.pop();\n state.set(node, 'black');\n };\n\n for (const node of adjacency.keys()) {\n if (state.get(node) === undefined) {\n visit(node);\n }\n }\n}\n\n/**\n * Run every cross-reference check on one source. `lookupEntity` and\n * `isNamespacePresent` give access to the cross-namespace view (full in\n * `validateIR`, this-source-only in `validateSourceIR`). Non-fatal observations\n * (degenerate unions, reference cycles) are collected in `info`.\n */\nfunction checkSource(\n namespace: string,\n source: SourceIR,\n lookupEntity: (ns: string, name: string) => Entity | undefined,\n isNamespacePresent: (ns: string) => boolean,\n issues: IrIssue[],\n info: IrIssue[],\n): void {\n for (const [key, def] of Object.entries(source.enums)) {\n if (def.name !== key) {\n pushIssue(\n issues,\n `${namespace}.enums.${key}`,\n 'entity_key_mismatch',\n `enum key '${key}' does not match enum name '${def.name}'`,\n );\n }\n checkEnumValues(issues, `${namespace}.enums.${key}`, def.values);\n }\n\n for (const [key, entity] of Object.entries(source.entities)) {\n const ePath = `${namespace}.${key}`;\n if (entity.name !== key) {\n pushIssue(\n issues,\n ePath,\n 'entity_key_mismatch',\n `entity key '${key}' does not match entity name '${entity.name}'`,\n );\n }\n\n const fieldNames = new Set<string>();\n for (const field of entity.fields) {\n const fPath = `${ePath}.${field.name}`;\n if (fieldNames.has(field.name)) {\n pushIssue(\n issues,\n fPath,\n 'duplicate_field',\n `duplicate field '${field.name}'`,\n );\n }\n fieldNames.add(field.name);\n checkConstraints(issues, `${fPath}.constraints`, field.constraints);\n walkFieldType(field.type, fPath, entity, source, issues, info);\n }\n if (entity.additionalProperties !== undefined) {\n walkFieldType(\n entity.additionalProperties,\n `${ePath}.additionalProperties`,\n entity,\n source,\n issues,\n info,\n );\n }\n\n for (const [localKey, def] of Object.entries(entity.enums ?? {})) {\n if (def.name !== localKey) {\n pushIssue(\n issues,\n `${ePath}.enums.${localKey}`,\n 'entity_key_mismatch',\n `local enum key '${localKey}' does not match name '${def.name}'`,\n );\n }\n checkEnumValues(issues, `${ePath}.enums.${localKey}`, def.values);\n }\n\n const hasField = (name: string): boolean => fieldNames.has(name);\n\n for (const pk of entity.primaryKey ?? []) {\n if (!hasField(pk)) {\n pushIssue(\n issues,\n `${ePath}.primaryKey`,\n 'unresolved_field_ref',\n `primaryKey references unknown field '${pk}'`,\n );\n }\n }\n entity.indexes.forEach((idx, i) => {\n for (const f of idx.fields) {\n if (!hasField(f)) {\n pushIssue(\n issues,\n `${ePath}.indexes.${i}`,\n 'unresolved_field_ref',\n `index references unknown field '${f}'`,\n );\n }\n }\n });\n entity.uniques.forEach((u, i) => {\n for (const f of u.fields) {\n if (!hasField(f)) {\n pushIssue(\n issues,\n `${ePath}.uniques.${i}`,\n 'unresolved_field_ref',\n `unique references unknown field '${f}'`,\n );\n }\n }\n });\n\n entity.relations.forEach((rel, i) => {\n const rPath = `${ePath}.relations.${rel.name === '' ? i : rel.name}`;\n\n for (const fk of rel.fkFields ?? []) {\n if (!hasField(fk)) {\n pushIssue(\n issues,\n rPath,\n 'unresolved_field_ref',\n `relation '${rel.name}' fkField references unknown field '${fk}'`,\n );\n }\n }\n\n const targetNs = rel.target.namespace;\n // Namespace absent: informational only, v1 drivers ignore cross-source.\n if (targetNs === '') {\n return;\n }\n const sameNs = targetNs === namespace;\n if (!sameNs && !isNamespacePresent(targetNs)) {\n // Other namespace, not present in this view: ignored (shape-level info).\n return;\n }\n\n const targetEntity = lookupEntity(targetNs, rel.target.entity);\n if (targetEntity === undefined) {\n pushIssue(\n issues,\n rPath,\n 'unresolved_relation_target',\n `relation '${rel.name}' target ${targetNs}.${rel.target.entity} does not exist`,\n );\n return;\n }\n if (\n rel.backRelation !== undefined &&\n !targetEntity.relations.some((r) => r.name === rel.backRelation)\n ) {\n pushIssue(\n issues,\n rPath,\n 'unresolved_back_relation',\n `backRelation '${rel.backRelation}' not found on ${targetNs}.${rel.target.entity}`,\n );\n }\n for (const ref of rel.references ?? []) {\n if (!targetEntity.fields.some((f) => f.name === ref)) {\n pushIssue(\n issues,\n rPath,\n 'unresolved_field_ref',\n `relation '${rel.name}' references unknown field '${ref}' on ${targetNs}.${rel.target.entity}`,\n );\n }\n }\n });\n }\n\n for (const [key, alias] of Object.entries(source.typeAliases ?? {})) {\n const aPath = `${namespace}.typeAliases.${key}`;\n if (alias.name !== key) {\n pushIssue(\n issues,\n aPath,\n 'type_alias_key_mismatch',\n `type alias key '${key}' does not match name '${alias.name}'`,\n );\n }\n walkFieldType(alias.type, `${aPath}.type`, undefined, source, issues, info);\n }\n\n checkRefCycles(namespace, source, info);\n}\n\nexport function validateSourceIR(value: unknown): IrValidation<SourceIR> {\n const parsed = v.safeParse(SourceIrSchema, value);\n if (!parsed.success) {\n return { ok: false, issues: normaliseValibotIssues(parsed.issues) };\n }\n const source = parsed.output;\n const issues: IrIssue[] = [];\n const info: IrIssue[] = [];\n const lookup = (ns: string, name: string): Entity | undefined =>\n ns === source.namespace ? source.entities[name] : undefined;\n const isPresent = (ns: string): boolean => ns === source.namespace;\n checkSource(source.namespace, source, lookup, isPresent, issues, info);\n if (issues.length > 0) {\n return { ok: false, issues };\n }\n return info.length > 0\n ? { ok: true, value: source, info }\n : { ok: true, value: source };\n}\n\nexport function validateIR(value: unknown): IrValidation<IR> {\n const parsed = v.safeParse(IrSchema, value);\n if (!parsed.success) {\n return { ok: false, issues: normaliseValibotIssues(parsed.issues) };\n }\n const ir = parsed.output;\n const issues: IrIssue[] = [];\n const info: IrIssue[] = [];\n\n if (!isCompatible(ir.irVersion)) {\n pushIssue(\n issues,\n 'irVersion',\n 'version_incompatible',\n `IR version '${ir.irVersion}' is not compatible with supported version '${IR_VERSION}'`,\n );\n }\n\n const lookup = (ns: string, name: string): Entity | undefined =>\n ir.sources[ns]?.entities[name];\n const isPresent = (ns: string): boolean => ns in ir.sources;\n\n for (const [key, source] of Object.entries(ir.sources)) {\n if (source.namespace !== key) {\n pushIssue(\n issues,\n `sources.${key}`,\n 'namespace_key_mismatch',\n `source key '${key}' does not match namespace '${source.namespace}'`,\n );\n }\n checkSource(source.namespace, source, lookup, isPresent, issues, info);\n }\n\n if (issues.length > 0) {\n return { ok: false, issues };\n }\n return info.length > 0\n ? { ok: true, value: ir, info }\n : { ok: true, value: ir };\n}\n\nexport function assertIR(value: unknown): asserts value is IR {\n const result = validateIR(value);\n if (!result.ok) {\n throw new IrValidationError(result.issues);\n }\n}\n\nexport function assertSourceIR(value: unknown): asserts value is SourceIR {\n const result = validateSourceIR(value);\n if (!result.ok) {\n throw new IrValidationError(result.issues);\n }\n}\n\nexport function parseIR(json: string): IR {\n const value = JSON.parse(json) as unknown;\n assertIR(value);\n return value;\n}\n","/**\n * IR format version. Orthogonal to the npm semver of `@kurotako/ir`\n * (independent versioning): a single string, bumped only on a breaking change\n * to the format itself.\n */\nexport const IR_VERSION = '4';\n\n/**\n * Whether an IR produced against `irVersion` can be consumed by this build.\n * v1 rule: strict equality.\n */\nexport function isCompatible(irVersion: string): boolean {\n return irVersion === IR_VERSION;\n}\n","/**\n * Traversal / resolution helpers. All pure, none throw — they return `undefined`\n * on a miss. `resolveEnum` implements the entity-local → source-level precedence\n * in one place so every generator agrees.\n */\nimport type {\n Entity,\n EnumDef,\n Field,\n FieldType,\n IR,\n Relation,\n ScalarType,\n SourceIR,\n TypeAlias,\n} from './types.js';\n\nexport function getSource(ir: IR, namespace: string): SourceIR | undefined {\n return ir.sources[namespace];\n}\n\nexport function resolveEntity(\n ir: IR,\n namespace: string,\n name: string,\n): Entity | undefined {\n return ir.sources[namespace]?.entities[name];\n}\n\n/** Entity-local enums shadow source-level enums of the same name. */\nexport function resolveEnum(\n source: SourceIR,\n entity: Entity | undefined,\n ref: string,\n): EnumDef | undefined {\n return entity?.enums?.[ref] ?? source.enums[ref];\n}\n\n/**\n * Resolve a `{ kind: 'ref' }` name against the same source: an entity first,\n * then a type alias. Same-namespace only — v1 has no namespace qualifier.\n */\nexport function resolveRef(\n source: SourceIR,\n ref: string,\n): Entity | TypeAlias | undefined {\n return source.entities[ref] ?? source.typeAliases?.[ref];\n}\n\nexport function resolveTypeAlias(\n source: SourceIR,\n name: string,\n): TypeAlias | undefined {\n return source.typeAliases?.[name];\n}\n\nexport function* iterTypeAliases(\n ir: IR,\n): Iterable<{ namespace: string; alias: TypeAlias }> {\n for (const [namespace, source] of Object.entries(ir.sources)) {\n for (const alias of Object.values(source.typeAliases ?? {})) {\n yield { namespace, alias };\n }\n }\n}\n\n/** Every `{ kind: 'ref' }` name reachable from a field type (through unions). */\nexport function collectRefNames(\n type: FieldType,\n into: Set<string> = new Set(),\n): Set<string> {\n if (type.kind === 'ref') {\n into.add(type.ref);\n } else if (type.kind === 'union') {\n for (const variant of type.variants) {\n collectRefNames(variant, into);\n }\n } else if (type.kind === 'map') {\n collectRefNames(type.value, into);\n } else if (type.kind === 'array') {\n collectRefNames(type.element, into);\n }\n return into;\n}\n\n/**\n * Names of entities / type aliases that take part in at least one `ref` cycle\n * within `source` — following field-type `ref`, alias `type` `ref` and union\n * variant `ref` edges. Mirrors the informational `union_cycle` pass in\n * `validate.ts`; a generator consumes this (through `GenerateContext.cycles`)\n * to decide which references must be `z.lazy`-wrapped / widened rather than\n * emitted as a bare forward reference.\n */\nexport function refCycleMembers(source: SourceIR): Set<string> {\n const adjacency = new Map<string, Set<string>>();\n const edgesFor = (key: string): Set<string> => {\n let set = adjacency.get(key);\n if (set === undefined) {\n set = new Set<string>();\n adjacency.set(key, set);\n }\n return set;\n };\n for (const [key, alias] of Object.entries(source.typeAliases ?? {})) {\n collectRefNames(alias.type, edgesFor(key));\n }\n for (const [key, entity] of Object.entries(source.entities)) {\n const set = edgesFor(key);\n for (const field of entity.fields) {\n collectRefNames(field.type, set);\n }\n if (entity.additionalProperties !== undefined) {\n collectRefNames(entity.additionalProperties, set);\n }\n }\n\n const canReachSelf = (start: string): boolean => {\n const seen = new Set<string>();\n const stack = [...(adjacency.get(start) ?? [])];\n while (stack.length > 0) {\n const node = stack.pop();\n if (node === undefined) {\n break;\n }\n if (node === start) {\n return true;\n }\n if (seen.has(node) || !adjacency.has(node)) {\n continue;\n }\n seen.add(node);\n for (const next of adjacency.get(node) ?? []) {\n stack.push(next);\n }\n }\n return false;\n };\n\n const members = new Set<string>();\n for (const node of adjacency.keys()) {\n if (canReachSelf(node)) {\n members.add(node);\n }\n }\n return members;\n}\n\n/** Stable structural key for a non-union `FieldType`, for deduplication. */\nfunction fieldTypeKey(type: FieldType): string {\n switch (type.kind) {\n case 'scalar':\n return `scalar:${type.scalar}`;\n case 'enum':\n return `enum:${type.ref}`;\n case 'ref':\n return `ref:${type.ref}`;\n case 'unknown':\n return `unknown:${type.hint ?? ''}`;\n case 'map':\n return `map:${fieldTypeKey(type.value)}`;\n case 'array':\n return `array:${fieldTypeKey(type.element)}`;\n case 'union':\n return `union:${flattenUnion(type).map(fieldTypeKey).join(',')}`;\n }\n}\n\n/**\n * Flatten nested unions into a single variant list and drop\n * structurally-identical duplicates, preserving first-seen order. The\n * discriminator of a nested union is not carried up.\n */\nexport function flattenUnion(\n type: Extract<FieldType, { kind: 'union' }>,\n): FieldType[] {\n const out: FieldType[] = [];\n const seen = new Set<string>();\n const push = (t: FieldType): void => {\n if (t.kind === 'union') {\n for (const variant of t.variants) {\n push(variant);\n }\n return;\n }\n const key = fieldTypeKey(t);\n if (!seen.has(key)) {\n seen.add(key);\n out.push(t);\n }\n };\n for (const variant of type.variants) {\n push(variant);\n }\n return out;\n}\n\n/**\n * A relation is cross-source when its target namespace is anything other than\n * the entity's own namespace — including the \"absent\" (empty) namespace, which\n * v1 drivers treat as an unresolved cross-source reference.\n */\nexport function isCrossSource(fromNamespace: string, rel: Relation): boolean {\n return rel.target.namespace !== fromNamespace;\n}\n\n/**\n * Resolve the target entity of a relation. Returns `undefined` when the target\n * namespace is absent or not present in the IR, or when the entity is missing.\n */\nexport function resolveRelationTarget(\n ir: IR,\n fromNamespace: string,\n rel: Relation,\n): Entity | undefined {\n const ns = isCrossSource(fromNamespace, rel)\n ? rel.target.namespace\n : fromNamespace;\n return ir.sources[ns]?.entities[rel.target.entity];\n}\n\nexport function* iterEntities(\n ir: IR,\n): Iterable<{ namespace: string; entity: Entity }> {\n for (const [namespace, source] of Object.entries(ir.sources)) {\n for (const entity of Object.values(source.entities)) {\n yield { namespace, entity };\n }\n }\n}\n\nexport function* iterFields(entity: Entity): Iterable<Field> {\n yield* entity.fields;\n}\n\n/** Fields named by `entity.primaryKey`, in declaration order. */\nexport function primaryKeyFields(entity: Entity): Field[] {\n const pk = entity.primaryKey;\n if (pk === undefined) {\n return [];\n }\n const byName = new Map(entity.fields.map((f) => [f.name, f]));\n const out: Field[] = [];\n for (const name of pk) {\n const field = byName.get(name);\n if (field !== undefined) {\n out.push(field);\n }\n }\n return out;\n}\n\n// --- shared-decision helpers ------------------------------------------------\n//\n// Principle: any modelling rule that a parser or a generator would otherwise\n// re-implement \"in its own way\" lives here as a pure helper, so the whole\n// pipeline reads it from one place. `generator-zod` (#34) and `generator-angular`\n// (#39) MUST consume these rather than re-encode the create/update payload-shape\n// rules or the scalar -> TS type mapping.\n\n/** Closed set of scalar TS type tokens `scalarTsType` may return for a scalar. */\nexport type ScalarTsType =\n | 'string'\n | 'number'\n | 'bigint'\n | 'boolean'\n | 'Date'\n | 'Uint8Array'\n | 'JsonValue'\n | 'unknown';\n\n/**\n * The value is assigned by the DB/server (an `expr` default: `now()`,\n * `autoincrement()`, `uuid()`, `dbgenerated(\"…\")`, …) and is never supplied on a\n * create payload.\n */\nexport function isDbAssigned(field: Field): boolean {\n return field.default?.kind === 'expr';\n}\n\n/**\n * Fields to include in a \"create\" payload: `entity.fields` minus the ones whose\n * only value source is db-side (a primary-key member that is `isDbAssigned`).\n */\nexport function createFields(entity: Entity): Field[] {\n const pk = new Set(entity.primaryKey ?? []);\n return entity.fields.filter(\n (field) => !(pk.has(field.name) && isDbAssigned(field)),\n );\n}\n\n/**\n * A create-payload field the caller may omit:\n * `field.optional || field.default != null || isDbAssigned(field)`.\n */\nexport function isCreateOptional(field: Field): boolean {\n return field.optional || field.default !== undefined || isDbAssigned(field);\n}\n\n/**\n * Fields to include in an \"update\" payload: `entity.fields` minus primary-key\n * members; the caller treats every one as optional (partial).\n */\nexport function updateFields(entity: Entity): Field[] {\n const pk = new Set(entity.primaryKey ?? []);\n return entity.fields.filter((field) => !pk.has(field.name));\n}\n\n/**\n * The TS type a non-nullable, non-list value of this field maps to, as a source\n * string every generator's typed output must agree on. Returns a `ScalarTsType`\n * token for scalars (`bytes -> 'Uint8Array'`, `json -> 'JsonValue'`, `decimal`\n * kept as `'string'` to preserve precision — runtime representation stays each\n * generator's choice), the enum type name for `{ kind: 'enum' }` (identifiers are\n * never prefixed, ADR-0004), and `'unknown'` for `{ kind: 'unknown' }`.\n */\nexport function scalarTsType(type: FieldType): string {\n switch (type.kind) {\n case 'enum':\n return type.ref;\n case 'ref':\n return type.ref;\n case 'unknown':\n return 'unknown';\n case 'scalar':\n return mapScalar(type.scalar);\n case 'union':\n return flattenUnion(type)\n .map((variant) =>\n variant.kind === 'union'\n ? `(${scalarTsType(variant)})`\n : scalarTsType(variant),\n )\n .join(' | ');\n case 'map':\n return `Record<string, ${scalarTsType(type.value)}>`;\n case 'array': {\n const element = scalarTsType(type.element);\n return type.element.kind === 'union' ? `(${element})[]` : `${element}[]`;\n }\n }\n}\n\nfunction mapScalar(scalar: ScalarType): ScalarTsType {\n switch (scalar) {\n case 'string':\n case 'uuid':\n case 'decimal':\n return 'string';\n case 'boolean':\n return 'boolean';\n case 'int':\n case 'float':\n return 'number';\n case 'bigint':\n return 'bigint';\n case 'date':\n case 'datetime':\n return 'Date';\n case 'bytes':\n return 'Uint8Array';\n case 'json':\n return 'JsonValue';\n }\n}\n"],"mappings":"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","names":["v","v","variant","variant","variant"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kurotako/ir",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Intermediate representation for kurotako: the schema model parsers produce and generators consume.",
5
5
  "keywords": [
6
6
  "kurotako",