@kurotako/ir 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
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 IndexDef,\n IndexType,\n ReferentialAction,\n Relation,\n ScalarType,\n SourceIR,\n StringFormat,\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\nexport interface FieldBuilder {\n scalar(t: ScalarType): this;\n enum(ref: string): 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 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\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 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\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 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\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';\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\nexport const FieldTypeSchema = 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]);\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});\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, 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 | '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 }\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 * 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`).\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): 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 if (field.type.kind === 'enum') {\n const resolved =\n entity.enums?.[field.type.ref] ?? source.enums[field.type.ref];\n if (resolved === undefined) {\n pushIssue(\n issues,\n fPath,\n 'unresolved_enum_ref',\n `field '${field.name}' references unknown enum '${field.type.ref}'`,\n );\n }\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\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 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);\n return issues.length > 0\n ? { ok: false, issues }\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\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);\n }\n\n return issues.length > 0 ? { ok: false, issues } : { 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 = '1';\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} 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 * 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 'unknown':\n return 'unknown';\n case 'scalar':\n return mapScalar(type.scalar);\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"]}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@kurotako/ir",
3
+ "version": "0.1.0",
4
+ "description": "Intermediate representation for kurotako: the schema model parsers produce and generators consume.",
5
+ "keywords": [
6
+ "kurotako",
7
+ "codegen",
8
+ "typescript",
9
+ "schema",
10
+ "ir",
11
+ "valibot"
12
+ ],
13
+ "license": "MIT",
14
+ "author": "Marmotz",
15
+ "homepage": "https://kurotako.marmotz.dev/",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/marmotz/kurotako.git",
19
+ "directory": "packages/ir"
20
+ },
21
+ "bugs": "https://github.com/marmotz/kurotako/issues",
22
+ "type": "module",
23
+ "sideEffects": false,
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js",
28
+ "require": "./dist/index.cjs"
29
+ }
30
+ },
31
+ "main": "./dist/index.cjs",
32
+ "module": "./dist/index.js",
33
+ "types": "./dist/index.d.ts",
34
+ "files": [
35
+ "dist",
36
+ "CHANGELOG.md",
37
+ "LICENSE"
38
+ ],
39
+ "engines": {
40
+ "node": ">=24"
41
+ },
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "typecheck": "tsc -b",
45
+ "test": "vitest run"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "dependencies": {
51
+ "valibot": "1.4.2"
52
+ }
53
+ }