{"version":3,"file":"control.mjs","names":[],"sources":["../src/core/control-mutation-defaults.ts","../src/exports/control.ts"],"sourcesContent":["import type { ExecutionMutationDefaultValue } from '@prisma-next/contract/types';\nimport { timestampNowControlDescriptor } from '@prisma-next/family-sql/control';\nimport type {\n  ControlMutationDefaultEntry,\n  DefaultFunctionLoweringContext,\n  LoweredDefaultResult,\n  MutationDefaultGeneratorDescriptor,\n  TypedDefaultFunctionCall,\n} from '@prisma-next/framework-components/control';\nimport {\n  builtinGeneratorRegistryMetadata,\n  resolveBuiltinGeneratedColumnDescriptor,\n} from '@prisma-next/ids';\nimport type { FuncCallSig } from '@prisma-next/psl-parser';\nimport { int, num, oneOf, optional, str } from '@prisma-next/psl-parser';\nimport {\n  SQLITE_BIGINT_CODEC_ID,\n  SQLITE_BLOB_CODEC_ID,\n  SQLITE_DATETIME_CODEC_ID,\n  SQLITE_INTEGER_CODEC_ID,\n  SQLITE_JSON_CODEC_ID,\n  SQLITE_REAL_CODEC_ID,\n  SQLITE_TEXT_CODEC_ID,\n} from '@prisma-next/target-sqlite/codec-ids';\n\nfunction invalidArgumentDiagnostic(input: {\n  readonly context: DefaultFunctionLoweringContext;\n  readonly span: TypedDefaultFunctionCall['span'];\n  readonly message: string;\n}): LoweredDefaultResult {\n  return {\n    ok: false,\n    diagnostic: {\n      code: 'PSL_INVALID_DEFAULT_FUNCTION_ARGUMENT',\n      message: input.message,\n      sourceId: input.context.sourceId,\n      span: input.span,\n    },\n  };\n}\n\nfunction executionGenerator(\n  id: ExecutionMutationDefaultValue['id'],\n  params?: Record<string, unknown>,\n): LoweredDefaultResult {\n  return {\n    ok: true,\n    value: {\n      kind: 'execution',\n      generated: {\n        kind: 'generator',\n        id,\n        ...(params ? { params } : {}),\n      },\n    },\n  };\n}\n\n/**\n * SQLite spellings that all denote the same wall-clock-now value. Anything\n * matching this set when passed through `dbgenerated(\"...\")` is rewritten\n * to the canonical `now()` form before entering the contract — symmetric\n * with `parseSqliteDefault` on the introspection side, so the verifier\n * compares canonical-vs-canonical and a contract using\n * `dbgenerated(\"CURRENT_TIMESTAMP\")` doesn't drift against the schema it\n * just produced.\n */\nconst NOW_SYNONYMS = new Set(['current_timestamp', \"datetime('now')\", 'datetime(\"now\")', 'now()']);\n\nfunction lowerAutoincrement(): LoweredDefaultResult {\n  return {\n    ok: true,\n    value: {\n      kind: 'storage',\n      defaultValue: { kind: 'function', expression: 'autoincrement()' },\n    },\n  };\n}\n\nfunction lowerNow(): LoweredDefaultResult {\n  return {\n    ok: true,\n    value: {\n      kind: 'storage',\n      defaultValue: { kind: 'function', expression: 'now()' },\n    },\n  };\n}\n\nfunction lowerUlid(): LoweredDefaultResult {\n  return executionGenerator('ulid');\n}\n\nfunction lowerUuid(input: {\n  readonly call: TypedDefaultFunctionCall;\n  readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n  return input.call.args['version'] === 7\n    ? executionGenerator('uuidv7')\n    : executionGenerator('uuidv4');\n}\n\nfunction lowerCuid(): LoweredDefaultResult {\n  return executionGenerator('cuid2');\n}\n\nfunction lowerNanoid(input: {\n  readonly call: TypedDefaultFunctionCall;\n  readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n  const size = input.call.args['size'];\n  return typeof size === 'number'\n    ? executionGenerator('nanoid', { size })\n    : executionGenerator('nanoid');\n}\n\nfunction lowerDbgenerated(input: {\n  readonly call: TypedDefaultFunctionCall;\n  readonly context: DefaultFunctionLoweringContext;\n}): LoweredDefaultResult {\n  const raw = input.call.args['expression'];\n  if (typeof raw !== 'string' || raw.trim().length === 0) {\n    return invalidArgumentDiagnostic({\n      context: input.context,\n      span: input.call.span,\n      message: 'Default function \"dbgenerated\" argument cannot be empty.',\n    });\n  }\n  const trimmed = raw.trim();\n  const expression = NOW_SYNONYMS.has(trimmed.toLowerCase()) ? 'now()' : trimmed;\n  return {\n    ok: true,\n    value: {\n      kind: 'storage',\n      defaultValue: { kind: 'function', expression },\n    },\n  };\n}\n\nconst nowSig: FuncCallSig = {};\nconst autoincrementSig: FuncCallSig = {};\nconst ulidSig: FuncCallSig = {};\nconst uuidSig: FuncCallSig = {\n  positional: [{ key: 'version', type: optional(oneOf(num(4), num(7))) }],\n};\nconst cuidSig: FuncCallSig = { positional: [{ key: 'version', type: num(2) }] };\nconst nanoidSig: FuncCallSig = {\n  positional: [{ key: 'size', type: optional(int({ min: 2, max: 255 })) }],\n};\nconst dbgeneratedSig: FuncCallSig = { positional: [{ key: 'expression', type: str() }] };\n\nconst sqliteDefaultFunctionRegistryEntries = [\n  [\n    'autoincrement',\n    {\n      signature: autoincrementSig,\n      lower: lowerAutoincrement,\n      usageSignatures: ['autoincrement()'],\n    },\n  ],\n  ['now', { signature: nowSig, lower: lowerNow, usageSignatures: ['now()'] }],\n  [\n    'uuid',\n    { signature: uuidSig, lower: lowerUuid, usageSignatures: ['uuid()', 'uuid(4)', 'uuid(7)'] },\n  ],\n  ['cuid', { signature: cuidSig, lower: lowerCuid, usageSignatures: ['cuid(2)'] }],\n  ['ulid', { signature: ulidSig, lower: lowerUlid, usageSignatures: ['ulid()'] }],\n  [\n    'nanoid',\n    { signature: nanoidSig, lower: lowerNanoid, usageSignatures: ['nanoid()', 'nanoid(<2-255>)'] },\n  ],\n  [\n    'dbgenerated',\n    { signature: dbgeneratedSig, lower: lowerDbgenerated, usageSignatures: ['dbgenerated(\"...\")'] },\n  ],\n] satisfies ReadonlyArray<readonly [string, ControlMutationDefaultEntry]>;\n\nconst sqliteScalarTypeDescriptors = new Map<string, string>([\n  ['String', SQLITE_TEXT_CODEC_ID],\n  ['Int', SQLITE_INTEGER_CODEC_ID],\n  ['BigInt', SQLITE_BIGINT_CODEC_ID],\n  ['Float', SQLITE_REAL_CODEC_ID],\n  ['Decimal', SQLITE_TEXT_CODEC_ID],\n  ['DateTime', SQLITE_DATETIME_CODEC_ID],\n  ['Json', SQLITE_JSON_CODEC_ID],\n  ['Bytes', SQLITE_BLOB_CODEC_ID],\n]);\n\nexport function createSqliteDefaultFunctionRegistry(): ReadonlyMap<\n  string,\n  ControlMutationDefaultEntry\n> {\n  return new Map(sqliteDefaultFunctionRegistryEntries);\n}\n\nexport function createSqliteMutationDefaultGeneratorDescriptors(): readonly MutationDefaultGeneratorDescriptor[] {\n  return [\n    ...builtinGeneratorRegistryMetadata.map(\n      ({ id, applicableCodecIds }): MutationDefaultGeneratorDescriptor => ({\n        id,\n        applicableCodecIds,\n        resolveGeneratedColumnDescriptor: ({ generated }) => {\n          if (generated.kind !== 'generator' || generated.id !== id) {\n            return undefined;\n          }\n          const descriptor = resolveBuiltinGeneratedColumnDescriptor({\n            id,\n            ...(generated.params ? { params: generated.params } : {}),\n          });\n          return {\n            codecId: descriptor.type.codecId,\n            nativeType: descriptor.type.nativeType,\n            ...(descriptor.type.typeRef ? { typeRef: descriptor.type.typeRef } : {}),\n            ...(descriptor.typeParams ? { typeParams: descriptor.typeParams } : {}),\n          };\n        },\n      }),\n    ),\n    timestampNowControlDescriptor(),\n  ];\n}\n\nexport function createSqliteScalarTypeDescriptors(): ReadonlyMap<string, string> {\n  return new Map(sqliteScalarTypeDescriptors);\n}\n","import type { SqlControlAdapterDescriptor } from '@prisma-next/family-sql/control';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport { SqliteControlAdapter } from '../core/control-adapter';\nimport {\n  createSqliteDefaultFunctionRegistry,\n  createSqliteMutationDefaultGeneratorDescriptors,\n  createSqliteScalarTypeDescriptors,\n} from '../core/control-mutation-defaults';\nimport { sqliteAdapterDescriptorMeta } from '../core/descriptor-meta';\n\nconst sqliteAdapterDescriptor: SqlControlAdapterDescriptor<'sqlite'> = {\n  ...sqliteAdapterDescriptorMeta,\n  scalarTypeDescriptors: createSqliteScalarTypeDescriptors(),\n  controlMutationDefaults: {\n    defaultFunctionRegistry: createSqliteDefaultFunctionRegistry(),\n    generatorDescriptors: createSqliteMutationDefaultGeneratorDescriptors(),\n  },\n  create(stack): SqlControlAdapter<'sqlite'> {\n    return new SqliteControlAdapter(stack.codecLookup);\n  },\n};\n\nexport default sqliteAdapterDescriptor;\n\n// `parseSqliteDefault`, `normalizeSqliteNativeType`, `quoteIdentifier`,\n// `escapeLiteral`, and `SqlEscapeError` live target-side (one-way\n// `adapter → target` edge, matching Postgres). Re-exported from the\n// adapter so consumers — both internal and downstream — see the same\n// adapter-shaped surface across SQL targets.\nexport { parseSqliteDefault } from '@prisma-next/target-sqlite/default-normalizer';\nexport { normalizeSqliteNativeType } from '@prisma-next/target-sqlite/native-type-normalizer';\nexport {\n  escapeLiteral,\n  quoteIdentifier,\n  SqlEscapeError,\n} from '@prisma-next/target-sqlite/sql-utils';\nexport { createSqliteBuiltinCodecLookup } from '../core/codec-lookup';\n// `SqlControlAdapterDescriptor` is declared in two places in the codebase\n// (`family-sql/control-adapter` and `family-sql/migrations/types`); the\n// migrations-side declaration narrows `create()`'s return type to the base\n// `ControlAdapterInstance`, hiding `introspect`/`readMarker`. Until that's\n// reconciled upstream, downstream consumers (e2e harness, integration\n// tests) need direct access to the concrete class. Mirrors how Postgres'\n// own package tests import `PostgresControlAdapter` directly.\nexport { SqliteControlAdapter } from '../core/control-adapter';\n"],"mappings":"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"}