convex-verify 1.1.0 → 1.2.2

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.
Files changed (46) hide show
  1. package/README.md +148 -80
  2. package/dist/core/index.d.mts +14 -55
  3. package/dist/core/index.d.ts +14 -55
  4. package/dist/core/index.js +492 -92
  5. package/dist/core/index.js.map +1 -1
  6. package/dist/core/index.mjs +491 -92
  7. package/dist/core/index.mjs.map +1 -1
  8. package/dist/index.d.mts +9 -6
  9. package/dist/index.d.ts +9 -6
  10. package/dist/index.js +378 -271
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +378 -267
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/types-B8ZkLuJ2.d.mts +141 -0
  15. package/dist/types-B8ZkLuJ2.d.ts +141 -0
  16. package/dist/utils/index.d.mts +3 -2
  17. package/dist/utils/index.d.ts +3 -2
  18. package/dist/utils/index.js +1 -1
  19. package/dist/utils/index.js.map +1 -1
  20. package/dist/utils/index.mjs +1 -1
  21. package/dist/utils/index.mjs.map +1 -1
  22. package/dist/verifyConfig-CTrtqMr_.d.ts +94 -0
  23. package/dist/verifyConfig-Kn3Ikj00.d.mts +94 -0
  24. package/package.json +1 -16
  25. package/dist/configs/index.d.mts +0 -51
  26. package/dist/configs/index.d.ts +0 -51
  27. package/dist/configs/index.js +0 -38
  28. package/dist/configs/index.js.map +0 -1
  29. package/dist/configs/index.mjs +0 -11
  30. package/dist/configs/index.mjs.map +0 -1
  31. package/dist/plugin-BOb1Kw1A.d.ts +0 -47
  32. package/dist/plugin-DlsboiCF.d.mts +0 -47
  33. package/dist/plugins/index.d.mts +0 -85
  34. package/dist/plugins/index.d.ts +0 -85
  35. package/dist/plugins/index.js +0 -312
  36. package/dist/plugins/index.js.map +0 -1
  37. package/dist/plugins/index.mjs +0 -284
  38. package/dist/plugins/index.mjs.map +0 -1
  39. package/dist/transforms/index.d.mts +0 -38
  40. package/dist/transforms/index.d.ts +0 -38
  41. package/dist/transforms/index.js +0 -46
  42. package/dist/transforms/index.js.map +0 -1
  43. package/dist/transforms/index.mjs +0 -19
  44. package/dist/transforms/index.mjs.map +0 -1
  45. package/dist/types-DvJMYubf.d.mts +0 -151
  46. package/dist/types-DvJMYubf.d.ts +0 -151
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/index.ts","../../src/core/types.ts","../../src/utils/helpers.ts"],"sourcesContent":["export { getTableIndexes, constructColumnData, constructIndexData } from './helpers';\n\n// Re-export types from core for convenience\nexport { normalizeIndexConfigEntry } from '../core/types';\nexport type {\n\tNormalizedIndexConfig,\n\tIndexConfigBaseOptions,\n\tIndexConfigEntry,\n} from '../core/types';\n","import {\n\tDataModelFromSchemaDefinition,\n\tGenericDocument,\n\tIndexes,\n\tNamedTableInfo,\n\tSchemaDefinition,\n\tWithoutSystemFields,\n} from 'convex/server';\n\n// =============================================================================\n// Utility Types\n// =============================================================================\n\nexport type Prettify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type MakeOptional<T, K extends PropertyKey> = Prettify<\n\tOmit<T, K & keyof T> & Partial<Pick<T, K & keyof T>>\n>;\n\n// =============================================================================\n// Base Types for Config Functions\n// =============================================================================\n\n/**\n * Base interface that all config functions should return.\n * Each config type can have its own `verify` signature and additional properties.\n */\nexport type BaseConfigReturn = {\n\tconfig: Record<string, any>;\n};\n\n// =============================================================================\n// OnFail Types\n// =============================================================================\n\nexport type OnFailArgs<D extends GenericDocument> = {\n\tuniqueColumn?: {\n\t\tconflictingColumn: keyof D;\n\t\texistingData: D;\n\t};\n\tuniqueRow?: {\n\t\texistingData: D | null;\n\t};\n\teditableColumn?: {\n\t\tremovedColumns: string[];\n\t\tfilteredData: Partial<WithoutSystemFields<D>>;\n\t};\n\trequiredColumn?: {\n\t\tmissingColumn: keyof D;\n\t};\n};\n\nexport type OnFailCallback<D extends GenericDocument> = (args: OnFailArgs<D>) => void;\n\n// =============================================================================\n// Config Data Types (what the user provides)\n// =============================================================================\n\nexport type DMGeneric = DataModelFromSchemaDefinition<SchemaDefinition<any, boolean>>;\n\nexport type DefaultValuesConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: {\n\t\t[column in keyof WithoutSystemFields<DM[K]['document']>]?: DM[K]['document'][column];\n\t};\n};\n\n// =============================================================================\n// Index-Based Config Types (shared between uniqueRow, uniqueColumn, etc.)\n// =============================================================================\n\n/**\n * Base options shared by all index-based config entries.\n * Individual extensions can extend this with their own options.\n */\nexport type IndexConfigBaseOptions = {\n\t/** Additional identifiers to check if the existing row is the same document being updated */\n\tidentifiers?: string[];\n};\n\n/**\n * A config entry that can be either:\n * - A string (index name) for shorthand\n * - An object with `index` and additional options\n *\n * @example\n * ```ts\n * // These are equivalent:\n * 'by_username'\n * { index: 'by_username' }\n *\n * // With options:\n * { index: 'by_username', identifiers: ['_id', 'userId'] }\n * ```\n */\nexport type IndexConfigEntry<\n\tDM extends DMGeneric,\n\tK extends keyof DM,\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n> =\n\t| keyof Indexes<NamedTableInfo<DM, K>>\n\t| ({\n\t\t\tindex: keyof Indexes<NamedTableInfo<DM, K>>;\n\t\t\tidentifiers?: (keyof NamedTableInfo<DM, K>['document'])[];\n\t } & Omit<Options, 'identifiers'>);\n\n/**\n * Normalized form of an index config entry (always an object)\n */\nexport type NormalizedIndexConfig<Options extends IndexConfigBaseOptions = IndexConfigBaseOptions> =\n\t{\n\t\tindex: string;\n\t\tidentifiers: string[];\n\t} & Omit<Options, 'identifiers'>;\n\n/**\n * Normalize a config entry to always have index and identifiers.\n * Works for both string shorthand and full object configs.\n */\nexport function normalizeIndexConfigEntry<\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n>(\n\tentry: string | ({ index: string; identifiers?: string[] } & Omit<Options, 'identifiers'>),\n\tdefaultIdentifiers: string[] = ['_id']\n): NormalizedIndexConfig<Options> {\n\tif (typeof entry === 'string') {\n\t\treturn {\n\t\t\tindex: entry,\n\t\t\tidentifiers: defaultIdentifiers,\n\t\t} as NormalizedIndexConfig<Options>;\n\t}\n\n\tconst { index, identifiers, ...rest } = entry;\n\treturn {\n\t\tindex: String(index),\n\t\tidentifiers: identifiers?.map(String) ?? defaultIdentifiers,\n\t\t...rest,\n\t} as NormalizedIndexConfig<Options>;\n}\n\n// =============================================================================\n// UniqueRow Config Types\n// =============================================================================\n\nexport type UniqueRowConfigOptions = IndexConfigBaseOptions & {\n\tqueryExistingWithNullish?: boolean;\n};\n\nexport type UniqueRowConfigEntry<DM extends DMGeneric, K extends keyof DM> = IndexConfigEntry<\n\tDM,\n\tK,\n\tUniqueRowConfigOptions\n>;\n\nexport type UniqueRowConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: UniqueRowConfigEntry<DM, K>[];\n};\n\n// =============================================================================\n// UniqueColumn Config Types\n// =============================================================================\n\nexport type UniqueColumnConfigOptions = IndexConfigBaseOptions;\n\nexport type UniqueColumnConfigEntry<DM extends DMGeneric, K extends keyof DM> = IndexConfigEntry<\n\tDM,\n\tK,\n\tUniqueColumnConfigOptions\n>;\n\nexport type UniqueColumnConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: UniqueColumnConfigEntry<DM, K>[];\n};\n\n// =============================================================================\n// Input Types (loose types for verifyConfig to accept)\n// =============================================================================\n\n/**\n * Loose input types that accept any return from config functions.\n * We use loose types here to avoid complex generic matching,\n * then extract the specific config types using conditional types.\n */\nexport type DefaultValuesInput = {\n\t_type: 'defaultValues';\n\tverify: (tableName: any, data: any) => Promise<any>;\n\tconfig:\n\t\t| Record<string, Record<string, any>>\n\t\t| (() => Record<string, Record<string, any>> | Promise<Record<string, Record<string, any>>>);\n};\n\n/**\n * Loose input type for protectedColumnsConfig return value.\n */\nexport type ProtectedColumnsInput = {\n\t_type: 'protectedColumns';\n\tconfig: Record<string, string[]>;\n};\n\n// =============================================================================\n// Object-Based Types (for verifyConfig)\n// =============================================================================\n\n/**\n * Config input for verifyConfig.\n *\n * - `defaultValues`: Transform config that makes fields optional (affects types)\n * - `protectedColumns`: Columns that cannot be patched (affects patch() types)\n * Extension-specific options are added by `verifyConfig`.\n */\nexport type VerifyConfigInput = {\n\tdefaultValues?: DefaultValuesInput;\n\tprotectedColumns?: ProtectedColumnsInput;\n};\n\n// =============================================================================\n// Type Extraction Helpers\n// =============================================================================\n\n/**\n * Extract the config type from defaultValues.config.\n * Handles both direct object and function forms.\n */\nexport type ExtractDefaultValuesConfig<VC> = VC extends {\n\tdefaultValues: { config: infer C };\n}\n\t? C extends () => infer R\n\t\t? Awaited<R>\n\t\t: C\n\t: Record<string, never>;\n\n/**\n * Compute which keys should be optional for a given table based on all configs.\n * Currently only defaultValues affects optionality.\n */\nexport type OptionalKeysForTable<VC, TN> = TN extends keyof ExtractDefaultValuesConfig<VC>\n\t? keyof ExtractDefaultValuesConfig<VC>[TN]\n\t: never;\n\n/**\n * Helper to check if a key exists in a type\n */\nexport type HasKey<T, K extends PropertyKey> = K extends keyof T ? true : false;\n\n// =============================================================================\n// Protected Columns Type Extraction\n// =============================================================================\n\n/**\n * Extract the config type from protectedColumns.config\n */\nexport type ExtractProtectedColumnsConfig<VC> = VC extends {\n\tprotectedColumns: { config: infer C };\n}\n\t? C\n\t: Record<string, never>;\n\n/**\n * Get protected column keys for a specific table.\n * Returns the column names that should be omitted from patch() input.\n */\nexport type ProtectedKeysForTable<VC, TN> = TN extends keyof ExtractProtectedColumnsConfig<VC>\n\t? ExtractProtectedColumnsConfig<VC>[TN] extends readonly (infer K)[]\n\t\t? K\n\t\t: never\n\t: never;\n","import {\n\tDataModelFromSchemaDefinition,\n\tDocumentByName,\n\tGenericSchema,\n\tSchemaDefinition,\n\tTableNamesInDataModel,\n} from \"convex/server\";\n\nimport {\n\tIndexConfigBaseOptions,\n\tNormalizedIndexConfig,\n\tnormalizeIndexConfigEntry,\n\tUniqueRowConfigData,\n} from \"../core/types\";\n\n/**\n * Get Table indexes helper\n *\n * Note: this is using an experimental API in convex-js\n * https://github.com/get-convex/convex-js/commit/04c3b44cab54c4d2230cce9312bdff074d54ab04\n */\nexport const getTableIndexes = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n>(\n\tschema: S,\n\ttableName: TN,\n) => {\n\treturn schema.tables[tableName][\" indexes\"]();\n};\n\n/**\n * Generate column data from fields and data object\n */\nexport const constructColumnData = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n\tD extends Partial<DocumentByName<DataModel, TN>>,\n>(\n\tfields: string[],\n\tdata: D,\n\t{\n\t\tallowNullishValue = false,\n\t\tallOrNothing = true,\n\t}: {\n\t\tallowNullishValue?: boolean;\n\t\tallOrNothing?: boolean;\n\t},\n) => {\n\tconst lengthOfFields = fields.length;\n\n\tconst columnData = fields\n\t\t.map((_, index) => {\n\t\t\tconst column = fields?.[index];\n\t\t\tconst value = data?.[column];\n\n\t\t\tif (!column || (!allowNullishValue && !value)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcolumn,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t})\n\t\t.filter((e) => !!e);\n\n\tif (allOrNothing && columnData.length !== lengthOfFields) {\n\t\treturn null;\n\t}\n\n\treturn columnData.length > 0 ? columnData : null;\n};\n\n/**\n * Construct index data from schema and config.\n * Handles both string shorthand and full object config entries.\n *\n * @returns Array of normalized index configs with resolved field names from schema\n */\nexport const constructIndexData = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n>(\n\tschema: S,\n\ttableName: TN,\n\tindexConfig?: UniqueRowConfigData<DataModel>,\n):\n\t| (NormalizedIndexConfig<Options> & { name: string; fields: string[] })[]\n\t| undefined => {\n\tif (!indexConfig) {\n\t\treturn;\n\t}\n\n\tconst tableConfig = indexConfig?.[tableName];\n\tif (!tableConfig) {\n\t\treturn;\n\t}\n\n\treturn tableConfig.map((entry) => {\n\t\t// Normalize the entry (handles both string and object forms)\n\t\tconst normalized = normalizeIndexConfigEntry<Options>(entry as any);\n\t\tconst { index, identifiers, ...rest } = normalized;\n\n\t\tconst fields = getTableIndexes(schema, tableName).find(\n\t\t\t(i) => i.indexDescriptor == index,\n\t\t)?.fields;\n\n\t\tif (!fields) {\n\t\t\tthrow new Error(\n\t\t\t\t`Error in 'constructIndexData()'. No fields found for index: [${index}]`,\n\t\t\t);\n\t\t}\n\n\t\t// Create a unique map in case there is any overlap in identifiers\n\t\t// Always include '_id' as a fallback identifier\n\t\tconst identifierMap = new Map<string, string>(\n\t\t\t[...identifiers, \"_id\"].map((i) => [String(i), String(i)]),\n\t\t);\n\n\t\treturn {\n\t\t\tname: index,\n\t\t\tfields,\n\t\t\tidentifiers: Array.from(identifierMap.values()),\n\t\t\t...rest,\n\t\t} as NormalizedIndexConfig<Options> & { name: string; fields: string[] };\n\t});\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACsHO,SAAS,0BAGf,OACA,qBAA+B,CAAC,KAAK,GACJ;AACjC,MAAI,OAAO,UAAU,UAAU;AAC9B,WAAO;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACd;AAAA,EACD;AAEA,QAAM,EAAE,OAAO,aAAa,GAAG,KAAK,IAAI;AACxC,SAAO;AAAA,IACN,OAAO,OAAO,KAAK;AAAA,IACnB,aAAa,aAAa,IAAI,MAAM,KAAK;AAAA,IACzC,GAAG;AAAA,EACJ;AACD;;;ACpHO,IAAM,kBAAkB,CAK9B,QACA,cACI;AACJ,SAAO,OAAO,OAAO,SAAS,EAAE,UAAU,EAAE;AAC7C;AAKO,IAAM,sBAAsB,CAMlC,QACA,MACA;AAAA,EACC,oBAAoB;AAAA,EACpB,eAAe;AAChB,MAII;AACJ,QAAM,iBAAiB,OAAO;AAE9B,QAAM,aAAa,OACjB,IAAI,CAAC,GAAG,UAAU;AAClB,UAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,QAAQ,OAAO,MAAM;AAE3B,QAAI,CAAC,UAAW,CAAC,qBAAqB,CAAC,OAAQ;AAC9C;AAAA,IACD;AAEA,WAAO;AAAA,MACN;AAAA,MACA;AAAA,IACD;AAAA,EACD,CAAC,EACA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnB,MAAI,gBAAgB,WAAW,WAAW,gBAAgB;AACzD,WAAO;AAAA,EACR;AAEA,SAAO,WAAW,SAAS,IAAI,aAAa;AAC7C;AAQO,IAAM,qBAAqB,CAMjC,QACA,WACA,gBAGe;AACf,MAAI,CAAC,aAAa;AACjB;AAAA,EACD;AAEA,QAAM,cAAc,cAAc,SAAS;AAC3C,MAAI,CAAC,aAAa;AACjB;AAAA,EACD;AAEA,SAAO,YAAY,IAAI,CAAC,UAAU;AAEjC,UAAM,aAAa,0BAAmC,KAAY;AAClE,UAAM,EAAE,OAAO,aAAa,GAAG,KAAK,IAAI;AAExC,UAAM,SAAS,gBAAgB,QAAQ,SAAS,EAAE;AAAA,MACjD,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC7B,GAAG;AAEH,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAI;AAAA,QACT,gEAAgE,KAAK;AAAA,MACtE;AAAA,IACD;AAIA,UAAM,gBAAgB,IAAI;AAAA,MACzB,CAAC,GAAG,aAAa,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AAAA,IAC1D;AAEA,WAAO;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,aAAa,MAAM,KAAK,cAAc,OAAO,CAAC;AAAA,MAC9C,GAAG;AAAA,IACJ;AAAA,EACD,CAAC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/index.ts","../../src/core/types.ts","../../src/utils/helpers.ts"],"sourcesContent":["export { getTableIndexes, constructColumnData, constructIndexData } from './helpers';\n\n// Re-export types from core for convenience\nexport { normalizeIndexConfigEntry } from '../core/types';\nexport type {\n\tNormalizedIndexConfig,\n\tIndexConfigBaseOptions,\n\tIndexConfigEntry,\n} from '../core/types';\n","import {\n\tDataModelFromSchemaDefinition,\n\tDocumentByName,\n\tGenericDocument,\n\tGenericMutationCtx,\n\tGenericSchema,\n\tIndexes,\n\tNamedTableInfo,\n\tSchemaDefinition,\n\tTableNamesInDataModel,\n\tWithoutSystemFields,\n} from 'convex/server';\nimport { GenericId } from 'convex/values';\n\n// =============================================================================\n// Utility Types\n// =============================================================================\n\nexport type Prettify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type MakeOptional<T, K extends PropertyKey> = Prettify<\n\tOmit<T, K & keyof T> & Partial<Pick<T, K & keyof T>>\n>;\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport type Exact<T, Shape> = T extends Shape\n\t? T extends (...args: any[]) => any\n\t\t? T\n\t\t: T extends readonly any[]\n\t\t\t? T\n\t\t\t: T extends object\n\t\t\t\t? {\n\t\t\t\t\t\t[K in keyof T]: K extends keyof NonNullable<Shape>\n\t\t\t\t\t\t\t? Exact<T[K], NonNullable<Shape>[K]>\n\t\t\t\t\t\t\t: never;\n\t\t\t\t } & {\n\t\t\t\t\t\t[K in Exclude<keyof NonNullable<Shape>, keyof T>]?: NonNullable<Shape>[K];\n\t\t\t\t }\n\t\t\t\t: T\n\t: never;\n\n// =============================================================================\n// Base Types\n// =============================================================================\n\nexport type BaseConfigReturn = {\n\tconfig: Record<string, any>;\n};\n\nexport type DMGeneric = DataModelFromSchemaDefinition<SchemaDefinition<any, boolean>>;\n\nexport type DataModelForSchema<S extends SchemaDefinition<GenericSchema, boolean>> =\n\tDataModelFromSchemaDefinition<S>;\n\nexport type MutationCtxForSchema<S extends SchemaDefinition<GenericSchema, boolean>> = Omit<\n\tGenericMutationCtx<DataModelForSchema<S>>,\n\tnever\n>;\n\n// =============================================================================\n// OnFail Types\n// =============================================================================\n\nexport type OnFailArgs<D extends GenericDocument> = {\n\tuniqueColumn?: {\n\t\tconflictingColumn: keyof D;\n\t\texistingData: D;\n\t};\n\tuniqueRow?: {\n\t\texistingData: D | null;\n\t};\n\teditableColumn?: {\n\t\tremovedColumns: string[];\n\t\tfilteredData: Partial<WithoutSystemFields<D>>;\n\t};\n\trequiredColumn?: {\n\t\tmissingColumn: keyof D;\n\t};\n};\n\nexport type OnFailCallback<D extends GenericDocument> = (args: OnFailArgs<D>) => void;\n\n// =============================================================================\n// Config Data Types\n// =============================================================================\n\nexport type DefaultValuesConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: {\n\t\t[column in keyof WithoutSystemFields<DM[K]['document']>]?: DM[K]['document'][column];\n\t};\n};\n\nexport type DefaultValuesConfigInput<DM extends DMGeneric> =\n\t| DefaultValuesConfigData<DM>\n\t| (() => DefaultValuesConfigData<DM> | Promise<DefaultValuesConfigData<DM>>);\n\nexport type ProtectedColumnsConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: (keyof WithoutSystemFields<DM[K]['document']>)[];\n};\n\n// =============================================================================\n// Index-Based Config Types\n// =============================================================================\n\nexport type IndexConfigBaseOptions = {\n\tidentifiers?: string[];\n};\n\nexport type IndexConfigEntry<\n\tDM extends DMGeneric,\n\tK extends keyof DM,\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n> =\n\t| keyof Indexes<NamedTableInfo<DM, K>>\n\t| ({\n\t\t\tindex: keyof Indexes<NamedTableInfo<DM, K>>;\n\t\t\tidentifiers?: (keyof NamedTableInfo<DM, K>['document'])[];\n\t } & Omit<Options, 'identifiers'>);\n\nexport type NormalizedIndexConfig<Options extends IndexConfigBaseOptions = IndexConfigBaseOptions> =\n\t{\n\t\tindex: string;\n\t\tidentifiers: string[];\n\t} & Omit<Options, 'identifiers'>;\n\nexport function normalizeIndexConfigEntry<\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n>(\n\tentry: string | ({ index: string; identifiers?: string[] } & Omit<Options, 'identifiers'>),\n\tdefaultIdentifiers: string[] = ['_id']\n): NormalizedIndexConfig<Options> {\n\tif (typeof entry === 'string') {\n\t\treturn {\n\t\t\tindex: entry,\n\t\t\tidentifiers: defaultIdentifiers,\n\t\t} as NormalizedIndexConfig<Options>;\n\t}\n\n\tconst { index, identifiers, ...rest } = entry;\n\treturn {\n\t\tindex: String(index),\n\t\tidentifiers: identifiers?.map(String) ?? defaultIdentifiers,\n\t\t...rest,\n\t} as NormalizedIndexConfig<Options>;\n}\n\n// =============================================================================\n// UniqueRow Config Types\n// =============================================================================\n\nexport type UniqueRowConfigOptions = IndexConfigBaseOptions & {\n\tqueryExistingWithNullish?: boolean;\n};\n\nexport type UniqueRowConfigEntry<DM extends DMGeneric, K extends keyof DM> = IndexConfigEntry<\n\tDM,\n\tK,\n\tUniqueRowConfigOptions\n>;\n\nexport type UniqueRowConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: UniqueRowConfigEntry<DM, K>[];\n};\n\n// =============================================================================\n// UniqueColumn Config Types\n// =============================================================================\n\nexport type UniqueColumnConfigOptions = IndexConfigBaseOptions;\n\nexport type UniqueColumnConfigEntry<DM extends DMGeneric, K extends keyof DM> = IndexConfigEntry<\n\tDM,\n\tK,\n\tUniqueColumnConfigOptions\n>;\n\nexport type UniqueColumnConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: UniqueColumnConfigEntry<DM, K>[];\n};\n\n// =============================================================================\n// VerifyConfig Types\n// =============================================================================\n\nexport type VerifyConfigInput<S extends SchemaDefinition<GenericSchema, boolean>> = {\n\tdefaultValues?: DefaultValuesConfigInput<DataModelForSchema<S>>;\n\tprotectedColumns?: ProtectedColumnsConfigData<DataModelForSchema<S>>;\n\tuniqueRow?: UniqueRowConfigData<DataModelForSchema<S>>;\n\tuniqueColumn?: UniqueColumnConfigData<DataModelForSchema<S>>;\n};\n\nexport type DefaultValuesParameter<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDV,\n> =\n\tValidateDefaultValuesInput<S, DV>;\n\nexport type VerifyConfigSections<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDV = never,\n\tPC = never,\n\tUR = never,\n\tUC = never,\n\tE = never,\n> = {\n\tdefaultValues?: DefaultValuesParameter<S, DV>;\n\tprotectedColumns?: Exact<PC, ProtectedColumnsConfigData<DataModelForSchema<S>>>;\n\tuniqueRow?: Exact<UR, UniqueRowConfigData<DataModelForSchema<S>>>;\n\tuniqueColumn?: Exact<UC, UniqueColumnConfigData<DataModelForSchema<S>>>;\n\textensions?: E;\n};\n\nexport type VerifyConfigShapeFromGenerics<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDV,\n\tPC,\n\tUR,\n\tUC,\n\tE,\n> = Prettify<\n\t([DV] extends [never] ? {} : { defaultValues: DefaultValuesParameter<S, DV> }) &\n\t\t([PC] extends [never]\n\t\t\t? {}\n\t\t\t: { protectedColumns: Exact<PC, ProtectedColumnsConfigData<DataModelForSchema<S>>> }) &\n\t\t([UR] extends [never]\n\t\t\t? {}\n\t\t\t: { uniqueRow: Exact<UR, UniqueRowConfigData<DataModelForSchema<S>>> }) &\n\t\t([UC] extends [never]\n\t\t\t? {}\n\t\t\t: { uniqueColumn: Exact<UC, UniqueColumnConfigData<DataModelForSchema<S>>> }) &\n\t\t([E] extends [never] ? {} : { extensions: E })\n>;\n\ntype AllowedVerifyConfigKeys =\n\t| 'defaultValues'\n\t| 'protectedColumns'\n\t| 'uniqueRow'\n\t| 'uniqueColumn'\n\t| 'extensions';\n\nexport type ValidateDefaultValuesInput<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tV,\n> = V extends () => Promise<infer R>\n\t? () => Promise<Exact<R, DefaultValuesConfigData<DataModelForSchema<S>>>>\n\t: V extends () => infer R\n\t\t? () => Exact<R, DefaultValuesConfigData<DataModelForSchema<S>>>\n\t\t: Exact<V, DefaultValuesConfigData<DataModelForSchema<S>>>;\n\nexport type ValidateVerifyConfig<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tVC,\n> = VC extends object\n\t? {\n\t\t\t[K in keyof VC]: K extends 'defaultValues'\n\t\t\t\t? ValidateDefaultValuesInput<S, VC[K]>\n\t\t\t\t: K extends 'protectedColumns'\n\t\t\t\t\t? Exact<VC[K], ProtectedColumnsConfigData<DataModelForSchema<S>>>\n\t\t\t\t\t: K extends 'uniqueRow'\n\t\t\t\t\t\t? Exact<VC[K], UniqueRowConfigData<DataModelForSchema<S>>>\n\t\t\t\t\t\t: K extends 'uniqueColumn'\n\t\t\t\t\t\t\t? Exact<VC[K], UniqueColumnConfigData<DataModelForSchema<S>>>\n\t\t\t\t\t\t\t: K extends 'extensions'\n\t\t\t\t\t\t\t\t? VC[K]\n\t\t\t\t\t\t\t\t: never;\n\t } & {\n\t\t\t[K in Exclude<keyof VC, AllowedVerifyConfigKeys>]: never;\n\t }\n\t: never;\n\n// =============================================================================\n// Type Extraction Helpers\n// =============================================================================\n\nexport type HasKey<T, K extends PropertyKey> = K extends keyof T ? true : false;\n\nexport type ExtractDefaultValuesConfig<VC> = VC extends {\n\tdefaultValues: infer C;\n}\n\t? C extends () => infer R\n\t\t? Awaited<R>\n\t\t: C\n\t: Record<string, never>;\n\nexport type OptionalKeysForTable<VC, TN> = TN extends keyof ExtractDefaultValuesConfig<VC>\n\t? keyof ExtractDefaultValuesConfig<VC>[TN]\n\t: never;\n\nexport type ExtractProtectedColumnsConfig<VC> = VC extends {\n\tprotectedColumns: infer C;\n}\n\t? C\n\t: Record<string, never>;\n\nexport type ProtectedKeysForTable<VC, TN> = TN extends keyof ExtractProtectedColumnsConfig<VC>\n\t? ExtractProtectedColumnsConfig<VC>[TN] extends readonly (infer K)[]\n\t\t? K\n\t\t: never\n\t: never;\n\n// =============================================================================\n// Direct Verify Input Types\n// =============================================================================\n\nexport type VerifyInsertInput<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tTN extends TableNamesInDataModel<DataModelForSchema<S>>,\n\tTData,\n> = {\n\tctx: MutationCtxForSchema<S>;\n\ttableName: TN;\n\toperation: 'insert';\n\tonFail?: OnFailCallback<DocumentByName<DataModelForSchema<S>, TN>>;\n\tschema: S;\n\tpatchId?: undefined;\n\tdata: TData;\n};\n\nexport type VerifyPatchInput<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tTN extends TableNamesInDataModel<DataModelForSchema<S>>,\n\tTData,\n> = {\n\tctx: MutationCtxForSchema<S>;\n\ttableName: TN;\n\toperation: 'patch';\n\tpatchId: GenericId<TN>;\n\tonFail?: OnFailCallback<DocumentByName<DataModelForSchema<S>, TN>>;\n\tschema: S;\n\tdata: TData;\n};\n\nexport type ExtensionStyleVerifyFn<S extends SchemaDefinition<GenericSchema, boolean>> = {\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyInsertInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t>,\n\t): Promise<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyPatchInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tPartial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>\n\t\t>,\n\t): Promise<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>>;\n};\n\nexport type DefaultValuesVerifyFn<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tVC,\n> = {\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\ttableName: TN,\n\t\tdata: HasKey<VC, 'defaultValues'> extends true\n\t\t\t? MakeOptional<\n\t\t\t\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>,\n\t\t\t\t\tOptionalKeysForTable<VC, TN> &\n\t\t\t\t\t\tkeyof WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t\t\t>\n\t\t\t: WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>,\n\t): Promise<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyInsertInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tHasKey<VC, 'defaultValues'> extends true\n\t\t\t\t? MakeOptional<\n\t\t\t\t\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>,\n\t\t\t\t\t\tOptionalKeysForTable<VC, TN> &\n\t\t\t\t\t\t\tkeyof WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t\t\t >\n\t\t\t\t: WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t>,\n\t): Promise<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyPatchInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tPartial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>\n\t\t>,\n\t): Promise<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>>;\n};\n\nexport type ProtectedColumnsVerifyFn<S extends SchemaDefinition<GenericSchema, boolean>> = {\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\ttableName: TN,\n\t\tdata: Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>,\n\t): Promise<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyInsertInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t>,\n\t): Promise<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyPatchInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tPartial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>\n\t\t>,\n\t): Promise<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>>;\n};\n\nexport type UniqueVerifyFn<S extends SchemaDefinition<GenericSchema, boolean>> = {\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>, D extends Partial<\n\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t>>(\n\t\tctx: MutationCtxForSchema<S>,\n\t\ttableName: TN,\n\t\tdata: D,\n\t): Promise<D>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>, D extends Partial<\n\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t>>(\n\t\tctx: MutationCtxForSchema<S>,\n\t\ttableName: TN,\n\t\tpatchId: GenericId<TN>,\n\t\tdata: D,\n\t): Promise<D>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>, D extends Partial<\n\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t>>(\n\t\tinput: VerifyInsertInput<S, TN, D>,\n\t): Promise<D>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>, D extends Partial<\n\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t>>(\n\t\tinput: VerifyPatchInput<S, TN, D>,\n\t): Promise<D>;\n};\n\nexport type BuiltinConfigKey =\n\t| 'defaultValues'\n\t| 'protectedColumns'\n\t| 'uniqueRow'\n\t| 'uniqueColumn';\n\nexport type VerifyFnForKey<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tVC,\n\tK extends BuiltinConfigKey,\n> = K extends 'defaultValues'\n\t? DefaultValuesVerifyFn<S, VC>\n\t: K extends 'protectedColumns'\n\t\t? ProtectedColumnsVerifyFn<S>\n\t\t: UniqueVerifyFn<S>;\n\nexport type VerifyRegistry<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tVC,\n> = Prettify<{\n\t[K in BuiltinConfigKey as HasKey<VC, K> extends true ? K : never]: VerifyFnForKey<S, VC, K>;\n}>;\n\nexport type ConfigRegistry<VC> = Prettify<{\n\t[K in BuiltinConfigKey as HasKey<VC, K> extends true ? K : never]: K extends keyof VC ? VC[K] : never;\n}>;\n","import {\n\tDataModelFromSchemaDefinition,\n\tDocumentByName,\n\tGenericSchema,\n\tSchemaDefinition,\n\tTableNamesInDataModel,\n} from \"convex/server\";\n\nimport {\n\tIndexConfigBaseOptions,\n\tNormalizedIndexConfig,\n\tnormalizeIndexConfigEntry,\n\tUniqueRowConfigData,\n} from \"../core/types\";\n\n/**\n * Get Table indexes helper\n *\n * Note: this is using an experimental API in convex-js\n * https://github.com/get-convex/convex-js/commit/04c3b44cab54c4d2230cce9312bdff074d54ab04\n */\nexport const getTableIndexes = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n>(\n\tschema: S,\n\ttableName: TN,\n) => {\n\treturn schema.tables[tableName][\" indexes\"]();\n};\n\n/**\n * Generate column data from fields and data object\n */\nexport const constructColumnData = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n\tD extends Partial<DocumentByName<DataModel, TN>>,\n>(\n\tfields: string[],\n\tdata: D,\n\t{\n\t\tallowNullishValue = false,\n\t\tallOrNothing = true,\n\t}: {\n\t\tallowNullishValue?: boolean;\n\t\tallOrNothing?: boolean;\n\t},\n) => {\n\tconst lengthOfFields = fields.length;\n\n\tconst columnData = fields\n\t\t.map((_, index) => {\n\t\t\tconst column = fields?.[index];\n\t\t\tconst value = data?.[column];\n\n\t\t\tif (\n\t\t\t\t!column ||\n\t\t\t\t(!allowNullishValue && (value === undefined || value === null))\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcolumn,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t})\n\t\t.filter((e) => !!e);\n\n\tif (allOrNothing && columnData.length !== lengthOfFields) {\n\t\treturn null;\n\t}\n\n\treturn columnData.length > 0 ? columnData : null;\n};\n\n/**\n * Construct index data from schema and config.\n * Handles both string shorthand and full object config entries.\n *\n * @returns Array of normalized index configs with resolved field names from schema\n */\nexport const constructIndexData = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n>(\n\tschema: S,\n\ttableName: TN,\n\tindexConfig?: UniqueRowConfigData<DataModel>,\n):\n\t| (NormalizedIndexConfig<Options> & { name: string; fields: string[] })[]\n\t| undefined => {\n\tif (!indexConfig) {\n\t\treturn;\n\t}\n\n\tconst tableConfig = indexConfig?.[tableName];\n\tif (!tableConfig) {\n\t\treturn;\n\t}\n\n\treturn tableConfig.map((entry) => {\n\t\t// Normalize the entry (handles both string and object forms)\n\t\tconst normalized = normalizeIndexConfigEntry<Options>(entry as any);\n\t\tconst { index, identifiers, ...rest } = normalized;\n\n\t\tconst fields = getTableIndexes(schema, tableName).find(\n\t\t\t(i) => i.indexDescriptor == index,\n\t\t)?.fields;\n\n\t\tif (!fields) {\n\t\t\tthrow new Error(\n\t\t\t\t`Error in 'constructIndexData()'. No fields found for index: [${index}]`,\n\t\t\t);\n\t\t}\n\n\t\t// Create a unique map in case there is any overlap in identifiers\n\t\t// Always include '_id' as a fallback identifier\n\t\tconst identifierMap = new Map<string, string>(\n\t\t\t[...identifiers, \"_id\"].map((i) => [String(i), String(i)]),\n\t\t);\n\n\t\treturn {\n\t\t\tname: index,\n\t\t\tfields,\n\t\t\tidentifiers: Array.from(identifierMap.values()),\n\t\t\t...rest,\n\t\t} as NormalizedIndexConfig<Options> & { name: string; fields: string[] };\n\t});\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC8HO,SAAS,0BAGf,OACA,qBAA+B,CAAC,KAAK,GACJ;AACjC,MAAI,OAAO,UAAU,UAAU;AAC9B,WAAO;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACd;AAAA,EACD;AAEA,QAAM,EAAE,OAAO,aAAa,GAAG,KAAK,IAAI;AACxC,SAAO;AAAA,IACN,OAAO,OAAO,KAAK;AAAA,IACnB,aAAa,aAAa,IAAI,MAAM,KAAK;AAAA,IACzC,GAAG;AAAA,EACJ;AACD;;;AC5HO,IAAM,kBAAkB,CAK9B,QACA,cACI;AACJ,SAAO,OAAO,OAAO,SAAS,EAAE,UAAU,EAAE;AAC7C;AAKO,IAAM,sBAAsB,CAMlC,QACA,MACA;AAAA,EACC,oBAAoB;AAAA,EACpB,eAAe;AAChB,MAII;AACJ,QAAM,iBAAiB,OAAO;AAE9B,QAAM,aAAa,OACjB,IAAI,CAAC,GAAG,UAAU;AAClB,UAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,QAAQ,OAAO,MAAM;AAE3B,QACC,CAAC,UACA,CAAC,sBAAsB,UAAU,UAAa,UAAU,OACxD;AACD;AAAA,IACD;AAEA,WAAO;AAAA,MACN;AAAA,MACA;AAAA,IACD;AAAA,EACD,CAAC,EACA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnB,MAAI,gBAAgB,WAAW,WAAW,gBAAgB;AACzD,WAAO;AAAA,EACR;AAEA,SAAO,WAAW,SAAS,IAAI,aAAa;AAC7C;AAQO,IAAM,qBAAqB,CAMjC,QACA,WACA,gBAGe;AACf,MAAI,CAAC,aAAa;AACjB;AAAA,EACD;AAEA,QAAM,cAAc,cAAc,SAAS;AAC3C,MAAI,CAAC,aAAa;AACjB;AAAA,EACD;AAEA,SAAO,YAAY,IAAI,CAAC,UAAU;AAEjC,UAAM,aAAa,0BAAmC,KAAY;AAClE,UAAM,EAAE,OAAO,aAAa,GAAG,KAAK,IAAI;AAExC,UAAM,SAAS,gBAAgB,QAAQ,SAAS,EAAE;AAAA,MACjD,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC7B,GAAG;AAEH,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAI;AAAA,QACT,gEAAgE,KAAK;AAAA,MACtE;AAAA,IACD;AAIA,UAAM,gBAAgB,IAAI;AAAA,MACzB,CAAC,GAAG,aAAa,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AAAA,IAC1D;AAEA,WAAO;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,aAAa,MAAM,KAAK,cAAc,OAAO,CAAC;AAAA,MAC9C,GAAG;AAAA,IACJ;AAAA,EACD,CAAC;AACF;","names":[]}
@@ -26,7 +26,7 @@ var constructColumnData = (fields, data, {
26
26
  const columnData = fields.map((_, index) => {
27
27
  const column = fields?.[index];
28
28
  const value = data?.[column];
29
- if (!column || !allowNullishValue && !value) {
29
+ if (!column || !allowNullishValue && (value === void 0 || value === null)) {
30
30
  return;
31
31
  }
32
32
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/types.ts","../../src/utils/helpers.ts"],"sourcesContent":["import {\n\tDataModelFromSchemaDefinition,\n\tGenericDocument,\n\tIndexes,\n\tNamedTableInfo,\n\tSchemaDefinition,\n\tWithoutSystemFields,\n} from 'convex/server';\n\n// =============================================================================\n// Utility Types\n// =============================================================================\n\nexport type Prettify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type MakeOptional<T, K extends PropertyKey> = Prettify<\n\tOmit<T, K & keyof T> & Partial<Pick<T, K & keyof T>>\n>;\n\n// =============================================================================\n// Base Types for Config Functions\n// =============================================================================\n\n/**\n * Base interface that all config functions should return.\n * Each config type can have its own `verify` signature and additional properties.\n */\nexport type BaseConfigReturn = {\n\tconfig: Record<string, any>;\n};\n\n// =============================================================================\n// OnFail Types\n// =============================================================================\n\nexport type OnFailArgs<D extends GenericDocument> = {\n\tuniqueColumn?: {\n\t\tconflictingColumn: keyof D;\n\t\texistingData: D;\n\t};\n\tuniqueRow?: {\n\t\texistingData: D | null;\n\t};\n\teditableColumn?: {\n\t\tremovedColumns: string[];\n\t\tfilteredData: Partial<WithoutSystemFields<D>>;\n\t};\n\trequiredColumn?: {\n\t\tmissingColumn: keyof D;\n\t};\n};\n\nexport type OnFailCallback<D extends GenericDocument> = (args: OnFailArgs<D>) => void;\n\n// =============================================================================\n// Config Data Types (what the user provides)\n// =============================================================================\n\nexport type DMGeneric = DataModelFromSchemaDefinition<SchemaDefinition<any, boolean>>;\n\nexport type DefaultValuesConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: {\n\t\t[column in keyof WithoutSystemFields<DM[K]['document']>]?: DM[K]['document'][column];\n\t};\n};\n\n// =============================================================================\n// Index-Based Config Types (shared between uniqueRow, uniqueColumn, etc.)\n// =============================================================================\n\n/**\n * Base options shared by all index-based config entries.\n * Individual extensions can extend this with their own options.\n */\nexport type IndexConfigBaseOptions = {\n\t/** Additional identifiers to check if the existing row is the same document being updated */\n\tidentifiers?: string[];\n};\n\n/**\n * A config entry that can be either:\n * - A string (index name) for shorthand\n * - An object with `index` and additional options\n *\n * @example\n * ```ts\n * // These are equivalent:\n * 'by_username'\n * { index: 'by_username' }\n *\n * // With options:\n * { index: 'by_username', identifiers: ['_id', 'userId'] }\n * ```\n */\nexport type IndexConfigEntry<\n\tDM extends DMGeneric,\n\tK extends keyof DM,\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n> =\n\t| keyof Indexes<NamedTableInfo<DM, K>>\n\t| ({\n\t\t\tindex: keyof Indexes<NamedTableInfo<DM, K>>;\n\t\t\tidentifiers?: (keyof NamedTableInfo<DM, K>['document'])[];\n\t } & Omit<Options, 'identifiers'>);\n\n/**\n * Normalized form of an index config entry (always an object)\n */\nexport type NormalizedIndexConfig<Options extends IndexConfigBaseOptions = IndexConfigBaseOptions> =\n\t{\n\t\tindex: string;\n\t\tidentifiers: string[];\n\t} & Omit<Options, 'identifiers'>;\n\n/**\n * Normalize a config entry to always have index and identifiers.\n * Works for both string shorthand and full object configs.\n */\nexport function normalizeIndexConfigEntry<\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n>(\n\tentry: string | ({ index: string; identifiers?: string[] } & Omit<Options, 'identifiers'>),\n\tdefaultIdentifiers: string[] = ['_id']\n): NormalizedIndexConfig<Options> {\n\tif (typeof entry === 'string') {\n\t\treturn {\n\t\t\tindex: entry,\n\t\t\tidentifiers: defaultIdentifiers,\n\t\t} as NormalizedIndexConfig<Options>;\n\t}\n\n\tconst { index, identifiers, ...rest } = entry;\n\treturn {\n\t\tindex: String(index),\n\t\tidentifiers: identifiers?.map(String) ?? defaultIdentifiers,\n\t\t...rest,\n\t} as NormalizedIndexConfig<Options>;\n}\n\n// =============================================================================\n// UniqueRow Config Types\n// =============================================================================\n\nexport type UniqueRowConfigOptions = IndexConfigBaseOptions & {\n\tqueryExistingWithNullish?: boolean;\n};\n\nexport type UniqueRowConfigEntry<DM extends DMGeneric, K extends keyof DM> = IndexConfigEntry<\n\tDM,\n\tK,\n\tUniqueRowConfigOptions\n>;\n\nexport type UniqueRowConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: UniqueRowConfigEntry<DM, K>[];\n};\n\n// =============================================================================\n// UniqueColumn Config Types\n// =============================================================================\n\nexport type UniqueColumnConfigOptions = IndexConfigBaseOptions;\n\nexport type UniqueColumnConfigEntry<DM extends DMGeneric, K extends keyof DM> = IndexConfigEntry<\n\tDM,\n\tK,\n\tUniqueColumnConfigOptions\n>;\n\nexport type UniqueColumnConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: UniqueColumnConfigEntry<DM, K>[];\n};\n\n// =============================================================================\n// Input Types (loose types for verifyConfig to accept)\n// =============================================================================\n\n/**\n * Loose input types that accept any return from config functions.\n * We use loose types here to avoid complex generic matching,\n * then extract the specific config types using conditional types.\n */\nexport type DefaultValuesInput = {\n\t_type: 'defaultValues';\n\tverify: (tableName: any, data: any) => Promise<any>;\n\tconfig:\n\t\t| Record<string, Record<string, any>>\n\t\t| (() => Record<string, Record<string, any>> | Promise<Record<string, Record<string, any>>>);\n};\n\n/**\n * Loose input type for protectedColumnsConfig return value.\n */\nexport type ProtectedColumnsInput = {\n\t_type: 'protectedColumns';\n\tconfig: Record<string, string[]>;\n};\n\n// =============================================================================\n// Object-Based Types (for verifyConfig)\n// =============================================================================\n\n/**\n * Config input for verifyConfig.\n *\n * - `defaultValues`: Transform config that makes fields optional (affects types)\n * - `protectedColumns`: Columns that cannot be patched (affects patch() types)\n * Extension-specific options are added by `verifyConfig`.\n */\nexport type VerifyConfigInput = {\n\tdefaultValues?: DefaultValuesInput;\n\tprotectedColumns?: ProtectedColumnsInput;\n};\n\n// =============================================================================\n// Type Extraction Helpers\n// =============================================================================\n\n/**\n * Extract the config type from defaultValues.config.\n * Handles both direct object and function forms.\n */\nexport type ExtractDefaultValuesConfig<VC> = VC extends {\n\tdefaultValues: { config: infer C };\n}\n\t? C extends () => infer R\n\t\t? Awaited<R>\n\t\t: C\n\t: Record<string, never>;\n\n/**\n * Compute which keys should be optional for a given table based on all configs.\n * Currently only defaultValues affects optionality.\n */\nexport type OptionalKeysForTable<VC, TN> = TN extends keyof ExtractDefaultValuesConfig<VC>\n\t? keyof ExtractDefaultValuesConfig<VC>[TN]\n\t: never;\n\n/**\n * Helper to check if a key exists in a type\n */\nexport type HasKey<T, K extends PropertyKey> = K extends keyof T ? true : false;\n\n// =============================================================================\n// Protected Columns Type Extraction\n// =============================================================================\n\n/**\n * Extract the config type from protectedColumns.config\n */\nexport type ExtractProtectedColumnsConfig<VC> = VC extends {\n\tprotectedColumns: { config: infer C };\n}\n\t? C\n\t: Record<string, never>;\n\n/**\n * Get protected column keys for a specific table.\n * Returns the column names that should be omitted from patch() input.\n */\nexport type ProtectedKeysForTable<VC, TN> = TN extends keyof ExtractProtectedColumnsConfig<VC>\n\t? ExtractProtectedColumnsConfig<VC>[TN] extends readonly (infer K)[]\n\t\t? K\n\t\t: never\n\t: never;\n","import {\n\tDataModelFromSchemaDefinition,\n\tDocumentByName,\n\tGenericSchema,\n\tSchemaDefinition,\n\tTableNamesInDataModel,\n} from \"convex/server\";\n\nimport {\n\tIndexConfigBaseOptions,\n\tNormalizedIndexConfig,\n\tnormalizeIndexConfigEntry,\n\tUniqueRowConfigData,\n} from \"../core/types\";\n\n/**\n * Get Table indexes helper\n *\n * Note: this is using an experimental API in convex-js\n * https://github.com/get-convex/convex-js/commit/04c3b44cab54c4d2230cce9312bdff074d54ab04\n */\nexport const getTableIndexes = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n>(\n\tschema: S,\n\ttableName: TN,\n) => {\n\treturn schema.tables[tableName][\" indexes\"]();\n};\n\n/**\n * Generate column data from fields and data object\n */\nexport const constructColumnData = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n\tD extends Partial<DocumentByName<DataModel, TN>>,\n>(\n\tfields: string[],\n\tdata: D,\n\t{\n\t\tallowNullishValue = false,\n\t\tallOrNothing = true,\n\t}: {\n\t\tallowNullishValue?: boolean;\n\t\tallOrNothing?: boolean;\n\t},\n) => {\n\tconst lengthOfFields = fields.length;\n\n\tconst columnData = fields\n\t\t.map((_, index) => {\n\t\t\tconst column = fields?.[index];\n\t\t\tconst value = data?.[column];\n\n\t\t\tif (!column || (!allowNullishValue && !value)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcolumn,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t})\n\t\t.filter((e) => !!e);\n\n\tif (allOrNothing && columnData.length !== lengthOfFields) {\n\t\treturn null;\n\t}\n\n\treturn columnData.length > 0 ? columnData : null;\n};\n\n/**\n * Construct index data from schema and config.\n * Handles both string shorthand and full object config entries.\n *\n * @returns Array of normalized index configs with resolved field names from schema\n */\nexport const constructIndexData = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n>(\n\tschema: S,\n\ttableName: TN,\n\tindexConfig?: UniqueRowConfigData<DataModel>,\n):\n\t| (NormalizedIndexConfig<Options> & { name: string; fields: string[] })[]\n\t| undefined => {\n\tif (!indexConfig) {\n\t\treturn;\n\t}\n\n\tconst tableConfig = indexConfig?.[tableName];\n\tif (!tableConfig) {\n\t\treturn;\n\t}\n\n\treturn tableConfig.map((entry) => {\n\t\t// Normalize the entry (handles both string and object forms)\n\t\tconst normalized = normalizeIndexConfigEntry<Options>(entry as any);\n\t\tconst { index, identifiers, ...rest } = normalized;\n\n\t\tconst fields = getTableIndexes(schema, tableName).find(\n\t\t\t(i) => i.indexDescriptor == index,\n\t\t)?.fields;\n\n\t\tif (!fields) {\n\t\t\tthrow new Error(\n\t\t\t\t`Error in 'constructIndexData()'. No fields found for index: [${index}]`,\n\t\t\t);\n\t\t}\n\n\t\t// Create a unique map in case there is any overlap in identifiers\n\t\t// Always include '_id' as a fallback identifier\n\t\tconst identifierMap = new Map<string, string>(\n\t\t\t[...identifiers, \"_id\"].map((i) => [String(i), String(i)]),\n\t\t);\n\n\t\treturn {\n\t\t\tname: index,\n\t\t\tfields,\n\t\t\tidentifiers: Array.from(identifierMap.values()),\n\t\t\t...rest,\n\t\t} as NormalizedIndexConfig<Options> & { name: string; fields: string[] };\n\t});\n};\n"],"mappings":";AAsHO,SAAS,0BAGf,OACA,qBAA+B,CAAC,KAAK,GACJ;AACjC,MAAI,OAAO,UAAU,UAAU;AAC9B,WAAO;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACd;AAAA,EACD;AAEA,QAAM,EAAE,OAAO,aAAa,GAAG,KAAK,IAAI;AACxC,SAAO;AAAA,IACN,OAAO,OAAO,KAAK;AAAA,IACnB,aAAa,aAAa,IAAI,MAAM,KAAK;AAAA,IACzC,GAAG;AAAA,EACJ;AACD;;;ACpHO,IAAM,kBAAkB,CAK9B,QACA,cACI;AACJ,SAAO,OAAO,OAAO,SAAS,EAAE,UAAU,EAAE;AAC7C;AAKO,IAAM,sBAAsB,CAMlC,QACA,MACA;AAAA,EACC,oBAAoB;AAAA,EACpB,eAAe;AAChB,MAII;AACJ,QAAM,iBAAiB,OAAO;AAE9B,QAAM,aAAa,OACjB,IAAI,CAAC,GAAG,UAAU;AAClB,UAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,QAAQ,OAAO,MAAM;AAE3B,QAAI,CAAC,UAAW,CAAC,qBAAqB,CAAC,OAAQ;AAC9C;AAAA,IACD;AAEA,WAAO;AAAA,MACN;AAAA,MACA;AAAA,IACD;AAAA,EACD,CAAC,EACA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnB,MAAI,gBAAgB,WAAW,WAAW,gBAAgB;AACzD,WAAO;AAAA,EACR;AAEA,SAAO,WAAW,SAAS,IAAI,aAAa;AAC7C;AAQO,IAAM,qBAAqB,CAMjC,QACA,WACA,gBAGe;AACf,MAAI,CAAC,aAAa;AACjB;AAAA,EACD;AAEA,QAAM,cAAc,cAAc,SAAS;AAC3C,MAAI,CAAC,aAAa;AACjB;AAAA,EACD;AAEA,SAAO,YAAY,IAAI,CAAC,UAAU;AAEjC,UAAM,aAAa,0BAAmC,KAAY;AAClE,UAAM,EAAE,OAAO,aAAa,GAAG,KAAK,IAAI;AAExC,UAAM,SAAS,gBAAgB,QAAQ,SAAS,EAAE;AAAA,MACjD,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC7B,GAAG;AAEH,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAI;AAAA,QACT,gEAAgE,KAAK;AAAA,MACtE;AAAA,IACD;AAIA,UAAM,gBAAgB,IAAI;AAAA,MACzB,CAAC,GAAG,aAAa,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AAAA,IAC1D;AAEA,WAAO;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,aAAa,MAAM,KAAK,cAAc,OAAO,CAAC;AAAA,MAC9C,GAAG;AAAA,IACJ;AAAA,EACD,CAAC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/core/types.ts","../../src/utils/helpers.ts"],"sourcesContent":["import {\n\tDataModelFromSchemaDefinition,\n\tDocumentByName,\n\tGenericDocument,\n\tGenericMutationCtx,\n\tGenericSchema,\n\tIndexes,\n\tNamedTableInfo,\n\tSchemaDefinition,\n\tTableNamesInDataModel,\n\tWithoutSystemFields,\n} from 'convex/server';\nimport { GenericId } from 'convex/values';\n\n// =============================================================================\n// Utility Types\n// =============================================================================\n\nexport type Prettify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type MakeOptional<T, K extends PropertyKey> = Prettify<\n\tOmit<T, K & keyof T> & Partial<Pick<T, K & keyof T>>\n>;\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport type Exact<T, Shape> = T extends Shape\n\t? T extends (...args: any[]) => any\n\t\t? T\n\t\t: T extends readonly any[]\n\t\t\t? T\n\t\t\t: T extends object\n\t\t\t\t? {\n\t\t\t\t\t\t[K in keyof T]: K extends keyof NonNullable<Shape>\n\t\t\t\t\t\t\t? Exact<T[K], NonNullable<Shape>[K]>\n\t\t\t\t\t\t\t: never;\n\t\t\t\t } & {\n\t\t\t\t\t\t[K in Exclude<keyof NonNullable<Shape>, keyof T>]?: NonNullable<Shape>[K];\n\t\t\t\t }\n\t\t\t\t: T\n\t: never;\n\n// =============================================================================\n// Base Types\n// =============================================================================\n\nexport type BaseConfigReturn = {\n\tconfig: Record<string, any>;\n};\n\nexport type DMGeneric = DataModelFromSchemaDefinition<SchemaDefinition<any, boolean>>;\n\nexport type DataModelForSchema<S extends SchemaDefinition<GenericSchema, boolean>> =\n\tDataModelFromSchemaDefinition<S>;\n\nexport type MutationCtxForSchema<S extends SchemaDefinition<GenericSchema, boolean>> = Omit<\n\tGenericMutationCtx<DataModelForSchema<S>>,\n\tnever\n>;\n\n// =============================================================================\n// OnFail Types\n// =============================================================================\n\nexport type OnFailArgs<D extends GenericDocument> = {\n\tuniqueColumn?: {\n\t\tconflictingColumn: keyof D;\n\t\texistingData: D;\n\t};\n\tuniqueRow?: {\n\t\texistingData: D | null;\n\t};\n\teditableColumn?: {\n\t\tremovedColumns: string[];\n\t\tfilteredData: Partial<WithoutSystemFields<D>>;\n\t};\n\trequiredColumn?: {\n\t\tmissingColumn: keyof D;\n\t};\n};\n\nexport type OnFailCallback<D extends GenericDocument> = (args: OnFailArgs<D>) => void;\n\n// =============================================================================\n// Config Data Types\n// =============================================================================\n\nexport type DefaultValuesConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: {\n\t\t[column in keyof WithoutSystemFields<DM[K]['document']>]?: DM[K]['document'][column];\n\t};\n};\n\nexport type DefaultValuesConfigInput<DM extends DMGeneric> =\n\t| DefaultValuesConfigData<DM>\n\t| (() => DefaultValuesConfigData<DM> | Promise<DefaultValuesConfigData<DM>>);\n\nexport type ProtectedColumnsConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: (keyof WithoutSystemFields<DM[K]['document']>)[];\n};\n\n// =============================================================================\n// Index-Based Config Types\n// =============================================================================\n\nexport type IndexConfigBaseOptions = {\n\tidentifiers?: string[];\n};\n\nexport type IndexConfigEntry<\n\tDM extends DMGeneric,\n\tK extends keyof DM,\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n> =\n\t| keyof Indexes<NamedTableInfo<DM, K>>\n\t| ({\n\t\t\tindex: keyof Indexes<NamedTableInfo<DM, K>>;\n\t\t\tidentifiers?: (keyof NamedTableInfo<DM, K>['document'])[];\n\t } & Omit<Options, 'identifiers'>);\n\nexport type NormalizedIndexConfig<Options extends IndexConfigBaseOptions = IndexConfigBaseOptions> =\n\t{\n\t\tindex: string;\n\t\tidentifiers: string[];\n\t} & Omit<Options, 'identifiers'>;\n\nexport function normalizeIndexConfigEntry<\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n>(\n\tentry: string | ({ index: string; identifiers?: string[] } & Omit<Options, 'identifiers'>),\n\tdefaultIdentifiers: string[] = ['_id']\n): NormalizedIndexConfig<Options> {\n\tif (typeof entry === 'string') {\n\t\treturn {\n\t\t\tindex: entry,\n\t\t\tidentifiers: defaultIdentifiers,\n\t\t} as NormalizedIndexConfig<Options>;\n\t}\n\n\tconst { index, identifiers, ...rest } = entry;\n\treturn {\n\t\tindex: String(index),\n\t\tidentifiers: identifiers?.map(String) ?? defaultIdentifiers,\n\t\t...rest,\n\t} as NormalizedIndexConfig<Options>;\n}\n\n// =============================================================================\n// UniqueRow Config Types\n// =============================================================================\n\nexport type UniqueRowConfigOptions = IndexConfigBaseOptions & {\n\tqueryExistingWithNullish?: boolean;\n};\n\nexport type UniqueRowConfigEntry<DM extends DMGeneric, K extends keyof DM> = IndexConfigEntry<\n\tDM,\n\tK,\n\tUniqueRowConfigOptions\n>;\n\nexport type UniqueRowConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: UniqueRowConfigEntry<DM, K>[];\n};\n\n// =============================================================================\n// UniqueColumn Config Types\n// =============================================================================\n\nexport type UniqueColumnConfigOptions = IndexConfigBaseOptions;\n\nexport type UniqueColumnConfigEntry<DM extends DMGeneric, K extends keyof DM> = IndexConfigEntry<\n\tDM,\n\tK,\n\tUniqueColumnConfigOptions\n>;\n\nexport type UniqueColumnConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: UniqueColumnConfigEntry<DM, K>[];\n};\n\n// =============================================================================\n// VerifyConfig Types\n// =============================================================================\n\nexport type VerifyConfigInput<S extends SchemaDefinition<GenericSchema, boolean>> = {\n\tdefaultValues?: DefaultValuesConfigInput<DataModelForSchema<S>>;\n\tprotectedColumns?: ProtectedColumnsConfigData<DataModelForSchema<S>>;\n\tuniqueRow?: UniqueRowConfigData<DataModelForSchema<S>>;\n\tuniqueColumn?: UniqueColumnConfigData<DataModelForSchema<S>>;\n};\n\nexport type DefaultValuesParameter<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDV,\n> =\n\tValidateDefaultValuesInput<S, DV>;\n\nexport type VerifyConfigSections<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDV = never,\n\tPC = never,\n\tUR = never,\n\tUC = never,\n\tE = never,\n> = {\n\tdefaultValues?: DefaultValuesParameter<S, DV>;\n\tprotectedColumns?: Exact<PC, ProtectedColumnsConfigData<DataModelForSchema<S>>>;\n\tuniqueRow?: Exact<UR, UniqueRowConfigData<DataModelForSchema<S>>>;\n\tuniqueColumn?: Exact<UC, UniqueColumnConfigData<DataModelForSchema<S>>>;\n\textensions?: E;\n};\n\nexport type VerifyConfigShapeFromGenerics<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDV,\n\tPC,\n\tUR,\n\tUC,\n\tE,\n> = Prettify<\n\t([DV] extends [never] ? {} : { defaultValues: DefaultValuesParameter<S, DV> }) &\n\t\t([PC] extends [never]\n\t\t\t? {}\n\t\t\t: { protectedColumns: Exact<PC, ProtectedColumnsConfigData<DataModelForSchema<S>>> }) &\n\t\t([UR] extends [never]\n\t\t\t? {}\n\t\t\t: { uniqueRow: Exact<UR, UniqueRowConfigData<DataModelForSchema<S>>> }) &\n\t\t([UC] extends [never]\n\t\t\t? {}\n\t\t\t: { uniqueColumn: Exact<UC, UniqueColumnConfigData<DataModelForSchema<S>>> }) &\n\t\t([E] extends [never] ? {} : { extensions: E })\n>;\n\ntype AllowedVerifyConfigKeys =\n\t| 'defaultValues'\n\t| 'protectedColumns'\n\t| 'uniqueRow'\n\t| 'uniqueColumn'\n\t| 'extensions';\n\nexport type ValidateDefaultValuesInput<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tV,\n> = V extends () => Promise<infer R>\n\t? () => Promise<Exact<R, DefaultValuesConfigData<DataModelForSchema<S>>>>\n\t: V extends () => infer R\n\t\t? () => Exact<R, DefaultValuesConfigData<DataModelForSchema<S>>>\n\t\t: Exact<V, DefaultValuesConfigData<DataModelForSchema<S>>>;\n\nexport type ValidateVerifyConfig<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tVC,\n> = VC extends object\n\t? {\n\t\t\t[K in keyof VC]: K extends 'defaultValues'\n\t\t\t\t? ValidateDefaultValuesInput<S, VC[K]>\n\t\t\t\t: K extends 'protectedColumns'\n\t\t\t\t\t? Exact<VC[K], ProtectedColumnsConfigData<DataModelForSchema<S>>>\n\t\t\t\t\t: K extends 'uniqueRow'\n\t\t\t\t\t\t? Exact<VC[K], UniqueRowConfigData<DataModelForSchema<S>>>\n\t\t\t\t\t\t: K extends 'uniqueColumn'\n\t\t\t\t\t\t\t? Exact<VC[K], UniqueColumnConfigData<DataModelForSchema<S>>>\n\t\t\t\t\t\t\t: K extends 'extensions'\n\t\t\t\t\t\t\t\t? VC[K]\n\t\t\t\t\t\t\t\t: never;\n\t } & {\n\t\t\t[K in Exclude<keyof VC, AllowedVerifyConfigKeys>]: never;\n\t }\n\t: never;\n\n// =============================================================================\n// Type Extraction Helpers\n// =============================================================================\n\nexport type HasKey<T, K extends PropertyKey> = K extends keyof T ? true : false;\n\nexport type ExtractDefaultValuesConfig<VC> = VC extends {\n\tdefaultValues: infer C;\n}\n\t? C extends () => infer R\n\t\t? Awaited<R>\n\t\t: C\n\t: Record<string, never>;\n\nexport type OptionalKeysForTable<VC, TN> = TN extends keyof ExtractDefaultValuesConfig<VC>\n\t? keyof ExtractDefaultValuesConfig<VC>[TN]\n\t: never;\n\nexport type ExtractProtectedColumnsConfig<VC> = VC extends {\n\tprotectedColumns: infer C;\n}\n\t? C\n\t: Record<string, never>;\n\nexport type ProtectedKeysForTable<VC, TN> = TN extends keyof ExtractProtectedColumnsConfig<VC>\n\t? ExtractProtectedColumnsConfig<VC>[TN] extends readonly (infer K)[]\n\t\t? K\n\t\t: never\n\t: never;\n\n// =============================================================================\n// Direct Verify Input Types\n// =============================================================================\n\nexport type VerifyInsertInput<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tTN extends TableNamesInDataModel<DataModelForSchema<S>>,\n\tTData,\n> = {\n\tctx: MutationCtxForSchema<S>;\n\ttableName: TN;\n\toperation: 'insert';\n\tonFail?: OnFailCallback<DocumentByName<DataModelForSchema<S>, TN>>;\n\tschema: S;\n\tpatchId?: undefined;\n\tdata: TData;\n};\n\nexport type VerifyPatchInput<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tTN extends TableNamesInDataModel<DataModelForSchema<S>>,\n\tTData,\n> = {\n\tctx: MutationCtxForSchema<S>;\n\ttableName: TN;\n\toperation: 'patch';\n\tpatchId: GenericId<TN>;\n\tonFail?: OnFailCallback<DocumentByName<DataModelForSchema<S>, TN>>;\n\tschema: S;\n\tdata: TData;\n};\n\nexport type ExtensionStyleVerifyFn<S extends SchemaDefinition<GenericSchema, boolean>> = {\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyInsertInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t>,\n\t): Promise<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyPatchInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tPartial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>\n\t\t>,\n\t): Promise<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>>;\n};\n\nexport type DefaultValuesVerifyFn<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tVC,\n> = {\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\ttableName: TN,\n\t\tdata: HasKey<VC, 'defaultValues'> extends true\n\t\t\t? MakeOptional<\n\t\t\t\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>,\n\t\t\t\t\tOptionalKeysForTable<VC, TN> &\n\t\t\t\t\t\tkeyof WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t\t\t>\n\t\t\t: WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>,\n\t): Promise<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyInsertInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tHasKey<VC, 'defaultValues'> extends true\n\t\t\t\t? MakeOptional<\n\t\t\t\t\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>,\n\t\t\t\t\t\tOptionalKeysForTable<VC, TN> &\n\t\t\t\t\t\t\tkeyof WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t\t\t >\n\t\t\t\t: WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t>,\n\t): Promise<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyPatchInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tPartial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>\n\t\t>,\n\t): Promise<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>>;\n};\n\nexport type ProtectedColumnsVerifyFn<S extends SchemaDefinition<GenericSchema, boolean>> = {\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\ttableName: TN,\n\t\tdata: Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>,\n\t): Promise<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyInsertInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t\t>,\n\t): Promise<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>>(\n\t\tinput: VerifyPatchInput<\n\t\t\tS,\n\t\t\tTN,\n\t\t\tPartial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>\n\t\t>,\n\t): Promise<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>>;\n};\n\nexport type UniqueVerifyFn<S extends SchemaDefinition<GenericSchema, boolean>> = {\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>, D extends Partial<\n\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t>>(\n\t\tctx: MutationCtxForSchema<S>,\n\t\ttableName: TN,\n\t\tdata: D,\n\t): Promise<D>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>, D extends Partial<\n\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t>>(\n\t\tctx: MutationCtxForSchema<S>,\n\t\ttableName: TN,\n\t\tpatchId: GenericId<TN>,\n\t\tdata: D,\n\t): Promise<D>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>, D extends Partial<\n\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t>>(\n\t\tinput: VerifyInsertInput<S, TN, D>,\n\t): Promise<D>;\n\t<TN extends TableNamesInDataModel<DataModelForSchema<S>>, D extends Partial<\n\t\tWithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>\n\t>>(\n\t\tinput: VerifyPatchInput<S, TN, D>,\n\t): Promise<D>;\n};\n\nexport type BuiltinConfigKey =\n\t| 'defaultValues'\n\t| 'protectedColumns'\n\t| 'uniqueRow'\n\t| 'uniqueColumn';\n\nexport type VerifyFnForKey<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tVC,\n\tK extends BuiltinConfigKey,\n> = K extends 'defaultValues'\n\t? DefaultValuesVerifyFn<S, VC>\n\t: K extends 'protectedColumns'\n\t\t? ProtectedColumnsVerifyFn<S>\n\t\t: UniqueVerifyFn<S>;\n\nexport type VerifyRegistry<\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tVC,\n> = Prettify<{\n\t[K in BuiltinConfigKey as HasKey<VC, K> extends true ? K : never]: VerifyFnForKey<S, VC, K>;\n}>;\n\nexport type ConfigRegistry<VC> = Prettify<{\n\t[K in BuiltinConfigKey as HasKey<VC, K> extends true ? K : never]: K extends keyof VC ? VC[K] : never;\n}>;\n","import {\n\tDataModelFromSchemaDefinition,\n\tDocumentByName,\n\tGenericSchema,\n\tSchemaDefinition,\n\tTableNamesInDataModel,\n} from \"convex/server\";\n\nimport {\n\tIndexConfigBaseOptions,\n\tNormalizedIndexConfig,\n\tnormalizeIndexConfigEntry,\n\tUniqueRowConfigData,\n} from \"../core/types\";\n\n/**\n * Get Table indexes helper\n *\n * Note: this is using an experimental API in convex-js\n * https://github.com/get-convex/convex-js/commit/04c3b44cab54c4d2230cce9312bdff074d54ab04\n */\nexport const getTableIndexes = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n>(\n\tschema: S,\n\ttableName: TN,\n) => {\n\treturn schema.tables[tableName][\" indexes\"]();\n};\n\n/**\n * Generate column data from fields and data object\n */\nexport const constructColumnData = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n\tD extends Partial<DocumentByName<DataModel, TN>>,\n>(\n\tfields: string[],\n\tdata: D,\n\t{\n\t\tallowNullishValue = false,\n\t\tallOrNothing = true,\n\t}: {\n\t\tallowNullishValue?: boolean;\n\t\tallOrNothing?: boolean;\n\t},\n) => {\n\tconst lengthOfFields = fields.length;\n\n\tconst columnData = fields\n\t\t.map((_, index) => {\n\t\t\tconst column = fields?.[index];\n\t\t\tconst value = data?.[column];\n\n\t\t\tif (\n\t\t\t\t!column ||\n\t\t\t\t(!allowNullishValue && (value === undefined || value === null))\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcolumn,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t})\n\t\t.filter((e) => !!e);\n\n\tif (allOrNothing && columnData.length !== lengthOfFields) {\n\t\treturn null;\n\t}\n\n\treturn columnData.length > 0 ? columnData : null;\n};\n\n/**\n * Construct index data from schema and config.\n * Handles both string shorthand and full object config entries.\n *\n * @returns Array of normalized index configs with resolved field names from schema\n */\nexport const constructIndexData = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tTN extends TableNamesInDataModel<DataModel>,\n\tOptions extends IndexConfigBaseOptions = IndexConfigBaseOptions,\n>(\n\tschema: S,\n\ttableName: TN,\n\tindexConfig?: UniqueRowConfigData<DataModel>,\n):\n\t| (NormalizedIndexConfig<Options> & { name: string; fields: string[] })[]\n\t| undefined => {\n\tif (!indexConfig) {\n\t\treturn;\n\t}\n\n\tconst tableConfig = indexConfig?.[tableName];\n\tif (!tableConfig) {\n\t\treturn;\n\t}\n\n\treturn tableConfig.map((entry) => {\n\t\t// Normalize the entry (handles both string and object forms)\n\t\tconst normalized = normalizeIndexConfigEntry<Options>(entry as any);\n\t\tconst { index, identifiers, ...rest } = normalized;\n\n\t\tconst fields = getTableIndexes(schema, tableName).find(\n\t\t\t(i) => i.indexDescriptor == index,\n\t\t)?.fields;\n\n\t\tif (!fields) {\n\t\t\tthrow new Error(\n\t\t\t\t`Error in 'constructIndexData()'. No fields found for index: [${index}]`,\n\t\t\t);\n\t\t}\n\n\t\t// Create a unique map in case there is any overlap in identifiers\n\t\t// Always include '_id' as a fallback identifier\n\t\tconst identifierMap = new Map<string, string>(\n\t\t\t[...identifiers, \"_id\"].map((i) => [String(i), String(i)]),\n\t\t);\n\n\t\treturn {\n\t\t\tname: index,\n\t\t\tfields,\n\t\t\tidentifiers: Array.from(identifierMap.values()),\n\t\t\t...rest,\n\t\t} as NormalizedIndexConfig<Options> & { name: string; fields: string[] };\n\t});\n};\n"],"mappings":";AA8HO,SAAS,0BAGf,OACA,qBAA+B,CAAC,KAAK,GACJ;AACjC,MAAI,OAAO,UAAU,UAAU;AAC9B,WAAO;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACd;AAAA,EACD;AAEA,QAAM,EAAE,OAAO,aAAa,GAAG,KAAK,IAAI;AACxC,SAAO;AAAA,IACN,OAAO,OAAO,KAAK;AAAA,IACnB,aAAa,aAAa,IAAI,MAAM,KAAK;AAAA,IACzC,GAAG;AAAA,EACJ;AACD;;;AC5HO,IAAM,kBAAkB,CAK9B,QACA,cACI;AACJ,SAAO,OAAO,OAAO,SAAS,EAAE,UAAU,EAAE;AAC7C;AAKO,IAAM,sBAAsB,CAMlC,QACA,MACA;AAAA,EACC,oBAAoB;AAAA,EACpB,eAAe;AAChB,MAII;AACJ,QAAM,iBAAiB,OAAO;AAE9B,QAAM,aAAa,OACjB,IAAI,CAAC,GAAG,UAAU;AAClB,UAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,QAAQ,OAAO,MAAM;AAE3B,QACC,CAAC,UACA,CAAC,sBAAsB,UAAU,UAAa,UAAU,OACxD;AACD;AAAA,IACD;AAEA,WAAO;AAAA,MACN;AAAA,MACA;AAAA,IACD;AAAA,EACD,CAAC,EACA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnB,MAAI,gBAAgB,WAAW,WAAW,gBAAgB;AACzD,WAAO;AAAA,EACR;AAEA,SAAO,WAAW,SAAS,IAAI,aAAa;AAC7C;AAQO,IAAM,qBAAqB,CAMjC,QACA,WACA,gBAGe;AACf,MAAI,CAAC,aAAa;AACjB;AAAA,EACD;AAEA,QAAM,cAAc,cAAc,SAAS;AAC3C,MAAI,CAAC,aAAa;AACjB;AAAA,EACD;AAEA,SAAO,YAAY,IAAI,CAAC,UAAU;AAEjC,UAAM,aAAa,0BAAmC,KAAY;AAClE,UAAM,EAAE,OAAO,aAAa,GAAG,KAAK,IAAI;AAExC,UAAM,SAAS,gBAAgB,QAAQ,SAAS,EAAE;AAAA,MACjD,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC7B,GAAG;AAEH,QAAI,CAAC,QAAQ;AACZ,YAAM,IAAI;AAAA,QACT,gEAAgE,KAAK;AAAA,MACtE;AAAA,IACD;AAIA,UAAM,gBAAgB,IAAI;AAAA,MACzB,CAAC,GAAG,aAAa,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AAAA,IAC1D;AAEA,WAAO;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,aAAa,MAAM,KAAK,cAAc,OAAO,CAAC;AAAA,MAC9C,GAAG;AAAA,IACJ;AAAA,EACD,CAAC;AACF;","names":[]}
@@ -0,0 +1,94 @@
1
+ import { SchemaDefinition, GenericSchema, GenericMutationCtx, TableNamesInDataModel, DataModelFromSchemaDefinition, WithoutSystemFields, DocumentByName } from 'convex/server';
2
+ import { GenericId } from 'convex/values';
3
+ import { w as DMGeneric, b as OnFailCallback, V as VerifyConfigInput, x as ValidateDefaultValuesInput, y as ValidateVerifyConfig, a as MutationCtxForSchema, H as HasKey, M as MakeOptional, f as OptionalKeysForTable, h as ProtectedKeysForTable, B as BuiltinConfigKey, z as VerifyFnForKey } from './types-B8ZkLuJ2.js';
4
+
5
+ type MaybePromise<T> = T | Promise<T>;
6
+ type MutationCtx<DM extends DMGeneric = DMGeneric> = Omit<GenericMutationCtx<DM>, never>;
7
+ type InsertExtensionContext<TN extends string = string, DM extends DMGeneric = DMGeneric, S extends SchemaDefinition<GenericSchema, boolean> = SchemaDefinition<GenericSchema, boolean>> = {
8
+ ctx: MutationCtx<DM>;
9
+ tableName: TN;
10
+ operation: "insert";
11
+ onFail?: OnFailCallback<any>;
12
+ schema: S;
13
+ patchId?: undefined;
14
+ };
15
+ type PatchExtensionContext<TN extends string = string, DM extends DMGeneric = DMGeneric, S extends SchemaDefinition<GenericSchema, boolean> = SchemaDefinition<GenericSchema, boolean>> = {
16
+ ctx: MutationCtx<DM>;
17
+ tableName: TN;
18
+ operation: "patch";
19
+ patchId: GenericId<TN>;
20
+ onFail?: OnFailCallback<any>;
21
+ schema: S;
22
+ };
23
+ type ExtensionContext<TN extends string = string, DM extends DMGeneric = DMGeneric, S extends SchemaDefinition<GenericSchema, boolean> = SchemaDefinition<GenericSchema, boolean>> = InsertExtensionContext<TN, DM, S> | PatchExtensionContext<TN, DM, S>;
24
+ type ExtensionInput<TData = unknown, TContext = ExtensionContext> = TContext & {
25
+ data: TData;
26
+ };
27
+ type ExtensionInputBase = {
28
+ data: unknown;
29
+ };
30
+ type DataModelForSchema<S extends SchemaDefinition<GenericSchema, boolean>> = DataModelFromSchemaDefinition<S>;
31
+ type ExtensionInputForSchema<S extends SchemaDefinition<GenericSchema, boolean>> = {
32
+ [TN in TableNamesInDataModel<DataModelForSchema<S>>]: ExtensionInput<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>, InsertExtensionContext<TN, DataModelForSchema<S>, S>> | ExtensionInput<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>, PatchExtensionContext<TN, DataModelForSchema<S>, S>>;
33
+ }[TableNamesInDataModel<DataModelForSchema<S>>];
34
+ type ExtensionVerify<TInput extends ExtensionInputBase = ExtensionInput> = (input: TInput) => MaybePromise<TInput["data"]>;
35
+ type ExtensionRecord<TType extends string = string, TConfig = unknown, TInput extends ExtensionInputBase = ExtensionInput> = {
36
+ readonly _type: TType;
37
+ readonly config?: TConfig;
38
+ verify(input: TInput): MaybePromise<TInput["data"]>;
39
+ };
40
+ type Extension<TInput extends ExtensionInputBase = ExtensionInput> = ExtensionRecord<"extension", undefined, TInput>;
41
+ type SchemaExtension<S extends SchemaDefinition<GenericSchema, boolean>, TType extends string = string, TConfig = unknown> = ExtensionRecord<TType, TConfig, ExtensionInputForSchema<S>>;
42
+ declare function createExtension<const S extends SchemaDefinition<GenericSchema, boolean>>(verify: ExtensionVerify<ExtensionInputForSchema<S>>): Extension<ExtensionInputForSchema<S>>;
43
+ declare function createExtension<const S extends SchemaDefinition<GenericSchema, boolean>>(schema: S, verify: ExtensionVerify<ExtensionInputForSchema<S>>): Extension<ExtensionInputForSchema<S>>;
44
+ declare function createExtension(verify: ExtensionVerify): Extension;
45
+ declare function isExtension(value: unknown): value is ExtensionRecord;
46
+ declare function runExtensions<TExtensionInput extends ExtensionInputBase, TInput extends TExtensionInput>(extensions: readonly ExtensionRecord<string, unknown, TExtensionInput>[], input: TInput): Promise<TInput["data"]>;
47
+
48
+ declare const verifyConfig: <S extends GenericSchema, SD extends SchemaDefinition<S, boolean>, const VC extends VerifyConfigInput<SD> & {
49
+ extensions?: unknown;
50
+ }, const DV = never>(_schema: SD, configs: (Omit<VerifyConfigInput<SD>, "defaultValues"> & {
51
+ defaultValues?: ValidateDefaultValuesInput<SD, DV>;
52
+ }) & ValidateVerifyConfig<SD, VC> & VC) => {
53
+ insert: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: MutationCtxForSchema<SD>, tableName: TN, data: HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
54
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
55
+ }), "defaultValues"> extends true ? MakeOptional<WithoutSystemFields<D>, OptionalKeysForTable<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
56
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
57
+ }), TN> & keyof WithoutSystemFields<D>> : WithoutSystemFields<D>, options?: {
58
+ onFail?: OnFailCallback<D>;
59
+ }) => Promise<GenericId<TN>>;
60
+ patch: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D_1 extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: MutationCtxForSchema<SD>, tableName: TN, id: GenericId<TN>, data: HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
61
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
62
+ }), "protectedColumns"> extends true ? Omit<Partial<WithoutSystemFields<D_1>>, ProtectedKeysForTable<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
63
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
64
+ }), TN> & keyof WithoutSystemFields<D_1>> : Partial<WithoutSystemFields<D_1>>, options?: {
65
+ onFail?: OnFailCallback<D_1>;
66
+ }) => Promise<void>;
67
+ dangerouslyPatch: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D_2 extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: MutationCtxForSchema<SD>, tableName: TN, id: GenericId<TN>, data: Partial<WithoutSystemFields<D_2>>, options?: {
68
+ onFail?: OnFailCallback<D_2>;
69
+ }) => Promise<void>;
70
+ verify: { [K_1 in BuiltinConfigKey as HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
71
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
72
+ }), K_1> extends true ? K_1 : never]: VerifyFnForKey<SD, Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
73
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
74
+ }), K_1>; } extends infer T ? { [K in keyof T]: { [K_1 in BuiltinConfigKey as HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
75
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
76
+ }), K_1> extends true ? K_1 : never]: VerifyFnForKey<SD, Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
77
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
78
+ }), K_1>; }[K]; } : never;
79
+ config: { [K_3 in BuiltinConfigKey as HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
80
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
81
+ }), K_3> extends true ? K_3 : never]: K_3 extends Exclude<keyof VC, "defaultValues"> | keyof ([DV] extends [never] ? {} : {
82
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
83
+ }) ? (Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
84
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
85
+ }))[K_3] : never; } extends infer T_1 ? { [K_2 in keyof T_1]: { [K_3 in BuiltinConfigKey as HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
86
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
87
+ }), K_3> extends true ? K_3 : never]: K_3 extends Exclude<keyof VC, "defaultValues"> | keyof ([DV] extends [never] ? {} : {
88
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
89
+ }) ? (Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
90
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
91
+ }))[K_3] : never; }[K_2]; } : never;
92
+ };
93
+
94
+ export { type ExtensionContext as E, type SchemaExtension as S, type ExtensionInput as a, type ExtensionInputForSchema as b, createExtension as c, type Extension as d, type ExtensionRecord as e, isExtension as i, runExtensions as r, verifyConfig as v };
@@ -0,0 +1,94 @@
1
+ import { SchemaDefinition, GenericSchema, GenericMutationCtx, TableNamesInDataModel, DataModelFromSchemaDefinition, WithoutSystemFields, DocumentByName } from 'convex/server';
2
+ import { GenericId } from 'convex/values';
3
+ import { w as DMGeneric, b as OnFailCallback, V as VerifyConfigInput, x as ValidateDefaultValuesInput, y as ValidateVerifyConfig, a as MutationCtxForSchema, H as HasKey, M as MakeOptional, f as OptionalKeysForTable, h as ProtectedKeysForTable, B as BuiltinConfigKey, z as VerifyFnForKey } from './types-B8ZkLuJ2.mjs';
4
+
5
+ type MaybePromise<T> = T | Promise<T>;
6
+ type MutationCtx<DM extends DMGeneric = DMGeneric> = Omit<GenericMutationCtx<DM>, never>;
7
+ type InsertExtensionContext<TN extends string = string, DM extends DMGeneric = DMGeneric, S extends SchemaDefinition<GenericSchema, boolean> = SchemaDefinition<GenericSchema, boolean>> = {
8
+ ctx: MutationCtx<DM>;
9
+ tableName: TN;
10
+ operation: "insert";
11
+ onFail?: OnFailCallback<any>;
12
+ schema: S;
13
+ patchId?: undefined;
14
+ };
15
+ type PatchExtensionContext<TN extends string = string, DM extends DMGeneric = DMGeneric, S extends SchemaDefinition<GenericSchema, boolean> = SchemaDefinition<GenericSchema, boolean>> = {
16
+ ctx: MutationCtx<DM>;
17
+ tableName: TN;
18
+ operation: "patch";
19
+ patchId: GenericId<TN>;
20
+ onFail?: OnFailCallback<any>;
21
+ schema: S;
22
+ };
23
+ type ExtensionContext<TN extends string = string, DM extends DMGeneric = DMGeneric, S extends SchemaDefinition<GenericSchema, boolean> = SchemaDefinition<GenericSchema, boolean>> = InsertExtensionContext<TN, DM, S> | PatchExtensionContext<TN, DM, S>;
24
+ type ExtensionInput<TData = unknown, TContext = ExtensionContext> = TContext & {
25
+ data: TData;
26
+ };
27
+ type ExtensionInputBase = {
28
+ data: unknown;
29
+ };
30
+ type DataModelForSchema<S extends SchemaDefinition<GenericSchema, boolean>> = DataModelFromSchemaDefinition<S>;
31
+ type ExtensionInputForSchema<S extends SchemaDefinition<GenericSchema, boolean>> = {
32
+ [TN in TableNamesInDataModel<DataModelForSchema<S>>]: ExtensionInput<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>, InsertExtensionContext<TN, DataModelForSchema<S>, S>> | ExtensionInput<Partial<WithoutSystemFields<DocumentByName<DataModelForSchema<S>, TN>>>, PatchExtensionContext<TN, DataModelForSchema<S>, S>>;
33
+ }[TableNamesInDataModel<DataModelForSchema<S>>];
34
+ type ExtensionVerify<TInput extends ExtensionInputBase = ExtensionInput> = (input: TInput) => MaybePromise<TInput["data"]>;
35
+ type ExtensionRecord<TType extends string = string, TConfig = unknown, TInput extends ExtensionInputBase = ExtensionInput> = {
36
+ readonly _type: TType;
37
+ readonly config?: TConfig;
38
+ verify(input: TInput): MaybePromise<TInput["data"]>;
39
+ };
40
+ type Extension<TInput extends ExtensionInputBase = ExtensionInput> = ExtensionRecord<"extension", undefined, TInput>;
41
+ type SchemaExtension<S extends SchemaDefinition<GenericSchema, boolean>, TType extends string = string, TConfig = unknown> = ExtensionRecord<TType, TConfig, ExtensionInputForSchema<S>>;
42
+ declare function createExtension<const S extends SchemaDefinition<GenericSchema, boolean>>(verify: ExtensionVerify<ExtensionInputForSchema<S>>): Extension<ExtensionInputForSchema<S>>;
43
+ declare function createExtension<const S extends SchemaDefinition<GenericSchema, boolean>>(schema: S, verify: ExtensionVerify<ExtensionInputForSchema<S>>): Extension<ExtensionInputForSchema<S>>;
44
+ declare function createExtension(verify: ExtensionVerify): Extension;
45
+ declare function isExtension(value: unknown): value is ExtensionRecord;
46
+ declare function runExtensions<TExtensionInput extends ExtensionInputBase, TInput extends TExtensionInput>(extensions: readonly ExtensionRecord<string, unknown, TExtensionInput>[], input: TInput): Promise<TInput["data"]>;
47
+
48
+ declare const verifyConfig: <S extends GenericSchema, SD extends SchemaDefinition<S, boolean>, const VC extends VerifyConfigInput<SD> & {
49
+ extensions?: unknown;
50
+ }, const DV = never>(_schema: SD, configs: (Omit<VerifyConfigInput<SD>, "defaultValues"> & {
51
+ defaultValues?: ValidateDefaultValuesInput<SD, DV>;
52
+ }) & ValidateVerifyConfig<SD, VC> & VC) => {
53
+ insert: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: MutationCtxForSchema<SD>, tableName: TN, data: HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
54
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
55
+ }), "defaultValues"> extends true ? MakeOptional<WithoutSystemFields<D>, OptionalKeysForTable<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
56
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
57
+ }), TN> & keyof WithoutSystemFields<D>> : WithoutSystemFields<D>, options?: {
58
+ onFail?: OnFailCallback<D>;
59
+ }) => Promise<GenericId<TN>>;
60
+ patch: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D_1 extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: MutationCtxForSchema<SD>, tableName: TN, id: GenericId<TN>, data: HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
61
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
62
+ }), "protectedColumns"> extends true ? Omit<Partial<WithoutSystemFields<D_1>>, ProtectedKeysForTable<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
63
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
64
+ }), TN> & keyof WithoutSystemFields<D_1>> : Partial<WithoutSystemFields<D_1>>, options?: {
65
+ onFail?: OnFailCallback<D_1>;
66
+ }) => Promise<void>;
67
+ dangerouslyPatch: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D_2 extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: MutationCtxForSchema<SD>, tableName: TN, id: GenericId<TN>, data: Partial<WithoutSystemFields<D_2>>, options?: {
68
+ onFail?: OnFailCallback<D_2>;
69
+ }) => Promise<void>;
70
+ verify: { [K_1 in BuiltinConfigKey as HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
71
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
72
+ }), K_1> extends true ? K_1 : never]: VerifyFnForKey<SD, Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
73
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
74
+ }), K_1>; } extends infer T ? { [K in keyof T]: { [K_1 in BuiltinConfigKey as HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
75
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
76
+ }), K_1> extends true ? K_1 : never]: VerifyFnForKey<SD, Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
77
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
78
+ }), K_1>; }[K]; } : never;
79
+ config: { [K_3 in BuiltinConfigKey as HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
80
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
81
+ }), K_3> extends true ? K_3 : never]: K_3 extends Exclude<keyof VC, "defaultValues"> | keyof ([DV] extends [never] ? {} : {
82
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
83
+ }) ? (Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
84
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
85
+ }))[K_3] : never; } extends infer T_1 ? { [K_2 in keyof T_1]: { [K_3 in BuiltinConfigKey as HasKey<Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
86
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
87
+ }), K_3> extends true ? K_3 : never]: K_3 extends Exclude<keyof VC, "defaultValues"> | keyof ([DV] extends [never] ? {} : {
88
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
89
+ }) ? (Omit<VC, "defaultValues"> & ([DV] extends [never] ? {} : {
90
+ defaultValues: ValidateDefaultValuesInput<SD, DV>;
91
+ }))[K_3] : never; }[K_2]; } : never;
92
+ };
93
+
94
+ export { type ExtensionContext as E, type SchemaExtension as S, type ExtensionInput as a, type ExtensionInputForSchema as b, createExtension as c, type Extension as d, type ExtensionRecord as e, isExtension as i, runExtensions as r, verifyConfig as v };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convex-verify",
3
- "version": "1.1.0",
3
+ "version": "1.2.2",
4
4
  "description": "Type-safe verification and validation for Convex database operations",
