@kurotako/parser-prisma 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/options.ts","../src/parser.ts","../src/detect.ts","../src/dmmf/load.ts","../src/dmmf/read.ts","../src/map/build.ts","../src/map/defaults.ts","../src/map/scalars.ts","../src/map/relations.ts"],"sourcesContent":["/**\n * Prisma-parser error classes. Each extends `TakoError` from `@kurotako/core`\n * so the CLI's single `instanceof TakoError` catch covers them; `@kurotako/core`\n * additionally wraps any throw from `parse()` as a `DriverError`.\n *\n * Codes: `prisma_input`, `prisma_peer_missing`, `prisma_schema`.\n */\nimport { TakoError } from '@kurotako/core';\n\n/** Schema path missing, an empty folder, or a folder with no `.prisma` file. */\nexport class PrismaInputError extends TakoError {\n readonly namespace: string;\n readonly resolvedPath: string;\n\n constructor(namespace: string, resolvedPath: string, detail: string) {\n super(\n 'prisma_input',\n `prisma parser (namespace '${namespace}'): ${detail} (resolved path: ${resolvedPath})`,\n );\n this.namespace = namespace;\n this.resolvedPath = resolvedPath;\n }\n}\n\n/** `@prisma/internals` cannot be resolved from the project. */\nexport class PrismaPeerMissingError extends TakoError {\n readonly namespace: string;\n\n constructor(namespace: string, options?: { cause?: unknown }) {\n super(\n 'prisma_peer_missing',\n `prisma parser (namespace '${namespace}'): '@prisma/internals' could not be resolved. ` +\n 'Add it as a devDependency (`bun add -d @prisma/internals`, matching your Prisma major). ' +\n 'In a monorepo it is resolved from the directory holding the schema, so it may ' +\n 'be installed in the sub-project that owns the schema rather than at the repo root. ' +\n 'Note: installing it pulls @prisma/engines, whose postinstall downloads a schema-engine binary.',\n options,\n );\n this.namespace = namespace;\n }\n}\n\n/** `getDMMF` threw — an invalid schema. Carries the Prisma message and `cause`. */\nexport class PrismaSchemaError extends TakoError {\n readonly namespace: string;\n readonly prismaMessage: string;\n\n constructor(\n namespace: string,\n prismaMessage: string,\n options?: { cause?: unknown },\n ) {\n super(\n 'prisma_schema',\n `prisma parser (namespace '${namespace}'): the Prisma schema is invalid:\\n${prismaMessage}`,\n options,\n );\n this.namespace = namespace;\n this.prismaMessage = prismaMessage;\n }\n}\n","/**\n * Valibot schema for `@kurotako/parser-prisma`'s `options`, plus the inferred\n * type. `@kurotako/config` validates a config entry's `options` against this\n * schema and curries it away before `@kurotako/core` sees the parser.\n *\n * `schema` is resolved against `ParseContext.cwd`. `version` forces the\n * version-mode (see `detect.ts`); omitted, the mode is inferred from the input.\n */\nimport * as v from 'valibot';\n\n// `strictObject`: an unknown key (a typo like `schemaPath`) is a hard error\n// rather than being silently dropped.\nexport const PrismaParserOptions = v.strictObject({\n schema: v.optional(v.string(), './prisma/schema.prisma'),\n version: v.optional(v.picklist([7, 8])),\n});\n\nexport type PrismaParserOptions = v.InferOutput<typeof PrismaParserOptions>;\n","/**\n * `prismaParser` — the `@kurotako/parser-prisma` driver.\n *\n * `@kurotako/config` validates `options` against `optionsSchema` and curries it\n * away; `@kurotako/core` then calls `parse(ctx)` once per namespace and runs\n * `validateSourceIR` on the result.\n *\n * Flow: `resolveInput` (detect.ts) → `readDmmf` (dmmf/, Prisma <= 7) →\n * `buildSourceIR` (map/). The Prisma 8 `contract.json` mode is detected but not\n * implemented in v1.\n */\nimport { dirname, resolve } from 'node:path';\nimport { defineParser } from '@kurotako/config';\nimport type { ParseContext } from '@kurotako/core';\nimport type { SourceIR } from '@kurotako/ir';\nimport { resolveInput } from './detect.js';\nimport { readDmmf } from './dmmf/load.js';\nimport { PrismaInputError } from './errors.js';\nimport { buildSourceIR } from './map/build.js';\nimport { PrismaParserOptions } from './options.js';\n\nexport const prismaParser = defineParser({\n name: 'prisma',\n optionsSchema: PrismaParserOptions,\n\n async parse(ctx: ParseContext, options): Promise<SourceIR> {\n const input = await resolveInput(ctx.cwd, options, ctx.namespace);\n\n if (input.mode === 8) {\n throw new PrismaInputError(\n ctx.namespace,\n input.contractPath,\n 'the Prisma 8 contract.json mode is not implemented in kurotako v1',\n );\n }\n\n const { model, prismaVersion } = await readDmmf(input, ctx);\n return buildSourceIR(\n ctx.namespace,\n model,\n `prisma@${prismaVersion}`,\n ctx.logger,\n );\n },\n\n async watchPaths(ctx: ParseContext, options): Promise<string[]> {\n // The resolved schema path — a `.prisma` file, a schema folder, or the\n // deferred contract.json. A folder watch covers every `*.prisma` inside it.\n return [resolve(ctx.cwd, options.schema)];\n },\n\n anchor(rootDir, options) {\n // The directory the schema lives in. `dirname` is correct for a `.prisma`\n // file and for a `contract.json`; for a schema *folder* it yields the\n // parent, which is still a valid walk-up base for `node_modules`\n // resolution. No `stat` — the hook stays cheap.\n return dirname(resolve(rootDir, options.schema));\n },\n});\n","/**\n * Input resolution and version-mode detection.\n *\n * `resolveInput` turns `options.schema` (a `.prisma` file, a\n * `prismaSchemaFolder`, or — deferred — a `contract.json`) into a\n * `ResolvedInput`: the concrete file tuples for the Prisma <= 7 DMMF path, or\n * the `contract.json` path for the deferred Prisma 8 path.\n *\n * `options.version` forces the mode; otherwise it is inferred from what is on\n * disk. Multi-file Prisma schemas are read transparently.\n */\nimport { readdir, readFile, stat } from 'node:fs/promises';\nimport { basename, dirname, join, relative, resolve, sep } from 'node:path';\nimport { PrismaInputError } from './errors.js';\nimport type { PrismaParserOptions } from './options.js';\n\nexport type ResolvedInput =\n | { mode: 7; kind: 'file' | 'folder'; files: Array<[string, string]> }\n | { mode: 8; kind: 'contract'; contractPath: string };\n\nconst PRISMA_EXT = '.prisma';\nconst CONTRACT_FILE = 'contract.json';\n\nfunction toPosix(p: string): string {\n return sep === '/' ? p : p.split(sep).join('/');\n}\n\nasync function pathKind(p: string): Promise<'file' | 'dir' | 'missing'> {\n try {\n const s = await stat(p);\n return s.isDirectory() ? 'dir' : 'file';\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return 'missing';\n }\n throw err;\n }\n}\n\n/** `*.prisma` directly in `dir`, then one level down (prismaSchemaFolder layout). */\nasync function collectPrismaFiles(dir: string): Promise<string[]> {\n const found: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = join(dir, entry.name);\n if (entry.isFile() && entry.name.endsWith(PRISMA_EXT)) {\n found.push(full);\n } else if (entry.isDirectory()) {\n const nested = await readdir(full, { withFileTypes: true });\n for (const child of nested) {\n if (child.isFile() && child.name.endsWith(PRISMA_EXT)) {\n found.push(join(full, child.name));\n }\n }\n }\n }\n return found;\n}\n\nasync function dirHasContract(dir: string): Promise<boolean> {\n return (await pathKind(join(dir, CONTRACT_FILE))) === 'file';\n}\n\nasync function readTuples(\n root: string,\n files: string[],\n): Promise<Array<[string, string]>> {\n const tuples = await Promise.all(\n files.map(\n async (file): Promise<[string, string]> => [\n toPosix(relative(root, file)),\n await readFile(file, 'utf8'),\n ],\n ),\n );\n return tuples.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n}\n\nasync function resolveMode7(\n namespace: string,\n resolved: string,\n kind: 'file' | 'dir',\n): Promise<ResolvedInput> {\n if (kind === 'file') {\n return {\n mode: 7,\n kind: 'file',\n files: await readTuples(dirname(resolved), [resolved]),\n };\n }\n const files = await collectPrismaFiles(resolved);\n if (files.length === 0) {\n throw new PrismaInputError(\n namespace,\n resolved,\n 'the schema folder contains no .prisma file',\n );\n }\n return { mode: 7, kind: 'folder', files: await readTuples(resolved, files) };\n}\n\nasync function resolveMode8(\n namespace: string,\n resolved: string,\n kind: 'file' | 'dir',\n): Promise<ResolvedInput> {\n if (kind === 'dir') {\n const contractPath = join(resolved, CONTRACT_FILE);\n if ((await pathKind(contractPath)) !== 'file') {\n throw new PrismaInputError(\n namespace,\n resolved,\n `version 8 mode expects a ${CONTRACT_FILE} in the folder`,\n );\n }\n return { mode: 8, kind: 'contract', contractPath };\n }\n return { mode: 8, kind: 'contract', contractPath: resolved };\n}\n\nexport async function resolveInput(\n cwd: string,\n o: PrismaParserOptions,\n namespace = '<unknown>',\n): Promise<ResolvedInput> {\n const resolved = resolve(cwd, o.schema);\n const kind = await pathKind(resolved);\n if (kind === 'missing') {\n throw new PrismaInputError(\n namespace,\n resolved,\n 'the schema path does not exist',\n );\n }\n\n if (o.version === 8) {\n return resolveMode8(namespace, resolved, kind);\n }\n if (o.version === 7) {\n return resolveMode7(namespace, resolved, kind);\n }\n\n // Infer.\n if (kind === 'file') {\n if (basename(resolved) === CONTRACT_FILE) {\n return { mode: 8, kind: 'contract', contractPath: resolved };\n }\n if (resolved.endsWith(PRISMA_EXT)) {\n return resolveMode7(namespace, resolved, 'file');\n }\n throw new PrismaInputError(\n namespace,\n resolved,\n `not a .prisma file or a ${CONTRACT_FILE}`,\n );\n }\n\n if (await dirHasContract(resolved)) {\n return resolveMode8(namespace, resolved, 'dir');\n }\n return resolveMode7(namespace, resolved, 'dir');\n}\n","/**\n * Prisma <= 7 DMMF acquisition.\n *\n * `@prisma/internals` is an optional peer: it is resolved dynamically from the\n * consumer's project (`ctx.cwd`), not bundled. A resolution failure is a\n * `PrismaPeerMissingError` with an install hint; a `getDMMF` throw (invalid\n * schema) is a `PrismaSchemaError` keeping the Prisma P1012 text and `cause`.\n *\n * The package is CJS-only and its ESM-interop is unreliable, so the `getDMMF`\n * function is looked up on both the namespace and its `default`.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { ParseContext } from '@kurotako/core';\nimport type { ResolvedInput } from '../detect.js';\nimport { PrismaPeerMissingError, PrismaSchemaError } from '../errors.js';\nimport type { PrismaModel } from './model.js';\nimport { toPrismaModel } from './read.js';\n\ntype SchemaFileInput = string | Array<[string, string]>;\ntype GetDmmf = (options: {\n datamodel: SchemaFileInput;\n}) => Promise<import('@prisma/dmmf').Document>;\n\ninterface InternalsModule {\n getDMMF?: GetDmmf;\n default?: { getDMMF?: GetDmmf };\n}\n\nasync function resolveInternals(\n ctx: ParseContext,\n): Promise<{ getDMMF: GetDmmf; prismaVersion: string }> {\n // Resolve `@prisma/internals` from the source's anchor directory (where its\n // schema lives) so it can be a devDependency of the sub-project holding the\n // schema, not only of the repo root. Node still walks up `node_modules` from\n // there to `ctx.cwd` and beyond. Absent ⇒ anchor on `ctx.cwd`.\n const base = ctx.anchorDir ?? ctx.cwd;\n const require = createRequire(join(base, 'noop.js'));\n\n let entry: string;\n try {\n entry = require.resolve('@prisma/internals');\n } catch (err) {\n throw new PrismaPeerMissingError(ctx.namespace, { cause: err });\n }\n\n let mod: InternalsModule;\n try {\n mod = (await import(pathToFileURL(entry).href)) as InternalsModule;\n } catch (err) {\n throw new PrismaPeerMissingError(ctx.namespace, { cause: err });\n }\n\n const getDMMF = mod.default?.getDMMF ?? mod.getDMMF;\n if (typeof getDMMF !== 'function') {\n throw new PrismaPeerMissingError(ctx.namespace);\n }\n\n let prismaVersion = 'unknown';\n try {\n const pkg = JSON.parse(\n await readFile(require.resolve('@prisma/internals/package.json'), 'utf8'),\n ) as { version?: string };\n if (typeof pkg.version === 'string') {\n prismaVersion = pkg.version;\n }\n } catch {\n ctx.logger.debug(\n 'prisma parser: could not read @prisma/internals version',\n { namespace: ctx.namespace },\n );\n }\n\n return { getDMMF, prismaVersion };\n}\n\nexport async function readDmmf(\n input: Extract<ResolvedInput, { mode: 7 }>,\n ctx: ParseContext,\n): Promise<{ model: PrismaModel; prismaVersion: string }> {\n const { getDMMF, prismaVersion } = await resolveInternals(ctx);\n\n const datamodel: SchemaFileInput =\n input.kind === 'file'\n ? (input.files[0]?.[1] ?? '')\n : input.files.map(([path, content]) => [path, content]);\n\n let doc: Awaited<ReturnType<GetDmmf>>;\n try {\n doc = await getDMMF({ datamodel });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new PrismaSchemaError(ctx.namespace, message, { cause: err });\n }\n\n return { model: toPrismaModel(doc), prismaVersion };\n}\n","/**\n * `DMMF.Document` → the mode-neutral `PrismaModel`.\n *\n * Pure and total: it never touches disk or Prisma. Object fields become\n * `relationEdges`; scalar / enum / unsupported fields become `fields`. Model and\n * enum `documentation` / `dbName` are carried verbatim. Non-unique `@@index`\n * entries come from `datamodel.indexes` when the resolved `@prisma/internals`\n * exposes them (6.x does), otherwise `indexes` stays empty.\n */\nimport type * as DMMF from '@prisma/dmmf';\nimport type {\n PrismaDefault,\n PrismaEntity,\n PrismaEnum,\n PrismaField,\n PrismaIndex,\n PrismaModel,\n PrismaRelationEdge,\n PrismaUnique,\n} from './model.js';\n\nfunction readField(f: DMMF.Field): PrismaField {\n const field: PrismaField = {\n name: f.name,\n type: f.type,\n kind:\n f.kind === 'enum'\n ? 'enum'\n : f.kind === 'unsupported'\n ? 'unsupported'\n : 'scalar',\n isList: f.isList,\n isRequired: f.isRequired,\n isUnique: f.isUnique,\n isUpdatedAt: f.isUpdatedAt ?? false,\n hasDefaultValue: f.hasDefaultValue,\n nativeType: f.nativeType ? [f.nativeType[0], [...f.nativeType[1]]] : null,\n };\n if (f.default !== undefined) {\n field.default = f.default as PrismaDefault;\n }\n if (f.documentation !== undefined) {\n field.doc = f.documentation;\n }\n return field;\n}\n\nfunction readEdge(f: DMMF.Field): PrismaRelationEdge {\n const edge: PrismaRelationEdge = {\n fieldName: f.name,\n relationName: f.relationName ?? '',\n targetEntity: f.type,\n isList: f.isList,\n isRequired: f.isRequired,\n fromFields: [...(f.relationFromFields ?? [])],\n toFields: [...(f.relationToFields ?? [])],\n };\n if (f.relationOnDelete !== undefined) {\n edge.onDelete = f.relationOnDelete;\n }\n if (f.relationOnUpdate !== undefined) {\n edge.onUpdate = f.relationOnUpdate;\n }\n return edge;\n}\n\nfunction readPrimaryKey(model: DMMF.Model): string[] {\n if (model.primaryKey && model.primaryKey.fields.length > 0) {\n return [...model.primaryKey.fields];\n }\n const id = model.fields.find((f) => f.isId);\n return id ? [id.name] : [];\n}\n\nfunction readUniques(model: DMMF.Model): PrismaUnique[] {\n if (model.uniqueIndexes.length > 0) {\n return model.uniqueIndexes.map((u) => {\n const entry: PrismaUnique = { fields: [...u.fields] };\n if (u.name) {\n entry.name = u.name;\n }\n return entry;\n });\n }\n return model.uniqueFields.map((fields) => ({ fields: [...fields] }));\n}\n\nfunction readIndexes(\n modelName: string,\n all: readonly DMMF.Index[] | undefined,\n): PrismaIndex[] {\n if (!all) {\n return [];\n }\n return all\n .filter((idx) => idx.model === modelName && idx.type === 'normal')\n .map((idx) => {\n const entry: PrismaIndex = { fields: idx.fields.map((f) => f.name) };\n if (idx.name) {\n entry.name = idx.name;\n }\n if (idx.algorithm) {\n entry.type = idx.algorithm.toLowerCase();\n }\n return entry;\n });\n}\n\nfunction readEntity(model: DMMF.Model, doc: DMMF.Document): PrismaEntity {\n const fields: PrismaField[] = [];\n const relationEdges: PrismaRelationEdge[] = [];\n for (const f of model.fields) {\n if (f.kind === 'object') {\n relationEdges.push(readEdge(f));\n } else {\n fields.push(readField(f));\n }\n }\n const entity: PrismaEntity = {\n name: model.name,\n fields,\n relationEdges,\n primaryKey: readPrimaryKey(model),\n uniques: readUniques(model),\n indexes: readIndexes(model.name, doc.datamodel.indexes),\n };\n if (model.dbName) {\n entity.dbName = model.dbName;\n }\n if (model.documentation !== undefined) {\n entity.doc = model.documentation;\n }\n return entity;\n}\n\nfunction readEnum(e: DMMF.DatamodelEnum): PrismaEnum {\n const def: PrismaEnum = {\n name: e.name,\n values: e.values.map((value) => {\n const entry = { name: value.name } as PrismaEnum['values'][number];\n if (value.dbName) {\n entry.dbName = value.dbName;\n }\n return entry;\n }),\n };\n if (e.dbName) {\n def.dbName = e.dbName;\n }\n if (e.documentation !== undefined) {\n def.doc = e.documentation;\n }\n return def;\n}\n\nexport function toPrismaModel(doc: DMMF.Document): PrismaModel {\n return {\n entities: doc.datamodel.models.map((m) => readEntity(m, doc)),\n enums: doc.datamodel.enums.map(readEnum),\n };\n}\n","/**\n * `PrismaModel` → `SourceIR`, driven entirely by the `createSourceIR` fluent\n * builder (the parser never hand-assembles IR).\n *\n * Field rules: `list ← isList`, `nullable ← !isRequired`,\n * `optional ← hasDefaultValue || isUpdatedAt`, `unique ← isUnique`. Scalars and\n * native-type refinement come from `map/scalars.ts`, defaults / id `format` from\n * `map/defaults.ts`, relations and implicit-m2m materialisation from\n * `map/relations.ts` (this module injects the namespace into every relation\n * target). Enums are emitted at source level, matching Prisma.\n */\nimport type { Logger } from '@kurotako/core';\nimport type { IndexType } from '@kurotako/ir';\nimport {\n createSourceIR,\n type EntityBuilder,\n type EnumBuilder,\n type FieldBuilder,\n type Relation,\n type SourceIR,\n} from '@kurotako/ir';\nimport type { PrismaEnum, PrismaModel } from '../dmmf/model.js';\nimport { mapDefault } from './defaults.js';\nimport { buildRelations } from './relations.js';\nimport { mapFieldType } from './scalars.js';\n\nconst INDEX_TYPES = new Set<IndexType>([\n 'btree',\n 'hash',\n 'gin',\n 'gist',\n 'brin',\n 'spgist',\n]);\n\nfunction asIndexType(raw: string | undefined): IndexType | undefined {\n return raw !== undefined && INDEX_TYPES.has(raw as IndexType)\n ? (raw as IndexType)\n : undefined;\n}\n\nfunction fillEnum(eb: EnumBuilder, e: PrismaEnum): void {\n for (const value of e.values) {\n const opts: { dbName?: string; doc?: string } = {};\n if (value.dbName !== undefined) {\n opts.dbName = value.dbName;\n }\n if (value.doc !== undefined) {\n opts.doc = value.doc;\n }\n eb.value(value.name, opts);\n }\n if (e.doc !== undefined) {\n eb.doc(e.doc);\n }\n if (e.dbName !== undefined) {\n eb.dbName(e.dbName);\n }\n}\n\nfunction addRelation(\n eb: EntityBuilder,\n rel: Relation,\n namespace: string,\n): void {\n eb.relation(rel.name, (rb) => {\n rb.to(namespace, rel.target.entity);\n if (rel.cardinality === 'many') {\n rb.many();\n } else {\n rb.one();\n }\n if (rel.optional) {\n rb.optional();\n }\n if (rel.owning) {\n rb.owning();\n }\n if (rel.backRelation !== undefined) {\n rb.backRelation(rel.backRelation);\n }\n if (rel.fkFields) {\n rb.fkFields(...rel.fkFields);\n }\n if (rel.references) {\n rb.references(...rel.references);\n }\n if (rel.onDelete) {\n rb.onDelete(rel.onDelete);\n }\n if (rel.onUpdate) {\n rb.onUpdate(rel.onUpdate);\n }\n });\n}\n\nexport function buildSourceIR(\n namespace: string,\n model: PrismaModel,\n parserVersion: string,\n logger?: Logger,\n): SourceIR {\n const b = createSourceIR({ namespace, parser: 'prisma', parserVersion });\n\n for (const e of model.enums) {\n b.addEnum(e.name, (eb) => fillEnum(eb, e));\n }\n\n const { relations, syntheticEntities } = buildRelations(model, logger);\n\n for (const entity of model.entities) {\n b.addEntity(entity.name, (eb) => {\n for (const field of entity.fields) {\n eb.field(field.name, (fb: FieldBuilder) => {\n const mapped = mapFieldType(field, logger);\n const scalar =\n mapped.scalarOverride ??\n (mapped.type.kind === 'scalar' ? mapped.type.scalar : undefined);\n\n if (scalar !== undefined) {\n fb.scalar(scalar);\n } else if (mapped.type.kind === 'enum') {\n fb.enum(mapped.type.ref);\n } else {\n fb.unknown(\n mapped.type.kind === 'unknown' ? mapped.type.hint : undefined,\n );\n }\n\n const isString = scalar === 'string';\n const { maxLength, format: nativeFormat } = mapped.constraints;\n if (maxLength !== undefined) {\n fb.maxLength(maxLength);\n }\n\n const mappedDefault = mapDefault(field.default);\n if (mappedDefault.default) {\n fb.default(mappedDefault.default);\n }\n const format = mappedDefault.format ?? nativeFormat;\n if (format !== undefined) {\n if (isString) {\n fb.format(format);\n } else {\n logger?.debug(\n `prisma parser: dropping format '${format}' on non-string field '${entity.name}.${field.name}'`,\n );\n }\n }\n\n if (field.isList) {\n fb.list();\n }\n if (!field.isRequired) {\n fb.nullable();\n }\n if (field.hasDefaultValue || field.isUpdatedAt) {\n fb.optional();\n }\n if (field.isUnique) {\n fb.unique();\n }\n if (field.doc !== undefined) {\n fb.doc(field.doc);\n }\n });\n }\n\n if (entity.primaryKey.length > 0) {\n eb.primaryKey(...entity.primaryKey);\n }\n for (const unique of entity.uniques) {\n eb.unique(\n unique.fields,\n unique.name ? { name: unique.name } : undefined,\n );\n }\n for (const index of entity.indexes) {\n const opts: { name?: string; type?: IndexType } = {};\n if (index.name) {\n opts.name = index.name;\n }\n const type = asIndexType(index.type);\n if (type) {\n opts.type = type;\n }\n eb.index(index.fields, opts);\n }\n if (entity.doc !== undefined) {\n eb.doc(entity.doc);\n }\n if (entity.dbName !== undefined) {\n eb.dbName(entity.dbName);\n }\n for (const rel of relations.get(entity.name) ?? []) {\n addRelation(eb, rel, namespace);\n }\n });\n }\n\n for (const synthetic of syntheticEntities) {\n b.addEntity(synthetic.name, (eb) => {\n for (const field of synthetic.fields) {\n eb.field(field.name, (fb) => fb.scalar(field.scalar));\n }\n eb.primaryKey(...synthetic.primaryKey);\n for (const rel of synthetic.relations) {\n addRelation(eb, rel, namespace);\n }\n });\n }\n\n return b.build();\n}\n","/**\n * Prisma `@default(...)` → IR `DefaultValue`, plus the `StringFormat` a\n * generator-side id default implies.\n *\n * Literals (and enum values, which the DMMF encodes as bare strings) become\n * `{ kind: 'value' }`. Function calls become `{ kind: 'expr' }`; `uuid()` /\n * `cuid()` / `cuid(2)` / `ulid()` additionally carry a `format` (the scalar is\n * left as `string`). `nanoid()` has no matching closed `StringFormat` → expr\n * only.\n */\nimport type { DefaultValue, StringFormat } from '@kurotako/ir';\nimport type { PrismaDefault } from '../dmmf/model.js';\n\nexport interface MappedDefault {\n default?: DefaultValue;\n format?: StringFormat;\n}\n\nconst ID_FORMATS: Record<string, StringFormat> = {\n uuid: 'uuid',\n cuid: 'cuid',\n ulid: 'ulid',\n};\n\nfunction isCall(\n raw: PrismaDefault,\n): raw is { name: string; args: Array<string | number> } {\n return typeof raw === 'object' && !Array.isArray(raw) && raw !== null;\n}\n\nexport function mapDefault(raw: PrismaDefault | undefined): MappedDefault {\n if (raw === undefined) {\n return {};\n }\n\n if (!isCall(raw)) {\n // literal, literal array, or enum value (bare string)\n return { default: { kind: 'value', value: raw } };\n }\n\n const { name, args } = raw;\n\n if (name === 'dbgenerated') {\n return { default: { kind: 'expr', expr: 'dbgenerated', args: [...args] } };\n }\n\n const idFormat = ID_FORMATS[name];\n if (idFormat !== undefined) {\n const format: StringFormat =\n name === 'cuid' && args[0] === 2 ? 'cuid2' : idFormat;\n return { default: { kind: 'expr', expr: `${name}()` }, format };\n }\n\n // now(), autoincrement(), nanoid(), and any other bare call\n return { default: { kind: 'expr', expr: `${name}()` } };\n}\n","/**\n * Prisma field type + native `@db.*` type → IR `FieldType` and `Constraints`.\n *\n * Base scalar mapping is a closed table. Native types refine it: a length\n * argument becomes `maxLength`, `@db.Uuid` / `@db.ObjectId` promote the scalar to\n * `uuid`, `@db.Date` to `date`, `@db.Time` keeps `datetime` but sets\n * `format: 'time'`. Unknown native types are ignored (logged at `debug`).\n */\nimport type { Logger } from '@kurotako/core';\nimport type { Constraints, FieldType, ScalarType } from '@kurotako/ir';\nimport type { PrismaField } from '../dmmf/model.js';\n\nconst SCALAR_TABLE: Record<string, ScalarType> = {\n String: 'string',\n Boolean: 'boolean',\n Int: 'int',\n BigInt: 'bigint',\n Float: 'float',\n Decimal: 'decimal',\n DateTime: 'datetime',\n Json: 'json',\n Bytes: 'bytes',\n};\n\nconst LENGTH_NATIVE = new Set(['VarChar', 'Char', 'NVarChar', 'String']);\nconst UUID_NATIVE = new Set(['Uuid', 'ObjectId']);\n/** Native types that are known and deliberately have no effect in v1. */\nconst NOOP_NATIVE = new Set([\n 'Text',\n 'Citext',\n 'Xml',\n 'Bit',\n 'VarBit',\n 'Inet',\n 'Line',\n 'LongText',\n 'MediumText',\n 'TinyText',\n 'SmallInt',\n 'MediumInt',\n 'UnsignedInt',\n 'UnsignedBigInt',\n 'Money',\n 'Real',\n 'DoublePrecision',\n 'Decimal',\n 'Numeric',\n 'SmallMoney',\n 'Timestamp',\n 'Timestamptz',\n 'DateTime2',\n 'DateTimeOffset',\n]);\n\nexport interface MappedFieldType {\n type: FieldType;\n constraints: Constraints;\n scalarOverride?: ScalarType;\n}\n\nfunction refineNative(\n native: [string, string[]],\n constraints: Constraints,\n result: MappedFieldType,\n field: PrismaField,\n logger: Logger | undefined,\n): void {\n const [name, args] = native;\n if (LENGTH_NATIVE.has(name)) {\n const n = Number(args[0]);\n if (Number.isFinite(n)) {\n constraints.maxLength = n;\n }\n return;\n }\n if (UUID_NATIVE.has(name)) {\n result.scalarOverride = 'uuid';\n return;\n }\n if (name === 'Date') {\n result.scalarOverride = 'date';\n return;\n }\n if (name === 'Time' || name === 'Timetz') {\n constraints.format = 'time';\n return;\n }\n if (NOOP_NATIVE.has(name)) {\n return;\n }\n logger?.debug(`prisma parser: ignoring unmapped native type @db.${name}`, {\n field: field.name,\n });\n}\n\nexport function mapFieldType(\n field: PrismaField,\n logger?: Logger,\n): MappedFieldType {\n const constraints: Constraints = {};\n\n if (field.kind === 'unsupported') {\n return { type: { kind: 'unknown', hint: field.type }, constraints };\n }\n if (field.kind === 'enum') {\n return { type: { kind: 'enum', ref: field.type }, constraints };\n }\n\n const scalar = SCALAR_TABLE[field.type];\n if (scalar === undefined) {\n return { type: { kind: 'unknown', hint: field.type }, constraints };\n }\n\n const result: MappedFieldType = {\n type: { kind: 'scalar', scalar },\n constraints,\n };\n if (field.nativeType) {\n refineNative(field.nativeType, constraints, result, field, logger);\n }\n return result;\n}\n","/**\n * Relation pairing and implicit-many-to-many materialisation.\n *\n * DMMF relation edges are grouped by `relationName`. A normal pair yields one\n * `Relation` per side (owning side = the one carrying `fromFields`). An implicit\n * m2m (both sides list, neither side carries fields) is materialised as a\n * synthetic join entity so downstream generators only ever see explicit m2m:\n * the two originals are rewritten to `many` relations pointing at the synthetic\n * entity, which gets `<model>Id` FK fields, a composite PK and two owning `one`\n * relations back to the originals.\n *\n * Every produced `Relation` has `target.namespace === ''`; `build.ts` injects\n * the real namespace (relations are always same-namespace for one Prisma\n * schema).\n */\nimport type { Logger } from '@kurotako/core';\nimport type { ReferentialAction, Relation, ScalarType } from '@kurotako/ir';\nimport type {\n PrismaEntity,\n PrismaModel,\n PrismaRelationEdge,\n} from '../dmmf/model.js';\nimport { mapFieldType } from './scalars.js';\n\nexport interface SyntheticField {\n name: string;\n scalar: ScalarType;\n}\n\nexport interface SyntheticEntity {\n name: string;\n fields: SyntheticField[];\n primaryKey: string[];\n relations: Relation[];\n}\n\nexport interface BuiltRelations {\n relations: Map<string, Relation[]>;\n syntheticEntities: SyntheticEntity[];\n}\n\nconst ACTION_MAP: Record<string, ReferentialAction> = {\n Cascade: 'cascade',\n Restrict: 'restrict',\n SetNull: 'setNull',\n SetDefault: 'setDefault',\n NoAction: 'noAction',\n};\n\nfunction mapAction(raw: string | undefined): ReferentialAction | undefined {\n return raw === undefined ? undefined : ACTION_MAP[raw];\n}\n\nfunction lcfirst(s: string): string {\n return s.length === 0 ? s : s.charAt(0).toLowerCase() + s.slice(1);\n}\n\ninterface OwnedEdge {\n owner: string;\n edge: PrismaRelationEdge;\n}\n\nfunction isImplicitM2M(edges: OwnedEdge[]): boolean {\n return (\n edges.length === 2 &&\n edges.every(\n ({ edge }) =>\n edge.isList &&\n edge.fromFields.length === 0 &&\n edge.toFields.length === 0,\n )\n );\n}\n\nfunction pkScalar(\n entities: Map<string, PrismaEntity>,\n entityName: string,\n logger: Logger | undefined,\n): ScalarType {\n const entity = entities.get(entityName);\n if (entity && entity.primaryKey.length === 1) {\n const pkName = entity.primaryKey[0];\n const field = entity.fields.find((f) => f.name === pkName);\n if (field) {\n const mapped = mapFieldType(field);\n if (mapped.scalarOverride) {\n return mapped.scalarOverride;\n }\n if (mapped.type.kind === 'scalar') {\n return mapped.type.scalar;\n }\n }\n }\n logger?.debug(\n `prisma parser: could not resolve primary-key scalar of '${entityName}', defaulting to string`,\n );\n return 'string';\n}\n\nfunction normalRelation(\n edge: PrismaRelationEdge,\n back: PrismaRelationEdge | undefined,\n): Relation {\n const owning = edge.fromFields.length > 0;\n const relation: Relation = {\n name: edge.fieldName,\n target: { namespace: '', entity: edge.targetEntity },\n cardinality: edge.isList ? 'many' : 'one',\n optional: !edge.isRequired,\n owning,\n };\n if (owning) {\n relation.fkFields = [...edge.fromFields];\n relation.references = [...edge.toFields];\n }\n if (back) {\n relation.backRelation = back.fieldName;\n }\n const onDelete = mapAction(edge.onDelete);\n if (onDelete) {\n relation.onDelete = onDelete;\n }\n const onUpdate = mapAction(edge.onUpdate);\n if (onUpdate) {\n relation.onUpdate = onUpdate;\n }\n return relation;\n}\n\nfunction materialiseM2M(\n a: OwnedEdge,\n b: OwnedEdge,\n relationName: string,\n entities: Map<string, PrismaEntity>,\n logger: Logger | undefined,\n): {\n synthetic: SyntheticEntity;\n rewrites: Array<{ owner: string; relation: Relation }>;\n} {\n const sorted = [a.owner, b.owner].sort((l, r) =>\n l < r ? -1 : l > r ? 1 : 0,\n );\n const x = sorted[0] ?? a.owner;\n const y = sorted[1] ?? b.owner;\n const defaultName = `${x}To${y}`;\n const name =\n relationName !== '' && relationName !== defaultName\n ? relationName\n : `${x}${y}`;\n\n const fkX = `${lcfirst(x)}Id`;\n const fkY = `${lcfirst(y)}Id`;\n const relX = lcfirst(x);\n const relY = lcfirst(y);\n const pkX = entities.get(x)?.primaryKey[0] ?? 'id';\n const pkY = entities.get(y)?.primaryKey[0] ?? 'id';\n\n const synthetic: SyntheticEntity = {\n name,\n fields: [\n { name: fkX, scalar: pkScalar(entities, x, logger) },\n { name: fkY, scalar: pkScalar(entities, y, logger) },\n ],\n primaryKey: [fkX, fkY],\n relations: [\n {\n name: relX,\n target: { namespace: '', entity: x },\n cardinality: 'one',\n optional: false,\n owning: true,\n fkFields: [fkX],\n references: [pkX],\n onDelete: 'cascade',\n },\n {\n name: relY,\n target: { namespace: '', entity: y },\n cardinality: 'one',\n optional: false,\n owning: true,\n fkFields: [fkY],\n references: [pkY],\n onDelete: 'cascade',\n },\n ],\n };\n\n const mkRewrite = (\n edge: OwnedEdge,\n backName: string,\n ): { owner: string; relation: Relation } => ({\n owner: edge.owner,\n relation: {\n name: edge.edge.fieldName,\n target: { namespace: '', entity: name },\n cardinality: 'many',\n optional: false,\n owning: false,\n backRelation: backName,\n },\n });\n\n return {\n synthetic,\n rewrites: [\n mkRewrite(a, a.owner === x ? relX : relY),\n mkRewrite(b, b.owner === x ? relX : relY),\n ],\n };\n}\n\nexport function buildRelations(\n model: PrismaModel,\n logger?: Logger,\n): BuiltRelations {\n const entities = new Map(model.entities.map((e) => [e.name, e]));\n const relations = new Map<string, Relation[]>();\n const syntheticEntities: SyntheticEntity[] = [];\n\n const push = (owner: string, relation: Relation): void => {\n const list = relations.get(owner) ?? [];\n list.push(relation);\n relations.set(owner, list);\n };\n\n const groups = new Map<string, OwnedEdge[]>();\n for (const entity of model.entities) {\n for (const edge of entity.relationEdges) {\n const list = groups.get(edge.relationName) ?? [];\n list.push({ owner: entity.name, edge });\n groups.set(edge.relationName, list);\n }\n }\n\n for (const [relationName, edges] of groups) {\n if (isImplicitM2M(edges)) {\n const [a, b] = edges as [OwnedEdge, OwnedEdge];\n const { synthetic, rewrites } = materialiseM2M(\n a,\n b,\n relationName,\n entities,\n logger,\n );\n syntheticEntities.push(synthetic);\n for (const { owner, relation } of rewrites) {\n push(owner, relation);\n }\n continue;\n }\n\n for (const { owner, edge } of edges) {\n const back = edges.find((e) => e.edge !== edge)?.edge;\n push(owner, normalRelation(edge, back));\n }\n }\n\n return { relations, syntheticEntities };\n}\n"],"mappings":"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","names":["dirname","resolve","readFile","join","require","join","readFile","resolve","dirname"]}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@kurotako/parser-prisma",
3
+ "version": "0.1.0",
4
+ "description": "kurotako parser that turns a Prisma schema into the intermediate representation.",
5
+ "keywords": [
6
+ "kurotako",
7
+ "codegen",
8
+ "typescript",
9
+ "prisma",
10
+ "parser"
11
+ ],
12
+ "license": "MIT",
13
+ "author": "Marmotz",
14
+ "homepage": "https://kurotako.marmotz.dev/",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/marmotz/kurotako.git",
18
+ "directory": "packages/parser-prisma"
19
+ },
20
+ "bugs": "https://github.com/marmotz/kurotako/issues",
21
+ "type": "module",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js",
26
+ "require": "./dist/index.cjs"
27
+ }
28
+ },
29
+ "main": "./dist/index.cjs",
30
+ "module": "./dist/index.js",
31
+ "types": "./dist/index.d.ts",
32
+ "sideEffects": false,
33
+ "files": [
34
+ "dist",
35
+ "CHANGELOG.md",
36
+ "LICENSE"
37
+ ],
38
+ "engines": {
39
+ "node": ">=24"
40
+ },
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "typecheck": "tsc -b",
44
+ "test": "vitest run"
45
+ },
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "dependencies": {
50
+ "@kurotako/ir": "^0.1.0",
51
+ "valibot": "1.4.2"
52
+ },
53
+ "peerDependencies": {
54
+ "@kurotako/config": "^0.1.0",
55
+ "@kurotako/core": "^0.1.0",
56
+ "@prisma/internals": ">=5 <8"
57
+ },
58
+ "peerDependenciesMeta": {
59
+ "@prisma/internals": {
60
+ "optional": true
61
+ }
62
+ },
63
+ "devDependencies": {
64
+ "@kurotako/config": "^0.1.0",
65
+ "@kurotako/core": "^0.1.0",
66
+ "@prisma/dmmf": "7.10.0",
67
+ "@prisma/internals": "7.10.0"
68
+ }
69
+ }