@kurotako/gen-typescript 0.1.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/CHANGELOG.md +62 -0
- package/dist/index.cjs +16 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,67 @@
|
|
|
1
1
|
# @kurotako/gen-typescript
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 9fe08b3: Add an `array` field type to the IR and bump the IR format to `'4'`.
|
|
8
|
+
|
|
9
|
+
- `@kurotako/ir`: new `{ kind: 'array', element: FieldType }` field type, so an
|
|
10
|
+
array-typed type alias, union variant or map value can be represented (the
|
|
11
|
+
boolean `Field.list` fast path stays as an optimisation for a plain
|
|
12
|
+
`property: { type: 'array', items: <scalar|ref> }`). Builders (`.array(...)`),
|
|
13
|
+
validation, reference traversal, cycle analysis and TypeScript-type helpers
|
|
14
|
+
recurse through it. The strict compatibility check now requires `irVersion` `'4'`.
|
|
15
|
+
- `@kurotako/gen-zod`: renders an array as `z.array(<element>)` and its TS type as
|
|
16
|
+
`<element>[]`.
|
|
17
|
+
- `@kurotako/gen-typescript`: renders an array as `<element>[]`, parenthesising a
|
|
18
|
+
union element.
|
|
19
|
+
- `@kurotako/gen-angular`: renders an array field as `FormControl<<element>[]>`
|
|
20
|
+
seeded with `[]`.
|
|
21
|
+
- `@kurotako/parser-openapi`: an array schema that is not a plain object property
|
|
22
|
+
(an array-typed response/component alias, a nested array, an array inside a
|
|
23
|
+
`oneOf`/`additionalProperties`) now maps to the `array` field type instead of
|
|
24
|
+
silently dropping the array wrapper. Nested arrays are supported.
|
|
25
|
+
- ecdb02c: Add the OpenAPI parser and IR typed maps.
|
|
26
|
+
|
|
27
|
+
- `@kurotako/ir`: adds the `{ kind: 'map', value: FieldType }`
|
|
28
|
+
field type and the optional `Entity.additionalProperties` slot. Builders,
|
|
29
|
+
validation, reference traversal, cycle analysis and TypeScript-type helpers
|
|
30
|
+
recurse through both.
|
|
31
|
+
- `@kurotako/gen-zod`: renders map values as `z.record(z.string(), value)` and an
|
|
32
|
+
entity catch-all as `.catchall(value)`.
|
|
33
|
+
- `@kurotako/gen-typescript`: renders map values as `Record<string, Value>` and an
|
|
34
|
+
entity catch-all as an index signature.
|
|
35
|
+
- `@kurotako/gen-angular`: renders a map field as `FormControl<Record<string, Value>>`
|
|
36
|
+
seeded with `{}`; entity-level catch-all values stay under the emitted Zod validator.
|
|
37
|
+
- `@kurotako/parser-openapi`: new package. Turns an OpenAPI 3.0/3.1 document (local
|
|
38
|
+
JSON/YAML or an unauthenticated HTTP(S) URL) into one `SourceIR`, mapping component
|
|
39
|
+
and inline operation schemas to deterministic entities, aliases, enums and typed maps.
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
- Updated dependencies [9fe08b3]
|
|
44
|
+
- Updated dependencies [ecdb02c]
|
|
45
|
+
- Updated dependencies [22e6559]
|
|
46
|
+
- @kurotako/ir@0.3.0
|
|
47
|
+
- @kurotako/core@0.1.2
|
|
48
|
+
- @kurotako/config@0.1.2
|
|
49
|
+
|
|
50
|
+
## 0.2.0
|
|
51
|
+
|
|
52
|
+
### Minor Changes
|
|
53
|
+
|
|
54
|
+
- 489a50d: Add a generator for pure TypeScript declaration types from kurotako IR.
|
|
55
|
+
|
|
56
|
+
### Patch Changes
|
|
57
|
+
|
|
58
|
+
- Updated dependencies [489a50d]
|
|
59
|
+
- Updated dependencies [c575bc1]
|
|
60
|
+
- Updated dependencies [7a50439]
|
|
61
|
+
- @kurotako/core@0.1.1
|
|
62
|
+
- @kurotako/ir@0.2.0
|
|
63
|
+
- @kurotako/config@0.1.1
|
|
64
|
+
|
|
3
65
|
## 0.1.0
|
|
4
66
|
|
|
5
67
|
### Minor Changes
|
package/dist/index.cjs
CHANGED
|
@@ -278,6 +278,12 @@ function collectTypeDependencies(type, source, entity, into = emptyDependencies(
|
|
|
278
278
|
collectTypeDependencies(variant, source, entity, into);
|
|
279
279
|
}
|
|
280
280
|
break;
|
|
281
|
+
case "map":
|
|
282
|
+
collectTypeDependencies(type.value, source, entity, into);
|
|
283
|
+
break;
|
|
284
|
+
case "array":
|
|
285
|
+
collectTypeDependencies(type.element, source, entity, into);
|
|
286
|
+
break;
|
|
281
287
|
case "unknown":
|
|
282
288
|
break;
|
|
283
289
|
}
|
|
@@ -293,6 +299,10 @@ function renderFieldType(type, source) {
|
|
|
293
299
|
(variant) => variant.kind === "union" ? `(${renderFieldType(variant, source)})` : renderFieldType(variant, source)
|
|
294
300
|
).join(" | ");
|
|
295
301
|
}
|
|
302
|
+
case "map":
|
|
303
|
+
return `Record<string, ${renderFieldType(type.value, source)}>`;
|
|
304
|
+
case "array":
|
|
305
|
+
return type.element.kind === "union" ? `(${renderFieldType(type.element, source)})[]` : `${renderFieldType(type.element, source)}[]`;
|
|
296
306
|
case "scalar":
|
|
297
307
|
case "enum":
|
|
298
308
|
case "unknown":
|
|
@@ -589,6 +599,12 @@ function emitEntity(source, entity, logger) {
|
|
|
589
599
|
entity
|
|
590
600
|
)
|
|
591
601
|
);
|
|
602
|
+
if (entity.additionalProperties !== void 0) {
|
|
603
|
+
const declared = variantFields(entity, variant).map((selection) => renderFieldType(selection.field.type, source)).join(" | ");
|
|
604
|
+
own.push(
|
|
605
|
+
` [key: string]: ${renderFieldType(entity.additionalProperties, source)}${declared === "" ? "" : ` | ${declared}`} | undefined;`
|
|
606
|
+
);
|
|
607
|
+
}
|
|
592
608
|
const relations = [];
|
|
593
609
|
if (family === "deep") {
|
|
594
610
|
for (let index = 0; index < entity.relations.length; index += 1) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/generator.ts","../src/artifact.ts","../src/names.ts","../src/emit/enums.ts","../src/render/scalars.ts","../src/emit/aliases.ts","../src/emit/barrel.ts","../src/render/jsdoc.ts","../src/render/field.ts","../src/render/relations.ts","../src/render/variants.ts","../src/emit/entity.ts","../src/emit/filters.ts","../src/emit/scalars.ts"],"sourcesContent":["/** `@kurotako/gen-typescript` — the TypeScript generator driver. */\nexport type { TypeScriptArtifactExtra } from './artifact.js';\nexport {\n TypeScriptAliasCycleError,\n TypeScriptAliasPublicNameCollisionError,\n TypeScriptEnumCollisionError,\n TypeScriptEnumPublicNameCollisionError,\n TypeScriptGenError,\n} from './errors.js';\nexport { typescriptGenerator } from './generator.js';\n","/**\n * `@kurotako/gen-typescript` error classes.\n *\n * Codes: `typescript_alias_cycle`, `typescript_alias_public_name_collision`,\n * `typescript_enum_collision`, `typescript_enum_public_name_collision`.\n */\nexport class TypeScriptGenError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n this.code = code;\n }\n}\n\n/**\n * Source aliases in a direct `ref` cycle cannot be represented by the emitted\n * pure TypeScript aliases.\n */\nexport class TypeScriptAliasCycleError extends TypeScriptGenError {\n readonly namespace: string;\n readonly aliasNames: string[];\n\n constructor(namespace: string, aliasNames: readonly string[]) {\n const sortedNames = [...aliasNames].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_alias_cycle',\n `source type aliases ${sortedNames.map((name) => `'${name}'`).join(', ')} form a direct reference cycle in namespace '${namespace}'; pure TypeScript aliases cannot represent it`,\n );\n this.namespace = namespace;\n this.aliasNames = sortedNames;\n }\n}\n\n/** Source aliases cannot reuse a public identifier emitted by this generator. */\nexport class TypeScriptAliasPublicNameCollisionError extends TypeScriptGenError {\n readonly namespace: string;\n readonly names: string[];\n\n constructor(namespace: string, names: readonly string[]) {\n const sortedNames = [...names].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_alias_public_name_collision',\n `source type aliases ${sortedNames.map((name) => `'${name}'`).join(', ')} collide with generated public identifiers in namespace '${namespace}'; rename one of the conflicting source definitions`,\n );\n this.namespace = namespace;\n this.names = sortedNames;\n }\n}\n\n/** An enum cannot reuse a non-enum identifier exported from the namespace barrel. */\nexport class TypeScriptEnumPublicNameCollisionError extends TypeScriptGenError {\n readonly namespace: string;\n readonly names: string[];\n\n constructor(namespace: string, names: readonly string[]) {\n const sortedNames = [...names].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_enum_public_name_collision',\n `source enums ${sortedNames.map((name) => `'${name}'`).join(', ')} collide with other public identifiers in namespace '${namespace}'; rename one of the conflicting source definitions`,\n );\n this.namespace = namespace;\n this.names = sortedNames;\n }\n}\n\n/**\n * Two distinct `EnumDef`s reachable in one source share a name. Names both\n * origins so the schema author can resolve the collision.\n */\nexport class TypeScriptEnumCollisionError extends TypeScriptGenError {\n readonly enumName: string;\n readonly firstOrigin: string;\n readonly secondOrigin: string;\n\n constructor(enumName: string, firstOrigin: string, secondOrigin: string) {\n super(\n 'typescript_enum_collision',\n `enum '${enumName}' is defined twice with different values (${firstOrigin} vs ${secondOrigin}); ` +\n 'rename one of them in the source schema',\n );\n this.enumName = enumName;\n this.firstOrigin = firstOrigin;\n this.secondOrigin = secondOrigin;\n }\n}\n","/** `typescriptGenerator` — emits pure TypeScript declarations from the IR. */\nimport { defineGenerator } from '@kurotako/config';\nimport type { GenerateContext, GenOutput, VirtualFile } from '@kurotako/core';\nimport { buildArtifact } from './artifact.js';\nimport { emitAliases } from './emit/aliases.js';\nimport { emitBarrel } from './emit/barrel.js';\nimport { emitEntity } from './emit/entity.js';\nimport { collectEnums, emitEnums } from './emit/enums.js';\nimport { collectFilterNames, emitFilters } from './emit/filters.js';\nimport { emitScalars } from './emit/scalars.js';\nimport {\n TypeScriptAliasCycleError,\n TypeScriptAliasPublicNameCollisionError,\n TypeScriptEnumPublicNameCollisionError,\n} from './errors.js';\nimport {\n FAMILIES,\n FAMILY_TOKEN,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n} from './names.js';\nimport { collectTypeDependencies } from './render/scalars.js';\n\nfunction sourceUsesJsonValue(\n source: GenerateContext['ir']['sources'][string],\n): boolean {\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n if (collectTypeDependencies(field.type, source, entity).usesJsonValue) {\n return true;\n }\n }\n }\n for (const alias of Object.values(source.typeAliases ?? {})) {\n if (collectTypeDependencies(alias.type, source, undefined).usesJsonValue) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Return aliases that participate in an alias-only `ref` cycle. A cycle passing\n * through an entity is valid TypeScript because the entity emits a structural\n * object type; bare aliases have no such structure to break the recursion.\n */\nfunction cyclicAliasNames(\n source: GenerateContext['ir']['sources'][string],\n cycles: GenerateContext['cycles'],\n): string[] {\n const aliases = source.typeAliases ?? {};\n const candidates = Object.keys(aliases).filter((name) =>\n cycles.has(`${source.namespace}.${name}`),\n );\n const candidateSet = new Set(candidates);\n const references = new Map<string, string[]>();\n\n for (const name of candidates) {\n const alias = aliases[name];\n if (alias === undefined) continue;\n const dependencies = collectTypeDependencies(alias.type, source, undefined);\n references.set(\n name,\n [...dependencies.aliases].filter((dependency) =>\n candidateSet.has(dependency),\n ),\n );\n }\n\n const reachesSelf = (start: string, current: string, seen: Set<string>) => {\n for (const next of references.get(current) ?? []) {\n if (next === start) return true;\n if (!seen.has(next)) {\n seen.add(next);\n if (reachesSelf(start, next, seen)) return true;\n }\n }\n return false;\n };\n\n return candidates.filter((name) => reachesSelf(name, name, new Set([name])));\n}\n\n/** Public barrel identifiers, separated by their enum, generated, and alias origins. */\nfunction generatedPublicNames(\n source: GenerateContext['ir']['sources'][string],\n): {\n enumNames: Set<string>;\n generatedTypeNames: Set<string>;\n aliasNames: Set<string>;\n} {\n // An enum's const and type intentionally share one identifier in TypeScript's\n // separate value and type namespaces, so it is recorded only once here.\n const enumNames = new Set(collectEnums(source).map(({ name }) => name));\n const generatedTypeNames = new Set<string>();\n\n for (const entity of Object.values(source.entities)) {\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n generatedTypeNames.add(\n typeName(entity.name, VARIANT_TOKEN[variant], FAMILY_TOKEN[family]),\n );\n }\n }\n }\n\n for (const name of collectFilterNames(source)) generatedTypeNames.add(name);\n if (sourceUsesJsonValue(source)) generatedTypeNames.add('JsonValue');\n return {\n enumNames,\n generatedTypeNames,\n aliasNames: new Set(Object.keys(source.typeAliases ?? {})),\n };\n}\n\nfunction validateSourceEmission(\n source: GenerateContext['ir']['sources'][string],\n cycles: GenerateContext['cycles'],\n): void {\n const aliasesInCycles = cyclicAliasNames(source, cycles);\n if (aliasesInCycles.length > 0) {\n throw new TypeScriptAliasCycleError(source.namespace, aliasesInCycles);\n }\n\n const { enumNames, generatedTypeNames, aliasNames } =\n generatedPublicNames(source);\n const aliasCollisions = [...aliasNames].filter(\n (name) => enumNames.has(name) || generatedTypeNames.has(name),\n );\n if (aliasCollisions.length > 0) {\n throw new TypeScriptAliasPublicNameCollisionError(\n source.namespace,\n aliasCollisions,\n );\n }\n\n const enumCollisions = [...enumNames].filter(\n (name) => generatedTypeNames.has(name) || aliasNames.has(name),\n );\n if (enumCollisions.length > 0) {\n throw new TypeScriptEnumPublicNameCollisionError(\n source.namespace,\n enumCollisions,\n );\n }\n}\n\n/** Pure, synchronous generator with no runtime dependency on generated code. */\nexport const typescriptGenerator = defineGenerator({\n name: 'typescript',\n\n generate(ctx: GenerateContext): GenOutput {\n const files: VirtualFile[] = [];\n for (const [namespace, source] of Object.entries(ctx.ir.sources)) {\n validateSourceEmission(source, ctx.cycles);\n const prefix = `${namespace}/typescript`;\n const emitsScalars = sourceUsesJsonValue(source);\n if (emitsScalars) {\n files.push({ path: `${prefix}/scalars.ts`, content: emitScalars() });\n }\n files.push({ path: `${prefix}/enums.ts`, content: emitEnums(source) });\n if (Object.keys(source.entities).length > 0) {\n files.push({\n path: `${prefix}/filters.ts`,\n content: emitFilters(source),\n });\n }\n if (Object.keys(source.typeAliases ?? {}).length > 0) {\n files.push({\n path: `${prefix}/aliases.ts`,\n content: emitAliases(source),\n });\n }\n for (const entity of Object.values(source.entities)) {\n files.push({\n path: `${prefix}/${entity.name}.type.ts`,\n content: emitEntity(source, entity, ctx.logger),\n });\n }\n files.push({\n path: `${prefix}/index.ts`,\n content: emitBarrel(\n source,\n emitsScalars,\n Object.keys(source.typeAliases ?? {}).length > 0,\n ),\n });\n }\n return { files, artifact: buildArtifact(ctx.ir) };\n },\n});\n","/** Assemble the TypeScript generator's full artifact symbol matrix. */\nimport type { EntitySymbols, GeneratorArtifact } from '@kurotako/core';\nimport type { IR } from '@kurotako/ir';\nimport { iterEntities } from '@kurotako/ir';\nimport { collectEnums } from './emit/enums.js';\nimport {\n barrelModule,\n entityModule,\n enumConst,\n enumsModule,\n enumTypeName,\n FAMILIES,\n FAMILY_TOKEN,\n type FamilyName,\n filtersModule,\n scalarsModule,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n type VariantName,\n} from './names.js';\n\nexport interface TypeScriptArtifactExtra {\n families: ['flat', 'deep'];\n variants: ['full', 'create', 'update', 'where', 'select'];\n perNamespace: Record<\n string,\n {\n barrelModule: string;\n filtersModule: string;\n scalarsModule: string;\n enums: Record<\n string,\n { constName: string; typeName: string; module: string }\n >;\n }\n >;\n}\n\nfunction roleStem(variant: VariantName, family: FamilyName): string {\n const variantStem = variant === 'full' ? '' : variant;\n return family === 'flat'\n ? variantStem\n : variantStem === ''\n ? 'deep'\n : `${variantStem}Deep`;\n}\n\nfunction entitySymbols(name: string): Record<string, string> {\n const symbols: Record<string, string> = {};\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n const stem = roleStem(variant, family);\n const key = stem === '' ? 'type' : `${stem}Type`;\n symbols[key] = typeName(\n name,\n VARIANT_TOKEN[variant],\n FAMILY_TOKEN[family],\n );\n }\n }\n return symbols;\n}\n\n/** Build the consumable metadata independently of file emission. */\nexport function buildArtifact(ir: IR): GeneratorArtifact {\n const entities: Record<string, EntitySymbols> = {};\n for (const { namespace, entity } of iterEntities(ir)) {\n entities[`${namespace}.${entity.name}`] = {\n module: entityModule(namespace, entity.name),\n symbols: entitySymbols(entity.name),\n };\n }\n\n const perNamespace: TypeScriptArtifactExtra['perNamespace'] = {};\n for (const [namespace, source] of Object.entries(ir.sources)) {\n const enums: TypeScriptArtifactExtra['perNamespace'][string]['enums'] = {};\n for (const definition of collectEnums(source)) {\n enums[definition.name] = {\n constName: enumConst(definition.name),\n typeName: enumTypeName(definition.name),\n module: enumsModule(namespace),\n };\n }\n perNamespace[namespace] = {\n barrelModule: barrelModule(namespace),\n filtersModule: filtersModule(namespace),\n scalarsModule: scalarsModule(namespace),\n enums,\n };\n }\n\n return {\n entities,\n extra: {\n families: ['flat', 'deep'],\n variants: ['full', 'create', 'update', 'where', 'select'],\n perNamespace,\n } satisfies TypeScriptArtifactExtra,\n };\n}\n","/**\n * Deterministic identifier and module-specifier helpers.\n *\n * Identifiers are never namespace-prefixed; the namespace only drives the\n * `typescript/` output sub-tree.\n */\n\n/** PascalCase variant token embedded in a type identifier. */\nexport type Variant = '' | 'Create' | 'Update' | 'Where' | 'Select';\n\n/** Relation family token embedded in a type identifier. */\nexport type Family = '' | 'Deep';\n\n/** The five variant names, in their fixed order. */\nexport const VARIANTS = [\n 'full',\n 'create',\n 'update',\n 'where',\n 'select',\n] as const;\nexport type VariantName = (typeof VARIANTS)[number];\n\n/** The two relation families, in their fixed order. */\nexport const FAMILIES = ['flat', 'deep'] as const;\nexport type FamilyName = (typeof FAMILIES)[number];\n\n/** `VariantName` -> the PascalCase token used inside identifiers. */\nexport const VARIANT_TOKEN: Record<VariantName, Variant> = {\n full: '',\n create: 'Create',\n update: 'Update',\n where: 'Where',\n select: 'Select',\n};\n\n/** `FamilyName` -> the token used inside identifiers. */\nexport const FAMILY_TOKEN: Record<FamilyName, Family> = {\n flat: '',\n deep: 'Deep',\n};\n\n/** `${Entity}${Variant}${Family}Dto`. */\nexport function typeName(\n entity: string,\n variant: Variant = '',\n family: Family = '',\n): string {\n return `${entity}${variant}${family}Dto`;\n}\n\n/** Enum `const` array identifier — the resolved `EnumDef` name verbatim. */\nexport function enumConst(name: string): string {\n return name;\n}\n\n/** Enum type alias — shares the name with `enumConst` in TypeScript's type namespace. */\nexport function enumTypeName(name: string): string {\n return name;\n}\n\n// --- module specifiers (POSIX, extension-less) -------------------------------\n\n/** `${ns}/typescript/${entity}.type`. */\nexport function entityModule(namespace: string, entity: string): string {\n return `${namespace}/typescript/${entity}.type`;\n}\n\n/** `${ns}/typescript/enums`. */\nexport function enumsModule(namespace: string): string {\n return `${namespace}/typescript/enums`;\n}\n\n/** `${ns}/typescript/filters`. */\nexport function filtersModule(namespace: string): string {\n return `${namespace}/typescript/filters`;\n}\n\n/** `${ns}/typescript/scalars`. */\nexport function scalarsModule(namespace: string): string {\n return `${namespace}/typescript/scalars`;\n}\n\n/** `${ns}/typescript` — this generator's own barrel. */\nexport function barrelModule(namespace: string): string {\n return `${namespace}/typescript`;\n}\n","/** Source enums -> the shared enums.ts module. */\nimport type { EnumDef, SourceIR } from '@kurotako/ir';\nimport { TypeScriptEnumCollisionError } from '../errors.js';\nimport { enumConst, enumTypeName } from '../names.js';\n\nfunction sameValues(a: EnumDef, b: EnumDef): boolean {\n const left = a.values.map((value) => value.name);\n const right = b.values.map((value) => value.name);\n return (\n left.length === right.length && left.every((value, i) => value === right[i])\n );\n}\n\n/** All reachable definitions, deduplicated and sorted by their identifier. */\nexport function collectEnums(source: SourceIR): EnumDef[] {\n const byName = new Map<string, { definition: EnumDef; origin: string }>();\n const add = (definition: EnumDef, origin: string): void => {\n const previous = byName.get(definition.name);\n if (previous === undefined) {\n byName.set(definition.name, { definition, origin });\n } else if (!sameValues(previous.definition, definition)) {\n throw new TypeScriptEnumCollisionError(\n definition.name,\n previous.origin,\n origin,\n );\n }\n };\n\n for (const definition of Object.values(source.enums))\n add(definition, 'source-level');\n for (const entity of Object.values(source.entities)) {\n for (const definition of Object.values(entity.enums ?? {})) {\n add(definition, `entity '${entity.name}'`);\n }\n }\n\n return [...byName.values()]\n .map(({ definition }) => definition)\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\n/** Emit type/value enum pairs, which legally share an identifier in TypeScript. */\nexport function emitEnums(source: SourceIR): string {\n const blocks = collectEnums(source).map((definition) => {\n const values = definition.values\n .map((value) => JSON.stringify(value.name))\n .join(', ');\n const name = enumConst(definition.name);\n return `export const ${name} = [${values}] as const;\\nexport type ${enumTypeName(definition.name)} = (typeof ${name})[number];`;\n });\n return blocks.length === 0 ? 'export {};\\n' : `${blocks.join('\\n\\n')}\\n`;\n}\n","/** Field types -> bare TypeScript type strings and their emitted dependencies. */\nimport type { Entity, Field, FieldType, SourceIR } from '@kurotako/ir';\nimport { flattenUnion, resolveEnum, scalarTsType } from '@kurotako/ir';\nimport { typeName } from '../names.js';\n\nexport interface TypeDependencies {\n enums: Set<string>;\n entityRefs: Set<string>;\n aliases: Set<string>;\n usesJsonValue: boolean;\n}\n\nfunction emptyDependencies(): TypeDependencies {\n return {\n enums: new Set(),\n entityRefs: new Set(),\n aliases: new Set(),\n usesJsonValue: false,\n };\n}\n\n/** Collect imports required by a field type, including refs nested in unions. */\nexport function collectTypeDependencies(\n type: FieldType,\n source: SourceIR,\n entity: Entity | undefined,\n into: TypeDependencies = emptyDependencies(),\n): TypeDependencies {\n switch (type.kind) {\n case 'enum': {\n const definition = resolveEnum(source, entity, type.ref);\n into.enums.add(definition?.name ?? type.ref);\n break;\n }\n case 'ref':\n if (source.entities[type.ref] !== undefined) {\n into.entityRefs.add(type.ref);\n } else if (source.typeAliases?.[type.ref] !== undefined) {\n into.aliases.add(type.ref);\n }\n break;\n case 'scalar':\n if (scalarTsType(type) === 'JsonValue') {\n into.usesJsonValue = true;\n }\n break;\n case 'union':\n for (const variant of type.variants) {\n collectTypeDependencies(variant, source, entity, into);\n }\n break;\n case 'unknown':\n break;\n }\n return into;\n}\n\n/**\n * Render a `FieldType` recursively. Entity refs name their emitted flat DTO;\n * type-alias refs retain their declared name from the source alias registry.\n */\nexport function renderFieldType(type: FieldType, source: SourceIR): string {\n switch (type.kind) {\n case 'ref':\n return source.entities[type.ref] !== undefined\n ? typeName(type.ref)\n : type.ref;\n case 'union': {\n const variants = flattenUnion(type);\n return variants.length === 0\n ? 'unknown'\n : variants\n .map((variant) =>\n variant.kind === 'union'\n ? `(${renderFieldType(variant, source)})`\n : renderFieldType(variant, source),\n )\n .join(' | ');\n }\n case 'scalar':\n case 'enum':\n case 'unknown':\n return scalarTsType(type);\n }\n}\n\n/** The non-list, non-nullable type for a field. */\nexport function fieldTsType(\n field: Field,\n source: SourceIR,\n entity: Entity,\n): string {\n collectTypeDependencies(field.type, source, entity);\n return renderFieldType(field.type, source);\n}\n","/** Source type aliases -> the shared aliases.ts declaration module. */\nimport type { SourceIR } from '@kurotako/ir';\nimport { typeName } from '../names.js';\nimport { collectTypeDependencies, renderFieldType } from '../render/scalars.js';\n\n/** Emit source aliases and imports for their external entity/enum dependencies. */\nexport function emitAliases(source: SourceIR): string {\n const aliases = Object.values(source.typeAliases ?? {});\n const enums = new Set<string>();\n const entityRefs = new Set<string>();\n let usesJsonValue = false;\n\n for (const alias of aliases) {\n const dependencies = collectTypeDependencies(alias.type, source, undefined);\n for (const name of dependencies.enums) enums.add(name);\n for (const name of dependencies.entityRefs) entityRefs.add(name);\n usesJsonValue ||= dependencies.usesJsonValue;\n }\n\n const imports: Array<{ specifier: string; names: string[] }> = [];\n if (enums.size > 0) {\n imports.push({ specifier: './enums', names: [...enums] });\n }\n if (usesJsonValue) {\n imports.push({ specifier: './scalars', names: ['JsonValue'] });\n }\n for (const ref of entityRefs) {\n imports.push({\n specifier: `./${ref}.type`,\n names: [typeName(ref)],\n });\n }\n\n const blocks = aliases.map((alias) => {\n const doc = alias.doc === undefined ? '' : `/** ${alias.doc} */\\n`;\n return `${doc}export type ${alias.name} = ${renderFieldType(alias.type, source)};`;\n });\n const importBlock = imports\n .sort((left, right) => left.specifier.localeCompare(right.specifier))\n .map(\n ({ specifier, names }) =>\n `import type { ${names.sort((left, right) => left.localeCompare(right)).join(', ')} } from '${specifier}';`,\n )\n .join('\\n');\n\n return `${[importBlock, ...blocks].filter((block) => block !== '').join('\\n\\n')}\\n`;\n}\n","/** This generator's per-namespace barrel. */\nimport type { SourceIR } from '@kurotako/ir';\n\n/** Re-export every emitted shared and entity declaration module. */\nexport function emitBarrel(\n source: SourceIR,\n emitsScalars: boolean,\n emitsAliases = Object.keys(source.typeAliases ?? {}).length > 0,\n): string {\n const lines: string[] = [];\n if (emitsScalars) lines.push(\"export type * from './scalars';\");\n lines.push(\"export * from './enums';\");\n if (emitsAliases) lines.push(\"export type * from './aliases';\");\n if (Object.keys(source.entities).length > 0) {\n lines.push(\"export type * from './filters';\");\n }\n for (const entity of Object.values(source.entities)) {\n lines.push(`export type * from './${entity.name}.type';`);\n }\n return `${lines.join('\\n')}\\n`;\n}\n","/** Field documentation and constraints -> an optional JSDoc block. */\nimport type { Field } from '@kurotako/ir';\n\n/** Render documentation-only metadata in a stable, human-readable order. */\nexport function jsDoc(field: Field): string {\n const tags: string[] = [];\n const constraints = field.constraints;\n\n if (constraints.min !== undefined) tags.push(`@min ${constraints.min}`);\n if (constraints.max !== undefined) tags.push(`@max ${constraints.max}`);\n if (constraints.minLength !== undefined) {\n tags.push(`@minLength ${constraints.minLength}`);\n }\n if (constraints.maxLength !== undefined) {\n tags.push(`@maxLength ${constraints.maxLength}`);\n }\n if (constraints.regex !== undefined) {\n tags.push(`@pattern ${constraints.regex}`);\n }\n if (constraints.format !== undefined) {\n tags.push(`@format ${constraints.format}`);\n }\n if (constraints.unique) tags.push('@unique');\n if (field.default?.kind === 'value') {\n tags.push(`@default ${JSON.stringify(field.default.value)}`);\n }\n if (field.type.kind === 'unknown') {\n tags.push(\n field.type.hint === undefined\n ? '@see unknown'\n : `@see unknown: ${field.type.hint}`,\n );\n }\n\n const prose = field.doc?.split('\\n') ?? [];\n if (prose.length === 0 && tags.length === 0) {\n return '';\n }\n\n const lines = [...prose];\n if (prose.length > 0 && tags.length > 0) lines.push('');\n lines.push(...tags);\n return ['/**', ...lines.map((line) => ` * ${line}`), ' */'].join('\\n');\n}\n","/** Assemble scalar and enum fields into TypeScript object members. */\nimport type { Entity, Field, SourceIR } from '@kurotako/ir';\nimport { jsDoc } from './jsdoc.js';\nimport { fieldTsType } from './scalars.js';\n\nexport interface MemberLineOptions {\n optional: boolean;\n}\n\n/** Render one field member, including documentation and list/null wrappers. */\nexport function memberLine(\n field: Field,\n opts: MemberLineOptions,\n source: SourceIR,\n entity: Entity,\n): string {\n let type = fieldTsType(field, source, entity);\n if (field.list) {\n if (type.includes(' | ')) type = `(${type})`;\n type = `${type}[]`;\n }\n if (field.nullable) type = `${type} | null`;\n\n const member = ` ${field.name}${opts.optional ? '?' : ''}: ${type};`;\n const doc = jsDoc(field);\n const indentedDoc = doc\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n return doc === '' ? member : `${indentedDoc}\\n${member}`;\n}\n","/** Flat versus deep relation members. */\nimport type { Logger } from '@kurotako/core';\nimport type { Relation } from '@kurotako/ir';\nimport { isCrossSource } from '@kurotako/ir';\nimport {\n type FamilyName,\n typeName,\n VARIANT_TOKEN,\n type VariantName,\n} from '../names.js';\n\nexport interface RelationMember {\n type: string;\n optional: boolean;\n}\n\nexport interface RelationMemberOptions {\n fromNamespace: string;\n logger?: Logger;\n}\n\n/**\n * Render a relation member for the deep family. Cross-source links deliberately\n * stay flat because v1 has no stable cross-namespace module mapping.\n */\nexport function relationMember(\n relation: Relation,\n family: FamilyName,\n variant: VariantName,\n opts: RelationMemberOptions,\n): RelationMember | null {\n if (family === 'flat') return null;\n if (isCrossSource(opts.fromNamespace, relation)) {\n opts.logger?.debug(\n `gen-typescript: relation '${relation.name}' targets another source ('${relation.target.namespace}.${relation.target.entity}'); degrading to the FK id (flat) in the deep family`,\n );\n return null;\n }\n\n const target = relation.target.entity;\n const many = relation.cardinality === 'many';\n if (variant === 'where') {\n const dto = typeName(target, 'Where', 'Deep');\n return {\n type: many ? `{ some?: ${dto}; every?: ${dto}; none?: ${dto} }` : dto,\n optional: true,\n };\n }\n if (variant === 'select') {\n return {\n type: `boolean | ${typeName(target, 'Select', 'Deep')}`,\n optional: true,\n };\n }\n\n return {\n type: many\n ? `${typeName(target, VARIANT_TOKEN[variant], 'Deep')}[]`\n : typeName(target, VARIANT_TOKEN[variant], 'Deep'),\n optional: relation.optional || many || variant === 'update',\n };\n}\n","/** Shared payload field selection and Where-filter classification. */\nimport type { Entity, Field } from '@kurotako/ir';\nimport { createFields, isCreateOptional, updateFields } from '@kurotako/ir';\nimport type { VariantName } from '../names.js';\n\nexport interface FieldSelection {\n field: Field;\n optional: boolean;\n}\n\n/** The scalar/enum fields included by a generated type variant. */\nexport function variantFields(\n entity: Entity,\n variant: VariantName,\n): FieldSelection[] {\n switch (variant) {\n case 'full':\n return entity.fields.map((field) => ({\n field,\n optional: field.optional,\n }));\n case 'create':\n return createFields(entity).map((field) => ({\n field,\n optional: isCreateOptional(field),\n }));\n case 'update':\n return updateFields(entity).map((field) => ({ field, optional: true }));\n case 'where':\n case 'select':\n return entity.fields.map((field) => ({ field, optional: true }));\n }\n}\n\n/** The Where filter type for a direct scalar or enum field. */\nexport function filterClass(field: Field): string | null {\n if (field.type.kind === 'enum') return `Enum${field.type.ref}Filter`;\n if (field.type.kind !== 'scalar') return null;\n\n switch (field.type.scalar) {\n case 'string':\n case 'uuid':\n case 'decimal':\n case 'bytes':\n return 'StringFilter';\n case 'int':\n return 'IntFilter';\n case 'float':\n return 'FloatFilter';\n case 'bigint':\n return 'BigIntFilter';\n case 'boolean':\n return 'BoolFilter';\n case 'date':\n case 'datetime':\n return 'DateTimeFilter';\n case 'json':\n return null;\n }\n}\n","/** One entity -> its ten flat/deep TypeScript declaration variants. */\nimport type { Logger } from '@kurotako/core';\nimport type { Entity, SourceIR } from '@kurotako/ir';\nimport {\n FAMILIES,\n FAMILY_TOKEN,\n type FamilyName,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n type VariantName,\n} from '../names.js';\nimport { memberLine } from '../render/field.js';\nimport { type RelationMember, relationMember } from '../render/relations.js';\nimport { collectTypeDependencies } from '../render/scalars.js';\nimport { filterClass, variantFields } from '../render/variants.js';\n\nfunction typeBlock(name: string, members: string[]): string {\n return `export type ${name} = {\\n${members.join('\\n')}\\n};`;\n}\n\nfunction relationLine(name: string, member: RelationMember): string {\n return ` ${name}${member.optional ? '?' : ''}: ${member.type};`;\n}\n\n/** Emit a type-only, specifier-sorted import block. */\nfunction importsFor(\n enums: Set<string>,\n aliases: Set<string>,\n filters: Set<string>,\n usesJsonValue: boolean,\n siblings: Map<string, Set<string>>,\n): string {\n const imports: Array<{ specifier: string; names: string[] }> = [];\n if (aliases.size > 0) {\n imports.push({ specifier: './aliases', names: [...aliases] });\n }\n if (enums.size > 0) {\n imports.push({ specifier: './enums', names: [...enums] });\n }\n if (filters.size > 0) {\n imports.push({ specifier: './filters', names: [...filters] });\n }\n if (usesJsonValue) {\n imports.push({ specifier: './scalars', names: ['JsonValue'] });\n }\n for (const [entity, names] of siblings) {\n imports.push({ specifier: `./${entity}.type`, names: [...names] });\n }\n return imports\n .sort((left, right) => left.specifier.localeCompare(right.specifier))\n .map(\n ({ specifier, names }) =>\n `import type { ${names.sort((left, right) => left.localeCompare(right)).join(', ')} } from '${specifier}';`,\n )\n .join('\\n');\n}\n\n/** Render an entity's complete variant/family matrix. */\nexport function emitEntity(\n source: SourceIR,\n entity: Entity,\n logger?: Logger,\n): string {\n const usedEnums = new Set<string>();\n const usedAliases = new Set<string>();\n const usedEntityRefs = new Set<string>();\n let usesJsonValue = false;\n const usedFilters = new Set<string>();\n const siblings = new Map<string, Set<string>>();\n\n for (const field of entity.fields) {\n const dependencies = collectTypeDependencies(field.type, source, entity);\n for (const name of dependencies.enums) usedEnums.add(name);\n for (const name of dependencies.aliases) usedAliases.add(name);\n for (const name of dependencies.entityRefs) usedEntityRefs.add(name);\n usesJsonValue ||= dependencies.usesJsonValue;\n }\n\n const trackSibling = (target: string, name: string): void => {\n if (target === entity.name) return;\n const names = siblings.get(target) ?? new Set<string>();\n names.add(name);\n siblings.set(target, names);\n };\n\n for (const ref of usedEntityRefs) {\n trackSibling(ref, typeName(ref));\n }\n\n const relation = (\n relationIndex: number,\n variant: VariantName,\n ): RelationMember | null => {\n const current = entity.relations[relationIndex];\n if (current === undefined) return null;\n const member = relationMember(current, 'deep', variant, {\n fromNamespace: source.namespace,\n logger,\n });\n if (member !== null) {\n trackSibling(\n current.target.entity,\n typeName(current.target.entity, VARIANT_TOKEN[variant], 'Deep'),\n );\n }\n return member;\n };\n\n const blocks: string[] = [];\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n const name = typeName(\n entity.name,\n VARIANT_TOKEN[variant],\n FAMILY_TOKEN[family],\n );\n if (variant === 'where') {\n blocks.push(renderWhere(name, family));\n } else if (variant === 'select') {\n blocks.push(renderSelect(name, family));\n } else {\n blocks.push(renderRecord(name, variant, family));\n }\n }\n }\n\n const imports = importsFor(\n usedEnums,\n usedAliases,\n usedFilters,\n usesJsonValue,\n siblings,\n );\n return `${[imports, '', ...blocks].join('\\n\\n').trim()}\\n`;\n\n function renderRecord(\n name: string,\n variant: Exclude<VariantName, 'where' | 'select'>,\n family: FamilyName,\n ): string {\n const own = variantFields(entity, variant).map((selection) =>\n memberLine(\n selection.field,\n { optional: variant === 'update' ? false : selection.optional },\n source,\n entity,\n ),\n );\n const relations: string[] = [];\n if (family === 'deep') {\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n const member = relation(index, variant);\n if (current !== undefined && member !== null) {\n relations.push(relationLine(current.name, member));\n }\n }\n }\n\n if (variant === 'update') {\n const base = `Partial<{\\n${own.join('\\n')}\\n}>`;\n return relations.length === 0\n ? `export type ${name} = ${base};`\n : `export type ${name} = ${base} & {\\n${relations.join('\\n')}\\n};`;\n }\n return typeBlock(name, [...own, ...relations]);\n }\n\n function renderWhere(name: string, family: FamilyName): string {\n const members: string[] = [];\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter === null) continue;\n usedFilters.add(filter);\n members.push(` ${field.name}?: ${filter};`);\n }\n if (family === 'deep') {\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n const member = relation(index, 'where');\n if (current !== undefined && member !== null) {\n members.push(relationLine(current.name, member));\n }\n }\n }\n members.push(\n ` AND?: ${name} | ${name}[];`,\n ` OR?: ${name} | ${name}[];`,\n ` NOT?: ${name} | ${name}[];`,\n );\n return typeBlock(name, members);\n }\n\n function renderSelect(name: string, family: FamilyName): string {\n const members = entity.fields.map((field) => ` ${field.name}?: boolean;`);\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n if (current === undefined) continue;\n if (family === 'flat') {\n members.push(` ${current.name}?: boolean;`);\n continue;\n }\n const member = relation(index, 'select');\n members.push(\n member === null\n ? ` ${current.name}?: boolean;`\n : relationLine(current.name, member),\n );\n }\n return typeBlock(name, members);\n }\n}\n","/** Shared Prisma-style Where filter interfaces. */\nimport type { SourceIR } from '@kurotako/ir';\nimport { scalarTsType } from '@kurotako/ir';\nimport { enumTypeName } from '../names.js';\nimport { filterClass } from '../render/variants.js';\n\nconst EQUALITY_OPS = ['equals', 'not'] as const;\nconst LIST_OPS = ['in', 'notIn'] as const;\nconst ORDER_OPS = ['lt', 'lte', 'gt', 'gte'] as const;\nconst STRING_OPS = ['contains', 'startsWith', 'endsWith'] as const;\nconst SCALAR_FILTER_ORDER = [\n 'StringFilter',\n 'IntFilter',\n 'FloatFilter',\n 'BigIntFilter',\n 'DateTimeFilter',\n 'BoolFilter',\n] as const;\n\ntype ScalarFilter = (typeof SCALAR_FILTER_ORDER)[number];\n\n/** Collect the public filter interface identifiers emitted for a source. */\nexport function collectFilterNames(source: SourceIR): Set<string> {\n const names = new Set<string>();\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter !== null) names.add(filter);\n }\n }\n return names;\n}\n\nfunction baseType(name: ScalarFilter): string {\n switch (name) {\n case 'StringFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'string' });\n case 'IntFilter':\n case 'FloatFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'int' });\n case 'BigIntFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'bigint' });\n case 'DateTimeFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'datetime' });\n case 'BoolFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'boolean' });\n }\n}\n\nfunction operations(name: string): readonly string[] {\n if (name === 'BoolFilter') return EQUALITY_OPS;\n if (name === 'StringFilter') {\n return [...EQUALITY_OPS, ...LIST_OPS, ...ORDER_OPS, ...STRING_OPS];\n }\n return [...EQUALITY_OPS, ...LIST_OPS, ...ORDER_OPS];\n}\n\nfunction emitInterface(\n name: string,\n type: string,\n ops: readonly string[],\n): string {\n const members = ops.map((operation) => {\n const list = (LIST_OPS as readonly string[]).includes(operation);\n return ` ${operation}?: ${list ? `${type}[]` : type};`;\n });\n return `export interface ${name} {\\n${members.join('\\n')}\\n}`;\n}\n\n/** Emit only the direct scalar and enum classes used by a source's fields. */\nexport function emitFilters(source: SourceIR): string {\n const scalars = new Set<string>();\n const enums = new Set<string>();\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter === null) continue;\n if (field.type.kind === 'enum') enums.add(field.type.ref);\n else scalars.add(filter);\n }\n }\n\n const enumNames = [...enums].sort((left, right) => left.localeCompare(right));\n const blocks: string[] = [];\n for (const name of SCALAR_FILTER_ORDER) {\n if (scalars.has(name))\n blocks.push(emitInterface(name, baseType(name), operations(name)));\n }\n for (const name of enumNames) {\n blocks.push(\n emitInterface(`Enum${name}Filter`, enumTypeName(name), [\n ...EQUALITY_OPS,\n ...LIST_OPS,\n ]),\n );\n }\n\n const imports =\n enumNames.length === 0\n ? ''\n : `import type { ${enumNames.map(enumTypeName).join(', ')} } from './enums';\\n\\n`;\n return blocks.length === 0\n ? 'export {};\\n'\n : `${imports}${blocks.join('\\n\\n')}\\n`;\n}\n","/** The JsonValue helper emitted when at least one field needs it. */\nexport function emitScalars(): string {\n return `export type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n`;\n}\n"],"mappings":"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","names":["import_ir","import_ir","import_ir","import_ir"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/generator.ts","../src/artifact.ts","../src/names.ts","../src/emit/enums.ts","../src/render/scalars.ts","../src/emit/aliases.ts","../src/emit/barrel.ts","../src/render/jsdoc.ts","../src/render/field.ts","../src/render/relations.ts","../src/render/variants.ts","../src/emit/entity.ts","../src/emit/filters.ts","../src/emit/scalars.ts"],"sourcesContent":["/** `@kurotako/gen-typescript` — the TypeScript generator driver. */\nexport type { TypeScriptArtifactExtra } from './artifact.js';\nexport {\n TypeScriptAliasCycleError,\n TypeScriptAliasPublicNameCollisionError,\n TypeScriptEnumCollisionError,\n TypeScriptEnumPublicNameCollisionError,\n TypeScriptGenError,\n} from './errors.js';\nexport { typescriptGenerator } from './generator.js';\n","/**\n * `@kurotako/gen-typescript` error classes.\n *\n * Codes: `typescript_alias_cycle`, `typescript_alias_public_name_collision`,\n * `typescript_enum_collision`, `typescript_enum_public_name_collision`.\n */\nexport class TypeScriptGenError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n this.code = code;\n }\n}\n\n/**\n * Source aliases in a direct `ref` cycle cannot be represented by the emitted\n * pure TypeScript aliases.\n */\nexport class TypeScriptAliasCycleError extends TypeScriptGenError {\n readonly namespace: string;\n readonly aliasNames: string[];\n\n constructor(namespace: string, aliasNames: readonly string[]) {\n const sortedNames = [...aliasNames].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_alias_cycle',\n `source type aliases ${sortedNames.map((name) => `'${name}'`).join(', ')} form a direct reference cycle in namespace '${namespace}'; pure TypeScript aliases cannot represent it`,\n );\n this.namespace = namespace;\n this.aliasNames = sortedNames;\n }\n}\n\n/** Source aliases cannot reuse a public identifier emitted by this generator. */\nexport class TypeScriptAliasPublicNameCollisionError extends TypeScriptGenError {\n readonly namespace: string;\n readonly names: string[];\n\n constructor(namespace: string, names: readonly string[]) {\n const sortedNames = [...names].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_alias_public_name_collision',\n `source type aliases ${sortedNames.map((name) => `'${name}'`).join(', ')} collide with generated public identifiers in namespace '${namespace}'; rename one of the conflicting source definitions`,\n );\n this.namespace = namespace;\n this.names = sortedNames;\n }\n}\n\n/** An enum cannot reuse a non-enum identifier exported from the namespace barrel. */\nexport class TypeScriptEnumPublicNameCollisionError extends TypeScriptGenError {\n readonly namespace: string;\n readonly names: string[];\n\n constructor(namespace: string, names: readonly string[]) {\n const sortedNames = [...names].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_enum_public_name_collision',\n `source enums ${sortedNames.map((name) => `'${name}'`).join(', ')} collide with other public identifiers in namespace '${namespace}'; rename one of the conflicting source definitions`,\n );\n this.namespace = namespace;\n this.names = sortedNames;\n }\n}\n\n/**\n * Two distinct `EnumDef`s reachable in one source share a name. Names both\n * origins so the schema author can resolve the collision.\n */\nexport class TypeScriptEnumCollisionError extends TypeScriptGenError {\n readonly enumName: string;\n readonly firstOrigin: string;\n readonly secondOrigin: string;\n\n constructor(enumName: string, firstOrigin: string, secondOrigin: string) {\n super(\n 'typescript_enum_collision',\n `enum '${enumName}' is defined twice with different values (${firstOrigin} vs ${secondOrigin}); ` +\n 'rename one of them in the source schema',\n );\n this.enumName = enumName;\n this.firstOrigin = firstOrigin;\n this.secondOrigin = secondOrigin;\n }\n}\n","/** `typescriptGenerator` — emits pure TypeScript declarations from the IR. */\nimport { defineGenerator } from '@kurotako/config';\nimport type { GenerateContext, GenOutput, VirtualFile } from '@kurotako/core';\nimport { buildArtifact } from './artifact.js';\nimport { emitAliases } from './emit/aliases.js';\nimport { emitBarrel } from './emit/barrel.js';\nimport { emitEntity } from './emit/entity.js';\nimport { collectEnums, emitEnums } from './emit/enums.js';\nimport { collectFilterNames, emitFilters } from './emit/filters.js';\nimport { emitScalars } from './emit/scalars.js';\nimport {\n TypeScriptAliasCycleError,\n TypeScriptAliasPublicNameCollisionError,\n TypeScriptEnumPublicNameCollisionError,\n} from './errors.js';\nimport {\n FAMILIES,\n FAMILY_TOKEN,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n} from './names.js';\nimport { collectTypeDependencies } from './render/scalars.js';\n\nfunction sourceUsesJsonValue(\n source: GenerateContext['ir']['sources'][string],\n): boolean {\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n if (collectTypeDependencies(field.type, source, entity).usesJsonValue) {\n return true;\n }\n }\n }\n for (const alias of Object.values(source.typeAliases ?? {})) {\n if (collectTypeDependencies(alias.type, source, undefined).usesJsonValue) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Return aliases that participate in an alias-only `ref` cycle. A cycle passing\n * through an entity is valid TypeScript because the entity emits a structural\n * object type; bare aliases have no such structure to break the recursion.\n */\nfunction cyclicAliasNames(\n source: GenerateContext['ir']['sources'][string],\n cycles: GenerateContext['cycles'],\n): string[] {\n const aliases = source.typeAliases ?? {};\n const candidates = Object.keys(aliases).filter((name) =>\n cycles.has(`${source.namespace}.${name}`),\n );\n const candidateSet = new Set(candidates);\n const references = new Map<string, string[]>();\n\n for (const name of candidates) {\n const alias = aliases[name];\n if (alias === undefined) continue;\n const dependencies = collectTypeDependencies(alias.type, source, undefined);\n references.set(\n name,\n [...dependencies.aliases].filter((dependency) =>\n candidateSet.has(dependency),\n ),\n );\n }\n\n const reachesSelf = (start: string, current: string, seen: Set<string>) => {\n for (const next of references.get(current) ?? []) {\n if (next === start) return true;\n if (!seen.has(next)) {\n seen.add(next);\n if (reachesSelf(start, next, seen)) return true;\n }\n }\n return false;\n };\n\n return candidates.filter((name) => reachesSelf(name, name, new Set([name])));\n}\n\n/** Public barrel identifiers, separated by their enum, generated, and alias origins. */\nfunction generatedPublicNames(\n source: GenerateContext['ir']['sources'][string],\n): {\n enumNames: Set<string>;\n generatedTypeNames: Set<string>;\n aliasNames: Set<string>;\n} {\n // An enum's const and type intentionally share one identifier in TypeScript's\n // separate value and type namespaces, so it is recorded only once here.\n const enumNames = new Set(collectEnums(source).map(({ name }) => name));\n const generatedTypeNames = new Set<string>();\n\n for (const entity of Object.values(source.entities)) {\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n generatedTypeNames.add(\n typeName(entity.name, VARIANT_TOKEN[variant], FAMILY_TOKEN[family]),\n );\n }\n }\n }\n\n for (const name of collectFilterNames(source)) generatedTypeNames.add(name);\n if (sourceUsesJsonValue(source)) generatedTypeNames.add('JsonValue');\n return {\n enumNames,\n generatedTypeNames,\n aliasNames: new Set(Object.keys(source.typeAliases ?? {})),\n };\n}\n\nfunction validateSourceEmission(\n source: GenerateContext['ir']['sources'][string],\n cycles: GenerateContext['cycles'],\n): void {\n const aliasesInCycles = cyclicAliasNames(source, cycles);\n if (aliasesInCycles.length > 0) {\n throw new TypeScriptAliasCycleError(source.namespace, aliasesInCycles);\n }\n\n const { enumNames, generatedTypeNames, aliasNames } =\n generatedPublicNames(source);\n const aliasCollisions = [...aliasNames].filter(\n (name) => enumNames.has(name) || generatedTypeNames.has(name),\n );\n if (aliasCollisions.length > 0) {\n throw new TypeScriptAliasPublicNameCollisionError(\n source.namespace,\n aliasCollisions,\n );\n }\n\n const enumCollisions = [...enumNames].filter(\n (name) => generatedTypeNames.has(name) || aliasNames.has(name),\n );\n if (enumCollisions.length > 0) {\n throw new TypeScriptEnumPublicNameCollisionError(\n source.namespace,\n enumCollisions,\n );\n }\n}\n\n/** Pure, synchronous generator with no runtime dependency on generated code. */\nexport const typescriptGenerator = defineGenerator({\n name: 'typescript',\n\n generate(ctx: GenerateContext): GenOutput {\n const files: VirtualFile[] = [];\n for (const [namespace, source] of Object.entries(ctx.ir.sources)) {\n validateSourceEmission(source, ctx.cycles);\n const prefix = `${namespace}/typescript`;\n const emitsScalars = sourceUsesJsonValue(source);\n if (emitsScalars) {\n files.push({ path: `${prefix}/scalars.ts`, content: emitScalars() });\n }\n files.push({ path: `${prefix}/enums.ts`, content: emitEnums(source) });\n if (Object.keys(source.entities).length > 0) {\n files.push({\n path: `${prefix}/filters.ts`,\n content: emitFilters(source),\n });\n }\n if (Object.keys(source.typeAliases ?? {}).length > 0) {\n files.push({\n path: `${prefix}/aliases.ts`,\n content: emitAliases(source),\n });\n }\n for (const entity of Object.values(source.entities)) {\n files.push({\n path: `${prefix}/${entity.name}.type.ts`,\n content: emitEntity(source, entity, ctx.logger),\n });\n }\n files.push({\n path: `${prefix}/index.ts`,\n content: emitBarrel(\n source,\n emitsScalars,\n Object.keys(source.typeAliases ?? {}).length > 0,\n ),\n });\n }\n return { files, artifact: buildArtifact(ctx.ir) };\n },\n});\n","/** Assemble the TypeScript generator's full artifact symbol matrix. */\nimport type { EntitySymbols, GeneratorArtifact } from '@kurotako/core';\nimport type { IR } from '@kurotako/ir';\nimport { iterEntities } from '@kurotako/ir';\nimport { collectEnums } from './emit/enums.js';\nimport {\n barrelModule,\n entityModule,\n enumConst,\n enumsModule,\n enumTypeName,\n FAMILIES,\n FAMILY_TOKEN,\n type FamilyName,\n filtersModule,\n scalarsModule,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n type VariantName,\n} from './names.js';\n\nexport interface TypeScriptArtifactExtra {\n families: ['flat', 'deep'];\n variants: ['full', 'create', 'update', 'where', 'select'];\n perNamespace: Record<\n string,\n {\n barrelModule: string;\n filtersModule: string;\n scalarsModule: string;\n enums: Record<\n string,\n { constName: string; typeName: string; module: string }\n >;\n }\n >;\n}\n\nfunction roleStem(variant: VariantName, family: FamilyName): string {\n const variantStem = variant === 'full' ? '' : variant;\n return family === 'flat'\n ? variantStem\n : variantStem === ''\n ? 'deep'\n : `${variantStem}Deep`;\n}\n\nfunction entitySymbols(name: string): Record<string, string> {\n const symbols: Record<string, string> = {};\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n const stem = roleStem(variant, family);\n const key = stem === '' ? 'type' : `${stem}Type`;\n symbols[key] = typeName(\n name,\n VARIANT_TOKEN[variant],\n FAMILY_TOKEN[family],\n );\n }\n }\n return symbols;\n}\n\n/** Build the consumable metadata independently of file emission. */\nexport function buildArtifact(ir: IR): GeneratorArtifact {\n const entities: Record<string, EntitySymbols> = {};\n for (const { namespace, entity } of iterEntities(ir)) {\n entities[`${namespace}.${entity.name}`] = {\n module: entityModule(namespace, entity.name),\n symbols: entitySymbols(entity.name),\n };\n }\n\n const perNamespace: TypeScriptArtifactExtra['perNamespace'] = {};\n for (const [namespace, source] of Object.entries(ir.sources)) {\n const enums: TypeScriptArtifactExtra['perNamespace'][string]['enums'] = {};\n for (const definition of collectEnums(source)) {\n enums[definition.name] = {\n constName: enumConst(definition.name),\n typeName: enumTypeName(definition.name),\n module: enumsModule(namespace),\n };\n }\n perNamespace[namespace] = {\n barrelModule: barrelModule(namespace),\n filtersModule: filtersModule(namespace),\n scalarsModule: scalarsModule(namespace),\n enums,\n };\n }\n\n return {\n entities,\n extra: {\n families: ['flat', 'deep'],\n variants: ['full', 'create', 'update', 'where', 'select'],\n perNamespace,\n } satisfies TypeScriptArtifactExtra,\n };\n}\n","/**\n * Deterministic identifier and module-specifier helpers.\n *\n * Identifiers are never namespace-prefixed; the namespace only drives the\n * `typescript/` output sub-tree.\n */\n\n/** PascalCase variant token embedded in a type identifier. */\nexport type Variant = '' | 'Create' | 'Update' | 'Where' | 'Select';\n\n/** Relation family token embedded in a type identifier. */\nexport type Family = '' | 'Deep';\n\n/** The five variant names, in their fixed order. */\nexport const VARIANTS = [\n 'full',\n 'create',\n 'update',\n 'where',\n 'select',\n] as const;\nexport type VariantName = (typeof VARIANTS)[number];\n\n/** The two relation families, in their fixed order. */\nexport const FAMILIES = ['flat', 'deep'] as const;\nexport type FamilyName = (typeof FAMILIES)[number];\n\n/** `VariantName` -> the PascalCase token used inside identifiers. */\nexport const VARIANT_TOKEN: Record<VariantName, Variant> = {\n full: '',\n create: 'Create',\n update: 'Update',\n where: 'Where',\n select: 'Select',\n};\n\n/** `FamilyName` -> the token used inside identifiers. */\nexport const FAMILY_TOKEN: Record<FamilyName, Family> = {\n flat: '',\n deep: 'Deep',\n};\n\n/** `${Entity}${Variant}${Family}Dto`. */\nexport function typeName(\n entity: string,\n variant: Variant = '',\n family: Family = '',\n): string {\n return `${entity}${variant}${family}Dto`;\n}\n\n/** Enum `const` array identifier — the resolved `EnumDef` name verbatim. */\nexport function enumConst(name: string): string {\n return name;\n}\n\n/** Enum type alias — shares the name with `enumConst` in TypeScript's type namespace. */\nexport function enumTypeName(name: string): string {\n return name;\n}\n\n// --- module specifiers (POSIX, extension-less) -------------------------------\n\n/** `${ns}/typescript/${entity}.type`. */\nexport function entityModule(namespace: string, entity: string): string {\n return `${namespace}/typescript/${entity}.type`;\n}\n\n/** `${ns}/typescript/enums`. */\nexport function enumsModule(namespace: string): string {\n return `${namespace}/typescript/enums`;\n}\n\n/** `${ns}/typescript/filters`. */\nexport function filtersModule(namespace: string): string {\n return `${namespace}/typescript/filters`;\n}\n\n/** `${ns}/typescript/scalars`. */\nexport function scalarsModule(namespace: string): string {\n return `${namespace}/typescript/scalars`;\n}\n\n/** `${ns}/typescript` — this generator's own barrel. */\nexport function barrelModule(namespace: string): string {\n return `${namespace}/typescript`;\n}\n","/** Source enums -> the shared enums.ts module. */\nimport type { EnumDef, SourceIR } from '@kurotako/ir';\nimport { TypeScriptEnumCollisionError } from '../errors.js';\nimport { enumConst, enumTypeName } from '../names.js';\n\nfunction sameValues(a: EnumDef, b: EnumDef): boolean {\n const left = a.values.map((value) => value.name);\n const right = b.values.map((value) => value.name);\n return (\n left.length === right.length && left.every((value, i) => value === right[i])\n );\n}\n\n/** All reachable definitions, deduplicated and sorted by their identifier. */\nexport function collectEnums(source: SourceIR): EnumDef[] {\n const byName = new Map<string, { definition: EnumDef; origin: string }>();\n const add = (definition: EnumDef, origin: string): void => {\n const previous = byName.get(definition.name);\n if (previous === undefined) {\n byName.set(definition.name, { definition, origin });\n } else if (!sameValues(previous.definition, definition)) {\n throw new TypeScriptEnumCollisionError(\n definition.name,\n previous.origin,\n origin,\n );\n }\n };\n\n for (const definition of Object.values(source.enums))\n add(definition, 'source-level');\n for (const entity of Object.values(source.entities)) {\n for (const definition of Object.values(entity.enums ?? {})) {\n add(definition, `entity '${entity.name}'`);\n }\n }\n\n return [...byName.values()]\n .map(({ definition }) => definition)\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\n/** Emit type/value enum pairs, which legally share an identifier in TypeScript. */\nexport function emitEnums(source: SourceIR): string {\n const blocks = collectEnums(source).map((definition) => {\n const values = definition.values\n .map((value) => JSON.stringify(value.name))\n .join(', ');\n const name = enumConst(definition.name);\n return `export const ${name} = [${values}] as const;\\nexport type ${enumTypeName(definition.name)} = (typeof ${name})[number];`;\n });\n return blocks.length === 0 ? 'export {};\\n' : `${blocks.join('\\n\\n')}\\n`;\n}\n","/** Field types -> bare TypeScript type strings and their emitted dependencies. */\nimport type { Entity, Field, FieldType, SourceIR } from '@kurotako/ir';\nimport { flattenUnion, resolveEnum, scalarTsType } from '@kurotako/ir';\nimport { typeName } from '../names.js';\n\nexport interface TypeDependencies {\n enums: Set<string>;\n entityRefs: Set<string>;\n aliases: Set<string>;\n usesJsonValue: boolean;\n}\n\nfunction emptyDependencies(): TypeDependencies {\n return {\n enums: new Set(),\n entityRefs: new Set(),\n aliases: new Set(),\n usesJsonValue: false,\n };\n}\n\n/** Collect imports required by a field type, including refs nested in unions. */\nexport function collectTypeDependencies(\n type: FieldType,\n source: SourceIR,\n entity: Entity | undefined,\n into: TypeDependencies = emptyDependencies(),\n): TypeDependencies {\n switch (type.kind) {\n case 'enum': {\n const definition = resolveEnum(source, entity, type.ref);\n into.enums.add(definition?.name ?? type.ref);\n break;\n }\n case 'ref':\n if (source.entities[type.ref] !== undefined) {\n into.entityRefs.add(type.ref);\n } else if (source.typeAliases?.[type.ref] !== undefined) {\n into.aliases.add(type.ref);\n }\n break;\n case 'scalar':\n if (scalarTsType(type) === 'JsonValue') {\n into.usesJsonValue = true;\n }\n break;\n case 'union':\n for (const variant of type.variants) {\n collectTypeDependencies(variant, source, entity, into);\n }\n break;\n case 'map':\n collectTypeDependencies(type.value, source, entity, into);\n break;\n case 'array':\n collectTypeDependencies(type.element, source, entity, into);\n break;\n case 'unknown':\n break;\n }\n return into;\n}\n\n/**\n * Render a `FieldType` recursively. Entity refs name their emitted flat DTO;\n * type-alias refs retain their declared name from the source alias registry.\n */\nexport function renderFieldType(type: FieldType, source: SourceIR): string {\n switch (type.kind) {\n case 'ref':\n return source.entities[type.ref] !== undefined\n ? typeName(type.ref)\n : type.ref;\n case 'union': {\n const variants = flattenUnion(type);\n return variants.length === 0\n ? 'unknown'\n : variants\n .map((variant) =>\n variant.kind === 'union'\n ? `(${renderFieldType(variant, source)})`\n : renderFieldType(variant, source),\n )\n .join(' | ');\n }\n case 'map':\n return `Record<string, ${renderFieldType(type.value, source)}>`;\n case 'array':\n return type.element.kind === 'union'\n ? `(${renderFieldType(type.element, source)})[]`\n : `${renderFieldType(type.element, source)}[]`;\n case 'scalar':\n case 'enum':\n case 'unknown':\n return scalarTsType(type);\n }\n}\n\n/** The non-list, non-nullable type for a field. */\nexport function fieldTsType(\n field: Field,\n source: SourceIR,\n entity: Entity,\n): string {\n collectTypeDependencies(field.type, source, entity);\n return renderFieldType(field.type, source);\n}\n","/** Source type aliases -> the shared aliases.ts declaration module. */\nimport type { SourceIR } from '@kurotako/ir';\nimport { typeName } from '../names.js';\nimport { collectTypeDependencies, renderFieldType } from '../render/scalars.js';\n\n/** Emit source aliases and imports for their external entity/enum dependencies. */\nexport function emitAliases(source: SourceIR): string {\n const aliases = Object.values(source.typeAliases ?? {});\n const enums = new Set<string>();\n const entityRefs = new Set<string>();\n let usesJsonValue = false;\n\n for (const alias of aliases) {\n const dependencies = collectTypeDependencies(alias.type, source, undefined);\n for (const name of dependencies.enums) enums.add(name);\n for (const name of dependencies.entityRefs) entityRefs.add(name);\n usesJsonValue ||= dependencies.usesJsonValue;\n }\n\n const imports: Array<{ specifier: string; names: string[] }> = [];\n if (enums.size > 0) {\n imports.push({ specifier: './enums', names: [...enums] });\n }\n if (usesJsonValue) {\n imports.push({ specifier: './scalars', names: ['JsonValue'] });\n }\n for (const ref of entityRefs) {\n imports.push({\n specifier: `./${ref}.type`,\n names: [typeName(ref)],\n });\n }\n\n const blocks = aliases.map((alias) => {\n const doc = alias.doc === undefined ? '' : `/** ${alias.doc} */\\n`;\n return `${doc}export type ${alias.name} = ${renderFieldType(alias.type, source)};`;\n });\n const importBlock = imports\n .sort((left, right) => left.specifier.localeCompare(right.specifier))\n .map(\n ({ specifier, names }) =>\n `import type { ${names.sort((left, right) => left.localeCompare(right)).join(', ')} } from '${specifier}';`,\n )\n .join('\\n');\n\n return `${[importBlock, ...blocks].filter((block) => block !== '').join('\\n\\n')}\\n`;\n}\n","/** This generator's per-namespace barrel. */\nimport type { SourceIR } from '@kurotako/ir';\n\n/** Re-export every emitted shared and entity declaration module. */\nexport function emitBarrel(\n source: SourceIR,\n emitsScalars: boolean,\n emitsAliases = Object.keys(source.typeAliases ?? {}).length > 0,\n): string {\n const lines: string[] = [];\n if (emitsScalars) lines.push(\"export type * from './scalars';\");\n lines.push(\"export * from './enums';\");\n if (emitsAliases) lines.push(\"export type * from './aliases';\");\n if (Object.keys(source.entities).length > 0) {\n lines.push(\"export type * from './filters';\");\n }\n for (const entity of Object.values(source.entities)) {\n lines.push(`export type * from './${entity.name}.type';`);\n }\n return `${lines.join('\\n')}\\n`;\n}\n","/** Field documentation and constraints -> an optional JSDoc block. */\nimport type { Field } from '@kurotako/ir';\n\n/** Render documentation-only metadata in a stable, human-readable order. */\nexport function jsDoc(field: Field): string {\n const tags: string[] = [];\n const constraints = field.constraints;\n\n if (constraints.min !== undefined) tags.push(`@min ${constraints.min}`);\n if (constraints.max !== undefined) tags.push(`@max ${constraints.max}`);\n if (constraints.minLength !== undefined) {\n tags.push(`@minLength ${constraints.minLength}`);\n }\n if (constraints.maxLength !== undefined) {\n tags.push(`@maxLength ${constraints.maxLength}`);\n }\n if (constraints.regex !== undefined) {\n tags.push(`@pattern ${constraints.regex}`);\n }\n if (constraints.format !== undefined) {\n tags.push(`@format ${constraints.format}`);\n }\n if (constraints.unique) tags.push('@unique');\n if (field.default?.kind === 'value') {\n tags.push(`@default ${JSON.stringify(field.default.value)}`);\n }\n if (field.type.kind === 'unknown') {\n tags.push(\n field.type.hint === undefined\n ? '@see unknown'\n : `@see unknown: ${field.type.hint}`,\n );\n }\n\n const prose = field.doc?.split('\\n') ?? [];\n if (prose.length === 0 && tags.length === 0) {\n return '';\n }\n\n const lines = [...prose];\n if (prose.length > 0 && tags.length > 0) lines.push('');\n lines.push(...tags);\n return ['/**', ...lines.map((line) => ` * ${line}`), ' */'].join('\\n');\n}\n","/** Assemble scalar and enum fields into TypeScript object members. */\nimport type { Entity, Field, SourceIR } from '@kurotako/ir';\nimport { jsDoc } from './jsdoc.js';\nimport { fieldTsType } from './scalars.js';\n\nexport interface MemberLineOptions {\n optional: boolean;\n}\n\n/** Render one field member, including documentation and list/null wrappers. */\nexport function memberLine(\n field: Field,\n opts: MemberLineOptions,\n source: SourceIR,\n entity: Entity,\n): string {\n let type = fieldTsType(field, source, entity);\n if (field.list) {\n if (type.includes(' | ')) type = `(${type})`;\n type = `${type}[]`;\n }\n if (field.nullable) type = `${type} | null`;\n\n const member = ` ${field.name}${opts.optional ? '?' : ''}: ${type};`;\n const doc = jsDoc(field);\n const indentedDoc = doc\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n return doc === '' ? member : `${indentedDoc}\\n${member}`;\n}\n","/** Flat versus deep relation members. */\nimport type { Logger } from '@kurotako/core';\nimport type { Relation } from '@kurotako/ir';\nimport { isCrossSource } from '@kurotako/ir';\nimport {\n type FamilyName,\n typeName,\n VARIANT_TOKEN,\n type VariantName,\n} from '../names.js';\n\nexport interface RelationMember {\n type: string;\n optional: boolean;\n}\n\nexport interface RelationMemberOptions {\n fromNamespace: string;\n logger?: Logger;\n}\n\n/**\n * Render a relation member for the deep family. Cross-source links deliberately\n * stay flat because v1 has no stable cross-namespace module mapping.\n */\nexport function relationMember(\n relation: Relation,\n family: FamilyName,\n variant: VariantName,\n opts: RelationMemberOptions,\n): RelationMember | null {\n if (family === 'flat') return null;\n if (isCrossSource(opts.fromNamespace, relation)) {\n opts.logger?.debug(\n `gen-typescript: relation '${relation.name}' targets another source ('${relation.target.namespace}.${relation.target.entity}'); degrading to the FK id (flat) in the deep family`,\n );\n return null;\n }\n\n const target = relation.target.entity;\n const many = relation.cardinality === 'many';\n if (variant === 'where') {\n const dto = typeName(target, 'Where', 'Deep');\n return {\n type: many ? `{ some?: ${dto}; every?: ${dto}; none?: ${dto} }` : dto,\n optional: true,\n };\n }\n if (variant === 'select') {\n return {\n type: `boolean | ${typeName(target, 'Select', 'Deep')}`,\n optional: true,\n };\n }\n\n return {\n type: many\n ? `${typeName(target, VARIANT_TOKEN[variant], 'Deep')}[]`\n : typeName(target, VARIANT_TOKEN[variant], 'Deep'),\n optional: relation.optional || many || variant === 'update',\n };\n}\n","/** Shared payload field selection and Where-filter classification. */\nimport type { Entity, Field } from '@kurotako/ir';\nimport { createFields, isCreateOptional, updateFields } from '@kurotako/ir';\nimport type { VariantName } from '../names.js';\n\nexport interface FieldSelection {\n field: Field;\n optional: boolean;\n}\n\n/** The scalar/enum fields included by a generated type variant. */\nexport function variantFields(\n entity: Entity,\n variant: VariantName,\n): FieldSelection[] {\n switch (variant) {\n case 'full':\n return entity.fields.map((field) => ({\n field,\n optional: field.optional,\n }));\n case 'create':\n return createFields(entity).map((field) => ({\n field,\n optional: isCreateOptional(field),\n }));\n case 'update':\n return updateFields(entity).map((field) => ({ field, optional: true }));\n case 'where':\n case 'select':\n return entity.fields.map((field) => ({ field, optional: true }));\n }\n}\n\n/** The Where filter type for a direct scalar or enum field. */\nexport function filterClass(field: Field): string | null {\n if (field.type.kind === 'enum') return `Enum${field.type.ref}Filter`;\n if (field.type.kind !== 'scalar') return null;\n\n switch (field.type.scalar) {\n case 'string':\n case 'uuid':\n case 'decimal':\n case 'bytes':\n return 'StringFilter';\n case 'int':\n return 'IntFilter';\n case 'float':\n return 'FloatFilter';\n case 'bigint':\n return 'BigIntFilter';\n case 'boolean':\n return 'BoolFilter';\n case 'date':\n case 'datetime':\n return 'DateTimeFilter';\n case 'json':\n return null;\n }\n}\n","/** One entity -> its ten flat/deep TypeScript declaration variants. */\nimport type { Logger } from '@kurotako/core';\nimport type { Entity, SourceIR } from '@kurotako/ir';\nimport {\n FAMILIES,\n FAMILY_TOKEN,\n type FamilyName,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n type VariantName,\n} from '../names.js';\nimport { memberLine } from '../render/field.js';\nimport { type RelationMember, relationMember } from '../render/relations.js';\nimport { collectTypeDependencies, renderFieldType } from '../render/scalars.js';\nimport { filterClass, variantFields } from '../render/variants.js';\n\nfunction typeBlock(name: string, members: string[]): string {\n return `export type ${name} = {\\n${members.join('\\n')}\\n};`;\n}\n\nfunction relationLine(name: string, member: RelationMember): string {\n return ` ${name}${member.optional ? '?' : ''}: ${member.type};`;\n}\n\n/** Emit a type-only, specifier-sorted import block. */\nfunction importsFor(\n enums: Set<string>,\n aliases: Set<string>,\n filters: Set<string>,\n usesJsonValue: boolean,\n siblings: Map<string, Set<string>>,\n): string {\n const imports: Array<{ specifier: string; names: string[] }> = [];\n if (aliases.size > 0) {\n imports.push({ specifier: './aliases', names: [...aliases] });\n }\n if (enums.size > 0) {\n imports.push({ specifier: './enums', names: [...enums] });\n }\n if (filters.size > 0) {\n imports.push({ specifier: './filters', names: [...filters] });\n }\n if (usesJsonValue) {\n imports.push({ specifier: './scalars', names: ['JsonValue'] });\n }\n for (const [entity, names] of siblings) {\n imports.push({ specifier: `./${entity}.type`, names: [...names] });\n }\n return imports\n .sort((left, right) => left.specifier.localeCompare(right.specifier))\n .map(\n ({ specifier, names }) =>\n `import type { ${names.sort((left, right) => left.localeCompare(right)).join(', ')} } from '${specifier}';`,\n )\n .join('\\n');\n}\n\n/** Render an entity's complete variant/family matrix. */\nexport function emitEntity(\n source: SourceIR,\n entity: Entity,\n logger?: Logger,\n): string {\n const usedEnums = new Set<string>();\n const usedAliases = new Set<string>();\n const usedEntityRefs = new Set<string>();\n let usesJsonValue = false;\n const usedFilters = new Set<string>();\n const siblings = new Map<string, Set<string>>();\n\n for (const field of entity.fields) {\n const dependencies = collectTypeDependencies(field.type, source, entity);\n for (const name of dependencies.enums) usedEnums.add(name);\n for (const name of dependencies.aliases) usedAliases.add(name);\n for (const name of dependencies.entityRefs) usedEntityRefs.add(name);\n usesJsonValue ||= dependencies.usesJsonValue;\n }\n\n const trackSibling = (target: string, name: string): void => {\n if (target === entity.name) return;\n const names = siblings.get(target) ?? new Set<string>();\n names.add(name);\n siblings.set(target, names);\n };\n\n for (const ref of usedEntityRefs) {\n trackSibling(ref, typeName(ref));\n }\n\n const relation = (\n relationIndex: number,\n variant: VariantName,\n ): RelationMember | null => {\n const current = entity.relations[relationIndex];\n if (current === undefined) return null;\n const member = relationMember(current, 'deep', variant, {\n fromNamespace: source.namespace,\n logger,\n });\n if (member !== null) {\n trackSibling(\n current.target.entity,\n typeName(current.target.entity, VARIANT_TOKEN[variant], 'Deep'),\n );\n }\n return member;\n };\n\n const blocks: string[] = [];\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n const name = typeName(\n entity.name,\n VARIANT_TOKEN[variant],\n FAMILY_TOKEN[family],\n );\n if (variant === 'where') {\n blocks.push(renderWhere(name, family));\n } else if (variant === 'select') {\n blocks.push(renderSelect(name, family));\n } else {\n blocks.push(renderRecord(name, variant, family));\n }\n }\n }\n\n const imports = importsFor(\n usedEnums,\n usedAliases,\n usedFilters,\n usesJsonValue,\n siblings,\n );\n return `${[imports, '', ...blocks].join('\\n\\n').trim()}\\n`;\n\n function renderRecord(\n name: string,\n variant: Exclude<VariantName, 'where' | 'select'>,\n family: FamilyName,\n ): string {\n const own = variantFields(entity, variant).map((selection) =>\n memberLine(\n selection.field,\n { optional: variant === 'update' ? false : selection.optional },\n source,\n entity,\n ),\n );\n if (entity.additionalProperties !== undefined) {\n const declared = variantFields(entity, variant)\n .map((selection) => renderFieldType(selection.field.type, source))\n .join(' | ');\n own.push(\n ` [key: string]: ${renderFieldType(entity.additionalProperties, source)}${declared === '' ? '' : ` | ${declared}`} | undefined;`,\n );\n }\n const relations: string[] = [];\n if (family === 'deep') {\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n const member = relation(index, variant);\n if (current !== undefined && member !== null) {\n relations.push(relationLine(current.name, member));\n }\n }\n }\n\n if (variant === 'update') {\n const base = `Partial<{\\n${own.join('\\n')}\\n}>`;\n return relations.length === 0\n ? `export type ${name} = ${base};`\n : `export type ${name} = ${base} & {\\n${relations.join('\\n')}\\n};`;\n }\n return typeBlock(name, [...own, ...relations]);\n }\n\n function renderWhere(name: string, family: FamilyName): string {\n const members: string[] = [];\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter === null) continue;\n usedFilters.add(filter);\n members.push(` ${field.name}?: ${filter};`);\n }\n if (family === 'deep') {\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n const member = relation(index, 'where');\n if (current !== undefined && member !== null) {\n members.push(relationLine(current.name, member));\n }\n }\n }\n members.push(\n ` AND?: ${name} | ${name}[];`,\n ` OR?: ${name} | ${name}[];`,\n ` NOT?: ${name} | ${name}[];`,\n );\n return typeBlock(name, members);\n }\n\n function renderSelect(name: string, family: FamilyName): string {\n const members = entity.fields.map((field) => ` ${field.name}?: boolean;`);\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n if (current === undefined) continue;\n if (family === 'flat') {\n members.push(` ${current.name}?: boolean;`);\n continue;\n }\n const member = relation(index, 'select');\n members.push(\n member === null\n ? ` ${current.name}?: boolean;`\n : relationLine(current.name, member),\n );\n }\n return typeBlock(name, members);\n }\n}\n","/** Shared Prisma-style Where filter interfaces. */\nimport type { SourceIR } from '@kurotako/ir';\nimport { scalarTsType } from '@kurotako/ir';\nimport { enumTypeName } from '../names.js';\nimport { filterClass } from '../render/variants.js';\n\nconst EQUALITY_OPS = ['equals', 'not'] as const;\nconst LIST_OPS = ['in', 'notIn'] as const;\nconst ORDER_OPS = ['lt', 'lte', 'gt', 'gte'] as const;\nconst STRING_OPS = ['contains', 'startsWith', 'endsWith'] as const;\nconst SCALAR_FILTER_ORDER = [\n 'StringFilter',\n 'IntFilter',\n 'FloatFilter',\n 'BigIntFilter',\n 'DateTimeFilter',\n 'BoolFilter',\n] as const;\n\ntype ScalarFilter = (typeof SCALAR_FILTER_ORDER)[number];\n\n/** Collect the public filter interface identifiers emitted for a source. */\nexport function collectFilterNames(source: SourceIR): Set<string> {\n const names = new Set<string>();\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter !== null) names.add(filter);\n }\n }\n return names;\n}\n\nfunction baseType(name: ScalarFilter): string {\n switch (name) {\n case 'StringFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'string' });\n case 'IntFilter':\n case 'FloatFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'int' });\n case 'BigIntFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'bigint' });\n case 'DateTimeFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'datetime' });\n case 'BoolFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'boolean' });\n }\n}\n\nfunction operations(name: string): readonly string[] {\n if (name === 'BoolFilter') return EQUALITY_OPS;\n if (name === 'StringFilter') {\n return [...EQUALITY_OPS, ...LIST_OPS, ...ORDER_OPS, ...STRING_OPS];\n }\n return [...EQUALITY_OPS, ...LIST_OPS, ...ORDER_OPS];\n}\n\nfunction emitInterface(\n name: string,\n type: string,\n ops: readonly string[],\n): string {\n const members = ops.map((operation) => {\n const list = (LIST_OPS as readonly string[]).includes(operation);\n return ` ${operation}?: ${list ? `${type}[]` : type};`;\n });\n return `export interface ${name} {\\n${members.join('\\n')}\\n}`;\n}\n\n/** Emit only the direct scalar and enum classes used by a source's fields. */\nexport function emitFilters(source: SourceIR): string {\n const scalars = new Set<string>();\n const enums = new Set<string>();\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter === null) continue;\n if (field.type.kind === 'enum') enums.add(field.type.ref);\n else scalars.add(filter);\n }\n }\n\n const enumNames = [...enums].sort((left, right) => left.localeCompare(right));\n const blocks: string[] = [];\n for (const name of SCALAR_FILTER_ORDER) {\n if (scalars.has(name))\n blocks.push(emitInterface(name, baseType(name), operations(name)));\n }\n for (const name of enumNames) {\n blocks.push(\n emitInterface(`Enum${name}Filter`, enumTypeName(name), [\n ...EQUALITY_OPS,\n ...LIST_OPS,\n ]),\n );\n }\n\n const imports =\n enumNames.length === 0\n ? ''\n : `import type { ${enumNames.map(enumTypeName).join(', ')} } from './enums';\\n\\n`;\n return blocks.length === 0\n ? 'export {};\\n'\n : `${imports}${blocks.join('\\n\\n')}\\n`;\n}\n","/** The JsonValue helper emitted when at least one field needs it. */\nexport function emitScalars(): string {\n return `export type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n`;\n}\n"],"mappings":"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","names":["import_ir","import_ir","import_ir","import_ir"]}
|
package/dist/index.js
CHANGED
|
@@ -247,6 +247,12 @@ function collectTypeDependencies(type, source, entity, into = emptyDependencies(
|
|
|
247
247
|
collectTypeDependencies(variant, source, entity, into);
|
|
248
248
|
}
|
|
249
249
|
break;
|
|
250
|
+
case "map":
|
|
251
|
+
collectTypeDependencies(type.value, source, entity, into);
|
|
252
|
+
break;
|
|
253
|
+
case "array":
|
|
254
|
+
collectTypeDependencies(type.element, source, entity, into);
|
|
255
|
+
break;
|
|
250
256
|
case "unknown":
|
|
251
257
|
break;
|
|
252
258
|
}
|
|
@@ -262,6 +268,10 @@ function renderFieldType(type, source) {
|
|
|
262
268
|
(variant) => variant.kind === "union" ? `(${renderFieldType(variant, source)})` : renderFieldType(variant, source)
|
|
263
269
|
).join(" | ");
|
|
264
270
|
}
|
|
271
|
+
case "map":
|
|
272
|
+
return `Record<string, ${renderFieldType(type.value, source)}>`;
|
|
273
|
+
case "array":
|
|
274
|
+
return type.element.kind === "union" ? `(${renderFieldType(type.element, source)})[]` : `${renderFieldType(type.element, source)}[]`;
|
|
265
275
|
case "scalar":
|
|
266
276
|
case "enum":
|
|
267
277
|
case "unknown":
|
|
@@ -558,6 +568,12 @@ function emitEntity(source, entity, logger) {
|
|
|
558
568
|
entity
|
|
559
569
|
)
|
|
560
570
|
);
|
|
571
|
+
if (entity.additionalProperties !== void 0) {
|
|
572
|
+
const declared = variantFields(entity, variant).map((selection) => renderFieldType(selection.field.type, source)).join(" | ");
|
|
573
|
+
own.push(
|
|
574
|
+
` [key: string]: ${renderFieldType(entity.additionalProperties, source)}${declared === "" ? "" : ` | ${declared}`} | undefined;`
|
|
575
|
+
);
|
|
576
|
+
}
|
|
561
577
|
const relations = [];
|
|
562
578
|
if (family === "deep") {
|
|
563
579
|
for (let index = 0; index < entity.relations.length; index += 1) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/generator.ts","../src/artifact.ts","../src/names.ts","../src/emit/enums.ts","../src/render/scalars.ts","../src/emit/aliases.ts","../src/emit/barrel.ts","../src/render/jsdoc.ts","../src/render/field.ts","../src/render/relations.ts","../src/render/variants.ts","../src/emit/entity.ts","../src/emit/filters.ts","../src/emit/scalars.ts"],"sourcesContent":["/**\n * `@kurotako/gen-typescript` error classes.\n *\n * Codes: `typescript_alias_cycle`, `typescript_alias_public_name_collision`,\n * `typescript_enum_collision`, `typescript_enum_public_name_collision`.\n */\nexport class TypeScriptGenError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n this.code = code;\n }\n}\n\n/**\n * Source aliases in a direct `ref` cycle cannot be represented by the emitted\n * pure TypeScript aliases.\n */\nexport class TypeScriptAliasCycleError extends TypeScriptGenError {\n readonly namespace: string;\n readonly aliasNames: string[];\n\n constructor(namespace: string, aliasNames: readonly string[]) {\n const sortedNames = [...aliasNames].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_alias_cycle',\n `source type aliases ${sortedNames.map((name) => `'${name}'`).join(', ')} form a direct reference cycle in namespace '${namespace}'; pure TypeScript aliases cannot represent it`,\n );\n this.namespace = namespace;\n this.aliasNames = sortedNames;\n }\n}\n\n/** Source aliases cannot reuse a public identifier emitted by this generator. */\nexport class TypeScriptAliasPublicNameCollisionError extends TypeScriptGenError {\n readonly namespace: string;\n readonly names: string[];\n\n constructor(namespace: string, names: readonly string[]) {\n const sortedNames = [...names].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_alias_public_name_collision',\n `source type aliases ${sortedNames.map((name) => `'${name}'`).join(', ')} collide with generated public identifiers in namespace '${namespace}'; rename one of the conflicting source definitions`,\n );\n this.namespace = namespace;\n this.names = sortedNames;\n }\n}\n\n/** An enum cannot reuse a non-enum identifier exported from the namespace barrel. */\nexport class TypeScriptEnumPublicNameCollisionError extends TypeScriptGenError {\n readonly namespace: string;\n readonly names: string[];\n\n constructor(namespace: string, names: readonly string[]) {\n const sortedNames = [...names].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_enum_public_name_collision',\n `source enums ${sortedNames.map((name) => `'${name}'`).join(', ')} collide with other public identifiers in namespace '${namespace}'; rename one of the conflicting source definitions`,\n );\n this.namespace = namespace;\n this.names = sortedNames;\n }\n}\n\n/**\n * Two distinct `EnumDef`s reachable in one source share a name. Names both\n * origins so the schema author can resolve the collision.\n */\nexport class TypeScriptEnumCollisionError extends TypeScriptGenError {\n readonly enumName: string;\n readonly firstOrigin: string;\n readonly secondOrigin: string;\n\n constructor(enumName: string, firstOrigin: string, secondOrigin: string) {\n super(\n 'typescript_enum_collision',\n `enum '${enumName}' is defined twice with different values (${firstOrigin} vs ${secondOrigin}); ` +\n 'rename one of them in the source schema',\n );\n this.enumName = enumName;\n this.firstOrigin = firstOrigin;\n this.secondOrigin = secondOrigin;\n }\n}\n","/** `typescriptGenerator` — emits pure TypeScript declarations from the IR. */\nimport { defineGenerator } from '@kurotako/config';\nimport type { GenerateContext, GenOutput, VirtualFile } from '@kurotako/core';\nimport { buildArtifact } from './artifact.js';\nimport { emitAliases } from './emit/aliases.js';\nimport { emitBarrel } from './emit/barrel.js';\nimport { emitEntity } from './emit/entity.js';\nimport { collectEnums, emitEnums } from './emit/enums.js';\nimport { collectFilterNames, emitFilters } from './emit/filters.js';\nimport { emitScalars } from './emit/scalars.js';\nimport {\n TypeScriptAliasCycleError,\n TypeScriptAliasPublicNameCollisionError,\n TypeScriptEnumPublicNameCollisionError,\n} from './errors.js';\nimport {\n FAMILIES,\n FAMILY_TOKEN,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n} from './names.js';\nimport { collectTypeDependencies } from './render/scalars.js';\n\nfunction sourceUsesJsonValue(\n source: GenerateContext['ir']['sources'][string],\n): boolean {\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n if (collectTypeDependencies(field.type, source, entity).usesJsonValue) {\n return true;\n }\n }\n }\n for (const alias of Object.values(source.typeAliases ?? {})) {\n if (collectTypeDependencies(alias.type, source, undefined).usesJsonValue) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Return aliases that participate in an alias-only `ref` cycle. A cycle passing\n * through an entity is valid TypeScript because the entity emits a structural\n * object type; bare aliases have no such structure to break the recursion.\n */\nfunction cyclicAliasNames(\n source: GenerateContext['ir']['sources'][string],\n cycles: GenerateContext['cycles'],\n): string[] {\n const aliases = source.typeAliases ?? {};\n const candidates = Object.keys(aliases).filter((name) =>\n cycles.has(`${source.namespace}.${name}`),\n );\n const candidateSet = new Set(candidates);\n const references = new Map<string, string[]>();\n\n for (const name of candidates) {\n const alias = aliases[name];\n if (alias === undefined) continue;\n const dependencies = collectTypeDependencies(alias.type, source, undefined);\n references.set(\n name,\n [...dependencies.aliases].filter((dependency) =>\n candidateSet.has(dependency),\n ),\n );\n }\n\n const reachesSelf = (start: string, current: string, seen: Set<string>) => {\n for (const next of references.get(current) ?? []) {\n if (next === start) return true;\n if (!seen.has(next)) {\n seen.add(next);\n if (reachesSelf(start, next, seen)) return true;\n }\n }\n return false;\n };\n\n return candidates.filter((name) => reachesSelf(name, name, new Set([name])));\n}\n\n/** Public barrel identifiers, separated by their enum, generated, and alias origins. */\nfunction generatedPublicNames(\n source: GenerateContext['ir']['sources'][string],\n): {\n enumNames: Set<string>;\n generatedTypeNames: Set<string>;\n aliasNames: Set<string>;\n} {\n // An enum's const and type intentionally share one identifier in TypeScript's\n // separate value and type namespaces, so it is recorded only once here.\n const enumNames = new Set(collectEnums(source).map(({ name }) => name));\n const generatedTypeNames = new Set<string>();\n\n for (const entity of Object.values(source.entities)) {\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n generatedTypeNames.add(\n typeName(entity.name, VARIANT_TOKEN[variant], FAMILY_TOKEN[family]),\n );\n }\n }\n }\n\n for (const name of collectFilterNames(source)) generatedTypeNames.add(name);\n if (sourceUsesJsonValue(source)) generatedTypeNames.add('JsonValue');\n return {\n enumNames,\n generatedTypeNames,\n aliasNames: new Set(Object.keys(source.typeAliases ?? {})),\n };\n}\n\nfunction validateSourceEmission(\n source: GenerateContext['ir']['sources'][string],\n cycles: GenerateContext['cycles'],\n): void {\n const aliasesInCycles = cyclicAliasNames(source, cycles);\n if (aliasesInCycles.length > 0) {\n throw new TypeScriptAliasCycleError(source.namespace, aliasesInCycles);\n }\n\n const { enumNames, generatedTypeNames, aliasNames } =\n generatedPublicNames(source);\n const aliasCollisions = [...aliasNames].filter(\n (name) => enumNames.has(name) || generatedTypeNames.has(name),\n );\n if (aliasCollisions.length > 0) {\n throw new TypeScriptAliasPublicNameCollisionError(\n source.namespace,\n aliasCollisions,\n );\n }\n\n const enumCollisions = [...enumNames].filter(\n (name) => generatedTypeNames.has(name) || aliasNames.has(name),\n );\n if (enumCollisions.length > 0) {\n throw new TypeScriptEnumPublicNameCollisionError(\n source.namespace,\n enumCollisions,\n );\n }\n}\n\n/** Pure, synchronous generator with no runtime dependency on generated code. */\nexport const typescriptGenerator = defineGenerator({\n name: 'typescript',\n\n generate(ctx: GenerateContext): GenOutput {\n const files: VirtualFile[] = [];\n for (const [namespace, source] of Object.entries(ctx.ir.sources)) {\n validateSourceEmission(source, ctx.cycles);\n const prefix = `${namespace}/typescript`;\n const emitsScalars = sourceUsesJsonValue(source);\n if (emitsScalars) {\n files.push({ path: `${prefix}/scalars.ts`, content: emitScalars() });\n }\n files.push({ path: `${prefix}/enums.ts`, content: emitEnums(source) });\n if (Object.keys(source.entities).length > 0) {\n files.push({\n path: `${prefix}/filters.ts`,\n content: emitFilters(source),\n });\n }\n if (Object.keys(source.typeAliases ?? {}).length > 0) {\n files.push({\n path: `${prefix}/aliases.ts`,\n content: emitAliases(source),\n });\n }\n for (const entity of Object.values(source.entities)) {\n files.push({\n path: `${prefix}/${entity.name}.type.ts`,\n content: emitEntity(source, entity, ctx.logger),\n });\n }\n files.push({\n path: `${prefix}/index.ts`,\n content: emitBarrel(\n source,\n emitsScalars,\n Object.keys(source.typeAliases ?? {}).length > 0,\n ),\n });\n }\n return { files, artifact: buildArtifact(ctx.ir) };\n },\n});\n","/** Assemble the TypeScript generator's full artifact symbol matrix. */\nimport type { EntitySymbols, GeneratorArtifact } from '@kurotako/core';\nimport type { IR } from '@kurotako/ir';\nimport { iterEntities } from '@kurotako/ir';\nimport { collectEnums } from './emit/enums.js';\nimport {\n barrelModule,\n entityModule,\n enumConst,\n enumsModule,\n enumTypeName,\n FAMILIES,\n FAMILY_TOKEN,\n type FamilyName,\n filtersModule,\n scalarsModule,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n type VariantName,\n} from './names.js';\n\nexport interface TypeScriptArtifactExtra {\n families: ['flat', 'deep'];\n variants: ['full', 'create', 'update', 'where', 'select'];\n perNamespace: Record<\n string,\n {\n barrelModule: string;\n filtersModule: string;\n scalarsModule: string;\n enums: Record<\n string,\n { constName: string; typeName: string; module: string }\n >;\n }\n >;\n}\n\nfunction roleStem(variant: VariantName, family: FamilyName): string {\n const variantStem = variant === 'full' ? '' : variant;\n return family === 'flat'\n ? variantStem\n : variantStem === ''\n ? 'deep'\n : `${variantStem}Deep`;\n}\n\nfunction entitySymbols(name: string): Record<string, string> {\n const symbols: Record<string, string> = {};\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n const stem = roleStem(variant, family);\n const key = stem === '' ? 'type' : `${stem}Type`;\n symbols[key] = typeName(\n name,\n VARIANT_TOKEN[variant],\n FAMILY_TOKEN[family],\n );\n }\n }\n return symbols;\n}\n\n/** Build the consumable metadata independently of file emission. */\nexport function buildArtifact(ir: IR): GeneratorArtifact {\n const entities: Record<string, EntitySymbols> = {};\n for (const { namespace, entity } of iterEntities(ir)) {\n entities[`${namespace}.${entity.name}`] = {\n module: entityModule(namespace, entity.name),\n symbols: entitySymbols(entity.name),\n };\n }\n\n const perNamespace: TypeScriptArtifactExtra['perNamespace'] = {};\n for (const [namespace, source] of Object.entries(ir.sources)) {\n const enums: TypeScriptArtifactExtra['perNamespace'][string]['enums'] = {};\n for (const definition of collectEnums(source)) {\n enums[definition.name] = {\n constName: enumConst(definition.name),\n typeName: enumTypeName(definition.name),\n module: enumsModule(namespace),\n };\n }\n perNamespace[namespace] = {\n barrelModule: barrelModule(namespace),\n filtersModule: filtersModule(namespace),\n scalarsModule: scalarsModule(namespace),\n enums,\n };\n }\n\n return {\n entities,\n extra: {\n families: ['flat', 'deep'],\n variants: ['full', 'create', 'update', 'where', 'select'],\n perNamespace,\n } satisfies TypeScriptArtifactExtra,\n };\n}\n","/**\n * Deterministic identifier and module-specifier helpers.\n *\n * Identifiers are never namespace-prefixed; the namespace only drives the\n * `typescript/` output sub-tree.\n */\n\n/** PascalCase variant token embedded in a type identifier. */\nexport type Variant = '' | 'Create' | 'Update' | 'Where' | 'Select';\n\n/** Relation family token embedded in a type identifier. */\nexport type Family = '' | 'Deep';\n\n/** The five variant names, in their fixed order. */\nexport const VARIANTS = [\n 'full',\n 'create',\n 'update',\n 'where',\n 'select',\n] as const;\nexport type VariantName = (typeof VARIANTS)[number];\n\n/** The two relation families, in their fixed order. */\nexport const FAMILIES = ['flat', 'deep'] as const;\nexport type FamilyName = (typeof FAMILIES)[number];\n\n/** `VariantName` -> the PascalCase token used inside identifiers. */\nexport const VARIANT_TOKEN: Record<VariantName, Variant> = {\n full: '',\n create: 'Create',\n update: 'Update',\n where: 'Where',\n select: 'Select',\n};\n\n/** `FamilyName` -> the token used inside identifiers. */\nexport const FAMILY_TOKEN: Record<FamilyName, Family> = {\n flat: '',\n deep: 'Deep',\n};\n\n/** `${Entity}${Variant}${Family}Dto`. */\nexport function typeName(\n entity: string,\n variant: Variant = '',\n family: Family = '',\n): string {\n return `${entity}${variant}${family}Dto`;\n}\n\n/** Enum `const` array identifier — the resolved `EnumDef` name verbatim. */\nexport function enumConst(name: string): string {\n return name;\n}\n\n/** Enum type alias — shares the name with `enumConst` in TypeScript's type namespace. */\nexport function enumTypeName(name: string): string {\n return name;\n}\n\n// --- module specifiers (POSIX, extension-less) -------------------------------\n\n/** `${ns}/typescript/${entity}.type`. */\nexport function entityModule(namespace: string, entity: string): string {\n return `${namespace}/typescript/${entity}.type`;\n}\n\n/** `${ns}/typescript/enums`. */\nexport function enumsModule(namespace: string): string {\n return `${namespace}/typescript/enums`;\n}\n\n/** `${ns}/typescript/filters`. */\nexport function filtersModule(namespace: string): string {\n return `${namespace}/typescript/filters`;\n}\n\n/** `${ns}/typescript/scalars`. */\nexport function scalarsModule(namespace: string): string {\n return `${namespace}/typescript/scalars`;\n}\n\n/** `${ns}/typescript` — this generator's own barrel. */\nexport function barrelModule(namespace: string): string {\n return `${namespace}/typescript`;\n}\n","/** Source enums -> the shared enums.ts module. */\nimport type { EnumDef, SourceIR } from '@kurotako/ir';\nimport { TypeScriptEnumCollisionError } from '../errors.js';\nimport { enumConst, enumTypeName } from '../names.js';\n\nfunction sameValues(a: EnumDef, b: EnumDef): boolean {\n const left = a.values.map((value) => value.name);\n const right = b.values.map((value) => value.name);\n return (\n left.length === right.length && left.every((value, i) => value === right[i])\n );\n}\n\n/** All reachable definitions, deduplicated and sorted by their identifier. */\nexport function collectEnums(source: SourceIR): EnumDef[] {\n const byName = new Map<string, { definition: EnumDef; origin: string }>();\n const add = (definition: EnumDef, origin: string): void => {\n const previous = byName.get(definition.name);\n if (previous === undefined) {\n byName.set(definition.name, { definition, origin });\n } else if (!sameValues(previous.definition, definition)) {\n throw new TypeScriptEnumCollisionError(\n definition.name,\n previous.origin,\n origin,\n );\n }\n };\n\n for (const definition of Object.values(source.enums))\n add(definition, 'source-level');\n for (const entity of Object.values(source.entities)) {\n for (const definition of Object.values(entity.enums ?? {})) {\n add(definition, `entity '${entity.name}'`);\n }\n }\n\n return [...byName.values()]\n .map(({ definition }) => definition)\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\n/** Emit type/value enum pairs, which legally share an identifier in TypeScript. */\nexport function emitEnums(source: SourceIR): string {\n const blocks = collectEnums(source).map((definition) => {\n const values = definition.values\n .map((value) => JSON.stringify(value.name))\n .join(', ');\n const name = enumConst(definition.name);\n return `export const ${name} = [${values}] as const;\\nexport type ${enumTypeName(definition.name)} = (typeof ${name})[number];`;\n });\n return blocks.length === 0 ? 'export {};\\n' : `${blocks.join('\\n\\n')}\\n`;\n}\n","/** Field types -> bare TypeScript type strings and their emitted dependencies. */\nimport type { Entity, Field, FieldType, SourceIR } from '@kurotako/ir';\nimport { flattenUnion, resolveEnum, scalarTsType } from '@kurotako/ir';\nimport { typeName } from '../names.js';\n\nexport interface TypeDependencies {\n enums: Set<string>;\n entityRefs: Set<string>;\n aliases: Set<string>;\n usesJsonValue: boolean;\n}\n\nfunction emptyDependencies(): TypeDependencies {\n return {\n enums: new Set(),\n entityRefs: new Set(),\n aliases: new Set(),\n usesJsonValue: false,\n };\n}\n\n/** Collect imports required by a field type, including refs nested in unions. */\nexport function collectTypeDependencies(\n type: FieldType,\n source: SourceIR,\n entity: Entity | undefined,\n into: TypeDependencies = emptyDependencies(),\n): TypeDependencies {\n switch (type.kind) {\n case 'enum': {\n const definition = resolveEnum(source, entity, type.ref);\n into.enums.add(definition?.name ?? type.ref);\n break;\n }\n case 'ref':\n if (source.entities[type.ref] !== undefined) {\n into.entityRefs.add(type.ref);\n } else if (source.typeAliases?.[type.ref] !== undefined) {\n into.aliases.add(type.ref);\n }\n break;\n case 'scalar':\n if (scalarTsType(type) === 'JsonValue') {\n into.usesJsonValue = true;\n }\n break;\n case 'union':\n for (const variant of type.variants) {\n collectTypeDependencies(variant, source, entity, into);\n }\n break;\n case 'unknown':\n break;\n }\n return into;\n}\n\n/**\n * Render a `FieldType` recursively. Entity refs name their emitted flat DTO;\n * type-alias refs retain their declared name from the source alias registry.\n */\nexport function renderFieldType(type: FieldType, source: SourceIR): string {\n switch (type.kind) {\n case 'ref':\n return source.entities[type.ref] !== undefined\n ? typeName(type.ref)\n : type.ref;\n case 'union': {\n const variants = flattenUnion(type);\n return variants.length === 0\n ? 'unknown'\n : variants\n .map((variant) =>\n variant.kind === 'union'\n ? `(${renderFieldType(variant, source)})`\n : renderFieldType(variant, source),\n )\n .join(' | ');\n }\n case 'scalar':\n case 'enum':\n case 'unknown':\n return scalarTsType(type);\n }\n}\n\n/** The non-list, non-nullable type for a field. */\nexport function fieldTsType(\n field: Field,\n source: SourceIR,\n entity: Entity,\n): string {\n collectTypeDependencies(field.type, source, entity);\n return renderFieldType(field.type, source);\n}\n","/** Source type aliases -> the shared aliases.ts declaration module. */\nimport type { SourceIR } from '@kurotako/ir';\nimport { typeName } from '../names.js';\nimport { collectTypeDependencies, renderFieldType } from '../render/scalars.js';\n\n/** Emit source aliases and imports for their external entity/enum dependencies. */\nexport function emitAliases(source: SourceIR): string {\n const aliases = Object.values(source.typeAliases ?? {});\n const enums = new Set<string>();\n const entityRefs = new Set<string>();\n let usesJsonValue = false;\n\n for (const alias of aliases) {\n const dependencies = collectTypeDependencies(alias.type, source, undefined);\n for (const name of dependencies.enums) enums.add(name);\n for (const name of dependencies.entityRefs) entityRefs.add(name);\n usesJsonValue ||= dependencies.usesJsonValue;\n }\n\n const imports: Array<{ specifier: string; names: string[] }> = [];\n if (enums.size > 0) {\n imports.push({ specifier: './enums', names: [...enums] });\n }\n if (usesJsonValue) {\n imports.push({ specifier: './scalars', names: ['JsonValue'] });\n }\n for (const ref of entityRefs) {\n imports.push({\n specifier: `./${ref}.type`,\n names: [typeName(ref)],\n });\n }\n\n const blocks = aliases.map((alias) => {\n const doc = alias.doc === undefined ? '' : `/** ${alias.doc} */\\n`;\n return `${doc}export type ${alias.name} = ${renderFieldType(alias.type, source)};`;\n });\n const importBlock = imports\n .sort((left, right) => left.specifier.localeCompare(right.specifier))\n .map(\n ({ specifier, names }) =>\n `import type { ${names.sort((left, right) => left.localeCompare(right)).join(', ')} } from '${specifier}';`,\n )\n .join('\\n');\n\n return `${[importBlock, ...blocks].filter((block) => block !== '').join('\\n\\n')}\\n`;\n}\n","/** This generator's per-namespace barrel. */\nimport type { SourceIR } from '@kurotako/ir';\n\n/** Re-export every emitted shared and entity declaration module. */\nexport function emitBarrel(\n source: SourceIR,\n emitsScalars: boolean,\n emitsAliases = Object.keys(source.typeAliases ?? {}).length > 0,\n): string {\n const lines: string[] = [];\n if (emitsScalars) lines.push(\"export type * from './scalars';\");\n lines.push(\"export * from './enums';\");\n if (emitsAliases) lines.push(\"export type * from './aliases';\");\n if (Object.keys(source.entities).length > 0) {\n lines.push(\"export type * from './filters';\");\n }\n for (const entity of Object.values(source.entities)) {\n lines.push(`export type * from './${entity.name}.type';`);\n }\n return `${lines.join('\\n')}\\n`;\n}\n","/** Field documentation and constraints -> an optional JSDoc block. */\nimport type { Field } from '@kurotako/ir';\n\n/** Render documentation-only metadata in a stable, human-readable order. */\nexport function jsDoc(field: Field): string {\n const tags: string[] = [];\n const constraints = field.constraints;\n\n if (constraints.min !== undefined) tags.push(`@min ${constraints.min}`);\n if (constraints.max !== undefined) tags.push(`@max ${constraints.max}`);\n if (constraints.minLength !== undefined) {\n tags.push(`@minLength ${constraints.minLength}`);\n }\n if (constraints.maxLength !== undefined) {\n tags.push(`@maxLength ${constraints.maxLength}`);\n }\n if (constraints.regex !== undefined) {\n tags.push(`@pattern ${constraints.regex}`);\n }\n if (constraints.format !== undefined) {\n tags.push(`@format ${constraints.format}`);\n }\n if (constraints.unique) tags.push('@unique');\n if (field.default?.kind === 'value') {\n tags.push(`@default ${JSON.stringify(field.default.value)}`);\n }\n if (field.type.kind === 'unknown') {\n tags.push(\n field.type.hint === undefined\n ? '@see unknown'\n : `@see unknown: ${field.type.hint}`,\n );\n }\n\n const prose = field.doc?.split('\\n') ?? [];\n if (prose.length === 0 && tags.length === 0) {\n return '';\n }\n\n const lines = [...prose];\n if (prose.length > 0 && tags.length > 0) lines.push('');\n lines.push(...tags);\n return ['/**', ...lines.map((line) => ` * ${line}`), ' */'].join('\\n');\n}\n","/** Assemble scalar and enum fields into TypeScript object members. */\nimport type { Entity, Field, SourceIR } from '@kurotako/ir';\nimport { jsDoc } from './jsdoc.js';\nimport { fieldTsType } from './scalars.js';\n\nexport interface MemberLineOptions {\n optional: boolean;\n}\n\n/** Render one field member, including documentation and list/null wrappers. */\nexport function memberLine(\n field: Field,\n opts: MemberLineOptions,\n source: SourceIR,\n entity: Entity,\n): string {\n let type = fieldTsType(field, source, entity);\n if (field.list) {\n if (type.includes(' | ')) type = `(${type})`;\n type = `${type}[]`;\n }\n if (field.nullable) type = `${type} | null`;\n\n const member = ` ${field.name}${opts.optional ? '?' : ''}: ${type};`;\n const doc = jsDoc(field);\n const indentedDoc = doc\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n return doc === '' ? member : `${indentedDoc}\\n${member}`;\n}\n","/** Flat versus deep relation members. */\nimport type { Logger } from '@kurotako/core';\nimport type { Relation } from '@kurotako/ir';\nimport { isCrossSource } from '@kurotako/ir';\nimport {\n type FamilyName,\n typeName,\n VARIANT_TOKEN,\n type VariantName,\n} from '../names.js';\n\nexport interface RelationMember {\n type: string;\n optional: boolean;\n}\n\nexport interface RelationMemberOptions {\n fromNamespace: string;\n logger?: Logger;\n}\n\n/**\n * Render a relation member for the deep family. Cross-source links deliberately\n * stay flat because v1 has no stable cross-namespace module mapping.\n */\nexport function relationMember(\n relation: Relation,\n family: FamilyName,\n variant: VariantName,\n opts: RelationMemberOptions,\n): RelationMember | null {\n if (family === 'flat') return null;\n if (isCrossSource(opts.fromNamespace, relation)) {\n opts.logger?.debug(\n `gen-typescript: relation '${relation.name}' targets another source ('${relation.target.namespace}.${relation.target.entity}'); degrading to the FK id (flat) in the deep family`,\n );\n return null;\n }\n\n const target = relation.target.entity;\n const many = relation.cardinality === 'many';\n if (variant === 'where') {\n const dto = typeName(target, 'Where', 'Deep');\n return {\n type: many ? `{ some?: ${dto}; every?: ${dto}; none?: ${dto} }` : dto,\n optional: true,\n };\n }\n if (variant === 'select') {\n return {\n type: `boolean | ${typeName(target, 'Select', 'Deep')}`,\n optional: true,\n };\n }\n\n return {\n type: many\n ? `${typeName(target, VARIANT_TOKEN[variant], 'Deep')}[]`\n : typeName(target, VARIANT_TOKEN[variant], 'Deep'),\n optional: relation.optional || many || variant === 'update',\n };\n}\n","/** Shared payload field selection and Where-filter classification. */\nimport type { Entity, Field } from '@kurotako/ir';\nimport { createFields, isCreateOptional, updateFields } from '@kurotako/ir';\nimport type { VariantName } from '../names.js';\n\nexport interface FieldSelection {\n field: Field;\n optional: boolean;\n}\n\n/** The scalar/enum fields included by a generated type variant. */\nexport function variantFields(\n entity: Entity,\n variant: VariantName,\n): FieldSelection[] {\n switch (variant) {\n case 'full':\n return entity.fields.map((field) => ({\n field,\n optional: field.optional,\n }));\n case 'create':\n return createFields(entity).map((field) => ({\n field,\n optional: isCreateOptional(field),\n }));\n case 'update':\n return updateFields(entity).map((field) => ({ field, optional: true }));\n case 'where':\n case 'select':\n return entity.fields.map((field) => ({ field, optional: true }));\n }\n}\n\n/** The Where filter type for a direct scalar or enum field. */\nexport function filterClass(field: Field): string | null {\n if (field.type.kind === 'enum') return `Enum${field.type.ref}Filter`;\n if (field.type.kind !== 'scalar') return null;\n\n switch (field.type.scalar) {\n case 'string':\n case 'uuid':\n case 'decimal':\n case 'bytes':\n return 'StringFilter';\n case 'int':\n return 'IntFilter';\n case 'float':\n return 'FloatFilter';\n case 'bigint':\n return 'BigIntFilter';\n case 'boolean':\n return 'BoolFilter';\n case 'date':\n case 'datetime':\n return 'DateTimeFilter';\n case 'json':\n return null;\n }\n}\n","/** One entity -> its ten flat/deep TypeScript declaration variants. */\nimport type { Logger } from '@kurotako/core';\nimport type { Entity, SourceIR } from '@kurotako/ir';\nimport {\n FAMILIES,\n FAMILY_TOKEN,\n type FamilyName,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n type VariantName,\n} from '../names.js';\nimport { memberLine } from '../render/field.js';\nimport { type RelationMember, relationMember } from '../render/relations.js';\nimport { collectTypeDependencies } from '../render/scalars.js';\nimport { filterClass, variantFields } from '../render/variants.js';\n\nfunction typeBlock(name: string, members: string[]): string {\n return `export type ${name} = {\\n${members.join('\\n')}\\n};`;\n}\n\nfunction relationLine(name: string, member: RelationMember): string {\n return ` ${name}${member.optional ? '?' : ''}: ${member.type};`;\n}\n\n/** Emit a type-only, specifier-sorted import block. */\nfunction importsFor(\n enums: Set<string>,\n aliases: Set<string>,\n filters: Set<string>,\n usesJsonValue: boolean,\n siblings: Map<string, Set<string>>,\n): string {\n const imports: Array<{ specifier: string; names: string[] }> = [];\n if (aliases.size > 0) {\n imports.push({ specifier: './aliases', names: [...aliases] });\n }\n if (enums.size > 0) {\n imports.push({ specifier: './enums', names: [...enums] });\n }\n if (filters.size > 0) {\n imports.push({ specifier: './filters', names: [...filters] });\n }\n if (usesJsonValue) {\n imports.push({ specifier: './scalars', names: ['JsonValue'] });\n }\n for (const [entity, names] of siblings) {\n imports.push({ specifier: `./${entity}.type`, names: [...names] });\n }\n return imports\n .sort((left, right) => left.specifier.localeCompare(right.specifier))\n .map(\n ({ specifier, names }) =>\n `import type { ${names.sort((left, right) => left.localeCompare(right)).join(', ')} } from '${specifier}';`,\n )\n .join('\\n');\n}\n\n/** Render an entity's complete variant/family matrix. */\nexport function emitEntity(\n source: SourceIR,\n entity: Entity,\n logger?: Logger,\n): string {\n const usedEnums = new Set<string>();\n const usedAliases = new Set<string>();\n const usedEntityRefs = new Set<string>();\n let usesJsonValue = false;\n const usedFilters = new Set<string>();\n const siblings = new Map<string, Set<string>>();\n\n for (const field of entity.fields) {\n const dependencies = collectTypeDependencies(field.type, source, entity);\n for (const name of dependencies.enums) usedEnums.add(name);\n for (const name of dependencies.aliases) usedAliases.add(name);\n for (const name of dependencies.entityRefs) usedEntityRefs.add(name);\n usesJsonValue ||= dependencies.usesJsonValue;\n }\n\n const trackSibling = (target: string, name: string): void => {\n if (target === entity.name) return;\n const names = siblings.get(target) ?? new Set<string>();\n names.add(name);\n siblings.set(target, names);\n };\n\n for (const ref of usedEntityRefs) {\n trackSibling(ref, typeName(ref));\n }\n\n const relation = (\n relationIndex: number,\n variant: VariantName,\n ): RelationMember | null => {\n const current = entity.relations[relationIndex];\n if (current === undefined) return null;\n const member = relationMember(current, 'deep', variant, {\n fromNamespace: source.namespace,\n logger,\n });\n if (member !== null) {\n trackSibling(\n current.target.entity,\n typeName(current.target.entity, VARIANT_TOKEN[variant], 'Deep'),\n );\n }\n return member;\n };\n\n const blocks: string[] = [];\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n const name = typeName(\n entity.name,\n VARIANT_TOKEN[variant],\n FAMILY_TOKEN[family],\n );\n if (variant === 'where') {\n blocks.push(renderWhere(name, family));\n } else if (variant === 'select') {\n blocks.push(renderSelect(name, family));\n } else {\n blocks.push(renderRecord(name, variant, family));\n }\n }\n }\n\n const imports = importsFor(\n usedEnums,\n usedAliases,\n usedFilters,\n usesJsonValue,\n siblings,\n );\n return `${[imports, '', ...blocks].join('\\n\\n').trim()}\\n`;\n\n function renderRecord(\n name: string,\n variant: Exclude<VariantName, 'where' | 'select'>,\n family: FamilyName,\n ): string {\n const own = variantFields(entity, variant).map((selection) =>\n memberLine(\n selection.field,\n { optional: variant === 'update' ? false : selection.optional },\n source,\n entity,\n ),\n );\n const relations: string[] = [];\n if (family === 'deep') {\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n const member = relation(index, variant);\n if (current !== undefined && member !== null) {\n relations.push(relationLine(current.name, member));\n }\n }\n }\n\n if (variant === 'update') {\n const base = `Partial<{\\n${own.join('\\n')}\\n}>`;\n return relations.length === 0\n ? `export type ${name} = ${base};`\n : `export type ${name} = ${base} & {\\n${relations.join('\\n')}\\n};`;\n }\n return typeBlock(name, [...own, ...relations]);\n }\n\n function renderWhere(name: string, family: FamilyName): string {\n const members: string[] = [];\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter === null) continue;\n usedFilters.add(filter);\n members.push(` ${field.name}?: ${filter};`);\n }\n if (family === 'deep') {\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n const member = relation(index, 'where');\n if (current !== undefined && member !== null) {\n members.push(relationLine(current.name, member));\n }\n }\n }\n members.push(\n ` AND?: ${name} | ${name}[];`,\n ` OR?: ${name} | ${name}[];`,\n ` NOT?: ${name} | ${name}[];`,\n );\n return typeBlock(name, members);\n }\n\n function renderSelect(name: string, family: FamilyName): string {\n const members = entity.fields.map((field) => ` ${field.name}?: boolean;`);\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n if (current === undefined) continue;\n if (family === 'flat') {\n members.push(` ${current.name}?: boolean;`);\n continue;\n }\n const member = relation(index, 'select');\n members.push(\n member === null\n ? ` ${current.name}?: boolean;`\n : relationLine(current.name, member),\n );\n }\n return typeBlock(name, members);\n }\n}\n","/** Shared Prisma-style Where filter interfaces. */\nimport type { SourceIR } from '@kurotako/ir';\nimport { scalarTsType } from '@kurotako/ir';\nimport { enumTypeName } from '../names.js';\nimport { filterClass } from '../render/variants.js';\n\nconst EQUALITY_OPS = ['equals', 'not'] as const;\nconst LIST_OPS = ['in', 'notIn'] as const;\nconst ORDER_OPS = ['lt', 'lte', 'gt', 'gte'] as const;\nconst STRING_OPS = ['contains', 'startsWith', 'endsWith'] as const;\nconst SCALAR_FILTER_ORDER = [\n 'StringFilter',\n 'IntFilter',\n 'FloatFilter',\n 'BigIntFilter',\n 'DateTimeFilter',\n 'BoolFilter',\n] as const;\n\ntype ScalarFilter = (typeof SCALAR_FILTER_ORDER)[number];\n\n/** Collect the public filter interface identifiers emitted for a source. */\nexport function collectFilterNames(source: SourceIR): Set<string> {\n const names = new Set<string>();\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter !== null) names.add(filter);\n }\n }\n return names;\n}\n\nfunction baseType(name: ScalarFilter): string {\n switch (name) {\n case 'StringFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'string' });\n case 'IntFilter':\n case 'FloatFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'int' });\n case 'BigIntFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'bigint' });\n case 'DateTimeFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'datetime' });\n case 'BoolFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'boolean' });\n }\n}\n\nfunction operations(name: string): readonly string[] {\n if (name === 'BoolFilter') return EQUALITY_OPS;\n if (name === 'StringFilter') {\n return [...EQUALITY_OPS, ...LIST_OPS, ...ORDER_OPS, ...STRING_OPS];\n }\n return [...EQUALITY_OPS, ...LIST_OPS, ...ORDER_OPS];\n}\n\nfunction emitInterface(\n name: string,\n type: string,\n ops: readonly string[],\n): string {\n const members = ops.map((operation) => {\n const list = (LIST_OPS as readonly string[]).includes(operation);\n return ` ${operation}?: ${list ? `${type}[]` : type};`;\n });\n return `export interface ${name} {\\n${members.join('\\n')}\\n}`;\n}\n\n/** Emit only the direct scalar and enum classes used by a source's fields. */\nexport function emitFilters(source: SourceIR): string {\n const scalars = new Set<string>();\n const enums = new Set<string>();\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter === null) continue;\n if (field.type.kind === 'enum') enums.add(field.type.ref);\n else scalars.add(filter);\n }\n }\n\n const enumNames = [...enums].sort((left, right) => left.localeCompare(right));\n const blocks: string[] = [];\n for (const name of SCALAR_FILTER_ORDER) {\n if (scalars.has(name))\n blocks.push(emitInterface(name, baseType(name), operations(name)));\n }\n for (const name of enumNames) {\n blocks.push(\n emitInterface(`Enum${name}Filter`, enumTypeName(name), [\n ...EQUALITY_OPS,\n ...LIST_OPS,\n ]),\n );\n }\n\n const imports =\n enumNames.length === 0\n ? ''\n : `import type { ${enumNames.map(enumTypeName).join(', ')} } from './enums';\\n\\n`;\n return blocks.length === 0\n ? 'export {};\\n'\n : `${imports}${blocks.join('\\n\\n')}\\n`;\n}\n","/** The JsonValue helper emitted when at least one field needs it. */\nexport function emitScalars(): string {\n return `export type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n`;\n}\n"],"mappings":"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","names":["scalarTsType","scalarTsType"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/generator.ts","../src/artifact.ts","../src/names.ts","../src/emit/enums.ts","../src/render/scalars.ts","../src/emit/aliases.ts","../src/emit/barrel.ts","../src/render/jsdoc.ts","../src/render/field.ts","../src/render/relations.ts","../src/render/variants.ts","../src/emit/entity.ts","../src/emit/filters.ts","../src/emit/scalars.ts"],"sourcesContent":["/**\n * `@kurotako/gen-typescript` error classes.\n *\n * Codes: `typescript_alias_cycle`, `typescript_alias_public_name_collision`,\n * `typescript_enum_collision`, `typescript_enum_public_name_collision`.\n */\nexport class TypeScriptGenError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n this.code = code;\n }\n}\n\n/**\n * Source aliases in a direct `ref` cycle cannot be represented by the emitted\n * pure TypeScript aliases.\n */\nexport class TypeScriptAliasCycleError extends TypeScriptGenError {\n readonly namespace: string;\n readonly aliasNames: string[];\n\n constructor(namespace: string, aliasNames: readonly string[]) {\n const sortedNames = [...aliasNames].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_alias_cycle',\n `source type aliases ${sortedNames.map((name) => `'${name}'`).join(', ')} form a direct reference cycle in namespace '${namespace}'; pure TypeScript aliases cannot represent it`,\n );\n this.namespace = namespace;\n this.aliasNames = sortedNames;\n }\n}\n\n/** Source aliases cannot reuse a public identifier emitted by this generator. */\nexport class TypeScriptAliasPublicNameCollisionError extends TypeScriptGenError {\n readonly namespace: string;\n readonly names: string[];\n\n constructor(namespace: string, names: readonly string[]) {\n const sortedNames = [...names].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_alias_public_name_collision',\n `source type aliases ${sortedNames.map((name) => `'${name}'`).join(', ')} collide with generated public identifiers in namespace '${namespace}'; rename one of the conflicting source definitions`,\n );\n this.namespace = namespace;\n this.names = sortedNames;\n }\n}\n\n/** An enum cannot reuse a non-enum identifier exported from the namespace barrel. */\nexport class TypeScriptEnumPublicNameCollisionError extends TypeScriptGenError {\n readonly namespace: string;\n readonly names: string[];\n\n constructor(namespace: string, names: readonly string[]) {\n const sortedNames = [...names].sort((left, right) =>\n left.localeCompare(right),\n );\n super(\n 'typescript_enum_public_name_collision',\n `source enums ${sortedNames.map((name) => `'${name}'`).join(', ')} collide with other public identifiers in namespace '${namespace}'; rename one of the conflicting source definitions`,\n );\n this.namespace = namespace;\n this.names = sortedNames;\n }\n}\n\n/**\n * Two distinct `EnumDef`s reachable in one source share a name. Names both\n * origins so the schema author can resolve the collision.\n */\nexport class TypeScriptEnumCollisionError extends TypeScriptGenError {\n readonly enumName: string;\n readonly firstOrigin: string;\n readonly secondOrigin: string;\n\n constructor(enumName: string, firstOrigin: string, secondOrigin: string) {\n super(\n 'typescript_enum_collision',\n `enum '${enumName}' is defined twice with different values (${firstOrigin} vs ${secondOrigin}); ` +\n 'rename one of them in the source schema',\n );\n this.enumName = enumName;\n this.firstOrigin = firstOrigin;\n this.secondOrigin = secondOrigin;\n }\n}\n","/** `typescriptGenerator` — emits pure TypeScript declarations from the IR. */\nimport { defineGenerator } from '@kurotako/config';\nimport type { GenerateContext, GenOutput, VirtualFile } from '@kurotako/core';\nimport { buildArtifact } from './artifact.js';\nimport { emitAliases } from './emit/aliases.js';\nimport { emitBarrel } from './emit/barrel.js';\nimport { emitEntity } from './emit/entity.js';\nimport { collectEnums, emitEnums } from './emit/enums.js';\nimport { collectFilterNames, emitFilters } from './emit/filters.js';\nimport { emitScalars } from './emit/scalars.js';\nimport {\n TypeScriptAliasCycleError,\n TypeScriptAliasPublicNameCollisionError,\n TypeScriptEnumPublicNameCollisionError,\n} from './errors.js';\nimport {\n FAMILIES,\n FAMILY_TOKEN,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n} from './names.js';\nimport { collectTypeDependencies } from './render/scalars.js';\n\nfunction sourceUsesJsonValue(\n source: GenerateContext['ir']['sources'][string],\n): boolean {\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n if (collectTypeDependencies(field.type, source, entity).usesJsonValue) {\n return true;\n }\n }\n }\n for (const alias of Object.values(source.typeAliases ?? {})) {\n if (collectTypeDependencies(alias.type, source, undefined).usesJsonValue) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Return aliases that participate in an alias-only `ref` cycle. A cycle passing\n * through an entity is valid TypeScript because the entity emits a structural\n * object type; bare aliases have no such structure to break the recursion.\n */\nfunction cyclicAliasNames(\n source: GenerateContext['ir']['sources'][string],\n cycles: GenerateContext['cycles'],\n): string[] {\n const aliases = source.typeAliases ?? {};\n const candidates = Object.keys(aliases).filter((name) =>\n cycles.has(`${source.namespace}.${name}`),\n );\n const candidateSet = new Set(candidates);\n const references = new Map<string, string[]>();\n\n for (const name of candidates) {\n const alias = aliases[name];\n if (alias === undefined) continue;\n const dependencies = collectTypeDependencies(alias.type, source, undefined);\n references.set(\n name,\n [...dependencies.aliases].filter((dependency) =>\n candidateSet.has(dependency),\n ),\n );\n }\n\n const reachesSelf = (start: string, current: string, seen: Set<string>) => {\n for (const next of references.get(current) ?? []) {\n if (next === start) return true;\n if (!seen.has(next)) {\n seen.add(next);\n if (reachesSelf(start, next, seen)) return true;\n }\n }\n return false;\n };\n\n return candidates.filter((name) => reachesSelf(name, name, new Set([name])));\n}\n\n/** Public barrel identifiers, separated by their enum, generated, and alias origins. */\nfunction generatedPublicNames(\n source: GenerateContext['ir']['sources'][string],\n): {\n enumNames: Set<string>;\n generatedTypeNames: Set<string>;\n aliasNames: Set<string>;\n} {\n // An enum's const and type intentionally share one identifier in TypeScript's\n // separate value and type namespaces, so it is recorded only once here.\n const enumNames = new Set(collectEnums(source).map(({ name }) => name));\n const generatedTypeNames = new Set<string>();\n\n for (const entity of Object.values(source.entities)) {\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n generatedTypeNames.add(\n typeName(entity.name, VARIANT_TOKEN[variant], FAMILY_TOKEN[family]),\n );\n }\n }\n }\n\n for (const name of collectFilterNames(source)) generatedTypeNames.add(name);\n if (sourceUsesJsonValue(source)) generatedTypeNames.add('JsonValue');\n return {\n enumNames,\n generatedTypeNames,\n aliasNames: new Set(Object.keys(source.typeAliases ?? {})),\n };\n}\n\nfunction validateSourceEmission(\n source: GenerateContext['ir']['sources'][string],\n cycles: GenerateContext['cycles'],\n): void {\n const aliasesInCycles = cyclicAliasNames(source, cycles);\n if (aliasesInCycles.length > 0) {\n throw new TypeScriptAliasCycleError(source.namespace, aliasesInCycles);\n }\n\n const { enumNames, generatedTypeNames, aliasNames } =\n generatedPublicNames(source);\n const aliasCollisions = [...aliasNames].filter(\n (name) => enumNames.has(name) || generatedTypeNames.has(name),\n );\n if (aliasCollisions.length > 0) {\n throw new TypeScriptAliasPublicNameCollisionError(\n source.namespace,\n aliasCollisions,\n );\n }\n\n const enumCollisions = [...enumNames].filter(\n (name) => generatedTypeNames.has(name) || aliasNames.has(name),\n );\n if (enumCollisions.length > 0) {\n throw new TypeScriptEnumPublicNameCollisionError(\n source.namespace,\n enumCollisions,\n );\n }\n}\n\n/** Pure, synchronous generator with no runtime dependency on generated code. */\nexport const typescriptGenerator = defineGenerator({\n name: 'typescript',\n\n generate(ctx: GenerateContext): GenOutput {\n const files: VirtualFile[] = [];\n for (const [namespace, source] of Object.entries(ctx.ir.sources)) {\n validateSourceEmission(source, ctx.cycles);\n const prefix = `${namespace}/typescript`;\n const emitsScalars = sourceUsesJsonValue(source);\n if (emitsScalars) {\n files.push({ path: `${prefix}/scalars.ts`, content: emitScalars() });\n }\n files.push({ path: `${prefix}/enums.ts`, content: emitEnums(source) });\n if (Object.keys(source.entities).length > 0) {\n files.push({\n path: `${prefix}/filters.ts`,\n content: emitFilters(source),\n });\n }\n if (Object.keys(source.typeAliases ?? {}).length > 0) {\n files.push({\n path: `${prefix}/aliases.ts`,\n content: emitAliases(source),\n });\n }\n for (const entity of Object.values(source.entities)) {\n files.push({\n path: `${prefix}/${entity.name}.type.ts`,\n content: emitEntity(source, entity, ctx.logger),\n });\n }\n files.push({\n path: `${prefix}/index.ts`,\n content: emitBarrel(\n source,\n emitsScalars,\n Object.keys(source.typeAliases ?? {}).length > 0,\n ),\n });\n }\n return { files, artifact: buildArtifact(ctx.ir) };\n },\n});\n","/** Assemble the TypeScript generator's full artifact symbol matrix. */\nimport type { EntitySymbols, GeneratorArtifact } from '@kurotako/core';\nimport type { IR } from '@kurotako/ir';\nimport { iterEntities } from '@kurotako/ir';\nimport { collectEnums } from './emit/enums.js';\nimport {\n barrelModule,\n entityModule,\n enumConst,\n enumsModule,\n enumTypeName,\n FAMILIES,\n FAMILY_TOKEN,\n type FamilyName,\n filtersModule,\n scalarsModule,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n type VariantName,\n} from './names.js';\n\nexport interface TypeScriptArtifactExtra {\n families: ['flat', 'deep'];\n variants: ['full', 'create', 'update', 'where', 'select'];\n perNamespace: Record<\n string,\n {\n barrelModule: string;\n filtersModule: string;\n scalarsModule: string;\n enums: Record<\n string,\n { constName: string; typeName: string; module: string }\n >;\n }\n >;\n}\n\nfunction roleStem(variant: VariantName, family: FamilyName): string {\n const variantStem = variant === 'full' ? '' : variant;\n return family === 'flat'\n ? variantStem\n : variantStem === ''\n ? 'deep'\n : `${variantStem}Deep`;\n}\n\nfunction entitySymbols(name: string): Record<string, string> {\n const symbols: Record<string, string> = {};\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n const stem = roleStem(variant, family);\n const key = stem === '' ? 'type' : `${stem}Type`;\n symbols[key] = typeName(\n name,\n VARIANT_TOKEN[variant],\n FAMILY_TOKEN[family],\n );\n }\n }\n return symbols;\n}\n\n/** Build the consumable metadata independently of file emission. */\nexport function buildArtifact(ir: IR): GeneratorArtifact {\n const entities: Record<string, EntitySymbols> = {};\n for (const { namespace, entity } of iterEntities(ir)) {\n entities[`${namespace}.${entity.name}`] = {\n module: entityModule(namespace, entity.name),\n symbols: entitySymbols(entity.name),\n };\n }\n\n const perNamespace: TypeScriptArtifactExtra['perNamespace'] = {};\n for (const [namespace, source] of Object.entries(ir.sources)) {\n const enums: TypeScriptArtifactExtra['perNamespace'][string]['enums'] = {};\n for (const definition of collectEnums(source)) {\n enums[definition.name] = {\n constName: enumConst(definition.name),\n typeName: enumTypeName(definition.name),\n module: enumsModule(namespace),\n };\n }\n perNamespace[namespace] = {\n barrelModule: barrelModule(namespace),\n filtersModule: filtersModule(namespace),\n scalarsModule: scalarsModule(namespace),\n enums,\n };\n }\n\n return {\n entities,\n extra: {\n families: ['flat', 'deep'],\n variants: ['full', 'create', 'update', 'where', 'select'],\n perNamespace,\n } satisfies TypeScriptArtifactExtra,\n };\n}\n","/**\n * Deterministic identifier and module-specifier helpers.\n *\n * Identifiers are never namespace-prefixed; the namespace only drives the\n * `typescript/` output sub-tree.\n */\n\n/** PascalCase variant token embedded in a type identifier. */\nexport type Variant = '' | 'Create' | 'Update' | 'Where' | 'Select';\n\n/** Relation family token embedded in a type identifier. */\nexport type Family = '' | 'Deep';\n\n/** The five variant names, in their fixed order. */\nexport const VARIANTS = [\n 'full',\n 'create',\n 'update',\n 'where',\n 'select',\n] as const;\nexport type VariantName = (typeof VARIANTS)[number];\n\n/** The two relation families, in their fixed order. */\nexport const FAMILIES = ['flat', 'deep'] as const;\nexport type FamilyName = (typeof FAMILIES)[number];\n\n/** `VariantName` -> the PascalCase token used inside identifiers. */\nexport const VARIANT_TOKEN: Record<VariantName, Variant> = {\n full: '',\n create: 'Create',\n update: 'Update',\n where: 'Where',\n select: 'Select',\n};\n\n/** `FamilyName` -> the token used inside identifiers. */\nexport const FAMILY_TOKEN: Record<FamilyName, Family> = {\n flat: '',\n deep: 'Deep',\n};\n\n/** `${Entity}${Variant}${Family}Dto`. */\nexport function typeName(\n entity: string,\n variant: Variant = '',\n family: Family = '',\n): string {\n return `${entity}${variant}${family}Dto`;\n}\n\n/** Enum `const` array identifier — the resolved `EnumDef` name verbatim. */\nexport function enumConst(name: string): string {\n return name;\n}\n\n/** Enum type alias — shares the name with `enumConst` in TypeScript's type namespace. */\nexport function enumTypeName(name: string): string {\n return name;\n}\n\n// --- module specifiers (POSIX, extension-less) -------------------------------\n\n/** `${ns}/typescript/${entity}.type`. */\nexport function entityModule(namespace: string, entity: string): string {\n return `${namespace}/typescript/${entity}.type`;\n}\n\n/** `${ns}/typescript/enums`. */\nexport function enumsModule(namespace: string): string {\n return `${namespace}/typescript/enums`;\n}\n\n/** `${ns}/typescript/filters`. */\nexport function filtersModule(namespace: string): string {\n return `${namespace}/typescript/filters`;\n}\n\n/** `${ns}/typescript/scalars`. */\nexport function scalarsModule(namespace: string): string {\n return `${namespace}/typescript/scalars`;\n}\n\n/** `${ns}/typescript` — this generator's own barrel. */\nexport function barrelModule(namespace: string): string {\n return `${namespace}/typescript`;\n}\n","/** Source enums -> the shared enums.ts module. */\nimport type { EnumDef, SourceIR } from '@kurotako/ir';\nimport { TypeScriptEnumCollisionError } from '../errors.js';\nimport { enumConst, enumTypeName } from '../names.js';\n\nfunction sameValues(a: EnumDef, b: EnumDef): boolean {\n const left = a.values.map((value) => value.name);\n const right = b.values.map((value) => value.name);\n return (\n left.length === right.length && left.every((value, i) => value === right[i])\n );\n}\n\n/** All reachable definitions, deduplicated and sorted by their identifier. */\nexport function collectEnums(source: SourceIR): EnumDef[] {\n const byName = new Map<string, { definition: EnumDef; origin: string }>();\n const add = (definition: EnumDef, origin: string): void => {\n const previous = byName.get(definition.name);\n if (previous === undefined) {\n byName.set(definition.name, { definition, origin });\n } else if (!sameValues(previous.definition, definition)) {\n throw new TypeScriptEnumCollisionError(\n definition.name,\n previous.origin,\n origin,\n );\n }\n };\n\n for (const definition of Object.values(source.enums))\n add(definition, 'source-level');\n for (const entity of Object.values(source.entities)) {\n for (const definition of Object.values(entity.enums ?? {})) {\n add(definition, `entity '${entity.name}'`);\n }\n }\n\n return [...byName.values()]\n .map(({ definition }) => definition)\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\n/** Emit type/value enum pairs, which legally share an identifier in TypeScript. */\nexport function emitEnums(source: SourceIR): string {\n const blocks = collectEnums(source).map((definition) => {\n const values = definition.values\n .map((value) => JSON.stringify(value.name))\n .join(', ');\n const name = enumConst(definition.name);\n return `export const ${name} = [${values}] as const;\\nexport type ${enumTypeName(definition.name)} = (typeof ${name})[number];`;\n });\n return blocks.length === 0 ? 'export {};\\n' : `${blocks.join('\\n\\n')}\\n`;\n}\n","/** Field types -> bare TypeScript type strings and their emitted dependencies. */\nimport type { Entity, Field, FieldType, SourceIR } from '@kurotako/ir';\nimport { flattenUnion, resolveEnum, scalarTsType } from '@kurotako/ir';\nimport { typeName } from '../names.js';\n\nexport interface TypeDependencies {\n enums: Set<string>;\n entityRefs: Set<string>;\n aliases: Set<string>;\n usesJsonValue: boolean;\n}\n\nfunction emptyDependencies(): TypeDependencies {\n return {\n enums: new Set(),\n entityRefs: new Set(),\n aliases: new Set(),\n usesJsonValue: false,\n };\n}\n\n/** Collect imports required by a field type, including refs nested in unions. */\nexport function collectTypeDependencies(\n type: FieldType,\n source: SourceIR,\n entity: Entity | undefined,\n into: TypeDependencies = emptyDependencies(),\n): TypeDependencies {\n switch (type.kind) {\n case 'enum': {\n const definition = resolveEnum(source, entity, type.ref);\n into.enums.add(definition?.name ?? type.ref);\n break;\n }\n case 'ref':\n if (source.entities[type.ref] !== undefined) {\n into.entityRefs.add(type.ref);\n } else if (source.typeAliases?.[type.ref] !== undefined) {\n into.aliases.add(type.ref);\n }\n break;\n case 'scalar':\n if (scalarTsType(type) === 'JsonValue') {\n into.usesJsonValue = true;\n }\n break;\n case 'union':\n for (const variant of type.variants) {\n collectTypeDependencies(variant, source, entity, into);\n }\n break;\n case 'map':\n collectTypeDependencies(type.value, source, entity, into);\n break;\n case 'array':\n collectTypeDependencies(type.element, source, entity, into);\n break;\n case 'unknown':\n break;\n }\n return into;\n}\n\n/**\n * Render a `FieldType` recursively. Entity refs name their emitted flat DTO;\n * type-alias refs retain their declared name from the source alias registry.\n */\nexport function renderFieldType(type: FieldType, source: SourceIR): string {\n switch (type.kind) {\n case 'ref':\n return source.entities[type.ref] !== undefined\n ? typeName(type.ref)\n : type.ref;\n case 'union': {\n const variants = flattenUnion(type);\n return variants.length === 0\n ? 'unknown'\n : variants\n .map((variant) =>\n variant.kind === 'union'\n ? `(${renderFieldType(variant, source)})`\n : renderFieldType(variant, source),\n )\n .join(' | ');\n }\n case 'map':\n return `Record<string, ${renderFieldType(type.value, source)}>`;\n case 'array':\n return type.element.kind === 'union'\n ? `(${renderFieldType(type.element, source)})[]`\n : `${renderFieldType(type.element, source)}[]`;\n case 'scalar':\n case 'enum':\n case 'unknown':\n return scalarTsType(type);\n }\n}\n\n/** The non-list, non-nullable type for a field. */\nexport function fieldTsType(\n field: Field,\n source: SourceIR,\n entity: Entity,\n): string {\n collectTypeDependencies(field.type, source, entity);\n return renderFieldType(field.type, source);\n}\n","/** Source type aliases -> the shared aliases.ts declaration module. */\nimport type { SourceIR } from '@kurotako/ir';\nimport { typeName } from '../names.js';\nimport { collectTypeDependencies, renderFieldType } from '../render/scalars.js';\n\n/** Emit source aliases and imports for their external entity/enum dependencies. */\nexport function emitAliases(source: SourceIR): string {\n const aliases = Object.values(source.typeAliases ?? {});\n const enums = new Set<string>();\n const entityRefs = new Set<string>();\n let usesJsonValue = false;\n\n for (const alias of aliases) {\n const dependencies = collectTypeDependencies(alias.type, source, undefined);\n for (const name of dependencies.enums) enums.add(name);\n for (const name of dependencies.entityRefs) entityRefs.add(name);\n usesJsonValue ||= dependencies.usesJsonValue;\n }\n\n const imports: Array<{ specifier: string; names: string[] }> = [];\n if (enums.size > 0) {\n imports.push({ specifier: './enums', names: [...enums] });\n }\n if (usesJsonValue) {\n imports.push({ specifier: './scalars', names: ['JsonValue'] });\n }\n for (const ref of entityRefs) {\n imports.push({\n specifier: `./${ref}.type`,\n names: [typeName(ref)],\n });\n }\n\n const blocks = aliases.map((alias) => {\n const doc = alias.doc === undefined ? '' : `/** ${alias.doc} */\\n`;\n return `${doc}export type ${alias.name} = ${renderFieldType(alias.type, source)};`;\n });\n const importBlock = imports\n .sort((left, right) => left.specifier.localeCompare(right.specifier))\n .map(\n ({ specifier, names }) =>\n `import type { ${names.sort((left, right) => left.localeCompare(right)).join(', ')} } from '${specifier}';`,\n )\n .join('\\n');\n\n return `${[importBlock, ...blocks].filter((block) => block !== '').join('\\n\\n')}\\n`;\n}\n","/** This generator's per-namespace barrel. */\nimport type { SourceIR } from '@kurotako/ir';\n\n/** Re-export every emitted shared and entity declaration module. */\nexport function emitBarrel(\n source: SourceIR,\n emitsScalars: boolean,\n emitsAliases = Object.keys(source.typeAliases ?? {}).length > 0,\n): string {\n const lines: string[] = [];\n if (emitsScalars) lines.push(\"export type * from './scalars';\");\n lines.push(\"export * from './enums';\");\n if (emitsAliases) lines.push(\"export type * from './aliases';\");\n if (Object.keys(source.entities).length > 0) {\n lines.push(\"export type * from './filters';\");\n }\n for (const entity of Object.values(source.entities)) {\n lines.push(`export type * from './${entity.name}.type';`);\n }\n return `${lines.join('\\n')}\\n`;\n}\n","/** Field documentation and constraints -> an optional JSDoc block. */\nimport type { Field } from '@kurotako/ir';\n\n/** Render documentation-only metadata in a stable, human-readable order. */\nexport function jsDoc(field: Field): string {\n const tags: string[] = [];\n const constraints = field.constraints;\n\n if (constraints.min !== undefined) tags.push(`@min ${constraints.min}`);\n if (constraints.max !== undefined) tags.push(`@max ${constraints.max}`);\n if (constraints.minLength !== undefined) {\n tags.push(`@minLength ${constraints.minLength}`);\n }\n if (constraints.maxLength !== undefined) {\n tags.push(`@maxLength ${constraints.maxLength}`);\n }\n if (constraints.regex !== undefined) {\n tags.push(`@pattern ${constraints.regex}`);\n }\n if (constraints.format !== undefined) {\n tags.push(`@format ${constraints.format}`);\n }\n if (constraints.unique) tags.push('@unique');\n if (field.default?.kind === 'value') {\n tags.push(`@default ${JSON.stringify(field.default.value)}`);\n }\n if (field.type.kind === 'unknown') {\n tags.push(\n field.type.hint === undefined\n ? '@see unknown'\n : `@see unknown: ${field.type.hint}`,\n );\n }\n\n const prose = field.doc?.split('\\n') ?? [];\n if (prose.length === 0 && tags.length === 0) {\n return '';\n }\n\n const lines = [...prose];\n if (prose.length > 0 && tags.length > 0) lines.push('');\n lines.push(...tags);\n return ['/**', ...lines.map((line) => ` * ${line}`), ' */'].join('\\n');\n}\n","/** Assemble scalar and enum fields into TypeScript object members. */\nimport type { Entity, Field, SourceIR } from '@kurotako/ir';\nimport { jsDoc } from './jsdoc.js';\nimport { fieldTsType } from './scalars.js';\n\nexport interface MemberLineOptions {\n optional: boolean;\n}\n\n/** Render one field member, including documentation and list/null wrappers. */\nexport function memberLine(\n field: Field,\n opts: MemberLineOptions,\n source: SourceIR,\n entity: Entity,\n): string {\n let type = fieldTsType(field, source, entity);\n if (field.list) {\n if (type.includes(' | ')) type = `(${type})`;\n type = `${type}[]`;\n }\n if (field.nullable) type = `${type} | null`;\n\n const member = ` ${field.name}${opts.optional ? '?' : ''}: ${type};`;\n const doc = jsDoc(field);\n const indentedDoc = doc\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n return doc === '' ? member : `${indentedDoc}\\n${member}`;\n}\n","/** Flat versus deep relation members. */\nimport type { Logger } from '@kurotako/core';\nimport type { Relation } from '@kurotako/ir';\nimport { isCrossSource } from '@kurotako/ir';\nimport {\n type FamilyName,\n typeName,\n VARIANT_TOKEN,\n type VariantName,\n} from '../names.js';\n\nexport interface RelationMember {\n type: string;\n optional: boolean;\n}\n\nexport interface RelationMemberOptions {\n fromNamespace: string;\n logger?: Logger;\n}\n\n/**\n * Render a relation member for the deep family. Cross-source links deliberately\n * stay flat because v1 has no stable cross-namespace module mapping.\n */\nexport function relationMember(\n relation: Relation,\n family: FamilyName,\n variant: VariantName,\n opts: RelationMemberOptions,\n): RelationMember | null {\n if (family === 'flat') return null;\n if (isCrossSource(opts.fromNamespace, relation)) {\n opts.logger?.debug(\n `gen-typescript: relation '${relation.name}' targets another source ('${relation.target.namespace}.${relation.target.entity}'); degrading to the FK id (flat) in the deep family`,\n );\n return null;\n }\n\n const target = relation.target.entity;\n const many = relation.cardinality === 'many';\n if (variant === 'where') {\n const dto = typeName(target, 'Where', 'Deep');\n return {\n type: many ? `{ some?: ${dto}; every?: ${dto}; none?: ${dto} }` : dto,\n optional: true,\n };\n }\n if (variant === 'select') {\n return {\n type: `boolean | ${typeName(target, 'Select', 'Deep')}`,\n optional: true,\n };\n }\n\n return {\n type: many\n ? `${typeName(target, VARIANT_TOKEN[variant], 'Deep')}[]`\n : typeName(target, VARIANT_TOKEN[variant], 'Deep'),\n optional: relation.optional || many || variant === 'update',\n };\n}\n","/** Shared payload field selection and Where-filter classification. */\nimport type { Entity, Field } from '@kurotako/ir';\nimport { createFields, isCreateOptional, updateFields } from '@kurotako/ir';\nimport type { VariantName } from '../names.js';\n\nexport interface FieldSelection {\n field: Field;\n optional: boolean;\n}\n\n/** The scalar/enum fields included by a generated type variant. */\nexport function variantFields(\n entity: Entity,\n variant: VariantName,\n): FieldSelection[] {\n switch (variant) {\n case 'full':\n return entity.fields.map((field) => ({\n field,\n optional: field.optional,\n }));\n case 'create':\n return createFields(entity).map((field) => ({\n field,\n optional: isCreateOptional(field),\n }));\n case 'update':\n return updateFields(entity).map((field) => ({ field, optional: true }));\n case 'where':\n case 'select':\n return entity.fields.map((field) => ({ field, optional: true }));\n }\n}\n\n/** The Where filter type for a direct scalar or enum field. */\nexport function filterClass(field: Field): string | null {\n if (field.type.kind === 'enum') return `Enum${field.type.ref}Filter`;\n if (field.type.kind !== 'scalar') return null;\n\n switch (field.type.scalar) {\n case 'string':\n case 'uuid':\n case 'decimal':\n case 'bytes':\n return 'StringFilter';\n case 'int':\n return 'IntFilter';\n case 'float':\n return 'FloatFilter';\n case 'bigint':\n return 'BigIntFilter';\n case 'boolean':\n return 'BoolFilter';\n case 'date':\n case 'datetime':\n return 'DateTimeFilter';\n case 'json':\n return null;\n }\n}\n","/** One entity -> its ten flat/deep TypeScript declaration variants. */\nimport type { Logger } from '@kurotako/core';\nimport type { Entity, SourceIR } from '@kurotako/ir';\nimport {\n FAMILIES,\n FAMILY_TOKEN,\n type FamilyName,\n typeName,\n VARIANT_TOKEN,\n VARIANTS,\n type VariantName,\n} from '../names.js';\nimport { memberLine } from '../render/field.js';\nimport { type RelationMember, relationMember } from '../render/relations.js';\nimport { collectTypeDependencies, renderFieldType } from '../render/scalars.js';\nimport { filterClass, variantFields } from '../render/variants.js';\n\nfunction typeBlock(name: string, members: string[]): string {\n return `export type ${name} = {\\n${members.join('\\n')}\\n};`;\n}\n\nfunction relationLine(name: string, member: RelationMember): string {\n return ` ${name}${member.optional ? '?' : ''}: ${member.type};`;\n}\n\n/** Emit a type-only, specifier-sorted import block. */\nfunction importsFor(\n enums: Set<string>,\n aliases: Set<string>,\n filters: Set<string>,\n usesJsonValue: boolean,\n siblings: Map<string, Set<string>>,\n): string {\n const imports: Array<{ specifier: string; names: string[] }> = [];\n if (aliases.size > 0) {\n imports.push({ specifier: './aliases', names: [...aliases] });\n }\n if (enums.size > 0) {\n imports.push({ specifier: './enums', names: [...enums] });\n }\n if (filters.size > 0) {\n imports.push({ specifier: './filters', names: [...filters] });\n }\n if (usesJsonValue) {\n imports.push({ specifier: './scalars', names: ['JsonValue'] });\n }\n for (const [entity, names] of siblings) {\n imports.push({ specifier: `./${entity}.type`, names: [...names] });\n }\n return imports\n .sort((left, right) => left.specifier.localeCompare(right.specifier))\n .map(\n ({ specifier, names }) =>\n `import type { ${names.sort((left, right) => left.localeCompare(right)).join(', ')} } from '${specifier}';`,\n )\n .join('\\n');\n}\n\n/** Render an entity's complete variant/family matrix. */\nexport function emitEntity(\n source: SourceIR,\n entity: Entity,\n logger?: Logger,\n): string {\n const usedEnums = new Set<string>();\n const usedAliases = new Set<string>();\n const usedEntityRefs = new Set<string>();\n let usesJsonValue = false;\n const usedFilters = new Set<string>();\n const siblings = new Map<string, Set<string>>();\n\n for (const field of entity.fields) {\n const dependencies = collectTypeDependencies(field.type, source, entity);\n for (const name of dependencies.enums) usedEnums.add(name);\n for (const name of dependencies.aliases) usedAliases.add(name);\n for (const name of dependencies.entityRefs) usedEntityRefs.add(name);\n usesJsonValue ||= dependencies.usesJsonValue;\n }\n\n const trackSibling = (target: string, name: string): void => {\n if (target === entity.name) return;\n const names = siblings.get(target) ?? new Set<string>();\n names.add(name);\n siblings.set(target, names);\n };\n\n for (const ref of usedEntityRefs) {\n trackSibling(ref, typeName(ref));\n }\n\n const relation = (\n relationIndex: number,\n variant: VariantName,\n ): RelationMember | null => {\n const current = entity.relations[relationIndex];\n if (current === undefined) return null;\n const member = relationMember(current, 'deep', variant, {\n fromNamespace: source.namespace,\n logger,\n });\n if (member !== null) {\n trackSibling(\n current.target.entity,\n typeName(current.target.entity, VARIANT_TOKEN[variant], 'Deep'),\n );\n }\n return member;\n };\n\n const blocks: string[] = [];\n for (const variant of VARIANTS) {\n for (const family of FAMILIES) {\n const name = typeName(\n entity.name,\n VARIANT_TOKEN[variant],\n FAMILY_TOKEN[family],\n );\n if (variant === 'where') {\n blocks.push(renderWhere(name, family));\n } else if (variant === 'select') {\n blocks.push(renderSelect(name, family));\n } else {\n blocks.push(renderRecord(name, variant, family));\n }\n }\n }\n\n const imports = importsFor(\n usedEnums,\n usedAliases,\n usedFilters,\n usesJsonValue,\n siblings,\n );\n return `${[imports, '', ...blocks].join('\\n\\n').trim()}\\n`;\n\n function renderRecord(\n name: string,\n variant: Exclude<VariantName, 'where' | 'select'>,\n family: FamilyName,\n ): string {\n const own = variantFields(entity, variant).map((selection) =>\n memberLine(\n selection.field,\n { optional: variant === 'update' ? false : selection.optional },\n source,\n entity,\n ),\n );\n if (entity.additionalProperties !== undefined) {\n const declared = variantFields(entity, variant)\n .map((selection) => renderFieldType(selection.field.type, source))\n .join(' | ');\n own.push(\n ` [key: string]: ${renderFieldType(entity.additionalProperties, source)}${declared === '' ? '' : ` | ${declared}`} | undefined;`,\n );\n }\n const relations: string[] = [];\n if (family === 'deep') {\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n const member = relation(index, variant);\n if (current !== undefined && member !== null) {\n relations.push(relationLine(current.name, member));\n }\n }\n }\n\n if (variant === 'update') {\n const base = `Partial<{\\n${own.join('\\n')}\\n}>`;\n return relations.length === 0\n ? `export type ${name} = ${base};`\n : `export type ${name} = ${base} & {\\n${relations.join('\\n')}\\n};`;\n }\n return typeBlock(name, [...own, ...relations]);\n }\n\n function renderWhere(name: string, family: FamilyName): string {\n const members: string[] = [];\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter === null) continue;\n usedFilters.add(filter);\n members.push(` ${field.name}?: ${filter};`);\n }\n if (family === 'deep') {\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n const member = relation(index, 'where');\n if (current !== undefined && member !== null) {\n members.push(relationLine(current.name, member));\n }\n }\n }\n members.push(\n ` AND?: ${name} | ${name}[];`,\n ` OR?: ${name} | ${name}[];`,\n ` NOT?: ${name} | ${name}[];`,\n );\n return typeBlock(name, members);\n }\n\n function renderSelect(name: string, family: FamilyName): string {\n const members = entity.fields.map((field) => ` ${field.name}?: boolean;`);\n for (let index = 0; index < entity.relations.length; index += 1) {\n const current = entity.relations[index];\n if (current === undefined) continue;\n if (family === 'flat') {\n members.push(` ${current.name}?: boolean;`);\n continue;\n }\n const member = relation(index, 'select');\n members.push(\n member === null\n ? ` ${current.name}?: boolean;`\n : relationLine(current.name, member),\n );\n }\n return typeBlock(name, members);\n }\n}\n","/** Shared Prisma-style Where filter interfaces. */\nimport type { SourceIR } from '@kurotako/ir';\nimport { scalarTsType } from '@kurotako/ir';\nimport { enumTypeName } from '../names.js';\nimport { filterClass } from '../render/variants.js';\n\nconst EQUALITY_OPS = ['equals', 'not'] as const;\nconst LIST_OPS = ['in', 'notIn'] as const;\nconst ORDER_OPS = ['lt', 'lte', 'gt', 'gte'] as const;\nconst STRING_OPS = ['contains', 'startsWith', 'endsWith'] as const;\nconst SCALAR_FILTER_ORDER = [\n 'StringFilter',\n 'IntFilter',\n 'FloatFilter',\n 'BigIntFilter',\n 'DateTimeFilter',\n 'BoolFilter',\n] as const;\n\ntype ScalarFilter = (typeof SCALAR_FILTER_ORDER)[number];\n\n/** Collect the public filter interface identifiers emitted for a source. */\nexport function collectFilterNames(source: SourceIR): Set<string> {\n const names = new Set<string>();\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter !== null) names.add(filter);\n }\n }\n return names;\n}\n\nfunction baseType(name: ScalarFilter): string {\n switch (name) {\n case 'StringFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'string' });\n case 'IntFilter':\n case 'FloatFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'int' });\n case 'BigIntFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'bigint' });\n case 'DateTimeFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'datetime' });\n case 'BoolFilter':\n return scalarTsType({ kind: 'scalar', scalar: 'boolean' });\n }\n}\n\nfunction operations(name: string): readonly string[] {\n if (name === 'BoolFilter') return EQUALITY_OPS;\n if (name === 'StringFilter') {\n return [...EQUALITY_OPS, ...LIST_OPS, ...ORDER_OPS, ...STRING_OPS];\n }\n return [...EQUALITY_OPS, ...LIST_OPS, ...ORDER_OPS];\n}\n\nfunction emitInterface(\n name: string,\n type: string,\n ops: readonly string[],\n): string {\n const members = ops.map((operation) => {\n const list = (LIST_OPS as readonly string[]).includes(operation);\n return ` ${operation}?: ${list ? `${type}[]` : type};`;\n });\n return `export interface ${name} {\\n${members.join('\\n')}\\n}`;\n}\n\n/** Emit only the direct scalar and enum classes used by a source's fields. */\nexport function emitFilters(source: SourceIR): string {\n const scalars = new Set<string>();\n const enums = new Set<string>();\n for (const entity of Object.values(source.entities)) {\n for (const field of entity.fields) {\n const filter = filterClass(field);\n if (filter === null) continue;\n if (field.type.kind === 'enum') enums.add(field.type.ref);\n else scalars.add(filter);\n }\n }\n\n const enumNames = [...enums].sort((left, right) => left.localeCompare(right));\n const blocks: string[] = [];\n for (const name of SCALAR_FILTER_ORDER) {\n if (scalars.has(name))\n blocks.push(emitInterface(name, baseType(name), operations(name)));\n }\n for (const name of enumNames) {\n blocks.push(\n emitInterface(`Enum${name}Filter`, enumTypeName(name), [\n ...EQUALITY_OPS,\n ...LIST_OPS,\n ]),\n );\n }\n\n const imports =\n enumNames.length === 0\n ? ''\n : `import type { ${enumNames.map(enumTypeName).join(', ')} } from './enums';\\n\\n`;\n return blocks.length === 0\n ? 'export {};\\n'\n : `${imports}${blocks.join('\\n\\n')}\\n`;\n}\n","/** The JsonValue helper emitted when at least one field needs it. */\nexport function emitScalars(): string {\n return `export type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n`;\n}\n"],"mappings":"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","names":["scalarTsType","scalarTsType"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kurotako/gen-typescript",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "kurotako generator that emits TypeScript type declarations from the intermediate representation.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"kurotako",
|
|
@@ -46,15 +46,15 @@
|
|
|
46
46
|
"access": "public"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@kurotako/ir": "^0.
|
|
49
|
+
"@kurotako/ir": "^0.2.0"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
|
-
"@kurotako/config": "^0.1.
|
|
53
|
-
"@kurotako/core": "^0.1.
|
|
52
|
+
"@kurotako/config": "^0.1.1",
|
|
53
|
+
"@kurotako/core": "^0.1.1"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@kurotako/config": "^0.1.
|
|
57
|
-
"@kurotako/core": "^0.1.
|
|
56
|
+
"@kurotako/config": "^0.1.1",
|
|
57
|
+
"@kurotako/core": "^0.1.1",
|
|
58
58
|
"typescript": "5.9.3"
|
|
59
59
|
}
|
|
60
60
|
}
|