{"version":3,"file":"schema-BKvcWdVf.mjs","names":["parseInternal","parseFieldInternal"],"sources":["../src/configure/types/field.ts","../src/configure/services/tailordb/schema.ts"],"sourcesContent":["import type { EnumValue } from \"#/configure/types/field.types\";\n\nexport type AllowedValues = readonly [string | EnumValue, ...(string | EnumValue)[]];\n\n/**\n * Normalize allowed values into EnumValue objects with descriptions.\n * @param values - Allowed values as strings or EnumValue objects\n * @returns Normalized allowed values\n */\nexport function mapAllowedValues(values: AllowedValues): EnumValue[] {\n  return values.map((value) => {\n    if (typeof value === \"string\") {\n      return { value, description: \"\" };\n    }\n    return { ...value, description: value.description ?? \"\" };\n  });\n}\n\nexport type AllowedValuesOutput<V extends AllowedValues> = V[number] extends infer T\n  ? T extends string\n    ? T\n    : T extends { value: infer K }\n      ? K\n      : never\n  : never;\n","import { cloneDeep } from \"es-toolkit\";\nimport {\n  type AllowedValues,\n  type AllowedValuesOutput,\n  mapAllowedValues,\n} from \"#/configure/types/field\";\nimport {\n  parseInternal as parseFieldInternal,\n  type FieldParseArgs,\n  type FieldParseInternalArgs,\n} from \"#/runtime/field-parse\";\nimport { brandValue } from \"#/utils/brand\";\nimport type {\n  FieldOptions,\n  FieldOutput,\n  TailorFieldType,\n  TailorToTs,\n  FieldValidateInput,\n} from \"#/configure/types/field.types\";\nimport type {\n  PrecompiledScriptExprKey,\n  PrecompiledScriptExprMap,\n} from \"#/parser/service/tailordb/types\";\nimport type { PluginAttachment, PluginConfigs, PluginFieldExtensions } from \"#/plugin/types\";\nimport type { InferredAttributes } from \"#/runtime/types\";\nimport type {\n  output,\n  InferFieldsOutput,\n  IsUnion,\n  TypeLevelError,\n  UnionToIntersection,\n} from \"#/types/helpers\";\nimport type { RawPermissions } from \"#/types/tailordb.generated\";\nimport type { TailorTypeGqlPermission, TailorTypePermission } from \"./permission\";\nimport type {\n  TailorDBField as TailorDBFieldBase,\n  TailorDBType as TailorDBTypeBase,\n  DBFieldMetadata,\n  DefinedDBFieldMetadata,\n  SerialConfig,\n  IndexDef,\n  TailorDBTypeMetadata,\n  RawRelationConfig,\n  RelationType,\n  Hook,\n  TypeHook,\n  UpdateHookFn,\n  ExcludeNestedDBFields,\n  ExcludeHookedDBFields,\n  ExcludeDefaultedDBFields,\n  TypeFeatures,\n  TypeValidateFn,\n} from \"./types\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n// Erased DB fields stay assignable across builder method-state changes.\n// oxlint-disable-next-line no-explicit-any\ntype AnyBuilderMethod = any;\n\nexport type TailorAnyDBField = Omit<\n  TailorDBFieldBase<AnyBuilderMethod, AnyBuilderMethod>,\n  \"fields\"\n> & {\n  readonly fields: Record<string, AnyBuilderMethod>;\n  _metadata: DBFieldMetadata;\n  parse: AnyBuilderMethod;\n  readonly typeName: TypeLevelError<string>;\n  description: AnyBuilderMethod;\n  relation: AnyBuilderMethod;\n  index: AnyBuilderMethod;\n  unique: AnyBuilderMethod;\n  vector: AnyBuilderMethod;\n  default: AnyBuilderMethod;\n  hooks: AnyBuilderMethod;\n  validate: AnyBuilderMethod;\n  serial: AnyBuilderMethod;\n  clone: AnyBuilderMethod;\n};\n\n// Helper alias\n// oxlint-disable-next-line no-explicit-any\nexport type TailorAnyDBType = TailorDBType<any, any, any>;\n\ntype IsAny<T> = 0 extends 1 & T ? true : false;\ntype DBFieldTypeNameMethod<Defined extends DefinedDBFieldMetadata> =\n  IsAny<Defined> extends true\n    ? TypeLevelError<string>\n    : TypeLevelError<\"typeName cannot be used on TailorDB fields\">;\n\ntype WithDBFieldDescription<Defined> = Defined & { description: true };\ntype WithDBFieldRelation<Defined, S extends RelationType | RelationSelfConfig> = S extends\n  | \"oneToOne\"\n  | \"1-1\"\n  ? Defined & { unique: true; index: true; relation: true }\n  : S extends { type: \"oneToOne\" | \"1-1\" }\n    ? Defined & { unique: true; index: true; relation: true }\n    : Defined & { index: true; relation: true };\ntype WithDBFieldIndex<Defined> = Defined & { index: true };\ntype WithDBFieldUnique<Defined> = Defined & { unique: true; index: true };\ntype WithDBFieldVector<Defined> = Defined & { vector: true };\ntype WithDBFieldHooks<Defined, H> = Defined & {\n  hooks: {\n    create: H extends { create: unknown } ? true : false;\n    update: H extends { update: unknown } ? true : false;\n  };\n  serial: false;\n};\ntype WithDBFieldDefault<Defined> = Defined & { default: true };\ntype WithDBFieldValidate<Defined> = Defined & { validate: true };\ntype WithDBFieldSerial<Defined> = Defined & {\n  serial: true;\n  hooks: { create: false; update: false };\n};\ntype WithDBFieldCloneOptions<Defined extends DefinedDBFieldMetadata, NewOpt extends FieldOptions> =\n  IsAny<Defined> extends true\n    ? Defined\n    : Omit<Defined, \"array\"> & {\n        array: NewOpt extends { array: true }\n          ? true\n          : NewOpt extends { array: false }\n            ? false\n            : Defined[\"array\"];\n      };\ntype NonNullableDBFieldOutput<Output> = Exclude<Output, null>;\ntype DBFieldScalarOutput<Output> =\n  NonNullableDBFieldOutput<Output> extends (infer Item)[] ? Item : NonNullableDBFieldOutput<Output>;\ntype DBFieldCloneArrayOutput<Output, NewOpt extends FieldOptions> = NewOpt extends {\n  array: true;\n}\n  ? DBFieldScalarOutput<Output>[]\n  : NewOpt extends { array: false }\n    ? DBFieldScalarOutput<Output>\n    : NonNullableDBFieldOutput<Output>;\ntype DBFieldCloneOutput<Output, NewOpt extends FieldOptions> = NewOpt extends { optional: true }\n  ? DBFieldCloneArrayOutput<Output, NewOpt> | null\n  : NewOpt extends { optional: false }\n    ? DBFieldCloneArrayOutput<Output, NewOpt>\n    : null extends Output\n      ? DBFieldCloneArrayOutput<Output, NewOpt> | null\n      : DBFieldCloneArrayOutput<Output, NewOpt>;\ntype DBFieldCloneOptions<Defined extends DefinedDBFieldMetadata> = Omit<FieldOptions, \"array\"> & {\n  array?: Defined extends { validate: unknown } ? Defined[\"array\"] : boolean;\n};\ntype InvalidValidatedArrayCloneKeys<\n  Fields extends Record<string, TailorAnyDBField>,\n  K extends keyof Fields,\n  Opt extends FieldOptions,\n> = Opt extends { array: infer ArrayOption }\n  ? {\n      [P in K]: Fields[P] extends TailorDBField<infer Defined, infer _Output>\n        ? Defined extends { validate: unknown }\n          ? ArrayOption extends Defined[\"array\"]\n            ? never\n            : P\n          : never\n        : never;\n    }[K]\n  : never;\ntype DBFieldsCloneOptionsGuard<\n  Fields extends Record<string, TailorAnyDBField>,\n  K extends keyof Fields,\n  Opt extends FieldOptions,\n> = [InvalidValidatedArrayCloneKeys<Fields, K, Opt>] extends [never]\n  ? unknown\n  : TypeLevelError<\"array cannot be changed on fields with custom validation\">;\ntype DefinedDBTypeMetadata = {\n  hooks?: true;\n  validate?: true;\n  features?: true;\n  indexes?: true;\n  files?: true;\n  permission?: true;\n  gqlPermission?: true;\n  description?: true;\n};\ntype WithDBTypeMetadata<\n  Defined extends DefinedDBTypeMetadata,\n  Key extends keyof DefinedDBTypeMetadata,\n> = Defined & Record<Key, true>;\ntype DBTypeDuplicateInputGuard<\n  Defined extends DefinedDBTypeMetadata,\n  Key extends keyof DefinedDBTypeMetadata,\n  Input,\n  Message extends string,\n> =\n  IsAny<Defined> extends true\n    ? Input\n    : Defined extends Record<Key, unknown>\n      ? TypeLevelError<Message>\n      : Input;\ntype DBTypeDuplicateRestGuard<\n  Defined extends DefinedDBTypeMetadata,\n  Key extends keyof DefinedDBTypeMetadata,\n  Input extends unknown[],\n  Message extends string,\n> =\n  IsAny<Defined> extends true\n    ? Input\n    : Defined extends Record<Key, unknown>\n      ? [TypeLevelError<Message>, ...TypeLevelError<Message>[]]\n      : Input;\ntype FileKeyConflictError<\n  Fields extends Record<string, TailorAnyDBField>,\n  User extends object,\n> = Partial<\n  Record<\n    keyof output<TailorDBType<Fields, User>> & string,\n    TypeLevelError<\"file keys cannot use existing field names\">\n  >\n>;\n// A plugin id with no PluginFieldExtensions entry contributes no keys — using\n// Record<never, never> (rather than Record<string, never>) keeps its `keyof`\n// empty so it can't spuriously collide with every existing field.\ntype PluginFieldExtensionFor<\n  Fields extends Record<string, TailorAnyDBField>,\n  Id extends string,\n  IdConfig,\n> = Id extends keyof PluginFieldExtensions<keyof Fields & string, IdConfig>\n  ? PluginFieldExtensions<keyof Fields & string, IdConfig>[Id]\n  : Record<never, never>;\ntype PluginFieldExtensionsUnion<\n  Fields extends Record<string, TailorAnyDBField>,\n  Config extends Record<string, unknown>,\n> = {\n  [Id in keyof Config & string]: PluginFieldExtensionFor<Fields, Id, Config[Id]>;\n}[keyof Config & string];\ntype AllExtensionKeys<Ext> = Ext extends unknown ? keyof Ext : never;\n// True when plugin `Id` has a PluginFieldExtensions entry whose type does not\n// extend Record<string, TailorAnyDBField> — e.g. a plugin author registered\n// a non-record shape by mistake. Checked ahead of PluginFieldConflict, since\n// `keyof` on a non-record shape (e.g. `keyof string`) would otherwise produce\n// nonsense candidate keys for the collision check.\n// `Id extends string` (not `keyof Config & string`) deliberately: a mapped\n// type's key variable, used inside a nested conditional branch and then\n// intersected with `string`, does not structurally satisfy a `keyof Config &\n// string`-constrained type parameter under `skipLibCheck: false` (verified\n// against a standalone consumer — TS2344 on both call sites otherwise, even\n// for code that never calls .plugin()). `Config[Id & keyof Config]` recovers\n// the same indexed-access result without that constraint.\ntype PluginFieldExtensionShapeError<\n  Fields extends Record<string, TailorAnyDBField>,\n  Config extends Record<string, unknown>,\n  Id extends string,\n> =\n  PluginFieldExtensionFor<Fields, Id, Config[Id & keyof Config]> extends Record<\n    string,\n    TailorAnyDBField\n  >\n    ? false\n    : true;\n// True when the fields plugin `Id` would inject collide with an existing\n// field, or with a field injected by another plugin id attached in the same\n// .plugin() call.\ntype PluginFieldConflict<\n  Fields extends Record<string, TailorAnyDBField>,\n  Config extends Record<string, unknown>,\n  Id extends string,\n  FileKeys extends string,\n> = [\n  AllExtensionKeys<PluginFieldExtensionFor<Fields, Id, Config[Id & keyof Config]>> &\n    (\n      | keyof Fields\n      | FileKeys\n      | AllExtensionKeys<PluginFieldExtensionsUnion<Fields, Omit<Config, Id>>>\n    ),\n] extends [never]\n  ? false\n  : true;\n// Rejects a property on the caller's config literal for plugin `Id` that\n// isn't part of its registered PluginConfigs shape. `Config` is captured by\n// a `const` type parameter from the argument itself, so intersecting the\n// success branch with `PluginConfigs<...>[Id]` alone would not trigger\n// TypeScript's excess-property check — that check only fires when an object\n// literal is validated directly against a target type, not after its shape\n// has already been inferred through a generic parameter.\ntype PluginConfigExcessProps<\n  Fields extends Record<string, TailorAnyDBField>,\n  Config extends Record<string, unknown>,\n  Id extends string,\n> = Record<\n  Exclude<\n    keyof Config[Id & keyof Config],\n    keyof PluginConfigs<keyof Fields & string>[Id & keyof PluginConfigs<keyof Fields & string>]\n  >,\n  never\n>;\ntype PluginExtendedFields<\n  Fields extends Record<string, TailorAnyDBField>,\n  Config extends Record<string, unknown>,\n> =\n  IsAny<Fields> extends true\n    ? Fields\n    : // For `Config = {}`, PluginFieldExtensionsUnion is `never`, and\n      // UnionToIntersection<never> is `unknown` (not `never`), so this\n      // correctly reduces to `Fields` — see the \"empty config\" test.\n      Fields & UnionToIntersection<PluginFieldExtensionsUnion<Fields, Config>>;\n// Validates each key of the passed config object against PluginConfigs and\n// flags field-extension conflicts (see PluginFieldConflict above), keeping\n// type errors localized to the offending plugin id instead of requiring\n// every registered plugin id to be present (as a `P extends keyof\n// PluginConfigs<...>` generic would need, defeating inference of which\n// plugin ids were actually passed).\ntype PluginConfigGuard<\n  Fields extends Record<string, TailorAnyDBField>,\n  Config extends Record<string, unknown>,\n  FileKeys extends string,\n> =\n  IsAny<Fields> extends true\n    ? unknown\n    : {\n        [K in keyof Config]: K extends keyof PluginConfigs<keyof Fields & string>\n          ? // A union config (e.g. from a ternary passed directly as a plugin's\n            // value) distributes through PluginFieldExtensionFor's conditional\n            // and silently collapses the injected field to `never` once\n            // intersected back together — reject it here instead, before it\n            // can produce that confusing downstream error.\n            IsUnion<Config[K]> extends true\n            ? TypeLevelError<\"plugin config must be a single object literal, not a union — assign the config to a variable first if it comes from a conditional expression\">\n            : PluginFieldExtensionShapeError<Fields, Config, K & string> extends true\n              ? TypeLevelError<\"PluginFieldExtensions entry must be a Record<string, TailorAnyDBField>\">\n              : PluginFieldConflict<Fields, Config, K & string, FileKeys> extends true\n                ? TypeLevelError<\"plugin field extension conflicts with an existing field, a file key declared via .files(), or another plugin's field\">\n                : PluginConfigs<keyof Fields & string>[K] &\n                    PluginConfigExcessProps<Fields, Config, K & string>\n          : TypeLevelError<\"unknown plugin id\">;\n      };\ntype DBFieldDescriptionFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = (description: string) => TailorDBField<WithDBFieldDescription<Defined>, Output, Nested>;\ntype DBFieldRelationFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = {\n  <S extends RelationType, T extends TailorAnyDBType>(\n    config: RelationConfig<S, T>,\n  ): TailorDBField<WithDBFieldRelation<Defined, S>, Output, Nested>;\n  <S extends RelationSelfConfig>(\n    config: S,\n  ): TailorDBField<WithDBFieldRelation<Defined, S>, Output, Nested>;\n};\ntype DBFieldIndexFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = () => TailorDBField<WithDBFieldIndex<Defined>, Output, Nested>;\ntype DBFieldUniqueFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = () => TailorDBField<WithDBFieldUnique<Defined>, Output, Nested>;\ntype DBFieldVectorFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = () => TailorDBField<WithDBFieldVector<Defined>, Output, Nested>;\ntype DBFieldHooksFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = <\n  const H extends Hook<\n    Output,\n    Defined extends { default: true } ? Output | null | undefined : Output\n  >,\n>(\n  hooks: H,\n) => TailorDBField<WithDBFieldHooks<Defined, H>, Output, Nested>;\ntype DBFieldValidateFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = (\n  ...validate: FieldValidateInput<Output>[]\n) => TailorDBField<WithDBFieldValidate<Defined>, Output, Nested>;\ntype DBFieldSerialFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = (\n  config: SerialConfig<Defined[\"type\"] & (\"integer\" | \"string\")>,\n) => TailorDBField<WithDBFieldSerial<Defined>, Output, Nested>;\ntype DBFieldDescriptionMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldDescriptionFn<Defined, Output, Nested>\n    : Defined extends { description: unknown }\n      ? TypeLevelError<\".description() has already been set\">\n      : DBFieldDescriptionFn<Defined, Output, Nested>;\ntype DBFieldRelationMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldRelationFn<Defined, Output, Nested>\n    : Defined extends { relation: unknown }\n      ? TypeLevelError<\".relation() has already been set\">\n      : DBFieldRelationFn<Defined, Output, Nested>;\ntype DBFieldArrayCheck<A extends boolean, Ok, Msg extends string> = A extends true\n  ? TypeLevelError<Msg>\n  : Ok;\ntype DBFieldIndexMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldIndexFn<Defined, Output, Nested>\n    : Defined extends { index: unknown }\n      ? TypeLevelError<\".index() has already been set\">\n      : DBFieldArrayCheck<\n          Defined[\"array\"],\n          DBFieldIndexFn<Defined, Output, Nested>,\n          \"index cannot be set on array fields\"\n        >;\ntype DBFieldUniqueMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldUniqueFn<Defined, Output, Nested>\n    : Defined extends { unique: unknown }\n      ? TypeLevelError<\".unique() has already been set\">\n      : DBFieldArrayCheck<\n          Defined[\"array\"],\n          DBFieldUniqueFn<Defined, Output, Nested>,\n          \"unique cannot be set on array fields\"\n        >;\ntype DBFieldVectorMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldVectorFn<Defined, Output, Nested>\n    : Defined extends { vector: unknown }\n      ? TypeLevelError<\".vector() has already been set\">\n      : Defined extends { type: \"string\"; array: false }\n        ? DBFieldVectorFn<Defined, Output, Nested>\n        : TypeLevelError<\"vector can only be set on non-array string fields\">;\ntype DBFieldHooksMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldHooksFn<Defined, Output, Nested>\n    : Defined extends {\n          serial: true;\n          hooks: { create: false; update: false };\n        }\n      ? TypeLevelError<\"hooks cannot be set after serial\">\n      : Defined extends {\n            hooks: unknown;\n          }\n        ? TypeLevelError<\".hooks() has already been set\">\n        : Defined extends { type: \"nested\" }\n          ? TypeLevelError<\"hooks cannot be set on nested type fields\">\n          : DBFieldHooksFn<Defined, Output, Nested>;\ntype DBFieldValidateMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldValidateFn<Defined, Output, Nested>\n    : Defined extends { validate: unknown }\n      ? TypeLevelError<\".validate() has already been set\">\n      : DBFieldValidateFn<Defined, Output, Nested>;\ntype DBFieldSerialMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldSerialFn<Defined, Output, Nested>\n    : Defined extends { serial: true }\n      ? TypeLevelError<\".serial() has already been set\">\n      : Defined extends { serial: false }\n        ? TypeLevelError<\"serial cannot be set after hooks\">\n        : IsAny<Output> extends true\n          ? Defined extends { type: \"integer\" | \"string\"; array: false }\n            ? DBFieldSerialFn<Defined, Output, Nested>\n            : TypeLevelError<\"serial can only be set on non-array integer or string fields\">\n          : null extends Output\n            ? TypeLevelError<\"serial can only be set on non-array integer or string fields\">\n            : Defined extends { type: \"integer\" | \"string\"; array: false }\n              ? DBFieldSerialFn<Defined, Output, Nested>\n              : TypeLevelError<\"serial can only be set on non-array integer or string fields\">;\ntype DBFieldDefaultFn<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> = (\n  value: Output extends null ? NonNullable<Output> : Output,\n) => TailorDBField<WithDBFieldDefault<Defined>, Output, Nested>;\ntype DBFieldDefaultMethod<\n  Defined extends DefinedDBFieldMetadata,\n  Output,\n  Nested extends Record<string, TailorAnyDBField>,\n> =\n  IsAny<Defined> extends true\n    ? DBFieldDefaultFn<Defined, Output, Nested>\n    : Defined extends { default: unknown }\n      ? TypeLevelError<\".default() has already been set\">\n      : Defined extends { type: \"nested\" }\n        ? TypeLevelError<\"default cannot be set on nested type fields\">\n        : Defined extends { serial: true }\n          ? TypeLevelError<\"default cannot be set on serial fields\">\n          : null extends Output\n            ? TypeLevelError<\"default cannot be set on optional fields\">\n            : DBFieldDefaultFn<Defined, Output, Nested>;\n\n/**\n * Full TailorDBField interface with builder methods.\n * Extends the minimal structural interface from types/ with fluent API methods.\n */\nexport interface TailorDBField<\n  Defined extends DefinedDBFieldMetadata = DefinedDBFieldMetadata,\n  // oxlint-disable-next-line no-explicit-any\n  Output = any,\n  // Nested object fields, so a `db.object()` field keeps the shape it was declared with.\n  // Every builder method passes it through; dropping it here would erase the shape as\n  // soon as one is chained.\n  Nested extends Record<string, TailorAnyDBField> = Record<string, TailorAnyDBField>,\n> extends Omit<TailorDBFieldBase<Defined, Output, Nested>, \"fields\"> {\n  readonly fields: Nested;\n  _metadata: DBFieldMetadata;\n\n  /**\n   * Parse and validate a value against this field's validation rules\n   */\n  parse(args: FieldParseArgs): StandardSchemaV1.Result<Output>;\n\n  /**\n   * typeName is not available on TailorDB fields.\n   * Use typeName on pipeline fields (t.enum / t.object) instead.\n   */\n  typeName: DBFieldTypeNameMethod<Defined>;\n\n  /**\n   * Set a description for the field\n   */\n  description: DBFieldDescriptionMethod<Defined, Output, Nested>;\n\n  /**\n   * Define a relation to another table.\n   */\n  relation: DBFieldRelationMethod<Defined, Output, Nested>;\n\n  /**\n   * Add an index to the field\n   */\n  index: DBFieldIndexMethod<Defined, Output, Nested>;\n\n  /**\n   * Make the field unique (also adds an index)\n   */\n  unique: DBFieldUniqueMethod<Defined, Output, Nested>;\n\n  /**\n   * Enable vector search on the field (string type only)\n   */\n  vector: DBFieldVectorMethod<Defined, Output, Nested>;\n\n  /**\n   * Set a default value for the field on create. When the field is required,\n   * this makes it optional in the Create input — the default fills in when\n   * no value (or a nullish hook result) is provided.\n   *\n   * For datetime/date/time fields, pass `\"now\"` to use the operation timestamp.\n   */\n  default: DBFieldDefaultMethod<Defined, Output, Nested>;\n\n  /**\n   * Add hooks for create/update operations on this field.\n   */\n  hooks: DBFieldHooksMethod<Defined, Output, Nested>;\n\n  /**\n   * Add validation functions to the field.\n   *\n   * Validators receive `{ value, data, user }` and run after hooks and\n   * built-in type validation; they are skipped when built-in validation\n   * fails. For array fields, `value` is the complete array.\n   */\n  validate: DBFieldValidateMethod<Defined, Output, Nested>;\n\n  /**\n   * Configure serial/auto-increment behavior\n   */\n  serial: DBFieldSerialMethod<Defined, Output, Nested>;\n\n  /**\n   * Clone the field with optional overrides for field options.\n   * The `array` option cannot change on fields with custom validation.\n   */\n  clone<const NewOpt extends DBFieldCloneOptions<Defined>>(\n    options?: NewOpt,\n  ): TailorDBField<\n    WithDBFieldCloneOptions<Defined, NewOpt>,\n    DBFieldCloneOutput<Output, NewOpt>,\n    Nested\n  >;\n}\n\n/**\n * Full TailorDBType interface with builder methods.\n * Extends the minimal structural interface from types/ with fluent API methods.\n */\nexport interface TailorDBType<\n  // oxlint-disable-next-line no-explicit-any\n  Fields extends Record<string, TailorAnyDBField> = any,\n  User extends object = InferredAttributes,\n  // oxlint-disable-next-line no-explicit-any\n  Defined extends DefinedDBTypeMetadata = any,\n  FileKeys extends string = never,\n> extends TailorDBTypeBase<Fields, User> {\n  _description?: string;\n\n  hooks(\n    hook: DBTypeDuplicateInputGuard<\n      Defined,\n      \"hooks\",\n      TypeHook<Fields>,\n      \".hooks() has already been set\"\n    >,\n  ): TailorDBType<Fields, User, WithDBTypeMetadata<Defined, \"hooks\">, FileKeys>;\n  validate(\n    fn: DBTypeDuplicateInputGuard<\n      Defined,\n      \"validate\",\n      TypeValidateFn<Fields>,\n      \".validate() has already been set\"\n    >,\n  ): TailorDBType<Fields, User, WithDBTypeMetadata<Defined, \"validate\">, FileKeys>;\n  features(\n    features: DBTypeDuplicateInputGuard<\n      Defined,\n      \"features\",\n      Omit<TypeFeatures, \"pluralForm\">,\n      \".features() has already been set\"\n    >,\n  ): TailorDBType<Fields, User, WithDBTypeMetadata<Defined, \"features\">, FileKeys>;\n  indexes(\n    ...indexes: DBTypeDuplicateRestGuard<\n      Defined,\n      \"indexes\",\n      IndexDef<TailorDBType<Fields, User, Defined, FileKeys>>[],\n      \".indexes() has already been set\"\n    >\n  ): TailorDBType<Fields, User, WithDBTypeMetadata<Defined, \"indexes\">, FileKeys>;\n  files<const F extends string>(\n    files: DBTypeDuplicateInputGuard<\n      Defined,\n      \"files\",\n      Record<F, string> & FileKeyConflictError<Fields, User>,\n      \".files() has already been set\"\n    >,\n  ): TailorDBType<Fields, User, WithDBTypeMetadata<Defined, \"files\">, FileKeys | F>;\n  permission<\n    U extends object = User,\n    P extends TailorTypePermission<U, output<TailorDBType<Fields, User, Defined>>> =\n      TailorTypePermission<U, output<TailorDBType<Fields, User, Defined>>>,\n  >(\n    permission: DBTypeDuplicateInputGuard<\n      Defined,\n      \"permission\",\n      P,\n      \".permission() has already been set\"\n    >,\n  ): TailorDBType<Fields, U, WithDBTypeMetadata<Defined, \"permission\">, FileKeys>;\n  gqlPermission<\n    U extends object = User,\n    P extends TailorTypeGqlPermission<U> = TailorTypeGqlPermission<U>,\n  >(\n    permission: DBTypeDuplicateInputGuard<\n      Defined,\n      \"gqlPermission\",\n      P,\n      \".gqlPermission() has already been set\"\n    >,\n  ): TailorDBType<Fields, U, WithDBTypeMetadata<Defined, \"gqlPermission\">, FileKeys>;\n  description(\n    description: DBTypeDuplicateInputGuard<\n      Defined,\n      \"description\",\n      string,\n      \".description() has already been set\"\n    >,\n  ): TailorDBType<Fields, User, WithDBTypeMetadata<Defined, \"description\">, FileKeys>;\n  pickFields<K extends keyof Fields>(keys: K[]): Pick<Fields, K>;\n  pickFields<K extends keyof Fields, const Opt extends FieldOptions>(\n    keys: K[],\n    options: Opt & DBFieldsCloneOptionsGuard<Fields, K, Opt>,\n  ): {\n    [P in K]: Fields[P] extends TailorDBField<infer D, infer O>\n      ? TailorDBField<WithDBFieldCloneOptions<D, Opt>, DBFieldCloneOutput<O, Opt>>\n      : never;\n  };\n  omitFields<K extends keyof Fields>(keys: K[]): Omit<Fields, K>;\n  plugin<const Config extends Record<string, unknown>>(\n    config: Config & PluginConfigGuard<Fields, Config, FileKeys>,\n  ): TailorDBType<PluginExtendedFields<Fields, Config>, User, Defined, FileKeys>;\n}\n\nexport type TailorDBInstance<\n  // oxlint-disable-next-line no-explicit-any\n  Fields extends Record<string, TailorAnyDBField> = any,\n  User extends object = InferredAttributes,\n  // oxlint-disable-next-line no-explicit-any\n  Defined extends DefinedDBTypeMetadata = any,\n  FileKeys extends string = never,\n> = TailorDBType<Fields, User, Defined, FileKeys>;\n\ninterface RelationConfig<S extends RelationType, T extends TailorDBType> {\n  type: S;\n  toward:\n    | {\n        table: T;\n        as?: string;\n        key?: keyof T[\"fields\"] & string;\n        type?: never;\n      }\n    | {\n        /**\n         * @deprecated since 2.6.0 — use `table` instead. codemod: v3/relation-toward-table\n         */\n        type: T;\n        as?: string;\n        key?: keyof T[\"fields\"] & string;\n        table?: never;\n      };\n  backward?: string;\n}\n\n// Special config variant for self-referencing relations\ntype RelationSelfConfig = {\n  type: RelationType;\n  toward:\n    | {\n        table: \"self\";\n        as?: string;\n        key?: string;\n        type?: never;\n      }\n    | {\n        /**\n         * @deprecated since 2.6.0 — use `table` instead. codemod: v3/relation-toward-table\n         */\n        type: \"self\";\n        as?: string;\n        key?: string;\n        table?: never;\n      };\n  backward?: string;\n};\n\ntype DBFieldDefined<T extends TailorFieldType, Opt extends FieldOptions> = {\n  type: T;\n  array: Opt extends { array: true } ? true : false;\n};\ntype DBFieldOutput<\n  T extends TailorFieldType,\n  Opt extends FieldOptions,\n  OutputBase = TailorToTs[T],\n> = FieldOutput<OutputBase, Opt>;\ntype TailorDBFieldInstance<\n  T extends TailorFieldType,\n  Opt extends FieldOptions,\n  OutputBase = TailorToTs[T],\n> = TailorDBField<DBFieldDefined<T, Opt>, DBFieldOutput<T, Opt, OutputBase>>;\ntype TailorDBFieldRuntimeInstance<\n  T extends TailorFieldType,\n  Opt extends FieldOptions,\n  OutputBase = TailorToTs[T],\n> = TailorDBFieldRuntime<DBFieldDefined<T, Opt>, DBFieldOutput<T, Opt, OutputBase>>;\ntype TailorDBFieldRuntime<Defined extends DefinedDBFieldMetadata, Output> = Omit<\n  TailorDBFieldBase<Defined, Output>,\n  \"fields\"\n> & {\n  readonly fields: Record<string, TailorAnyDBField>;\n  _metadata: DBFieldMetadata;\n  description(description: string): object;\n  typeName(typeName: string): object;\n  validate(...validate: FieldValidateInput<Output>[]): object;\n  relation(config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig): object;\n  index(): object;\n  unique(): object;\n  vector(): object;\n  default(value: unknown): object;\n  hooks(hooks: Hook<Output>): object;\n  serial(config: SerialConfig): object;\n  clone(options?: FieldOptions): TailorDBFieldRuntime<DefinedDBFieldMetadata, AnyBuilderMethod>;\n  parse(args: FieldParseArgs): StandardSchemaV1.Result<Output>;\n  _setRawRelation(relation: RawRelationConfig): void;\n};\n\n/**\n * Creates a new TailorDBField instance.\n * @param type - Field type\n * @param options - Field options\n * @param fields - Nested fields for object-like types\n * @param values - Allowed values for enum-like fields\n * @returns A new TailorDBField\n */\nfunction createTailorDBField<\n  const T extends TailorFieldType,\n  const TOptions extends FieldOptions,\n  const OutputBase = TailorToTs[T],\n>(\n  type: T,\n  options?: TOptions,\n  fields?: Record<string, TailorAnyDBField>,\n  values?: AllowedValues,\n): TailorDBFieldInstance<T, TOptions, OutputBase>;\nfunction createTailorDBField<const T extends TailorFieldType, const TOptions extends FieldOptions>(\n  type: T,\n  options?: TOptions,\n  fields?: Record<string, TailorAnyDBField>,\n  values?: AllowedValues,\n): object {\n  return createTailorDBFieldRuntime(type, options, fields, values);\n}\n\nfunction createTailorDBFieldRuntime<\n  const T extends TailorFieldType,\n  const TOptions extends FieldOptions,\n  const OutputBase = TailorToTs[T],\n>(\n  type: T,\n  options?: TOptions,\n  fields?: Record<string, TailorAnyDBField>,\n  values?: AllowedValues,\n): TailorDBFieldRuntimeInstance<T, TOptions, OutputBase> {\n  type FieldValue = DBFieldOutput<T, TOptions, OutputBase>;\n  type FieldType = TailorDBFieldRuntimeInstance<T, TOptions, OutputBase>;\n\n  const _metadata: DBFieldMetadata = { required: true };\n  let _rawRelation: RawRelationConfig | undefined;\n\n  if (options) {\n    if (options.optional === true) {\n      _metadata.required = false;\n    }\n    if (options.array === true) {\n      _metadata.array = true;\n    }\n  }\n  if (values) {\n    _metadata.allowedValues = mapAllowedValues(values);\n  }\n\n  function parseInternal(args: FieldParseInternalArgs): StandardSchemaV1.Result<FieldValue> {\n    return parseFieldInternal<T, FieldValue>({\n      ...args,\n      field,\n    });\n  }\n\n  function cloneWith(metadataUpdates: Partial<DBFieldMetadata>) {\n    const cloned = field.clone();\n    Object.assign(cloned._metadata, metadataUpdates);\n    return cloned;\n  }\n\n  const field: FieldType = {\n    type,\n    fields: fields ?? {},\n    _defined: undefined as unknown as DBFieldDefined<T, TOptions>,\n    _output: undefined as FieldValue,\n    _metadata,\n\n    get metadata() {\n      return { ...this._metadata };\n    },\n\n    get rawRelation(): Readonly<RawRelationConfig> | undefined {\n      return _rawRelation ? { ..._rawRelation, toward: { ..._rawRelation.toward } } : undefined;\n    },\n\n    description(description: string) {\n      return cloneWith({ description });\n    },\n\n    typeName(typeName: string) {\n      return cloneWith({ typeName });\n    },\n\n    validate(...validateInputs: FieldValidateInput<FieldValue>[]) {\n      return cloneWith({ validate: validateInputs });\n    },\n\n    parse(args: FieldParseArgs): StandardSchemaV1.Result<FieldValue> {\n      return parseInternal({\n        value: args.value,\n        data: args.data,\n        invoker: args.invoker,\n        pathArray: [],\n      });\n    },\n\n    // TailorDBField specific methods\n    relation(config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig) {\n      const cloned = field.clone();\n      // The public type is a nested union (RelationConfig | RelationSelfConfig,\n      // each with a `{ table } | { type }` toward), which TS's \"in\" narrowing\n      // can't discriminate across cleanly. Re-view it as the flat two-branch\n      // shape it always is at runtime — the `table?: never` / `type?: never`\n      // markers above already forbid both keys from being set together.\n      const toward = config.toward as\n        | { table: TailorDBType | \"self\" }\n        | { type: TailorDBType | \"self\" };\n      const towardTarget = \"table\" in toward ? toward.table : toward.type;\n      const targetTable = towardTarget === \"self\" ? \"self\" : towardTarget.name;\n      cloned._setRawRelation({\n        type: config.type,\n        toward: {\n          table: targetTable,\n          as: config.toward.as,\n          key: config.toward.key,\n        },\n        backward: config.backward,\n      });\n      return cloned;\n    },\n\n    index() {\n      return cloneWith({ index: true });\n    },\n\n    unique() {\n      return cloneWith({ unique: true, index: true });\n    },\n\n    vector() {\n      return cloneWith({ vector: true });\n    },\n\n    // oxlint-disable-next-line no-explicit-any\n    default(value: any) {\n      // oxlint-disable-next-line no-explicit-any\n      return cloneWith({ default: value }) as any;\n    },\n\n    hooks(hooks: Hook<FieldValue>) {\n      return cloneWith({ hooks });\n    },\n\n    serial(config: SerialConfig) {\n      return cloneWith({ serial: config });\n    },\n\n    clone(cloneOptions?: FieldOptions) {\n      if (\n        this._metadata.validate?.length &&\n        cloneOptions?.array !== undefined &&\n        cloneOptions.array !== (this._metadata.array === true)\n      ) {\n        throw new Error(\"Cannot change the array option on a field with custom validation\");\n      }\n\n      // Deep clone nested object fields if present\n      let clonedFields = fields;\n      if (fields) {\n        const cloned: Record<string, TailorAnyDBField> = {};\n        for (const [key, field] of Object.entries(fields)) {\n          cloned[key] = field.clone();\n        }\n        clonedFields = cloned;\n      }\n\n      // Create a new field with cloned configuration\n      const clonedField = createTailorDBFieldRuntime(type, options, clonedFields, values);\n\n      // Deep copy metadata using cloneDeep (preserves function references)\n      Object.assign(clonedField._metadata, cloneDeep(this._metadata));\n\n      // Apply new options if provided\n      if (cloneOptions) {\n        if (cloneOptions.optional !== undefined) {\n          clonedField._metadata.required = !cloneOptions.optional;\n        }\n        if (cloneOptions.array !== undefined) {\n          clonedField._metadata.array = cloneOptions.array;\n        }\n      }\n\n      // Copy raw relation if exists\n      if (_rawRelation) {\n        clonedField._setRawRelation(cloneDeep(_rawRelation));\n      }\n\n      return clonedField;\n    },\n\n    _setRawRelation(relation: RawRelationConfig) {\n      _rawRelation = relation;\n    },\n  };\n\n  return field;\n}\n\nconst createField = createTailorDBField;\n\n/**\n * Create a UUID field.\n * @param options - Field configuration options\n * @returns A UUID field\n * @example db.uuid()\n * @example db.uuid({ optional: true })\n */\nfunction uuid<const Opt extends FieldOptions>(options?: Opt) {\n  return createField(\"uuid\", options);\n}\n\n/**\n * Create a string field.\n * @param options - Field configuration options\n * @returns A string field\n * @example db.string()\n * @example db.string({ optional: true })\n */\nfunction string<const Opt extends FieldOptions>(options?: Opt) {\n  return createField(\"string\", options);\n}\n\n/**\n * Create a boolean field.\n * Note: The method name is `bool` but creates a `boolean` type field.\n * @param options - Field configuration options\n * @returns A boolean field\n * @example db.bool()\n * @example db.bool({ optional: true })\n */\nfunction bool<const Opt extends FieldOptions>(options?: Opt) {\n  return createField(\"boolean\", options);\n}\n\n/**\n * Create an integer field.\n * @param options - Field configuration options\n * @returns An integer field\n * @example db.int()\n * @example db.int({ optional: true })\n */\nfunction int<const Opt extends FieldOptions>(options?: Opt) {\n  return createField(\"integer\", options);\n}\n\n/**\n * Create a float (decimal number) field.\n * @param options - Field configuration options\n * @returns A float field\n * @example db.float()\n * @example db.float({ optional: true })\n */\nfunction float<const Opt extends FieldOptions>(options?: Opt) {\n  return createField(\"float\", options);\n}\n\ninterface DecimalFieldOptions extends FieldOptions {\n  scale?: number;\n}\n\n/**\n * Create a decimal field (stored as string for precision).\n * @param options - Field configuration options including optional scale (0-12)\n * @returns A decimal field\n * @example db.decimal()\n * @example db.decimal({ scale: 2 })\n * @example db.decimal({ scale: 2, optional: true })\n */\nfunction decimal<const Opt extends DecimalFieldOptions>(options?: Opt) {\n  if (options?.scale !== undefined) {\n    if (!Number.isInteger(options.scale) || options.scale < 0 || options.scale > 12) {\n      throw new Error(\"scale must be an integer between 0 and 12\");\n    }\n  }\n  const field = createField(\"decimal\", options);\n  if (options?.scale !== undefined) {\n    field._metadata.scale = options.scale;\n  }\n  return field;\n}\n\n/**\n * Create a date field (date only, no time component).\n * Format: \"yyyy-MM-dd\"\n * @param options - Field configuration options\n * @returns A date field\n * @example db.date()\n */\nfunction date<const Opt extends FieldOptions>(options?: Opt) {\n  return createField(\"date\", options);\n}\n\n/**\n * Create a datetime field (date and time).\n * Format: ISO 8601, such as \"yyyy-MM-ddTHH:mm:ssZ\" or \"yyyy-MM-ddTHH:mm:ss+09:00\"\n * @param options - Field configuration options\n * @returns A datetime field\n * @example db.datetime()\n */\nfunction datetime<const Opt extends FieldOptions>(options?: Opt) {\n  return createField(\"datetime\", options);\n}\n\n/**\n * Create a time field (time only, no date component).\n * Format: \"HH:mm\"\n * @param options - Field configuration options\n * @returns A time field\n * @example db.time()\n */\nfunction time<const Opt extends FieldOptions>(options?: Opt) {\n  return createField(\"time\", options);\n}\n\n/**\n * Create an enum field with at least one allowed string value.\n * @param values - Array of allowed string values, or array of `{ value, description }` objects\n * @param options - Field configuration options\n * @returns An enum field\n * @example db.enum([\"active\", \"inactive\", \"suspended\"])\n * @example db.enum([\"small\", \"medium\", \"large\"], { optional: true })\n */\nfunction _enum<const V extends AllowedValues, const Opt extends FieldOptions>(\n  values: V,\n  options?: Opt,\n): TailorDBField<\n  { type: \"enum\"; array: Opt extends { array: true } ? true : false },\n  FieldOutput<AllowedValuesOutput<V>, Opt>\n> {\n  return createField<\"enum\", Opt, AllowedValuesOutput<V>>(\"enum\", options, undefined, values);\n}\n\n/**\n * Create a nested object field with sub-fields.\n * @param fields - Record of nested field definitions\n * @param options - Field configuration options\n * @returns A nested object field\n * @example db.object({ street: db.string(), city: db.string(), zip: db.string() })\n * @example db.object({ name: db.string() }, { optional: true })\n */\nfunction object<\n  const F extends Record<string, TailorAnyDBField> &\n    ExcludeNestedDBFields<F> &\n    ExcludeHookedDBFields<F> &\n    ExcludeDefaultedDBFields<F>,\n  const Opt extends FieldOptions,\n>(fields: F, options?: Opt) {\n  return createField(\"nested\", options, fields) as unknown as TailorDBField<\n    { type: \"nested\"; array: Opt extends { array: true } ? true : false },\n    FieldOutput<InferFieldsOutput<F>, Opt>,\n    F\n  >;\n}\n\n/**\n * Creates a new TailorDBType instance.\n * @param name - Table name\n * @param fields - Field definitions\n * @param options - Table options\n * @param options.pluralForm - Optional plural form\n * @param options.description - Optional description\n * @returns A new TailorDBType\n */\nfunction createTailorDBType<\n  // oxlint-disable-next-line no-explicit-any\n  const Fields extends Record<string, TailorAnyDBField> = any,\n  User extends object = InferredAttributes,\n>(\n  name: string,\n  fields: Fields,\n  options: { pluralForm?: string; description?: string },\n): TailorDBType<Fields, User, DefinedDBTypeMetadata> {\n  let _description = options.description;\n  let _settings: TypeFeatures = {};\n  let _indexes: IndexDef<TailorDBType<Fields, User, DefinedDBTypeMetadata>>[] = [];\n  const _permissions: RawPermissions = {};\n  let _files: Record<string, string> = {};\n  const _plugins: PluginAttachment[] = [];\n  // oxlint-disable-next-line typescript/no-unsafe-function-type\n  let _typeHook: { create?: Function; update?: Function } | undefined;\n  // oxlint-disable-next-line typescript/no-unsafe-function-type\n  let _typeValidate: Function | undefined;\n  const _definedMethods = new Set<keyof DefinedDBTypeMetadata>();\n  if (options.description !== undefined) {\n    _definedMethods.add(\"description\");\n  }\n\n  function runMethodOnce<T>(method: keyof DefinedDBTypeMetadata, action: () => T): T {\n    if (_definedMethods.has(method)) {\n      throw new Error(`.${method}() has already been set`);\n    }\n    const result = action();\n    _definedMethods.add(method);\n    return result;\n  }\n  type TypeAfter<Key extends keyof DefinedDBTypeMetadata> = TailorDBType<\n    Fields,\n    User,\n    WithDBTypeMetadata<DefinedDBTypeMetadata, Key>\n  >;\n  type TypeAfterUser<\n    NextUser extends object,\n    Key extends keyof DefinedDBTypeMetadata,\n  > = TailorDBType<Fields, NextUser, WithDBTypeMetadata<DefinedDBTypeMetadata, Key>>;\n  type TypeAfterPlugin<Config extends Record<string, unknown>> = TailorDBType<\n    PluginExtendedFields<Fields, Config>,\n    User,\n    DefinedDBTypeMetadata\n  >;\n\n  if (options.pluralForm) {\n    if (name === options.pluralForm) {\n      throw new Error(`The name and the plural form must be different. name=${name}`);\n    }\n    _settings.pluralForm = options.pluralForm;\n  }\n\n  const dbType: TailorDBType<Fields, User, DefinedDBTypeMetadata> = {\n    name,\n    fields: { ...fields },\n    _output: null as unknown as InferFieldsOutput<Fields>,\n    _description,\n\n    get metadata(): TailorDBTypeMetadata {\n      // Convert indexes to the format expected by the manifest\n      const indexes: Record<string, { fields: string[]; unique?: boolean }> = {};\n      if (_indexes.length > 0) {\n        _indexes.forEach((index) => {\n          const fieldNames = index.fields.map((field) => String(field));\n          const key = index.name || `idx_${fieldNames.join(\"_\")}`;\n          indexes[key] = {\n            fields: fieldNames,\n            unique: index.unique,\n          };\n        });\n      }\n\n      return {\n        name: this.name,\n        description: _description,\n        settings: _settings,\n        permissions: _permissions,\n        files: _files,\n        ...(Object.keys(indexes).length > 0 && { indexes }),\n        ...(_typeHook && { typeHook: _typeHook }),\n        ...(_typeValidate && { typeValidate: _typeValidate }),\n      };\n    },\n\n    hooks(hook: TypeHook<Fields>): TypeAfter<\"hooks\"> {\n      return runMethodOnce(\"hooks\", () => {\n        _typeHook = hook;\n        return this as TypeAfter<\"hooks\">;\n      });\n    },\n\n    validate(fn: TypeValidateFn<Fields>): TypeAfter<\"validate\"> {\n      return runMethodOnce(\"validate\", () => {\n        _typeValidate = fn;\n        return this as TypeAfter<\"validate\">;\n      });\n    },\n\n    features(features: Omit<TypeFeatures, \"pluralForm\">): TypeAfter<\"features\"> {\n      return runMethodOnce(\"features\", () => {\n        _settings = {\n          ..._settings,\n          ...features,\n        };\n        return this as TypeAfter<\"features\">;\n      });\n    },\n\n    indexes(\n      ...indexes: IndexDef<TailorDBType<Fields, User, DefinedDBTypeMetadata>>[]\n    ): TypeAfter<\"indexes\"> {\n      return runMethodOnce(\"indexes\", () => {\n        _indexes = indexes;\n        return this as TypeAfter<\"indexes\">;\n      });\n    },\n\n    files<const F extends string>(\n      files: Record<F, string> & FileKeyConflictError<Fields, User>,\n    ): TailorDBType<Fields, User, WithDBTypeMetadata<DefinedDBTypeMetadata, \"files\">, F> {\n      return runMethodOnce(\"files\", () => {\n        _files = files;\n        return this as TailorDBType<\n          Fields,\n          User,\n          WithDBTypeMetadata<DefinedDBTypeMetadata, \"files\">,\n          F\n        >;\n      });\n    },\n\n    permission<\n      U extends object = User,\n      P extends TailorTypePermission<U, output<TailorDBType<Fields, User, DefinedDBTypeMetadata>>> =\n        TailorTypePermission<U, output<TailorDBType<Fields, User, DefinedDBTypeMetadata>>>,\n    >(permission: P): TypeAfterUser<U, \"permission\"> {\n      return runMethodOnce(\"permission\", () => {\n        const ret = this as unknown as TypeAfterUser<U, \"permission\">;\n        _permissions.record = permission as RawPermissions[\"record\"];\n        return ret;\n      });\n    },\n\n    gqlPermission<\n      U extends object = User,\n      P extends TailorTypeGqlPermission<U> = TailorTypeGqlPermission<U>,\n    >(permission: P): TypeAfterUser<U, \"gqlPermission\"> {\n      return runMethodOnce(\"gqlPermission\", () => {\n        const ret = this as unknown as TypeAfterUser<U, \"gqlPermission\">;\n        _permissions.gql = permission as RawPermissions[\"gql\"];\n        return ret;\n      });\n    },\n\n    description(description: string): TypeAfter<\"description\"> {\n      return runMethodOnce(\"description\", () => {\n        _description = description;\n        this._description = description;\n        return this as TypeAfter<\"description\">;\n      });\n    },\n\n    pickFields<K extends keyof Fields, const Opt extends FieldOptions>(keys: K[], options?: Opt) {\n      const result = {} as Record<K, TailorAnyDBField>;\n      for (const key of keys) {\n        const field = this.fields[key] as TailorAnyDBField | undefined;\n        if (!field) {\n          // A plugin-injected field is only added to `fields` after `tailor\n          // generate` runs — see the \"Injecting fields into the attached\n          // table's type\" section of the plugin docs.\n          throw new Error(\n            `pickFields(): field \"${String(key)}\" does not exist on this table yet. If it comes from a plugin's .plugin() call, it is only added to the table after \\`tailor generate\\` runs.`,\n          );\n        }\n        if (options) {\n          result[key] = field.clone(options);\n        } else {\n          result[key] = field;\n        }\n      }\n      // oxlint-disable-next-line no-explicit-any\n      return result as any;\n    },\n\n    omitFields<K extends keyof Fields>(keys: K[]): Omit<Fields, K> {\n      const keysSet = new Set(keys);\n      const result = {} as Record<string, TailorAnyDBField>;\n      for (const key in this.fields) {\n        if (Object.hasOwn(this.fields, key) && !keysSet.has(key as unknown as K)) {\n          result[key] = this.fields[key] as TailorAnyDBField;\n        }\n      }\n      return result as Omit<Fields, K>;\n    },\n\n    get plugins(): PluginAttachment[] {\n      return _plugins;\n    },\n\n    plugin<const Config extends Record<string, unknown>>(\n      config: Config & PluginConfigGuard<Fields, Config, never>,\n    ): TypeAfterPlugin<Config> {\n      for (const [pluginId, pluginConfig] of Object.entries(config)) {\n        _plugins.push({ pluginId, config: pluginConfig });\n      }\n      return this as unknown as TypeAfterPlugin<Config>;\n    },\n  };\n\n  return brandValue(dbType, \"tailordb-type\");\n}\n\nconst idField = uuid();\ntype idField = typeof idField;\ntype DBTable<\n  F extends { id?: never } & Record<string, TailorAnyDBField>,\n  Defined extends DefinedDBTypeMetadata = DefinedDBTypeMetadata,\n> = TailorDBInstance<{ id: idField } & F, InferredAttributes, Defined>;\n\n/**\n * Creates a new database table with the specified fields.\n * An `id` field (UUID) is automatically added to every table.\n * @param name - The name of the table, or a tuple of [name, pluralForm]\n * @param fields - The field definitions for the table\n * @returns A new TailorDB table instance\n * @example\n * export const user = db.table(\"User\", {\n *   name: db.string(),\n *   email: db.string(),\n *   age: db.int({ optional: true }),\n *   role: db.enum([\"admin\", \"member\"]),\n *   ...db.fields.timestamps(),\n * });\n * // Always export both the value and type:\n * export type user = typeof user;\n */\nfunction dbTable<const F extends { id?: never } & Record<string, TailorAnyDBField>>(\n  name: string | [string, string],\n  fields: F,\n): DBTable<F>;\n/**\n * Creates a new database table with the specified fields and description.\n * An `id` field (UUID) is automatically added to every table.\n * @param name - The name of the table, or a tuple of [name, pluralForm]\n * @param description - A description of the table\n * @param fields - The field definitions for the table\n * @returns A new TailorDB table instance\n */\nfunction dbTable<const F extends { id?: never } & Record<string, TailorAnyDBField>>(\n  name: string | [string, string],\n  description: string,\n  fields: F,\n): DBTable<F, WithDBTypeMetadata<DefinedDBTypeMetadata, \"description\">>;\nfunction dbTable<const F extends { id?: never } & Record<string, TailorAnyDBField>>(\n  name: string | [string, string],\n  fieldsOrDescription: string | F,\n  fields?: F,\n): DBTable<F> | DBTable<F, WithDBTypeMetadata<DefinedDBTypeMetadata, \"description\">> {\n  const typeName = Array.isArray(name) ? name[0] : name;\n  const pluralForm = Array.isArray(name) ? name[1] : undefined;\n\n  let description: string | undefined;\n  let fieldDef: F;\n  if (typeof fieldsOrDescription === \"string\") {\n    description = fieldsOrDescription;\n    fieldDef = fields as F;\n  } else {\n    fieldDef = fieldsOrDescription;\n  }\n  return createTailorDBType<{ id: idField } & F>(\n    typeName,\n    {\n      id: idField,\n      ...fieldDef,\n    },\n    { pluralForm, description },\n  );\n}\n\n// `Function.prototype.toString()` of this hook is embedded verbatim into deployed\n// schemas and migration diffs (see parser/service/tailordb/hooks-validate-precompiled-expr.ts\n// and field.ts). Its source text depends on how the SDK itself was built (e.g.\n// minification), so a fixed expression is pinned onto it directly here instead -\n// configure cannot import parser's `setPrecompiledScriptExpr` runtime helper across\n// the module boundary, only the symbol registry key and map types. Keep\n// this literal in sync with the \"timestamps() updatedAt hook resolves to the pinned\n// expr\" test in parser/service/tailordb/field.precompiled.test.ts, which fails if it\n// ever drifts from what this hook's own source naturally produces.\ntype TimestampsUpdatedAtHookFn = UpdateHookFn<string | Date | null, string | Date>;\nconst timestampsUpdatedAtHook: TimestampsUpdatedAtHookFn = ({ input, now }) => input ?? now;\nconst PRECOMPILED_EXPR_KEY: PrecompiledScriptExprKey =\n  \"tailor-platform/sdk:precompiled-script-expr\";\nconst PRECOMPILED_EXPR_SYMBOL = Symbol.for(PRECOMPILED_EXPR_KEY);\n(timestampsUpdatedAtHook as unknown as Record<symbol, PrecompiledScriptExprMap>)[\n  PRECOMPILED_EXPR_SYMBOL\n] = {\n  \"hooks.update\":\n    \"(({ input, now }) => input ?? now)({ input: _value, oldValue: _oldValue, invoker: _principal, now: _now })\",\n};\n\n/** TailorDB schema builder utilities for defining tables and fields. */\nexport const db = {\n  table: dbTable,\n  uuid,\n  string,\n  bool,\n  int,\n  float,\n  decimal,\n  date,\n  datetime,\n  time,\n  enum: _enum,\n  object,\n  fields: {\n    /**\n     * Creates standard timestamp fields (createdAt, updatedAt) with automatic defaults.\n     * Both fields default to the current time on create. updatedAt is also refreshed on update.\n     * User-specified values are respected when provided (e.g. seeding historical records).\n     * @returns An object with createdAt and updatedAt fields\n     * @example\n     * const model = db.table(\"Model\", {\n     *   name: db.string(),\n     *   ...db.fields.timestamps(),\n     * });\n     */\n    timestamps: () => ({\n      createdAt: datetime().default(\"now\").description(\"Record creation timestamp\"),\n      updatedAt: datetime()\n        .default(\"now\")\n        .hooks({ update: timestampsUpdatedAtHook })\n        .description(\"Record update timestamp\"),\n    }),\n  },\n};\n"],"mappings":"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"}