5
5
  "packageManager": "pnpm@9.10.0",
6
6
  "main": "./dist/index.js",
@@ -17,21 +17,6 @@
17
17
  "import": "./dist/core/index.mjs",
18
18
  "require": "./dist/core/index.js"
19
19
  },
20
- "./transforms": {
21
- "types": "./dist/transforms/index.d.ts",
22
- "import": "./dist/transforms/index.mjs",
23
- "require": "./dist/transforms/index.js"
24
- },
25
- "./configs": {
26
- "types": "./dist/configs/index.d.ts",
27
- "import": "./dist/configs/index.mjs",
28
- "require": "./dist/configs/index.js"
29
- },
30
- "./plugins": {
31
- "types": "./dist/plugins/index.d.ts",
32
- "import": "./dist/plugins/index.mjs",
33
- "require": "./dist/plugins/index.js"
34
- },
35
20
  "./utils": {
36
21
  "types": "./dist/utils/index.d.ts",
37
22
  "import": "./dist/utils/index.mjs",
@@ -1,51 +0,0 @@
1
- import { SchemaDefinition, GenericSchema, DataModelFromSchemaDefinition, WithoutSystemFields } from 'convex/server';
2
- import { k as DMGeneric } from '../types-DvJMYubf.mjs';
3
-
4
- /**
5
- * Config data type for protected columns.
6
- * Maps table names to arrays of column names that should be protected from patching.
7
- */
8
- type ProtectedColumnsConfigData<DM extends DMGeneric> = {
9
- [K in keyof DM]?: (keyof WithoutSystemFields<DM[K]['document']>)[];
10
- };
11
- /**
12
- * Creates a protected columns config.
13
- *
14
- * Protected columns are removed from the patch() input type,
15
- * preventing accidental updates to critical fields like foreign keys.
16
- * Use dangerouslyPatch() to bypass this protection when needed.
17
- *
18
- * @param schema - Your Convex schema definition
19
- * @param config - Object mapping table names to arrays of protected column names
20
- * @returns Config object for use with verifyConfig
21
- *
22
- * @example
23
- * ```ts
24
- * const protectedColumns = protectedColumnsConfig(schema, {
25
- * posts: ['authorId', 'createdAt'],
26
- * comments: ['postId', 'authorId'],
27
- * });
28
- *
29
- * // In verifyConfig:
30
- * const { patch, dangerouslyPatch } = verifyConfig(schema, {
31
- * protectedColumns,
32
- * });
33
- *
34
- * // patch() won't allow authorId
35
- * await patch(ctx, 'posts', id, {
36
- * authorId: '...', // TS Error - property doesn't exist
37
- * title: 'new', // OK
38
- * });
39
- *
40
- * // dangerouslyPatch() allows all columns
41
- * await dangerouslyPatch(ctx, 'posts', id, {
42
- * authorId: '...', // OK - bypasses protection
43
- * });
44
- * ```
45
- */
46
- declare const protectedColumnsConfig: <S extends SchemaDefinition<GenericSchema, boolean>, DataModel extends DataModelFromSchemaDefinition<S>, const C extends ProtectedColumnsConfigData<DataModel>>(_schema: S, config: C) => {
47
- _type: "protectedColumns";
48
- config: C;
49
- };
50
-
51
- export { type ProtectedColumnsConfigData, protectedColumnsConfig };
@@ -1,51 +0,0 @@
1
- import { SchemaDefinition, GenericSchema, DataModelFromSchemaDefinition, WithoutSystemFields } from 'convex/server';
2
- import { k as DMGeneric } from '../types-DvJMYubf.js';
3
-
4
- /**
5
- * Config data type for protected columns.
6
- * Maps table names to arrays of column names that should be protected from patching.
7
- */
8
- type ProtectedColumnsConfigData<DM extends DMGeneric> = {
9
- [K in keyof DM]?: (keyof WithoutSystemFields<DM[K]['document']>)[];
10
- };
11
- /**
12
- * Creates a protected columns config.
13
- *
14
- * Protected columns are removed from the patch() input type,
15
- * preventing accidental updates to critical fields like foreign keys.
16
- * Use dangerouslyPatch() to bypass this protection when needed.
17
- *
18
- * @param schema - Your Convex schema definition
19
- * @param config - Object mapping table names to arrays of protected column names
20
- * @returns Config object for use with verifyConfig
21
- *
22
- * @example
23
- * ```ts
24
- * const protectedColumns = protectedColumnsConfig(schema, {
25
- * posts: ['authorId', 'createdAt'],
26
- * comments: ['postId', 'authorId'],
27
- * });
28
- *
29
- * // In verifyConfig:
30
- * const { patch, dangerouslyPatch } = verifyConfig(schema, {
31
- * protectedColumns,
32
- * });
33
- *
34
- * // patch() won't allow authorId
35
- * await patch(ctx, 'posts', id, {
36
- * authorId: '...', // TS Error - property doesn't exist
37
- * title: 'new', // OK
38
- * });
39
- *
40
- * // dangerouslyPatch() allows all columns
41
- * await dangerouslyPatch(ctx, 'posts', id, {
42
- * authorId: '...', // OK - bypasses protection
43
- * });
44
- * ```
45
- */
46
- declare const protectedColumnsConfig: <S extends SchemaDefinition<GenericSchema, boolean>, DataModel extends DataModelFromSchemaDefinition<S>, const C extends ProtectedColumnsConfigData<DataModel>>(_schema: S, config: C) => {
47
- _type: "protectedColumns";
48
- config: C;
49
- };
50
-
51
- export { type ProtectedColumnsConfigData, protectedColumnsConfig };
@@ -1,38 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/configs/index.ts
21
- var configs_exports = {};
22
- __export(configs_exports, {
23
- protectedColumnsConfig: () => protectedColumnsConfig
24
- });
25
- module.exports = __toCommonJS(configs_exports);
26
-
27
- // src/configs/protectedColumnsConfig.ts
28
- var protectedColumnsConfig = (_schema, config) => {
29
- return {
30
- _type: "protectedColumns",
31
- config
32
- };
33
- };
34
- // Annotate the CommonJS export names for ESM import in node:
35
- 0 && (module.exports = {
36
- protectedColumnsConfig
37
- });
38
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/configs/index.ts","../../src/configs/protectedColumnsConfig.ts"],"sourcesContent":["export { protectedColumnsConfig } from './protectedColumnsConfig';\nexport type { ProtectedColumnsConfigData } from './protectedColumnsConfig';\n","import {\n\tDataModelFromSchemaDefinition,\n\tGenericSchema,\n\tSchemaDefinition,\n\tWithoutSystemFields,\n} from 'convex/server';\n\nimport { DMGeneric } from '../core/types';\n\n/**\n * Config data type for protected columns.\n * Maps table names to arrays of column names that should be protected from patching.\n */\nexport type ProtectedColumnsConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: (keyof WithoutSystemFields<DM[K]['document']>)[];\n};\n\n/**\n * Creates a protected columns config.\n *\n * Protected columns are removed from the patch() input type,\n * preventing accidental updates to critical fields like foreign keys.\n * Use dangerouslyPatch() to bypass this protection when needed.\n *\n * @param schema - Your Convex schema definition\n * @param config - Object mapping table names to arrays of protected column names\n * @returns Config object for use with verifyConfig\n *\n * @example\n * ```ts\n * const protectedColumns = protectedColumnsConfig(schema, {\n * posts: ['authorId', 'createdAt'],\n * comments: ['postId', 'authorId'],\n * });\n *\n * // In verifyConfig:\n * const { patch, dangerouslyPatch } = verifyConfig(schema, {\n * protectedColumns,\n * });\n *\n * // patch() won't allow authorId\n * await patch(ctx, 'posts', id, {\n * authorId: '...', // TS Error - property doesn't exist\n * title: 'new', // OK\n * });\n *\n * // dangerouslyPatch() allows all columns\n * await dangerouslyPatch(ctx, 'posts', id, {\n * authorId: '...', // OK - bypasses protection\n * });\n * ```\n */\nexport const protectedColumnsConfig = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tconst C extends ProtectedColumnsConfigData<DataModel>,\n>(\n\t_schema: S,\n\tconfig: C\n) => {\n\treturn {\n\t\t_type: 'protectedColumns' as const,\n\t\tconfig,\n\t};\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACoDO,IAAM,yBAAyB,CAKrC,SACA,WACI;AACJ,SAAO;AAAA,IACN,OAAO;AAAA,IACP;AAAA,EACD;AACD;","names":[]}
@@ -1,11 +0,0 @@
1
- // src/configs/protectedColumnsConfig.ts
2
- var protectedColumnsConfig = (_schema, config) => {
3
- return {
4
- _type: "protectedColumns",
5
- config
6
- };
7
- };
8
- export {
9
- protectedColumnsConfig
10
- };
11
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/configs/protectedColumnsConfig.ts"],"sourcesContent":["import {\n\tDataModelFromSchemaDefinition,\n\tGenericSchema,\n\tSchemaDefinition,\n\tWithoutSystemFields,\n} from 'convex/server';\n\nimport { DMGeneric } from '../core/types';\n\n/**\n * Config data type for protected columns.\n * Maps table names to arrays of column names that should be protected from patching.\n */\nexport type ProtectedColumnsConfigData<DM extends DMGeneric> = {\n\t[K in keyof DM]?: (keyof WithoutSystemFields<DM[K]['document']>)[];\n};\n\n/**\n * Creates a protected columns config.\n *\n * Protected columns are removed from the patch() input type,\n * preventing accidental updates to critical fields like foreign keys.\n * Use dangerouslyPatch() to bypass this protection when needed.\n *\n * @param schema - Your Convex schema definition\n * @param config - Object mapping table names to arrays of protected column names\n * @returns Config object for use with verifyConfig\n *\n * @example\n * ```ts\n * const protectedColumns = protectedColumnsConfig(schema, {\n * posts: ['authorId', 'createdAt'],\n * comments: ['postId', 'authorId'],\n * });\n *\n * // In verifyConfig:\n * const { patch, dangerouslyPatch } = verifyConfig(schema, {\n * protectedColumns,\n * });\n *\n * // patch() won't allow authorId\n * await patch(ctx, 'posts', id, {\n * authorId: '...', // TS Error - property doesn't exist\n * title: 'new', // OK\n * });\n *\n * // dangerouslyPatch() allows all columns\n * await dangerouslyPatch(ctx, 'posts', id, {\n * authorId: '...', // OK - bypasses protection\n * });\n * ```\n */\nexport const protectedColumnsConfig = <\n\tS extends SchemaDefinition<GenericSchema, boolean>,\n\tDataModel extends DataModelFromSchemaDefinition<S>,\n\tconst C extends ProtectedColumnsConfigData<DataModel>,\n>(\n\t_schema: S,\n\tconfig: C\n) => {\n\treturn {\n\t\t_type: 'protectedColumns' as const,\n\t\tconfig,\n\t};\n};\n"],"mappings":";AAoDO,IAAM,yBAAyB,CAKrC,SACA,WACI;AACJ,SAAO;AAAA,IACN,OAAO;AAAA,IACP;AAAA,EACD;AACD;","names":[]}