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
package/README.md CHANGED
@@ -24,36 +24,30 @@ pnpm install convex-verify
24
24
  ## Quick Start
25
25
 
26
26
  ```ts
27
- import {
28
- defaultValuesConfig,
29
- protectedColumnsConfig,
30
- uniqueColumnConfig,
31
- uniqueRowConfig,
32
- verifyConfig,
33
- } from "convex-verify";
27
+ import { verifyConfig } from "convex-verify";
34
28
 
35
29
  import schema from "./schema";
36
30
 
37
- export const { insert, patch, dangerouslyPatch } = verifyConfig(schema, {
38
- defaultValues: defaultValuesConfig(schema, {
31
+ export const { insert, patch, dangerouslyPatch, verify, config } = verifyConfig(schema, {
32
+ defaultValues: {
39
33
  posts: { status: "draft", views: 0 },
40
- }),
34
+ },
41
35
 
42
- protectedColumns: protectedColumnsConfig(schema, {
36
+ protectedColumns: {
43
37
  posts: ["authorId"],
44
- }),
38
+ },
45
39
 
46
- uniqueRow: uniqueRowConfig(schema, {
40
+ uniqueRow: {
47
41
  posts: ["by_author_slug"],
48
- }),
42
+ },
49
43
 
50
- uniqueColumn: uniqueColumnConfig(schema, {
44
+ uniqueColumn: {
51
45
  users: ["by_email", "by_username"],
52
- }),
46
+ },
53
47
  });
54
48
  ```
55
49
 
56
- Then use in your mutations:
50
+ Use the returned helpers in mutations:
57
51
 
58
52
  ```ts
59
53
  import { insert, patch } from "./verify";
@@ -82,48 +76,68 @@ export const updatePost = mutation({
82
76
  });
83
77
  ```
84
78
 
79
+ And use the returned verifier surface directly when you need schema-aware built-in checks outside the insert/patch helpers:
80
+
81
+ ```ts
82
+ await verify.uniqueRow(ctx, "posts", {
83
+ title: "Hello",
84
+ slug: "hello",
85
+ authorId: "author-1",
86
+ });
87
+
88
+ config.uniqueRow.posts; // typed configured options
89
+ ```
90
+
85
91
  ---
86
92
 
87
93
  ## API Reference
88
94
 
89
95
  ### `verifyConfig(schema, config)`
90
96
 
91
- Main configuration function that returns typed `insert`, `patch`, and `dangerouslyPatch` functions.
97
+ Main configuration function. It accepts inline schema-aware config and returns typed mutation helpers plus a direct `verify` registry.
92
98
 
93
99
  ```ts
94
- const { insert, patch, dangerouslyPatch } = verifyConfig(schema, {
95
- defaultValues?: DefaultValuesConfig,
96
- protectedColumns?: ProtectedColumnsConfig,
97
- uniqueRow?: UniqueRowConfig,
98
- uniqueColumn?: UniqueColumnConfig,
100
+ const { insert, patch, dangerouslyPatch, verify, config } = verifyConfig(schema, {
101
+ defaultValues?: {
102
+ posts?: { status?: "draft"; views?: number };
103
+ } | (() => { ... } | Promise<{ ... }>),
104
+ protectedColumns?: {
105
+ posts?: ["authorId"];
106
+ },
107
+ uniqueRow?: {
108
+ posts?: ["by_author_slug"];
109
+ },
110
+ uniqueColumn?: {
111
+ users?: ["by_email", "by_username"];
112
+ },
99
113
  extensions?: Extension[],
100
114
  });
101
115
  ```
102
116
 
103
117
  #### Returns
104
118
 
105
- | Function | Description |
119
+ | Function/Value | Description |
106
120
  | ------------------ | ----------------------------------------------------------------------------------- |
107
121
  | `insert` | Insert with default values applied and extensions run |
108
122
  | `patch` | Patch with protected columns removed and extensions run |
109
123
  | `dangerouslyPatch` | Patch with full access to all columns (bypasses protected columns type restriction) |
124
+ | `verify` | Built-in verifier functions for configured features only |
125
+ | `config` | Passive typed snapshot of the built-in config that was passed in |
110
126
 
111
127
  ---
112
128
 
113
- ## `defaultValuesConfig`
114
-
115
- Makes specified fields optional in `insert()` by providing default values. The types update automatically - fields with defaults become optional.
129
+ ## `defaultValues`
116
130
 
117
- ```ts
118
- import { defaultValuesConfig } from "convex-verify";
119
- ```
131
+ Makes specified fields optional in `insert()` by providing default values. The types update automatically.
120
132
 
121
133
  ### Static Values
122
134
 
123
135
  ```ts
124
- const config = defaultValuesConfig(schema, {
136
+ const { insert } = verifyConfig(schema, {
137
+ defaultValues: {
125
138
  posts: { status: "draft", views: 0 },
126
139
  comments: { likes: 0 },
140
+ },
127
141
  });
128
142
  ```
129
143
 
@@ -132,41 +146,58 @@ const config = defaultValuesConfig(schema, {
132
146
  Use a function when values should be generated fresh on each insert:
133
147
 
134
148
  ```ts
135
- const config = defaultValuesConfig(schema, () => ({
136
- posts: {
137
- status: "draft",
138
- slug: generateRandomSlug(),
139
- createdAt: Date.now(),
140
- },
141
- }));
149
+ const { insert } = verifyConfig(schema, {
150
+ defaultValues: () => ({
151
+ posts: {
152
+ status: "draft",
153
+ slug: generateRandomSlug(),
154
+ createdAt: Date.now(),
155
+ },
156
+ }),
157
+ });
142
158
  ```
143
159
 
144
160
  ### Async Values
145
161
 
146
162
  ```ts
147
- const config = defaultValuesConfig(schema, async () => ({
148
- posts: {
149
- category: await fetchDefaultCategory(),
163
+ const { insert } = verifyConfig(schema, {
164
+ defaultValues: async () => ({
165
+ posts: {
166
+ category: await fetchDefaultCategory(),
167
+ },
168
+ }),
169
+ });
170
+ ```
171
+
172
+ ### Direct Verifier Calls
173
+
174
+ ```ts
175
+ const { verify } = verifyConfig(schema, {
176
+ defaultValues: {
177
+ users: { status: "pending" },
150
178
  },
151
- }));
179
+ });
180
+
181
+ const user = await verify.defaultValues("users", {
182
+ email: "alice@example.com",
183
+ username: "alice",
184
+ });
152
185
  ```
153
186
 
154
187
  ---
155
188
 
156
- ## `protectedColumnsConfig`
189
+ ## `protectedColumns`
157
190
 
158
191
  Removes specified columns from the `patch()` input type, preventing accidental updates to critical fields like `authorId` or `createdAt`.
159
192
 
160
- ```ts
161
- import { protectedColumnsConfig } from "convex-verify";
162
- ```
163
-
164
193
  ### Usage
165
194
 
166
195
  ```ts
167
- const config = protectedColumnsConfig(schema, {
168
- posts: ["authorId", "createdAt"],
169
- comments: ["postId", "authorId"],
196
+ const { patch, dangerouslyPatch } = verifyConfig(schema, {
197
+ protectedColumns: {
198
+ posts: ["authorId", "createdAt"],
199
+ comments: ["postId", "authorId"],
200
+ },
170
201
  });
171
202
  ```
172
203
 
@@ -192,33 +223,33 @@ await dangerouslyPatch(ctx, "posts", id, {
192
223
 
193
224
  ---
194
225
 
195
- ## `uniqueRowConfig`
226
+ ## `uniqueRow`
196
227
 
197
228
  Enforces uniqueness across multiple columns using composite indexes. Useful for things like "unique slug per author" or "unique name per organization".
198
229
 
199
- ```ts
200
- import { uniqueRowConfig } from "convex-verify";
201
- ```
202
-
203
230
  ### Usage
204
231
 
205
232
  ```ts
206
- const config = uniqueRowConfig(schema, {
207
- posts: ["by_author_slug"], // Unique author + slug combination
208
- projects: ["by_org_name"], // Unique org + name combination
233
+ const { verify } = verifyConfig(schema, {
234
+ uniqueRow: {
235
+ posts: ["by_author_slug"], // Unique author + slug combination
236
+ projects: ["by_org_name"], // Unique org + name combination
237
+ },
209
238
  });
210
239
  ```
211
240
 
212
241
  ### With Options
213
242
 
214
243
  ```ts
215
- const config = uniqueRowConfig(schema, {
216
- posts: [
217
- {
218
- index: "by_author_slug",
219
- identifiers: ["_id", "authorId"], // Fields that identify "same document"
220
- },
221
- ],
244
+ const { verify } = verifyConfig(schema, {
245
+ uniqueRow: {
246
+ posts: [
247
+ {
248
+ index: "by_author_slug",
249
+ identifiers: ["_id", "authorId"], // Fields that identify "same document"
250
+ },
251
+ ],
252
+ },
222
253
  });
223
254
  ```
224
255
 
@@ -226,20 +257,18 @@ The `identifiers` option controls which fields are checked when determining if a
226
257
 
227
258
  ---
228
259
 
229
- ## `uniqueColumnConfig`
260
+ ## `uniqueColumn`
230
261
 
231
262
  Enforces uniqueness on single columns using indexes. Useful for email addresses, usernames, slugs, etc.
232
263
 
233
- ```ts
234
- import { uniqueColumnConfig } from "convex-verify";
235
- ```
236
-
237
264
  ### Usage
238
265
 
239
266
  ```ts
240
- const config = uniqueColumnConfig(schema, {
241
- users: ["by_email", "by_username"],
242
- organizations: ["by_slug"],
267
+ const { verify } = verifyConfig(schema, {
268
+ uniqueColumn: {
269
+ users: ["by_email", "by_username"],
270
+ organizations: ["by_slug"],
271
+ },
243
272
  });
244
273
  ```
245
274
 
@@ -251,14 +280,43 @@ The column name is derived from the index name by removing the `by_` prefix:
251
280
  ### With Options
252
281
 
253
282
  ```ts
254
- const config = uniqueColumnConfig(schema, {
255
- users: [
256
- "by_username",
257
- { index: "by_email", identifiers: ["_id", "clerkId"] },
258
- ],
283
+ const { verify } = verifyConfig(schema, {
284
+ uniqueColumn: {
285
+ users: [
286
+ "by_username",
287
+ { index: "by_email", identifiers: ["_id", "clerkId"] },
288
+ ],
289
+ },
259
290
  });
260
291
  ```
261
292
 
293
+ ### Direct Verifier Calls
294
+
295
+ ```ts
296
+ await verify.uniqueColumn(ctx, "users", {
297
+ email: "alice@example.com",
298
+ });
299
+ ```
300
+
301
+ Patch checks use the document id:
302
+
303
+ ```ts
304
+ await verify.uniqueColumn(ctx, "users", userId, {
305
+ username: "alice",
306
+ });
307
+ ```
308
+
309
+ Direct uniqueness verifier calls may use partial data. Only configured unique fields present in the payload are checked.
310
+
311
+ ### Breaking Change
312
+
313
+ Version `2.0.0` removes the old helper-wrapper API:
314
+
315
+ - `defaultValuesConfig`
316
+ - `protectedColumnsConfig`
317
+ - `uniqueRowConfig`
318
+ - `uniqueColumnConfig`
319
+
262
320
  ---
263
321
 
264
322
  ## Custom Extensions
@@ -283,15 +341,25 @@ Custom extensions let you add your own validation and transformation logic that
283
341
  - `patch()` still strips protected columns at runtime; use `dangerouslyPatch()` if an extension must change them
284
342
  - Extension errors should use `ConvexError` for proper error handling on the client
285
343
 
344
+ ### Execution Order
345
+
346
+ Custom extensions always run before built-in uniqueness checks.
347
+
348
+ - `insert()`: `defaultValues` → custom `extensions` → `uniqueRow` → `uniqueColumn`
349
+ - `patch()`: protected-column strip → custom `extensions` → `uniqueRow` → `uniqueColumn` → protected-column strip again
350
+ - `dangerouslyPatch()`: custom `extensions` → `uniqueRow` → `uniqueColumn`
351
+
352
+ `defaultValues` and protected-column stripping are preprocessing steps, not entries in the custom `extensions` array.
353
+
286
354
  ### Creating an Extension
287
355
 
288
- Use `createExtension`. If you want schema-aware typing in the callback, pass your schema type as the generic:
356
+ Use `createExtension`. For schema-aware typing in the callback, pass the schema as the first argument:
289
357
 
290
358
  ```ts
291
359
  import { createExtension } from "convex-verify";
292
360
  import { ConvexError } from "convex/values";
293
361
 
294
- const normalizeEmail = createExtension<typeof schema>((input) => {
362
+ const normalizeEmail = createExtension(schema, (input) => {
295
363
  if (input.tableName !== "users") {
296
364
  return input.data;
297
365
  }
@@ -1,58 +1,17 @@
1
- import { GenericSchema, SchemaDefinition, TableNamesInDataModel, DataModelFromSchemaDefinition, DocumentByName, GenericMutationCtx, WithoutSystemFields } from 'convex/server';
2
- import { GenericId } from 'convex/values';
3
- import { S as SchemaExtension } from '../plugin-DlsboiCF.mjs';
4
- export { d as Extension, E as ExtensionContext, a as ExtensionInput, b as ExtensionInputForSchema, e as ExtensionRecord, c as createExtension, i as isExtension, r as runExtensions } from '../plugin-DlsboiCF.mjs';
5
- import { V as VerifyConfigInput, H as HasKey, M as MakeOptional, b as OptionalKeysForTable, a as OnFailCallback, d as ProtectedKeysForTable } from '../types-DvJMYubf.mjs';
6
- export { B as BaseConfigReturn, k as DMGeneric, D as DefaultValuesConfigData, l as DefaultValuesInput, E as ExtractDefaultValuesConfig, c as ExtractProtectedColumnsConfig, I as IndexConfigBaseOptions, j as IndexConfigEntry, N as NormalizedIndexConfig, O as OnFailArgs, P as Prettify, m as ProtectedColumnsInput, g as UniqueColumnConfigData, h as UniqueColumnConfigEntry, i as UniqueColumnConfigOptions, U as UniqueRowConfigData, e as UniqueRowConfigEntry, f as UniqueRowConfigOptions, n as normalizeIndexConfigEntry } from '../types-DvJMYubf.mjs';
1
+ import { c as createExtension$1, i as isExtension$1, r as runExtensions$1 } from '../verifyConfig-Kn3Ikj00.mjs';
2
+ export { d as Extension, E as ExtensionContext, a as ExtensionInput, b as ExtensionInputForSchema, e as ExtensionRecord, S as SchemaExtension, v as verifyConfig } from '../verifyConfig-Kn3Ikj00.mjs';
3
+ export { v as BaseConfigReturn, B as BuiltinConfigKey, C as ConfigRegistry, w as DMGeneric, D as DataModelForSchema, c as DefaultValuesConfigData, d as DefaultValuesConfigInput, k as DefaultValuesVerifyFn, m as ExtensionStyleVerifyFn, E as ExtractDefaultValuesConfig, g as ExtractProtectedColumnsConfig, H as HasKey, I as IndexConfigBaseOptions, u as IndexConfigEntry, M as MakeOptional, a as MutationCtxForSchema, N as NormalizedIndexConfig, O as OnFailArgs, b as OnFailCallback, f as OptionalKeysForTable, P as Prettify, e as ProtectedColumnsConfigData, l as ProtectedColumnsVerifyFn, h as ProtectedKeysForTable, q as UniqueColumnConfigData, r as UniqueColumnConfigEntry, s as UniqueColumnConfigOptions, U as UniqueRowConfigData, o as UniqueRowConfigEntry, p as UniqueRowConfigOptions, V as VerifyConfigInput, i as VerifyInsertInput, j as VerifyPatchInput, n as VerifyRegistry, t as normalizeIndexConfigEntry } from '../types-B8ZkLuJ2.mjs';
4
+ import 'convex/server';
5
+ import 'convex/values';
7
6
 
8
- /**
9
- * Extended config input that includes optional extensions.
10
- */
11
- type VerifyConfigInputWithExtensions<S extends SchemaDefinition<GenericSchema, boolean>> = VerifyConfigInput & {
12
- /**
13
- * Unique row validation config.
14
- * Enforces uniqueness across multiple columns using composite indexes.
15
- *
16
- * Can also be added to the `extensions` array.
17
- */
18
- uniqueRow?: SchemaExtension<S, "uniqueRow", any>;
19
- /**
20
- * Unique column validation config.
21
- * Enforces uniqueness on single columns using indexes.
22
- *
23
- * Can also be added to the `extensions` array.
24
- */
25
- uniqueColumn?: SchemaExtension<S, "uniqueColumn", any>;
26
- /**
27
- * Additional extensions to run after transform configs (defaultValues, etc.).
28
- * These extensions can validate data, transform/mutate it, or both.
29
- * Custom extensions run before built-in uniqueness extensions so the built-ins
30
- * validate the final transformed payload.
31
- * Extensions run in order; each receives the (possibly transformed) output of the previous.
32
- *
33
- * Built-in extensions (uniqueRow, uniqueColumn) can be added here
34
- * as an alternative to using their dedicated config keys when you need
35
- * explicit ordering.
36
- */
37
- extensions?: SchemaExtension<S>[];
38
- };
39
- /**
40
- * Configure type-safe insert and patch functions with validation and transforms.
41
- *
42
- * @param schema - Your Convex schema definition
43
- * @param configs - Configuration object with transforms, configs, and extensions
44
- * @returns Object with `insert`, `patch`, and `dangerouslyPatch` functions
45
- */
46
- declare const verifyConfig: <S extends GenericSchema, SD extends SchemaDefinition<S, boolean>, const VC extends VerifyConfigInputWithExtensions<SD>>(_schema: SD, configs: VC) => {
47
- insert: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: Omit<GenericMutationCtx<DataModelFromSchemaDefinition<SD>>, never>, tableName: TN, data: HasKey<VC, "defaultValues"> extends true ? MakeOptional<WithoutSystemFields<D>, OptionalKeysForTable<VC, TN> & keyof WithoutSystemFields<D>> : WithoutSystemFields<D>, options?: {
48
- onFail?: OnFailCallback<D>;
49
- }) => Promise<GenericId<TN>>;
50
- patch: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D_1 extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: Omit<GenericMutationCtx<DataModelFromSchemaDefinition<SD>>, never>, tableName: TN, id: GenericId<TN>, data: HasKey<VC, "protectedColumns"> extends true ? Omit<Partial<WithoutSystemFields<D_1>>, ProtectedKeysForTable<VC, TN> & keyof WithoutSystemFields<D_1>> : Partial<WithoutSystemFields<D_1>>, options?: {
51
- onFail?: OnFailCallback<D_1>;
52
- }) => Promise<void>;
53
- dangerouslyPatch: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D_2 extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: Omit<GenericMutationCtx<DataModelFromSchemaDefinition<SD>>, never>, tableName: TN, id: GenericId<TN>, data: Partial<WithoutSystemFields<D_2>>, options?: {
54
- onFail?: OnFailCallback<D_2>;
55
- }) => Promise<void>;
7
+ type ProtectedColumnsLike = Record<string, readonly PropertyKey[] | undefined>;
8
+ declare const stripProtectedPatchColumns: <T extends Record<string, any>>(protectedColumns: ProtectedColumnsLike, tableName: string, data: T) => {
9
+ filteredData: T;
10
+ removedColumns: string[];
56
11
  };
57
12
 
58
- export { HasKey, MakeOptional, OnFailCallback, OptionalKeysForTable, ProtectedKeysForTable, SchemaExtension, VerifyConfigInput, verifyConfig };
13
+ declare const createExtension: typeof createExtension$1;
14
+ declare const isExtension: typeof isExtension$1;
15
+ declare const runExtensions: typeof runExtensions$1;
16
+
17
+ export { createExtension, isExtension, runExtensions, stripProtectedPatchColumns };
@@ -1,58 +1,17 @@
1
- import { GenericSchema, SchemaDefinition, TableNamesInDataModel, DataModelFromSchemaDefinition, DocumentByName, GenericMutationCtx, WithoutSystemFields } from 'convex/server';
2
- import { GenericId } from 'convex/values';
3
- import { S as SchemaExtension } from '../plugin-BOb1Kw1A.js';
4
- export { d as Extension, E as ExtensionContext, a as ExtensionInput, b as ExtensionInputForSchema, e as ExtensionRecord, c as createExtension, i as isExtension, r as runExtensions } from '../plugin-BOb1Kw1A.js';
5
- import { V as VerifyConfigInput, H as HasKey, M as MakeOptional, b as OptionalKeysForTable, a as OnFailCallback, d as ProtectedKeysForTable } from '../types-DvJMYubf.js';
6
- export { B as BaseConfigReturn, k as DMGeneric, D as DefaultValuesConfigData, l as DefaultValuesInput, E as ExtractDefaultValuesConfig, c as ExtractProtectedColumnsConfig, I as IndexConfigBaseOptions, j as IndexConfigEntry, N as NormalizedIndexConfig, O as OnFailArgs, P as Prettify, m as ProtectedColumnsInput, g as UniqueColumnConfigData, h as UniqueColumnConfigEntry, i as UniqueColumnConfigOptions, U as UniqueRowConfigData, e as UniqueRowConfigEntry, f as UniqueRowConfigOptions, n as normalizeIndexConfigEntry } from '../types-DvJMYubf.js';
1
+ import { c as createExtension$1, i as isExtension$1, r as runExtensions$1 } from '../verifyConfig-CTrtqMr_.js';
2
+ export { d as Extension, E as ExtensionContext, a as ExtensionInput, b as ExtensionInputForSchema, e as ExtensionRecord, S as SchemaExtension, v as verifyConfig } from '../verifyConfig-CTrtqMr_.js';
3
+ export { v as BaseConfigReturn, B as BuiltinConfigKey, C as ConfigRegistry, w as DMGeneric, D as DataModelForSchema, c as DefaultValuesConfigData, d as DefaultValuesConfigInput, k as DefaultValuesVerifyFn, m as ExtensionStyleVerifyFn, E as ExtractDefaultValuesConfig, g as ExtractProtectedColumnsConfig, H as HasKey, I as IndexConfigBaseOptions, u as IndexConfigEntry, M as MakeOptional, a as MutationCtxForSchema, N as NormalizedIndexConfig, O as OnFailArgs, b as OnFailCallback, f as OptionalKeysForTable, P as Prettify, e as ProtectedColumnsConfigData, l as ProtectedColumnsVerifyFn, h as ProtectedKeysForTable, q as UniqueColumnConfigData, r as UniqueColumnConfigEntry, s as UniqueColumnConfigOptions, U as UniqueRowConfigData, o as UniqueRowConfigEntry, p as UniqueRowConfigOptions, V as VerifyConfigInput, i as VerifyInsertInput, j as VerifyPatchInput, n as VerifyRegistry, t as normalizeIndexConfigEntry } from '../types-B8ZkLuJ2.js';
4
+ import 'convex/server';
5
+ import 'convex/values';
7
6
 
8
- /**
9
- * Extended config input that includes optional extensions.
10
- */
11
- type VerifyConfigInputWithExtensions<S extends SchemaDefinition<GenericSchema, boolean>> = VerifyConfigInput & {
12
- /**
13
- * Unique row validation config.
14
- * Enforces uniqueness across multiple columns using composite indexes.
15
- *
16
- * Can also be added to the `extensions` array.
17
- */
18
- uniqueRow?: SchemaExtension<S, "uniqueRow", any>;
19
- /**
20
- * Unique column validation config.
21
- * Enforces uniqueness on single columns using indexes.
22
- *
23
- * Can also be added to the `extensions` array.
24
- */
25
- uniqueColumn?: SchemaExtension<S, "uniqueColumn", any>;
26
- /**
27
- * Additional extensions to run after transform configs (defaultValues, etc.).
28
- * These extensions can validate data, transform/mutate it, or both.
29
- * Custom extensions run before built-in uniqueness extensions so the built-ins
30
- * validate the final transformed payload.
31
- * Extensions run in order; each receives the (possibly transformed) output of the previous.
32
- *
33
- * Built-in extensions (uniqueRow, uniqueColumn) can be added here
34
- * as an alternative to using their dedicated config keys when you need
35
- * explicit ordering.
36
- */
37
- extensions?: SchemaExtension<S>[];
38
- };
39
- /**
40
- * Configure type-safe insert and patch functions with validation and transforms.
41
- *
42
- * @param schema - Your Convex schema definition
43
- * @param configs - Configuration object with transforms, configs, and extensions
44
- * @returns Object with `insert`, `patch`, and `dangerouslyPatch` functions
45
- */
46
- declare const verifyConfig: <S extends GenericSchema, SD extends SchemaDefinition<S, boolean>, const VC extends VerifyConfigInputWithExtensions<SD>>(_schema: SD, configs: VC) => {
47
- insert: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: Omit<GenericMutationCtx<DataModelFromSchemaDefinition<SD>>, never>, tableName: TN, data: HasKey<VC, "defaultValues"> extends true ? MakeOptional<WithoutSystemFields<D>, OptionalKeysForTable<VC, TN> & keyof WithoutSystemFields<D>> : WithoutSystemFields<D>, options?: {
48
- onFail?: OnFailCallback<D>;
49
- }) => Promise<GenericId<TN>>;
50
- patch: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D_1 extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: Omit<GenericMutationCtx<DataModelFromSchemaDefinition<SD>>, never>, tableName: TN, id: GenericId<TN>, data: HasKey<VC, "protectedColumns"> extends true ? Omit<Partial<WithoutSystemFields<D_1>>, ProtectedKeysForTable<VC, TN> & keyof WithoutSystemFields<D_1>> : Partial<WithoutSystemFields<D_1>>, options?: {
51
- onFail?: OnFailCallback<D_1>;
52
- }) => Promise<void>;
53
- dangerouslyPatch: <const TN extends TableNamesInDataModel<DataModelFromSchemaDefinition<SD>>, const D_2 extends DocumentByName<DataModelFromSchemaDefinition<SD>, TN>>(ctx: Omit<GenericMutationCtx<DataModelFromSchemaDefinition<SD>>, never>, tableName: TN, id: GenericId<TN>, data: Partial<WithoutSystemFields<D_2>>, options?: {
54
- onFail?: OnFailCallback<D_2>;
55
- }) => Promise<void>;
7
+ type ProtectedColumnsLike = Record<string, readonly PropertyKey[] | undefined>;
8
+ declare const stripProtectedPatchColumns: <T extends Record<string, any>>(protectedColumns: ProtectedColumnsLike, tableName: string, data: T) => {
9
+ filteredData: T;
10
+ removedColumns: string[];
56
11
  };
57
12
 
58
- export { HasKey, MakeOptional, OnFailCallback, OptionalKeysForTable, ProtectedKeysForTable, SchemaExtension, VerifyConfigInput, verifyConfig };
13
+ declare const createExtension: typeof createExtension$1;
14
+ declare const isExtension: typeof isExtension$1;
15
+ declare const runExtensions: typeof runExtensions$1;
16
+
17
+ export { createExtension, isExtension, runExtensions, stripProtectedPatchColumns };