@prisma-next/family-mongo 0.12.0-dev.17 → 0.12.0-dev.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.
@@ -1,5 +1,3 @@
1
- import type { ControlPolicy } from '@prisma-next/contract/types';
2
- import { effectiveControlPolicy } from '@prisma-next/contract/types';
3
1
  import type {
4
2
  SchemaIssue,
5
3
  SchemaVerifier,
@@ -7,8 +5,7 @@ import type {
7
5
  SchemaVerifyResult,
8
6
  } from '@prisma-next/framework-components/control';
9
7
  import type { Namespace } from '@prisma-next/framework-components/ir';
10
- import { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';
11
- import type { MongoCollection, MongoStorage } from '@prisma-next/mongo-contract';
8
+ import type { MongoStorage } from '@prisma-next/mongo-contract';
12
9
 
13
10
  /**
14
11
  * Mongo family `SchemaVerifier` abstract base. Commits the Mongo family
@@ -32,7 +29,7 @@ import type { MongoCollection, MongoStorage } from '@prisma-next/mongo-contract'
32
29
  * list when no extensions exist over the Mongo family alphabet.
33
30
  */
34
31
  export abstract class MongoSchemaVerifierBase<
35
- TContract extends { readonly storage: MongoStorage; readonly defaultControl?: ControlPolicy },
32
+ TContract extends { readonly storage: MongoStorage },
36
33
  TSchema,
37
34
  > implements SchemaVerifier<TContract, TSchema>
38
35
  {
@@ -43,22 +40,6 @@ export abstract class MongoSchemaVerifierBase<
43
40
  return { ok: issues.length === 0, issues };
44
41
  }
45
42
 
46
- protected effectiveCollectionControlPolicy(
47
- contract: TContract,
48
- collection: MongoCollection | undefined,
49
- ): ControlPolicy {
50
- return effectiveControlPolicy(collection?.control, contract.defaultControl);
51
- }
52
-
53
- protected collectionControlPolicyForName(
54
- contract: TContract,
55
- collectionName: string,
56
- ): ControlPolicy {
57
- const namespace = contract.storage.namespaces[UNBOUND_NAMESPACE_ID];
58
- const collection = namespace?.collections[collectionName];
59
- return this.effectiveCollectionControlPolicy(contract, collection);
60
- }
61
-
62
43
  protected verifyCommonMongoSchema(
63
44
  options: SchemaVerifyOptions<TContract, TSchema>,
64
45
  ): readonly SchemaIssue[] {
@@ -1,4 +1,3 @@
1
- import type { ControlPolicy } from '@prisma-next/contract/types';
2
1
  import type {
3
2
  SchemaIssue,
4
3
  SchemaVerificationNode,
@@ -10,13 +9,11 @@ import type {
10
9
  MongoSchemaIR,
11
10
  } from '@prisma-next/mongo-schema-ir';
12
11
  import { canonicalize, deepEqual } from '@prisma-next/mongo-schema-ir';
13
- import { emitMongoIssueAndNodeUnderControlPolicy } from './schema-verify/mongo-control-verify-emit';
14
12
 
15
13
  export function diffMongoSchemas(
16
14
  live: MongoSchemaIR,
17
15
  expected: MongoSchemaIR,
18
16
  strict: boolean,
19
- collectionControlPolicy: (collectionName: string) => ControlPolicy,
20
17
  ): {
21
18
  root: SchemaVerificationNode;
22
19
  issues: SchemaIssue[];
@@ -35,70 +32,54 @@ export function diffMongoSchemas(
35
32
  const expectedColl = expected.collection(name);
36
33
 
37
34
  if (!liveColl && expectedColl) {
38
- const controlPolicy = collectionControlPolicy(name);
39
- const issue: SchemaIssue = {
35
+ issues.push({
40
36
  kind: 'missing_table',
41
37
  table: name,
42
38
  message: `Collection "${name}" is missing from the database`,
43
- };
44
- const disposition = emitMongoIssueAndNodeUnderControlPolicy(
45
- controlPolicy,
46
- issue,
47
- {
48
- status: 'fail',
49
- kind: 'collection',
50
- name,
51
- contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${name}`,
52
- code: 'MISSING_COLLECTION',
53
- message: `Collection "${name}" is missing`,
54
- expected: name,
55
- actual: null,
56
- children: [],
57
- },
58
- issues,
59
- collectionChildren,
60
- );
61
- if (disposition === 'fail') fail++;
62
- else if (disposition === 'warn') warn++;
39
+ });
40
+ collectionChildren.push({
41
+ status: 'fail',
42
+ kind: 'collection',
43
+ name,
44
+ contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${name}`,
45
+ code: 'MISSING_COLLECTION',
46
+ message: `Collection "${name}" is missing`,
47
+ expected: name,
48
+ actual: null,
49
+ children: [],
50
+ });
51
+ fail++;
63
52
  continue;
64
53
  }
65
54
 
66
55
  if (liveColl && !expectedColl) {
67
- const controlPolicy = collectionControlPolicy(name);
68
- const issue: SchemaIssue = {
56
+ const status = strict ? 'fail' : 'warn';
57
+ issues.push({
69
58
  kind: 'extra_table',
70
59
  table: name,
71
60
  message: `Extra collection "${name}" exists in the database but not in the contract`,
72
- };
73
- const baseStatus = strict ? 'fail' : 'warn';
74
- const disposition = emitMongoIssueAndNodeUnderControlPolicy(
75
- controlPolicy,
76
- issue,
77
- {
78
- status: baseStatus,
79
- kind: 'collection',
80
- name,
81
- contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${name}`,
82
- code: 'EXTRA_COLLECTION',
83
- message: `Extra collection "${name}" found`,
84
- expected: null,
85
- actual: name,
86
- children: [],
87
- },
88
- issues,
89
- collectionChildren,
90
- );
91
- if (disposition === 'fail') fail++;
92
- else if (disposition === 'warn') warn++;
61
+ });
62
+ collectionChildren.push({
63
+ status,
64
+ kind: 'collection',
65
+ name,
66
+ contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${name}`,
67
+ code: 'EXTRA_COLLECTION',
68
+ message: `Extra collection "${name}" found`,
69
+ expected: null,
70
+ actual: name,
71
+ children: [],
72
+ });
73
+ if (status === 'fail') fail++;
74
+ else warn++;
93
75
  continue;
94
76
  }
95
77
 
96
78
  const lc = liveColl as MongoSchemaCollection;
97
79
  const ec = expectedColl as MongoSchemaCollection;
98
- const controlPolicy = collectionControlPolicy(name);
99
- const indexChildren = diffIndexes(name, lc, ec, strict, controlPolicy, issues);
100
- const validatorChildren = diffValidator(name, lc, ec, strict, controlPolicy, issues);
101
- const optionsChildren = diffOptions(name, lc, ec, strict, controlPolicy, issues);
80
+ const indexChildren = diffIndexes(name, lc, ec, strict, issues);
81
+ const validatorChildren = diffValidator(name, lc, ec, strict, issues);
82
+ const optionsChildren = diffOptions(name, lc, ec, strict, issues);
102
83
  const children = [...indexChildren, ...validatorChildren, ...optionsChildren];
103
84
 
104
85
  const worstStatus = children.reduce<'pass' | 'warn' | 'fail'>(
@@ -175,7 +156,6 @@ function diffIndexes(
175
156
  live: MongoSchemaCollection,
176
157
  expected: MongoSchemaCollection,
177
158
  strict: boolean,
178
- collectionControlPolicy: ControlPolicy,
179
159
  issues: SchemaIssue[],
180
160
  ): SchemaVerificationNode[] {
181
161
  const nodes: SchemaVerificationNode[] = [];
@@ -199,58 +179,46 @@ function diffIndexes(
199
179
  children: [],
200
180
  });
201
181
  } else {
202
- const issue: SchemaIssue = {
182
+ issues.push({
203
183
  kind: 'index_mismatch',
204
184
  table: collName,
205
185
  indexOrConstraint: formatIndexName(idx),
206
186
  message: `Index ${formatIndexName(idx)} missing on collection "${collName}"`,
207
- };
208
- emitMongoIssueAndNodeUnderControlPolicy(
209
- collectionControlPolicy,
210
- issue,
211
- {
212
- status: 'fail',
213
- kind: 'index',
214
- name: formatIndexName(idx),
215
- contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.indexes`,
216
- code: 'MISSING_INDEX',
217
- message: `Index ${formatIndexName(idx)} missing`,
218
- expected: key,
219
- actual: null,
220
- children: [],
221
- },
222
- issues,
223
- nodes,
224
- );
187
+ });
188
+ nodes.push({
189
+ status: 'fail',
190
+ kind: 'index',
191
+ name: formatIndexName(idx),
192
+ contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.indexes`,
193
+ code: 'MISSING_INDEX',
194
+ message: `Index ${formatIndexName(idx)} missing`,
195
+ expected: key,
196
+ actual: null,
197
+ children: [],
198
+ });
225
199
  }
226
200
  }
227
201
 
228
202
  for (const [key, idx] of liveLookup) {
229
203
  if (!expectedLookup.has(key)) {
230
- const issue: SchemaIssue = {
204
+ const status = strict ? 'fail' : 'warn';
205
+ issues.push({
231
206
  kind: 'extra_index',
232
207
  table: collName,
233
208
  indexOrConstraint: formatIndexName(idx),
234
209
  message: `Extra index ${formatIndexName(idx)} on collection "${collName}"`,
235
- };
236
- const baseStatus = strict ? 'fail' : 'warn';
237
- emitMongoIssueAndNodeUnderControlPolicy(
238
- collectionControlPolicy,
239
- issue,
240
- {
241
- status: baseStatus,
242
- kind: 'index',
243
- name: formatIndexName(idx),
244
- contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.indexes`,
245
- code: 'EXTRA_INDEX',
246
- message: `Extra index ${formatIndexName(idx)}`,
247
- expected: null,
248
- actual: key,
249
- children: [],
250
- },
251
- issues,
252
- nodes,
253
- );
210
+ });
211
+ nodes.push({
212
+ status,
213
+ kind: 'index',
214
+ name: formatIndexName(idx),
215
+ contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.indexes`,
216
+ code: 'EXTRA_INDEX',
217
+ message: `Extra index ${formatIndexName(idx)}`,
218
+ expected: null,
219
+ actual: key,
220
+ children: [],
221
+ });
254
222
  }
255
223
  }
256
224
 
@@ -262,21 +230,17 @@ function diffValidator(
262
230
  live: MongoSchemaCollection,
263
231
  expected: MongoSchemaCollection,
264
232
  strict: boolean,
265
- collectionControlPolicy: ControlPolicy,
266
233
  issues: SchemaIssue[],
267
234
  ): SchemaVerificationNode[] {
268
235
  if (!live.validator && !expected.validator) return [];
269
236
 
270
237
  if (expected.validator && !live.validator) {
271
- const issue: SchemaIssue = {
238
+ issues.push({
272
239
  kind: 'type_missing',
273
240
  table: collName,
274
241
  message: `Validator missing on collection "${collName}"`,
275
- };
276
- const nodes: SchemaVerificationNode[] = [];
277
- emitMongoIssueAndNodeUnderControlPolicy(
278
- collectionControlPolicy,
279
- issue,
242
+ });
243
+ return [
280
244
  {
281
245
  status: 'fail',
282
246
  kind: 'validator',
@@ -288,25 +252,19 @@ function diffValidator(
288
252
  actual: null,
289
253
  children: [],
290
254
  },
291
- issues,
292
- nodes,
293
- );
294
- return nodes;
255
+ ];
295
256
  }
296
257
 
297
258
  if (!expected.validator && live.validator) {
298
- const issue: SchemaIssue = {
259
+ const status = strict ? 'fail' : 'warn';
260
+ issues.push({
299
261
  kind: 'extra_validator',
300
262
  table: collName,
301
263
  message: `Extra validator on collection "${collName}"`,
302
- };
303
- const nodes: SchemaVerificationNode[] = [];
304
- const baseStatus = strict ? 'fail' : 'warn';
305
- emitMongoIssueAndNodeUnderControlPolicy(
306
- collectionControlPolicy,
307
- issue,
264
+ });
265
+ return [
308
266
  {
309
- status: baseStatus,
267
+ status,
310
268
  kind: 'validator',
311
269
  name: 'validator',
312
270
  contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.validator`,
@@ -316,10 +274,7 @@ function diffValidator(
316
274
  actual: canonicalize(live.validator.jsonSchema),
317
275
  children: [],
318
276
  },
319
- issues,
320
- nodes,
321
- );
322
- return nodes;
277
+ ];
323
278
  }
324
279
 
325
280
  const liveVal = live.validator as NonNullable<typeof live.validator>;
@@ -332,17 +287,14 @@ function diffValidator(
332
287
  liveVal.validationLevel !== expectedVal.validationLevel ||
333
288
  liveVal.validationAction !== expectedVal.validationAction
334
289
  ) {
335
- const issue: SchemaIssue = {
290
+ issues.push({
336
291
  kind: 'type_mismatch',
337
292
  table: collName,
338
293
  expected: expectedSchema,
339
294
  actual: liveSchema,
340
295
  message: `Validator mismatch on collection "${collName}"`,
341
- };
342
- const nodes: SchemaVerificationNode[] = [];
343
- emitMongoIssueAndNodeUnderControlPolicy(
344
- collectionControlPolicy,
345
- issue,
296
+ });
297
+ return [
346
298
  {
347
299
  status: 'fail',
348
300
  kind: 'validator',
@@ -362,10 +314,7 @@ function diffValidator(
362
314
  },
363
315
  children: [],
364
316
  },
365
- issues,
366
- nodes,
367
- );
368
- return nodes;
317
+ ];
369
318
  }
370
319
 
371
320
  return [
@@ -388,25 +337,21 @@ function diffOptions(
388
337
  live: MongoSchemaCollection,
389
338
  expected: MongoSchemaCollection,
390
339
  strict: boolean,
391
- collectionControlPolicy: ControlPolicy,
392
340
  issues: SchemaIssue[],
393
341
  ): SchemaVerificationNode[] {
394
342
  if (!live.options && !expected.options) return [];
395
343
 
396
344
  if (!expected.options && live.options) {
397
- const issue: SchemaIssue = {
345
+ const status = strict ? 'fail' : 'warn';
346
+ issues.push({
398
347
  kind: 'type_mismatch',
399
348
  table: collName,
400
349
  actual: canonicalize(live.options),
401
350
  message: `Extra collection options on "${collName}"`,
402
- };
403
- const nodes: SchemaVerificationNode[] = [];
404
- const baseStatus = strict ? 'fail' : 'warn';
405
- emitMongoIssueAndNodeUnderControlPolicy(
406
- collectionControlPolicy,
407
- issue,
351
+ });
352
+ return [
408
353
  {
409
- status: baseStatus,
354
+ status,
410
355
  kind: 'options',
411
356
  name: 'options',
412
357
  contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.options`,
@@ -416,10 +361,7 @@ function diffOptions(
416
361
  actual: live.options,
417
362
  children: [],
418
363
  },
419
- issues,
420
- nodes,
421
- );
422
- return nodes;
364
+ ];
423
365
  }
424
366
 
425
367
  if (deepEqual(live.options, expected.options)) {
@@ -438,17 +380,14 @@ function diffOptions(
438
380
  ];
439
381
  }
440
382
 
441
- const issue: SchemaIssue = {
383
+ issues.push({
442
384
  kind: 'type_mismatch',
443
385
  table: collName,
444
386
  expected: canonicalize(expected.options),
445
387
  actual: canonicalize(live.options),
446
388
  message: `Collection options mismatch on "${collName}"`,
447
- };
448
- const nodes: SchemaVerificationNode[] = [];
449
- emitMongoIssueAndNodeUnderControlPolicy(
450
- collectionControlPolicy,
451
- issue,
389
+ });
390
+ return [
452
391
  {
453
392
  status: 'fail',
454
393
  kind: 'options',
@@ -460,8 +399,5 @@ function diffOptions(
460
399
  actual: live.options,
461
400
  children: [],
462
401
  },
463
- issues,
464
- nodes,
465
- );
466
- return nodes;
402
+ ];
467
403
  }
@@ -1,12 +1,10 @@
1
- import { type ControlPolicy, effectiveControlPolicy } from '@prisma-next/contract/types';
2
1
  import type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';
3
2
  import type {
4
3
  OperationContext,
5
4
  VerifyDatabaseSchemaResult,
6
5
  } from '@prisma-next/framework-components/control';
7
6
  import { VERIFY_CODE_SCHEMA_FAILURE } from '@prisma-next/framework-components/control';
8
- import { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';
9
- import type { MongoCollection, MongoContract } from '@prisma-next/mongo-contract';
7
+ import type { MongoContract } from '@prisma-next/mongo-contract';
10
8
  import type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';
11
9
  import { ifDefined } from '@prisma-next/utils/defined';
12
10
  import { contractToMongoSchemaIR } from '../contract-to-schema';
@@ -37,13 +35,7 @@ export function verifyMongoSchema(options: VerifyMongoSchemaOptions): VerifyData
37
35
  schema,
38
36
  expectedIR,
39
37
  );
40
- const collectionControlPolicy = resolveMongoCollectionControlPolicy(contract);
41
- const { root, issues, counts } = diffMongoSchemas(
42
- canonicalLive,
43
- canonicalExpected,
44
- strict,
45
- collectionControlPolicy,
46
- );
38
+ const { root, issues, counts } = diffMongoSchemas(canonicalLive, canonicalExpected, strict);
47
39
 
48
40
  const ok = counts.fail === 0;
49
41
  const profileHash = typeof contract.profileHash === 'string' ? contract.profileHash : '';
@@ -66,13 +58,3 @@ export function verifyMongoSchema(options: VerifyMongoSchemaOptions): VerifyData
66
58
  timings: { total: Date.now() - startTime },
67
59
  };
68
60
  }
69
-
70
- function resolveMongoCollectionControlPolicy(
71
- contract: MongoContract,
72
- ): (collectionName: string) => ControlPolicy {
73
- const namespace = contract.storage.namespaces[UNBOUND_NAMESPACE_ID];
74
- const collections: Record<string, MongoCollection> = namespace?.collections ?? {};
75
- const defaultControl = contract.defaultControl;
76
- return (collectionName: string) =>
77
- effectiveControlPolicy(collections[collectionName]?.control, defaultControl);
78
- }
@@ -1,2 +0,0 @@
1
- import { defaultMongoDomainNamespaceId, defaultMongoStorageNamespaceId } from "@prisma-next/mongo-contract";
2
- export { defaultMongoDomainNamespaceId, defaultMongoStorageNamespaceId };
package/dist/runtime.mjs DELETED
@@ -1,2 +0,0 @@
1
- import { defaultMongoDomainNamespaceId, defaultMongoStorageNamespaceId } from "@prisma-next/mongo-contract";
2
- export { defaultMongoDomainNamespaceId, defaultMongoStorageNamespaceId };
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify-mongo-schema-BXJqoE59.mjs","names":["MongoSchemaIRCtor","MongoSchemaCollectionCtor","MongoSchemaIndexCtor","MongoSchemaCollectionOptionsCtor"],"sources":["../src/core/contract-to-schema.ts","../src/core/schema-verify/verifier-disposition.ts","../src/core/schema-verify/mongo-control-verify-emit.ts","../src/core/schema-diff.ts","../src/core/schema-verify/canonicalize-introspection.ts","../src/core/schema-verify/verify-mongo-schema.ts"],"sourcesContent":["import type {\n MongoCollection,\n MongoCollectionOptions,\n MongoContract,\n MongoIndex,\n MongoValidator,\n} from '@prisma-next/mongo-contract';\nimport {\n MongoSchemaCollection,\n MongoSchemaCollectionOptions,\n MongoSchemaIndex,\n MongoSchemaIR,\n MongoSchemaValidator,\n} from '@prisma-next/mongo-schema-ir';\n\nfunction stripIrKind(node: object): Record<string, unknown> {\n const { kind: _kind, ...rest } = node as Record<string, unknown>;\n return rest;\n}\n\nfunction convertIndex(index: MongoIndex): MongoSchemaIndex {\n return new MongoSchemaIndex({\n keys: index.keys,\n unique: index.unique,\n sparse: index.sparse,\n expireAfterSeconds: index.expireAfterSeconds,\n partialFilterExpression: index.partialFilterExpression,\n wildcardProjection: index.wildcardProjection,\n collation: index.collation,\n weights: index.weights,\n default_language: index.default_language,\n language_override: index.language_override,\n });\n}\n\nfunction convertValidator(v: MongoValidator): MongoSchemaValidator {\n return new MongoSchemaValidator({\n jsonSchema: v.jsonSchema,\n validationLevel: v.validationLevel,\n validationAction: v.validationAction,\n });\n}\n\nfunction convertOptions(o: MongoCollectionOptions): MongoSchemaCollectionOptions {\n return new MongoSchemaCollectionOptions({\n ...(o.capped !== undefined && { capped: o.capped }),\n ...(o.timeseries !== undefined && {\n timeseries: {\n timeField: o.timeseries.timeField,\n ...(o.timeseries.metaField !== undefined && { metaField: o.timeseries.metaField }),\n ...(o.timeseries.granularity !== undefined && { granularity: o.timeseries.granularity }),\n },\n }),\n ...(o.collation !== undefined && {\n collation: stripIrKind(o.collation),\n }),\n ...(o.changeStreamPreAndPostImages !== undefined && {\n changeStreamPreAndPostImages: { enabled: o.changeStreamPreAndPostImages.enabled },\n }),\n ...(o.clusteredIndex !== undefined && { clusteredIndex: o.clusteredIndex }),\n });\n}\n\nfunction convertCollection(name: string, def: MongoCollection): MongoSchemaCollection {\n const indexes = (def.indexes ?? []).map(convertIndex);\n return new MongoSchemaCollection({\n name,\n indexes,\n ...(def.validator != null && { validator: convertValidator(def.validator) }),\n ...(def.options != null && { options: convertOptions(def.options) }),\n });\n}\n\nexport function contractToMongoSchemaIR(contract: MongoContract | null): MongoSchemaIR {\n if (!contract) {\n return new MongoSchemaIR([]);\n }\n\n const collections: MongoSchemaCollection[] = [];\n for (const ns of Object.values(contract.storage.namespaces)) {\n for (const [name, def] of Object.entries(ns.collections)) {\n collections.push(convertCollection(name, def));\n }\n }\n\n return new MongoSchemaIR(collections);\n}\n","import type { ControlPolicy } from '@prisma-next/contract/types';\nimport type {\n SchemaIssue,\n VerifierIssueCategory,\n VerifierOutcome,\n} from '@prisma-next/framework-components/control';\nimport { dispositionForCategory } from '@prisma-next/framework-components/control';\n\n/**\n * Classifies the verifier issue kinds the Mongo schema differ emits into the\n * target-neutral categories the framework grades. Mongo only emits the kinds\n * listed below (missing/extra collections, missing/extra indexes, missing/extra\n * validators, and validator/options mismatches coded as `type_mismatch`); any\n * other kind never reaches this classifier and is graded conservatively as a\n * declared-incompatible divergence. Mongo owns this mapping rather than\n * importing the SQL classifier — the two families share only the framework's\n * category grading.\n */\nexport function classifyMongoVerifierIssueKind(kind: SchemaIssue['kind']): VerifierIssueCategory {\n switch (kind) {\n case 'extra_table':\n return 'extraTopLevelObject';\n case 'extra_index':\n case 'extra_validator':\n return 'extraAuxiliary';\n case 'missing_table':\n case 'type_missing':\n return 'declaredMissing';\n case 'index_mismatch':\n case 'type_mismatch':\n return 'declaredIncompatible';\n default:\n return 'declaredIncompatible';\n }\n}\n\nexport function verifierDisposition(\n controlPolicy: ControlPolicy,\n issueKind: SchemaIssue['kind'],\n): VerifierOutcome {\n return dispositionForCategory(controlPolicy, classifyMongoVerifierIssueKind(issueKind));\n}\n","import type { ControlPolicy } from '@prisma-next/contract/types';\nimport type {\n SchemaIssue,\n SchemaVerificationNode,\n VerifierOutcome,\n} from '@prisma-next/framework-components/control';\nimport { verifierDisposition } from './verifier-disposition';\n\n/**\n * Reconciles a control-policy disposition with the Mongo family's strict-mode\n * contract for live-only extras — the single point where `strict` and the\n * control policy meet.\n *\n * The control policy decides first; only a `fail` is reconciled against the\n * caller's base node status. Call sites stamp a live-only extra with\n * `strict ? 'fail' : 'warn'` and a declared missing/mismatch with `fail`, so\n * this one step encodes the whole matrix:\n *\n * | live-vs-declared | strict | non-strict |\n * |-------------------------------------|----------|------------|\n * | declared missing / mismatch | fail | fail |\n * | live-only extra (managed/tolerated) | fail | warn |\n * | live-only extra (external) | suppress (extras ignored, both modes) |\n * | anything (observed) | warn (both modes) |\n *\n * `tolerated` no longer diverges from `managed` on a non-strict extra index:\n * both soften to `warn`, because the softening comes from the base status the\n * caller already computed from `strict`, not from per-policy special-casing.\n */\nfunction reconcileMongoOutcome(\n controlPolicy: ControlPolicy,\n issueKind: SchemaIssue['kind'],\n baseStatus: SchemaVerificationNode['status'],\n): VerifierOutcome {\n const disposition = verifierDisposition(controlPolicy, issueKind);\n return disposition === 'fail' ? baseStatus : disposition;\n}\n\nexport function emitMongoIssueAndNodeUnderControlPolicy(\n controlPolicy: ControlPolicy,\n issue: SchemaIssue,\n node: SchemaVerificationNode,\n issues: SchemaIssue[],\n nodes: SchemaVerificationNode[],\n): VerifierOutcome {\n const outcome = reconcileMongoOutcome(controlPolicy, issue.kind, node.status);\n if (outcome === 'suppress') {\n return 'suppress';\n }\n issues.push(issue);\n nodes.push({ ...node, status: outcome });\n return outcome;\n}\n","import type { ControlPolicy } from '@prisma-next/contract/types';\nimport type {\n SchemaIssue,\n SchemaVerificationNode,\n} from '@prisma-next/framework-components/control';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport type {\n MongoSchemaCollection,\n MongoSchemaIndex,\n MongoSchemaIR,\n} from '@prisma-next/mongo-schema-ir';\nimport { canonicalize, deepEqual } from '@prisma-next/mongo-schema-ir';\nimport { emitMongoIssueAndNodeUnderControlPolicy } from './schema-verify/mongo-control-verify-emit';\n\nexport function diffMongoSchemas(\n live: MongoSchemaIR,\n expected: MongoSchemaIR,\n strict: boolean,\n collectionControlPolicy: (collectionName: string) => ControlPolicy,\n): {\n root: SchemaVerificationNode;\n issues: SchemaIssue[];\n counts: { pass: number; warn: number; fail: number; totalNodes: number };\n} {\n const issues: SchemaIssue[] = [];\n const collectionChildren: SchemaVerificationNode[] = [];\n let pass = 0;\n let warn = 0;\n let fail = 0;\n\n const allNames = new Set([...live.collectionNames, ...expected.collectionNames]);\n\n for (const name of [...allNames].sort()) {\n const liveColl = live.collection(name);\n const expectedColl = expected.collection(name);\n\n if (!liveColl && expectedColl) {\n const controlPolicy = collectionControlPolicy(name);\n const issue: SchemaIssue = {\n kind: 'missing_table',\n table: name,\n message: `Collection \"${name}\" is missing from the database`,\n };\n const disposition = emitMongoIssueAndNodeUnderControlPolicy(\n controlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'collection',\n name,\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${name}`,\n code: 'MISSING_COLLECTION',\n message: `Collection \"${name}\" is missing`,\n expected: name,\n actual: null,\n children: [],\n },\n issues,\n collectionChildren,\n );\n if (disposition === 'fail') fail++;\n else if (disposition === 'warn') warn++;\n continue;\n }\n\n if (liveColl && !expectedColl) {\n const controlPolicy = collectionControlPolicy(name);\n const issue: SchemaIssue = {\n kind: 'extra_table',\n table: name,\n message: `Extra collection \"${name}\" exists in the database but not in the contract`,\n };\n const baseStatus = strict ? 'fail' : 'warn';\n const disposition = emitMongoIssueAndNodeUnderControlPolicy(\n controlPolicy,\n issue,\n {\n status: baseStatus,\n kind: 'collection',\n name,\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${name}`,\n code: 'EXTRA_COLLECTION',\n message: `Extra collection \"${name}\" found`,\n expected: null,\n actual: name,\n children: [],\n },\n issues,\n collectionChildren,\n );\n if (disposition === 'fail') fail++;\n else if (disposition === 'warn') warn++;\n continue;\n }\n\n const lc = liveColl as MongoSchemaCollection;\n const ec = expectedColl as MongoSchemaCollection;\n const controlPolicy = collectionControlPolicy(name);\n const indexChildren = diffIndexes(name, lc, ec, strict, controlPolicy, issues);\n const validatorChildren = diffValidator(name, lc, ec, strict, controlPolicy, issues);\n const optionsChildren = diffOptions(name, lc, ec, strict, controlPolicy, issues);\n const children = [...indexChildren, ...validatorChildren, ...optionsChildren];\n\n const worstStatus = children.reduce<'pass' | 'warn' | 'fail'>(\n (s, c) => (c.status === 'fail' ? 'fail' : c.status === 'warn' && s !== 'fail' ? 'warn' : s),\n 'pass',\n );\n\n for (const c of children) {\n if (c.status === 'pass') pass++;\n else if (c.status === 'warn') warn++;\n else fail++;\n }\n\n if (children.length === 0) {\n pass++;\n }\n\n collectionChildren.push({\n status: worstStatus,\n kind: 'collection',\n name,\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${name}`,\n code: worstStatus === 'pass' ? 'MATCH' : 'DRIFT',\n message:\n worstStatus === 'pass' ? `Collection \"${name}\" matches` : `Collection \"${name}\" has drift`,\n expected: name,\n actual: name,\n children,\n });\n }\n\n const rootStatus = fail > 0 ? 'fail' : warn > 0 ? 'warn' : 'pass';\n const totalNodes = pass + warn + fail + collectionChildren.length;\n\n const root: SchemaVerificationNode = {\n status: rootStatus,\n kind: 'root',\n name: 'mongo-schema',\n contractPath: 'storage',\n code: rootStatus === 'pass' ? 'MATCH' : 'DRIFT',\n message: rootStatus === 'pass' ? 'Schema matches' : 'Schema has drift',\n expected: null,\n actual: null,\n children: collectionChildren,\n };\n\n return { root, issues, counts: { pass, warn, fail, totalNodes } };\n}\n\nfunction buildIndexLookupKey(index: MongoSchemaIndex): string {\n const keys = index.keys.map((k) => `${k.field}:${k.direction}`).join(',');\n const opts = [\n index.unique ? 'unique' : '',\n index.sparse ? 'sparse' : '',\n index.expireAfterSeconds != null ? `ttl:${index.expireAfterSeconds}` : '',\n index.partialFilterExpression ? `pfe:${canonicalize(index.partialFilterExpression)}` : '',\n index.wildcardProjection ? `wp:${canonicalize(index.wildcardProjection)}` : '',\n index.collation ? `col:${canonicalize(index.collation)}` : '',\n index.weights ? `wt:${canonicalize(index.weights)}` : '',\n index.default_language ? `dl:${index.default_language}` : '',\n index.language_override ? `lo:${index.language_override}` : '',\n ]\n .filter(Boolean)\n .join(';');\n return opts ? `${keys}|${opts}` : keys;\n}\n\nfunction formatIndexName(index: MongoSchemaIndex): string {\n return index.keys.map((k) => `${k.field}:${k.direction}`).join(', ');\n}\n\nfunction diffIndexes(\n collName: string,\n live: MongoSchemaCollection,\n expected: MongoSchemaCollection,\n strict: boolean,\n collectionControlPolicy: ControlPolicy,\n issues: SchemaIssue[],\n): SchemaVerificationNode[] {\n const nodes: SchemaVerificationNode[] = [];\n const liveLookup = new Map<string, MongoSchemaIndex>();\n for (const idx of live.indexes) liveLookup.set(buildIndexLookupKey(idx), idx);\n\n const expectedLookup = new Map<string, MongoSchemaIndex>();\n for (const idx of expected.indexes) expectedLookup.set(buildIndexLookupKey(idx), idx);\n\n for (const [key, idx] of expectedLookup) {\n if (liveLookup.has(key)) {\n nodes.push({\n status: 'pass',\n kind: 'index',\n name: formatIndexName(idx),\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.indexes`,\n code: 'MATCH',\n message: `Index ${formatIndexName(idx)} matches`,\n expected: key,\n actual: key,\n children: [],\n });\n } else {\n const issue: SchemaIssue = {\n kind: 'index_mismatch',\n table: collName,\n indexOrConstraint: formatIndexName(idx),\n message: `Index ${formatIndexName(idx)} missing on collection \"${collName}\"`,\n };\n emitMongoIssueAndNodeUnderControlPolicy(\n collectionControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'index',\n name: formatIndexName(idx),\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.indexes`,\n code: 'MISSING_INDEX',\n message: `Index ${formatIndexName(idx)} missing`,\n expected: key,\n actual: null,\n children: [],\n },\n issues,\n nodes,\n );\n }\n }\n\n for (const [key, idx] of liveLookup) {\n if (!expectedLookup.has(key)) {\n const issue: SchemaIssue = {\n kind: 'extra_index',\n table: collName,\n indexOrConstraint: formatIndexName(idx),\n message: `Extra index ${formatIndexName(idx)} on collection \"${collName}\"`,\n };\n const baseStatus = strict ? 'fail' : 'warn';\n emitMongoIssueAndNodeUnderControlPolicy(\n collectionControlPolicy,\n issue,\n {\n status: baseStatus,\n kind: 'index',\n name: formatIndexName(idx),\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.indexes`,\n code: 'EXTRA_INDEX',\n message: `Extra index ${formatIndexName(idx)}`,\n expected: null,\n actual: key,\n children: [],\n },\n issues,\n nodes,\n );\n }\n }\n\n return nodes;\n}\n\nfunction diffValidator(\n collName: string,\n live: MongoSchemaCollection,\n expected: MongoSchemaCollection,\n strict: boolean,\n collectionControlPolicy: ControlPolicy,\n issues: SchemaIssue[],\n): SchemaVerificationNode[] {\n if (!live.validator && !expected.validator) return [];\n\n if (expected.validator && !live.validator) {\n const issue: SchemaIssue = {\n kind: 'type_missing',\n table: collName,\n message: `Validator missing on collection \"${collName}\"`,\n };\n const nodes: SchemaVerificationNode[] = [];\n emitMongoIssueAndNodeUnderControlPolicy(\n collectionControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'validator',\n name: 'validator',\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.validator`,\n code: 'MISSING_VALIDATOR',\n message: 'Validator missing',\n expected: canonicalize(expected.validator.jsonSchema),\n actual: null,\n children: [],\n },\n issues,\n nodes,\n );\n return nodes;\n }\n\n if (!expected.validator && live.validator) {\n const issue: SchemaIssue = {\n kind: 'extra_validator',\n table: collName,\n message: `Extra validator on collection \"${collName}\"`,\n };\n const nodes: SchemaVerificationNode[] = [];\n const baseStatus = strict ? 'fail' : 'warn';\n emitMongoIssueAndNodeUnderControlPolicy(\n collectionControlPolicy,\n issue,\n {\n status: baseStatus,\n kind: 'validator',\n name: 'validator',\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.validator`,\n code: 'EXTRA_VALIDATOR',\n message: 'Extra validator found',\n expected: null,\n actual: canonicalize(live.validator.jsonSchema),\n children: [],\n },\n issues,\n nodes,\n );\n return nodes;\n }\n\n const liveVal = live.validator as NonNullable<typeof live.validator>;\n const expectedVal = expected.validator as NonNullable<typeof expected.validator>;\n const liveSchema = canonicalize(liveVal.jsonSchema);\n const expectedSchema = canonicalize(expectedVal.jsonSchema);\n\n if (\n liveSchema !== expectedSchema ||\n liveVal.validationLevel !== expectedVal.validationLevel ||\n liveVal.validationAction !== expectedVal.validationAction\n ) {\n const issue: SchemaIssue = {\n kind: 'type_mismatch',\n table: collName,\n expected: expectedSchema,\n actual: liveSchema,\n message: `Validator mismatch on collection \"${collName}\"`,\n };\n const nodes: SchemaVerificationNode[] = [];\n emitMongoIssueAndNodeUnderControlPolicy(\n collectionControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'validator',\n name: 'validator',\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.validator`,\n code: 'VALIDATOR_MISMATCH',\n message: 'Validator mismatch',\n expected: {\n jsonSchema: expectedVal.jsonSchema,\n validationLevel: expectedVal.validationLevel,\n validationAction: expectedVal.validationAction,\n },\n actual: {\n jsonSchema: liveVal.jsonSchema,\n validationLevel: liveVal.validationLevel,\n validationAction: liveVal.validationAction,\n },\n children: [],\n },\n issues,\n nodes,\n );\n return nodes;\n }\n\n return [\n {\n status: 'pass',\n kind: 'validator',\n name: 'validator',\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.validator`,\n code: 'MATCH',\n message: 'Validator matches',\n expected: expectedSchema,\n actual: liveSchema,\n children: [],\n },\n ];\n}\n\nfunction diffOptions(\n collName: string,\n live: MongoSchemaCollection,\n expected: MongoSchemaCollection,\n strict: boolean,\n collectionControlPolicy: ControlPolicy,\n issues: SchemaIssue[],\n): SchemaVerificationNode[] {\n if (!live.options && !expected.options) return [];\n\n if (!expected.options && live.options) {\n const issue: SchemaIssue = {\n kind: 'type_mismatch',\n table: collName,\n actual: canonicalize(live.options),\n message: `Extra collection options on \"${collName}\"`,\n };\n const nodes: SchemaVerificationNode[] = [];\n const baseStatus = strict ? 'fail' : 'warn';\n emitMongoIssueAndNodeUnderControlPolicy(\n collectionControlPolicy,\n issue,\n {\n status: baseStatus,\n kind: 'options',\n name: 'options',\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.options`,\n code: 'EXTRA_OPTIONS',\n message: 'Extra collection options found',\n expected: null,\n actual: live.options,\n children: [],\n },\n issues,\n nodes,\n );\n return nodes;\n }\n\n if (deepEqual(live.options, expected.options)) {\n return [\n {\n status: 'pass',\n kind: 'options',\n name: 'options',\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.options`,\n code: 'MATCH',\n message: 'Collection options match',\n expected: canonicalize(expected.options),\n actual: canonicalize(live.options),\n children: [],\n },\n ];\n }\n\n const issue: SchemaIssue = {\n kind: 'type_mismatch',\n table: collName,\n expected: canonicalize(expected.options),\n actual: canonicalize(live.options),\n message: `Collection options mismatch on \"${collName}\"`,\n };\n const nodes: SchemaVerificationNode[] = [];\n emitMongoIssueAndNodeUnderControlPolicy(\n collectionControlPolicy,\n issue,\n {\n status: 'fail',\n kind: 'options',\n name: 'options',\n contractPath: `storage.namespaces.${UNBOUND_NAMESPACE_ID}.collections.${collName}.options`,\n code: 'OPTIONS_MISMATCH',\n message: 'Collection options mismatch',\n expected: expected.options,\n actual: live.options,\n children: [],\n },\n issues,\n nodes,\n );\n return nodes;\n}\n","/**\n * Canonicalizes a live (introspected) `MongoSchemaIR` against the expected\n * (contract-built) IR before diffing. MongoDB applies server-side defaults\n * to several option/index families that are absent from authored contracts,\n * which would otherwise cause `verifyMongoSchema` to report false-positive\n * drift on a fresh `migrate` run.\n *\n * The normalization is contract-aware where it has to be: server defaults\n * are stripped from the live IR for fields the contract did not specify, so\n * a contract that *does* specify a value still gets compared faithfully.\n *\n * Symmetric defaults — like `changeStreamPreAndPostImages: { enabled: false }`,\n * which is equivalent to \"absent\" on both sides — are stripped from both IRs\n * so either authoring style verifies.\n */\n\nimport type {\n MongoSchemaCollection,\n MongoSchemaCollectionOptions,\n MongoSchemaIndex,\n MongoSchemaIR,\n} from '@prisma-next/mongo-schema-ir';\nimport {\n MongoSchemaCollection as MongoSchemaCollectionCtor,\n MongoSchemaCollectionOptions as MongoSchemaCollectionOptionsCtor,\n MongoSchemaIndex as MongoSchemaIndexCtor,\n MongoSchemaIR as MongoSchemaIRCtor,\n} from '@prisma-next/mongo-schema-ir';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nexport interface CanonicalizedSchemas {\n readonly live: MongoSchemaIR;\n readonly expected: MongoSchemaIR;\n}\n\nexport function canonicalizeSchemasForVerification(\n live: MongoSchemaIR,\n expected: MongoSchemaIR,\n): CanonicalizedSchemas {\n const expectedByName = new Map<string, MongoSchemaCollection>();\n for (const c of expected.collections) expectedByName.set(c.name, c);\n\n const liveByName = new Map<string, MongoSchemaCollection>();\n for (const c of live.collections) liveByName.set(c.name, c);\n\n const canonicalLive = live.collections.map((c) =>\n canonicalizeLiveCollection(c, expectedByName.get(c.name)),\n );\n const canonicalExpected = expected.collections.map((c) =>\n canonicalizeExpectedCollection(c, liveByName.get(c.name)),\n );\n\n return {\n live: new MongoSchemaIRCtor(canonicalLive),\n expected: new MongoSchemaIRCtor(canonicalExpected),\n };\n}\n\nfunction canonicalizeLiveCollection(\n liveColl: MongoSchemaCollection,\n expectedColl: MongoSchemaCollection | undefined,\n): MongoSchemaCollection {\n const expectedIndexes = expectedColl?.indexes ?? [];\n const indexes = liveColl.indexes.map((idx) =>\n canonicalizeLiveIndex(idx, findExpectedIndexCounterpart(idx, expectedIndexes)),\n );\n\n const options = liveColl.options\n ? canonicalizeLiveOptions(liveColl.options, expectedColl?.options)\n : undefined;\n\n return new MongoSchemaCollectionCtor({\n name: liveColl.name,\n indexes,\n ...ifDefined('validator', liveColl.validator),\n ...ifDefined('options', options),\n });\n}\n\nfunction canonicalizeExpectedCollection(\n expectedColl: MongoSchemaCollection,\n liveColl: MongoSchemaCollection | undefined,\n): MongoSchemaCollection {\n // Symmetric text-index key ordering: a contract-shaped text index preserves\n // the user-authored field order, but the introspected counterpart comes\n // back from MongoDB with `weights` keys in alphabetical order, so we\n // canonicalize both sides to alphabetical text-key order. The order of\n // text fields within the text block is semantically irrelevant — relevance\n // is governed by `weights`, not key order.\n const indexes = expectedColl.indexes.map(canonicalizeTextIndexKeyOrder);\n\n const options = expectedColl.options\n ? canonicalizeExpectedOptions(expectedColl.options, liveColl?.options)\n : undefined;\n\n return new MongoSchemaCollectionCtor({\n name: expectedColl.name,\n indexes,\n ...ifDefined('validator', expectedColl.validator),\n ...ifDefined('options', options),\n });\n}\n\nfunction canonicalizeTextIndexKeyOrder(index: MongoSchemaIndex): MongoSchemaIndex {\n const hasTextKey = index.keys.some((k) => k.direction === 'text');\n if (!hasTextKey) return index;\n return new MongoSchemaIndexCtor({\n keys: sortTextKeys(index.keys),\n unique: index.unique,\n ...ifDefined('sparse', index.sparse),\n ...ifDefined('expireAfterSeconds', index.expireAfterSeconds),\n ...ifDefined('partialFilterExpression', index.partialFilterExpression),\n ...ifDefined('wildcardProjection', index.wildcardProjection),\n ...ifDefined('collation', index.collation),\n ...ifDefined('weights', index.weights),\n ...ifDefined('default_language', index.default_language),\n ...ifDefined('language_override', index.language_override),\n });\n}\n\n/**\n * Returns a copy of `keys` with text-direction entries sorted alphabetically\n * while preserving the relative position of non-text entries. Compound text\n * indexes (`{a: 1, _fts: 'text', _ftsx: 1, b: 1}`) keep their scalar\n * prefix/suffix layout; only the contiguous text block is reordered.\n */\nfunction sortTextKeys(\n keys: ReadonlyArray<{\n readonly field: string;\n readonly direction: 'text' | 1 | -1 | '2dsphere' | '2d' | 'hashed';\n }>,\n): ReadonlyArray<{\n readonly field: string;\n readonly direction: 'text' | 1 | -1 | '2dsphere' | '2d' | 'hashed';\n}> {\n const textEntries = keys.filter((k) => k.direction === 'text');\n if (textEntries.length <= 1) return keys;\n const sortedText = [...textEntries].sort((a, b) => a.field.localeCompare(b.field));\n let textIdx = 0;\n return keys.map((k) => {\n if (k.direction !== 'text') return k;\n const next = sortedText[textIdx++];\n /* v8 ignore next 3 -- @preserve invariant guard: textIdx is always < sortedText.length here because we only consume sortedText for text-direction entries and sortedText is built from the same filter. */\n if (next === undefined) {\n throw new Error('sortTextKeys: text-key counts mismatched');\n }\n return next;\n });\n}\n\nfunction canonicalizeLiveIndex(\n liveIndex: MongoSchemaIndex,\n expectedIndex: MongoSchemaIndex | undefined,\n): MongoSchemaIndex {\n const projectedKeys = sortTextKeys(projectTextIndexKeys(liveIndex));\n const collation = liveIndex.collation\n ? stripUnspecifiedFields(liveIndex.collation, expectedIndex?.collation)\n : liveIndex.collation;\n\n // Text-index server defaults: when the contract did not set\n // `weights`/`default_language`/`language_override`, MongoDB applies\n // `weights = {<field>: 1, ...}` (uniform), `'english'`, and `'language'`\n // respectively. Strip them from live *only* when the live value matches\n // those defaults — preserving non-default live values lets the verifier\n // surface drift when the live index is tampered (e.g. weights tuned\n // out-of-band, custom `default_language`/`language_override`) even though\n // the contract authored neither.\n const weights =\n expectedIndex?.weights === undefined && hasDefaultTextWeights(projectedKeys, liveIndex.weights)\n ? undefined\n : liveIndex.weights;\n const default_language =\n expectedIndex?.default_language === undefined && liveIndex.default_language === 'english'\n ? undefined\n : liveIndex.default_language;\n const language_override =\n expectedIndex?.language_override === undefined && liveIndex.language_override === 'language'\n ? undefined\n : liveIndex.language_override;\n\n return new MongoSchemaIndexCtor({\n keys: projectedKeys,\n unique: liveIndex.unique,\n ...ifDefined('sparse', liveIndex.sparse),\n ...ifDefined('expireAfterSeconds', liveIndex.expireAfterSeconds),\n ...ifDefined('partialFilterExpression', liveIndex.partialFilterExpression),\n ...ifDefined('wildcardProjection', liveIndex.wildcardProjection),\n ...ifDefined('collation', collation),\n ...ifDefined('weights', weights),\n ...ifDefined('default_language', default_language),\n ...ifDefined('language_override', language_override),\n });\n}\n\n/**\n * Locate the contract-side index that corresponds to a live index for the\n * purpose of contract-aware normalization. We deliberately match by the\n * *projected* (contract-shaped) key list — so a live `_fts/_ftsx` index\n * resolves to a contract `{title: 'text', body: 'text'}` index — and pick\n * the first match. Contracts very rarely contain duplicate-key indexes; if\n * we have no counterpart we fall back to no normalization for that index.\n */\nfunction findExpectedIndexCounterpart(\n liveIndex: MongoSchemaIndex,\n expectedIndexes: ReadonlyArray<MongoSchemaIndex>,\n): MongoSchemaIndex | undefined {\n const projectedLiveKeys = sortTextKeys(projectTextIndexKeys(liveIndex));\n const liveKeySig = projectedLiveKeys.map((k) => `${k.field}:${k.direction}`).join(',');\n for (const expected of expectedIndexes) {\n const expectedKeySig = sortTextKeys(expected.keys)\n .map((k) => `${k.field}:${k.direction}`)\n .join(',');\n if (expectedKeySig === liveKeySig) return expected;\n }\n return undefined;\n}\n\n/**\n * MongoDB expands a contract-shaped text index like\n * `[{title: 'text'}, {body: 'text'}]` into its internal weighted vector\n * representation `[{_fts: 'text'}, {_ftsx: 1}]`. We project back to\n * contract-shaped keys via `weights`, iterating in whatever order MongoDB\n * returns them (alphabetical, in practice). `sortTextKeys` is applied\n * downstream to canonicalize the order on both sides, so this projection\n * does not depend on a specific iteration order.\n */\nfunction projectTextIndexKeys(liveIndex: MongoSchemaIndex): ReadonlyArray<{\n readonly field: string;\n readonly direction: 'text' | 1 | -1 | '2dsphere' | '2d' | 'hashed';\n}> {\n const isTextIndex =\n liveIndex.keys.length >= 1 &&\n liveIndex.keys.some((k) => k.field === '_fts' && k.direction === 'text');\n\n if (!isTextIndex || !liveIndex.weights) return liveIndex.keys;\n\n const textKeys = Object.keys(liveIndex.weights).map((field) => ({\n field,\n direction: 'text' as const,\n }));\n\n // Splice the projected text fields into the original `_fts/_ftsx` slot so\n // compound text indexes that mix scalar prefixes *and* suffixes — e.g.\n // `[prefix, _fts, _ftsx, suffix]` — keep their original layout. Flattening\n // scalars first would yield `[prefix, suffix, ...text]`, which `sortTextKeys`\n // (downstream) cannot recover because it only reorders text-direction\n // entries within their existing positions. MongoDB always emits exactly one\n // `_fts`/`_ftsx` pair per index, so we don't need to guard against\n // duplicates.\n type IndexKey = (typeof liveIndex.keys)[number];\n const projectedKeys: IndexKey[] = [];\n for (const key of liveIndex.keys) {\n if (key.field === '_ftsx') continue;\n if (key.field === '_fts') {\n projectedKeys.push(...textKeys);\n continue;\n }\n projectedKeys.push(key);\n }\n return projectedKeys;\n}\n\n/**\n * MongoDB's server-default `weights` for an authored-without-weights text\n * index assigns `1` to every text-direction field. Returns `true` only when\n * `liveWeights` is exactly that uniform shape (every projected text-direction\n * key weighted at `1`) so the canonicalizer leaves non-default weights —\n * including out-of-band relevance tweaks — visible to the verifier.\n *\n * `projectTextIndexKeys` derives text-direction keys from the live weights\n * map, so the count is guaranteed to match; we only have to check the value\n * shape.\n */\nfunction hasDefaultTextWeights(\n projectedKeys: ReadonlyArray<{\n readonly field: string;\n readonly direction: 'text' | 1 | -1 | '2dsphere' | '2d' | 'hashed';\n }>,\n liveWeights: MongoSchemaIndex['weights'],\n): boolean {\n if (liveWeights === undefined) return false;\n const textFields = projectedKeys.filter((k) => k.direction === 'text').map((k) => k.field);\n return textFields.every((field) => liveWeights[field] === 1);\n}\n\nfunction canonicalizeLiveOptions(\n liveOptions: MongoSchemaCollectionOptions,\n expectedOptions: MongoSchemaCollectionOptions | undefined,\n): MongoSchemaCollectionOptions | undefined {\n const collation = liveOptions.collation\n ? stripUnspecifiedFields(liveOptions.collation, expectedOptions?.collation)\n : undefined;\n\n // Timeseries: drop `bucketMaxSpanSeconds` (and any other server-applied\n // extras) when the contract did not specify them.\n const timeseries = liveOptions.timeseries\n ? (stripUnspecifiedFields(\n liveOptions.timeseries as Record<string, unknown>,\n expectedOptions?.timeseries as Record<string, unknown> | undefined,\n ) as MongoSchemaCollectionOptions['timeseries'])\n : undefined;\n\n // ClusteredIndex: drop `key`, `unique`, `v` and any other server-applied\n // extras when the contract did not specify them.\n const clusteredIndex = liveOptions.clusteredIndex\n ? (stripUnspecifiedFields(\n liveOptions.clusteredIndex as Record<string, unknown>,\n expectedOptions?.clusteredIndex as Record<string, unknown> | undefined,\n ) as MongoSchemaCollectionOptions['clusteredIndex'])\n : undefined;\n\n // changeStreamPreAndPostImages: `{enabled: false}` is equivalent to\n // \"absent\". Strip it from live so it round-trips with a contract that\n // omits the field, and is symmetric with the expected-side stripping.\n const changeStreamPreAndPostImages = isDisabledChangeStream(\n liveOptions.changeStreamPreAndPostImages,\n )\n ? undefined\n : liveOptions.changeStreamPreAndPostImages;\n\n const hasMeaningful =\n liveOptions.capped || timeseries || collation || changeStreamPreAndPostImages || clusteredIndex;\n if (!hasMeaningful) return undefined;\n\n return new MongoSchemaCollectionOptionsCtor({\n ...ifDefined('capped', liveOptions.capped),\n ...ifDefined('timeseries', timeseries),\n ...ifDefined('collation', collation),\n ...ifDefined('changeStreamPreAndPostImages', changeStreamPreAndPostImages),\n ...ifDefined('clusteredIndex', clusteredIndex),\n });\n}\n\nfunction canonicalizeExpectedOptions(\n expectedOptions: MongoSchemaCollectionOptions,\n _liveOptions: MongoSchemaCollectionOptions | undefined,\n): MongoSchemaCollectionOptions | undefined {\n // Symmetric: a contract `{enabled: false}` is equivalent to absent.\n const changeStreamPreAndPostImages = isDisabledChangeStream(\n expectedOptions.changeStreamPreAndPostImages,\n )\n ? undefined\n : expectedOptions.changeStreamPreAndPostImages;\n\n const hasMeaningful =\n expectedOptions.capped ||\n expectedOptions.timeseries ||\n expectedOptions.collation ||\n changeStreamPreAndPostImages ||\n expectedOptions.clusteredIndex;\n if (!hasMeaningful) return undefined;\n\n return new MongoSchemaCollectionOptionsCtor({\n ...ifDefined('capped', expectedOptions.capped),\n ...ifDefined('timeseries', expectedOptions.timeseries),\n ...ifDefined('collation', expectedOptions.collation),\n ...ifDefined('changeStreamPreAndPostImages', changeStreamPreAndPostImages),\n ...ifDefined('clusteredIndex', expectedOptions.clusteredIndex),\n });\n}\n\nfunction isDisabledChangeStream(value: { enabled: boolean } | undefined): boolean {\n return value !== undefined && value.enabled === false;\n}\n\n/**\n * Returns a copy of `live` containing only the keys that `expected` defines.\n * Used for option families whose individual sub-fields are server-extended\n * with platform defaults (collation, timeseries, clusteredIndex), so the\n * verifier should compare only what the contract actually authored.\n *\n * When `expected` is `undefined` — i.e. the contract authored nothing for\n * this whole option family but the live IR has it — we return `live`\n * unchanged so the verifier still sees the entire live block and can\n * surface it as drift. (Returning `undefined` here would silently strip a\n * server-attached collation/timeseries/clusteredIndex that the contract\n * never asked for, hiding real drift.)\n */\nfunction stripUnspecifiedFields(\n live: Record<string, unknown>,\n expected: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (expected === undefined) return live;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(expected)) {\n if (Object.hasOwn(live, key)) out[key] = live[key];\n }\n return out;\n}\n","import { type ControlPolicy, effectiveControlPolicy } from '@prisma-next/contract/types';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type {\n OperationContext,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport { VERIFY_CODE_SCHEMA_FAILURE } from '@prisma-next/framework-components/control';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport type { MongoCollection, MongoContract } from '@prisma-next/mongo-contract';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { contractToMongoSchemaIR } from '../contract-to-schema';\nimport { diffMongoSchemas } from '../schema-diff';\nimport { canonicalizeSchemasForVerification } from './canonicalize-introspection';\n\nexport interface VerifyMongoSchemaOptions {\n readonly contract: MongoContract;\n readonly schema: MongoSchemaIR;\n readonly strict: boolean;\n readonly context?: OperationContext;\n /**\n * Active framework components participating in this composition. Mongo\n * verification does not currently consult them, but the parameter exists\n * for parity with `verifySqlSchema` so callers can pass the same envelope.\n */\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'mongo', string>>;\n}\n\nexport function verifyMongoSchema(options: VerifyMongoSchemaOptions): VerifyDatabaseSchemaResult {\n const { contract, schema, strict, context } = options;\n const startTime = Date.now();\n\n const expectedIR = contractToMongoSchemaIR(contract);\n // Strip server-applied defaults (and authored equivalents) before diffing so\n // the verifier compares like-with-like — see `canonicalize-introspection.ts`.\n const { live: canonicalLive, expected: canonicalExpected } = canonicalizeSchemasForVerification(\n schema,\n expectedIR,\n );\n const collectionControlPolicy = resolveMongoCollectionControlPolicy(contract);\n const { root, issues, counts } = diffMongoSchemas(\n canonicalLive,\n canonicalExpected,\n strict,\n collectionControlPolicy,\n );\n\n const ok = counts.fail === 0;\n const profileHash = typeof contract.profileHash === 'string' ? contract.profileHash : '';\n\n return {\n ok,\n ...ifDefined('code', ok ? undefined : VERIFY_CODE_SCHEMA_FAILURE),\n summary: ok ? 'Schema matches contract' : `Schema verification found ${counts.fail} issue(s)`,\n contract: {\n storageHash: contract.storage.storageHash,\n ...(profileHash ? { profileHash } : {}),\n },\n target: { expected: contract.target },\n schema: { issues, root, counts },\n meta: {\n strict,\n ...ifDefined('contractPath', context?.contractPath),\n ...ifDefined('configPath', context?.configPath),\n },\n timings: { total: Date.now() - startTime },\n };\n}\n\nfunction resolveMongoCollectionControlPolicy(\n contract: MongoContract,\n): (collectionName: string) => ControlPolicy {\n const namespace = contract.storage.namespaces[UNBOUND_NAMESPACE_ID];\n const collections: Record<string, MongoCollection> = namespace?.collections ?? {};\n const defaultControl = contract.defaultControl;\n return (collectionName: string) =>\n effectiveControlPolicy(collections[collectionName]?.control, defaultControl);\n}\n"],"mappings":";;;;;;AAeA,SAAS,YAAY,MAAuC;CAC1D,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS;CACjC,OAAO;AACT;AAEA,SAAS,aAAa,OAAqC;CACzD,OAAO,IAAI,iBAAiB;EAC1B,MAAM,MAAM;EACZ,QAAQ,MAAM;EACd,QAAQ,MAAM;EACd,oBAAoB,MAAM;EAC1B,yBAAyB,MAAM;EAC/B,oBAAoB,MAAM;EAC1B,WAAW,MAAM;EACjB,SAAS,MAAM;EACf,kBAAkB,MAAM;EACxB,mBAAmB,MAAM;CAC3B,CAAC;AACH;AAEA,SAAS,iBAAiB,GAAyC;CACjE,OAAO,IAAI,qBAAqB;EAC9B,YAAY,EAAE;EACd,iBAAiB,EAAE;EACnB,kBAAkB,EAAE;CACtB,CAAC;AACH;AAEA,SAAS,eAAe,GAAyD;CAC/E,OAAO,IAAI,6BAA6B;EACtC,GAAI,EAAE,WAAW,KAAA,KAAa,EAAE,QAAQ,EAAE,OAAO;EACjD,GAAI,EAAE,eAAe,KAAA,KAAa,EAChC,YAAY;GACV,WAAW,EAAE,WAAW;GACxB,GAAI,EAAE,WAAW,cAAc,KAAA,KAAa,EAAE,WAAW,EAAE,WAAW,UAAU;GAChF,GAAI,EAAE,WAAW,gBAAgB,KAAA,KAAa,EAAE,aAAa,EAAE,WAAW,YAAY;EACxF,EACF;EACA,GAAI,EAAE,cAAc,KAAA,KAAa,EAC/B,WAAW,YAAY,EAAE,SAAS,EACpC;EACA,GAAI,EAAE,iCAAiC,KAAA,KAAa,EAClD,8BAA8B,EAAE,SAAS,EAAE,6BAA6B,QAAQ,EAClF;EACA,GAAI,EAAE,mBAAmB,KAAA,KAAa,EAAE,gBAAgB,EAAE,eAAe;CAC3E,CAAC;AACH;AAEA,SAAS,kBAAkB,MAAc,KAA6C;CAEpF,OAAO,IAAI,sBAAsB;EAC/B;EACA,UAHe,IAAI,WAAW,CAAC,GAAG,IAAI,YAGhC;EACN,GAAI,IAAI,aAAa,QAAQ,EAAE,WAAW,iBAAiB,IAAI,SAAS,EAAE;EAC1E,GAAI,IAAI,WAAW,QAAQ,EAAE,SAAS,eAAe,IAAI,OAAO,EAAE;CACpE,CAAC;AACH;AAEA,SAAgB,wBAAwB,UAA+C;CACrF,IAAI,CAAC,UACH,OAAO,IAAI,cAAc,CAAC,CAAC;CAG7B,MAAM,cAAuC,CAAC;CAC9C,KAAK,MAAM,MAAM,OAAO,OAAO,SAAS,QAAQ,UAAU,GACxD,KAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG,WAAW,GACrD,YAAY,KAAK,kBAAkB,MAAM,GAAG,CAAC;CAIjD,OAAO,IAAI,cAAc,WAAW;AACtC;;;;;;;;;;;;;ACpEA,SAAgB,+BAA+B,MAAkD;CAC/F,QAAQ,MAAR;EACE,KAAK,eACH,OAAO;EACT,KAAK;EACL,KAAK,mBACH,OAAO;EACT,KAAK;EACL,KAAK,gBACH,OAAO;EACT,KAAK;EACL,KAAK,iBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAgB,oBACd,eACA,WACiB;CACjB,OAAO,uBAAuB,eAAe,+BAA+B,SAAS,CAAC;AACxF;;;;;;;;;;;;;;;;;;;;;;;;ACZA,SAAS,sBACP,eACA,WACA,YACiB;CACjB,MAAM,cAAc,oBAAoB,eAAe,SAAS;CAChE,OAAO,gBAAgB,SAAS,aAAa;AAC/C;AAEA,SAAgB,wCACd,eACA,OACA,MACA,QACA,OACiB;CACjB,MAAM,UAAU,sBAAsB,eAAe,MAAM,MAAM,KAAK,MAAM;CAC5E,IAAI,YAAY,YACd,OAAO;CAET,OAAO,KAAK,KAAK;CACjB,MAAM,KAAK;EAAE,GAAG;EAAM,QAAQ;CAAQ,CAAC;CACvC,OAAO;AACT;;;ACtCA,SAAgB,iBACd,MACA,UACA,QACA,yBAKA;CACA,MAAM,SAAwB,CAAC;CAC/B,MAAM,qBAA+C,CAAC;CACtD,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,OAAO;CAEX,MAAM,WAAW,IAAI,IAAI,CAAC,GAAG,KAAK,iBAAiB,GAAG,SAAS,eAAe,CAAC;CAE/E,KAAK,MAAM,QAAQ,CAAC,GAAG,QAAQ,EAAE,KAAK,GAAG;EACvC,MAAM,WAAW,KAAK,WAAW,IAAI;EACrC,MAAM,eAAe,SAAS,WAAW,IAAI;EAE7C,IAAI,CAAC,YAAY,cAAc;GAO7B,MAAM,cAAc,wCANE,wBAAwB,IAOhC,GACZ;IANA,MAAM;IACN,OAAO;IACP,SAAS,eAAe,KAAK;GAIzB,GACJ;IACE,QAAQ;IACR,MAAM;IACN;IACA,cAAc,sBAAsB,qBAAqB,eAAe;IACxE,MAAM;IACN,SAAS,eAAe,KAAK;IAC7B,UAAU;IACV,QAAQ;IACR,UAAU,CAAC;GACb,GACA,QACA,kBACF;GACA,IAAI,gBAAgB,QAAQ;QACvB,IAAI,gBAAgB,QAAQ;GACjC;EACF;EAEA,IAAI,YAAY,CAAC,cAAc;GAQ7B,MAAM,cAAc,wCAPE,wBAAwB,IAQhC,GACZ;IAPA,MAAM;IACN,OAAO;IACP,SAAS,qBAAqB,KAAK;GAK/B,GACJ;IACE,QALe,SAAS,SAAS;IAMjC,MAAM;IACN;IACA,cAAc,sBAAsB,qBAAqB,eAAe;IACxE,MAAM;IACN,SAAS,qBAAqB,KAAK;IACnC,UAAU;IACV,QAAQ;IACR,UAAU,CAAC;GACb,GACA,QACA,kBACF;GACA,IAAI,gBAAgB,QAAQ;QACvB,IAAI,gBAAgB,QAAQ;GACjC;EACF;EAEA,MAAM,KAAK;EACX,MAAM,KAAK;EACX,MAAM,gBAAgB,wBAAwB,IAAI;EAClD,MAAM,gBAAgB,YAAY,MAAM,IAAI,IAAI,QAAQ,eAAe,MAAM;EAC7E,MAAM,oBAAoB,cAAc,MAAM,IAAI,IAAI,QAAQ,eAAe,MAAM;EACnF,MAAM,kBAAkB,YAAY,MAAM,IAAI,IAAI,QAAQ,eAAe,MAAM;EAC/E,MAAM,WAAW;GAAC,GAAG;GAAe,GAAG;GAAmB,GAAG;EAAe;EAE5E,MAAM,cAAc,SAAS,QAC1B,GAAG,MAAO,EAAE,WAAW,SAAS,SAAS,EAAE,WAAW,UAAU,MAAM,SAAS,SAAS,GACzF,MACF;EAEA,KAAK,MAAM,KAAK,UACd,IAAI,EAAE,WAAW,QAAQ;OACpB,IAAI,EAAE,WAAW,QAAQ;OACzB;EAGP,IAAI,SAAS,WAAW,GACtB;EAGF,mBAAmB,KAAK;GACtB,QAAQ;GACR,MAAM;GACN;GACA,cAAc,sBAAsB,qBAAqB,eAAe;GACxE,MAAM,gBAAgB,SAAS,UAAU;GACzC,SACE,gBAAgB,SAAS,eAAe,KAAK,aAAa,eAAe,KAAK;GAChF,UAAU;GACV,QAAQ;GACR;EACF,CAAC;CACH;CAEA,MAAM,aAAa,OAAO,IAAI,SAAS,OAAO,IAAI,SAAS;CAC3D,MAAM,aAAa,OAAO,OAAO,OAAO,mBAAmB;CAc3D,OAAO;EAAE,MAAA;GAXP,QAAQ;GACR,MAAM;GACN,MAAM;GACN,cAAc;GACd,MAAM,eAAe,SAAS,UAAU;GACxC,SAAS,eAAe,SAAS,mBAAmB;GACpD,UAAU;GACV,QAAQ;GACR,UAAU;EAGA;EAAG;EAAQ,QAAQ;GAAE;GAAM;GAAM;GAAM;EAAW;CAAE;AAClE;AAEA,SAAS,oBAAoB,OAAiC;CAC5D,MAAM,OAAO,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,WAAW,EAAE,KAAK,GAAG;CACxE,MAAM,OAAO;EACX,MAAM,SAAS,WAAW;EAC1B,MAAM,SAAS,WAAW;EAC1B,MAAM,sBAAsB,OAAO,OAAO,MAAM,uBAAuB;EACvE,MAAM,0BAA0B,OAAO,aAAa,MAAM,uBAAuB,MAAM;EACvF,MAAM,qBAAqB,MAAM,aAAa,MAAM,kBAAkB,MAAM;EAC5E,MAAM,YAAY,OAAO,aAAa,MAAM,SAAS,MAAM;EAC3D,MAAM,UAAU,MAAM,aAAa,MAAM,OAAO,MAAM;EACtD,MAAM,mBAAmB,MAAM,MAAM,qBAAqB;EAC1D,MAAM,oBAAoB,MAAM,MAAM,sBAAsB;CAC9D,EACG,OAAO,OAAO,EACd,KAAK,GAAG;CACX,OAAO,OAAO,GAAG,KAAK,GAAG,SAAS;AACpC;AAEA,SAAS,gBAAgB,OAAiC;CACxD,OAAO,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,WAAW,EAAE,KAAK,IAAI;AACrE;AAEA,SAAS,YACP,UACA,MACA,UACA,QACA,yBACA,QAC0B;CAC1B,MAAM,QAAkC,CAAC;CACzC,MAAM,6BAAa,IAAI,IAA8B;CACrD,KAAK,MAAM,OAAO,KAAK,SAAS,WAAW,IAAI,oBAAoB,GAAG,GAAG,GAAG;CAE5E,MAAM,iCAAiB,IAAI,IAA8B;CACzD,KAAK,MAAM,OAAO,SAAS,SAAS,eAAe,IAAI,oBAAoB,GAAG,GAAG,GAAG;CAEpF,KAAK,MAAM,CAAC,KAAK,QAAQ,gBACvB,IAAI,WAAW,IAAI,GAAG,GACpB,MAAM,KAAK;EACT,QAAQ;EACR,MAAM;EACN,MAAM,gBAAgB,GAAG;EACzB,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;EACjF,MAAM;EACN,SAAS,SAAS,gBAAgB,GAAG,EAAE;EACvC,UAAU;EACV,QAAQ;EACR,UAAU,CAAC;CACb,CAAC;MAQD,wCACE,yBACA;EAPA,MAAM;EACN,OAAO;EACP,mBAAmB,gBAAgB,GAAG;EACtC,SAAS,SAAS,gBAAgB,GAAG,EAAE,0BAA0B,SAAS;CAItE,GACJ;EACE,QAAQ;EACR,MAAM;EACN,MAAM,gBAAgB,GAAG;EACzB,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;EACjF,MAAM;EACN,SAAS,SAAS,gBAAgB,GAAG,EAAE;EACvC,UAAU;EACV,QAAQ;EACR,UAAU,CAAC;CACb,GACA,QACA,KACF;CAIJ,KAAK,MAAM,CAAC,KAAK,QAAQ,YACvB,IAAI,CAAC,eAAe,IAAI,GAAG,GAQzB,wCACE,yBACA;EARA,MAAM;EACN,OAAO;EACP,mBAAmB,gBAAgB,GAAG;EACtC,SAAS,eAAe,gBAAgB,GAAG,EAAE,kBAAkB,SAAS;CAKpE,GACJ;EACE,QALe,SAAS,SAAS;EAMjC,MAAM;EACN,MAAM,gBAAgB,GAAG;EACzB,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;EACjF,MAAM;EACN,SAAS,eAAe,gBAAgB,GAAG;EAC3C,UAAU;EACV,QAAQ;EACR,UAAU,CAAC;CACb,GACA,QACA,KACF;CAIJ,OAAO;AACT;AAEA,SAAS,cACP,UACA,MACA,UACA,QACA,yBACA,QAC0B;CAC1B,IAAI,CAAC,KAAK,aAAa,CAAC,SAAS,WAAW,OAAO,CAAC;CAEpD,IAAI,SAAS,aAAa,CAAC,KAAK,WAAW;EACzC,MAAM,QAAqB;GACzB,MAAM;GACN,OAAO;GACP,SAAS,oCAAoC,SAAS;EACxD;EACA,MAAM,QAAkC,CAAC;EACzC,wCACE,yBACA,OACA;GACE,QAAQ;GACR,MAAM;GACN,MAAM;GACN,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;GACjF,MAAM;GACN,SAAS;GACT,UAAU,aAAa,SAAS,UAAU,UAAU;GACpD,QAAQ;GACR,UAAU,CAAC;EACb,GACA,QACA,KACF;EACA,OAAO;CACT;CAEA,IAAI,CAAC,SAAS,aAAa,KAAK,WAAW;EACzC,MAAM,QAAqB;GACzB,MAAM;GACN,OAAO;GACP,SAAS,kCAAkC,SAAS;EACtD;EACA,MAAM,QAAkC,CAAC;EAEzC,wCACE,yBACA,OACA;GACE,QALe,SAAS,SAAS;GAMjC,MAAM;GACN,MAAM;GACN,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;GACjF,MAAM;GACN,SAAS;GACT,UAAU;GACV,QAAQ,aAAa,KAAK,UAAU,UAAU;GAC9C,UAAU,CAAC;EACb,GACA,QACA,KACF;EACA,OAAO;CACT;CAEA,MAAM,UAAU,KAAK;CACrB,MAAM,cAAc,SAAS;CAC7B,MAAM,aAAa,aAAa,QAAQ,UAAU;CAClD,MAAM,iBAAiB,aAAa,YAAY,UAAU;CAE1D,IACE,eAAe,kBACf,QAAQ,oBAAoB,YAAY,mBACxC,QAAQ,qBAAqB,YAAY,kBACzC;EACA,MAAM,QAAqB;GACzB,MAAM;GACN,OAAO;GACP,UAAU;GACV,QAAQ;GACR,SAAS,qCAAqC,SAAS;EACzD;EACA,MAAM,QAAkC,CAAC;EACzC,wCACE,yBACA,OACA;GACE,QAAQ;GACR,MAAM;GACN,MAAM;GACN,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;GACjF,MAAM;GACN,SAAS;GACT,UAAU;IACR,YAAY,YAAY;IACxB,iBAAiB,YAAY;IAC7B,kBAAkB,YAAY;GAChC;GACA,QAAQ;IACN,YAAY,QAAQ;IACpB,iBAAiB,QAAQ;IACzB,kBAAkB,QAAQ;GAC5B;GACA,UAAU,CAAC;EACb,GACA,QACA,KACF;EACA,OAAO;CACT;CAEA,OAAO,CACL;EACE,QAAQ;EACR,MAAM;EACN,MAAM;EACN,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;EACjF,MAAM;EACN,SAAS;EACT,UAAU;EACV,QAAQ;EACR,UAAU,CAAC;CACb,CACF;AACF;AAEA,SAAS,YACP,UACA,MACA,UACA,QACA,yBACA,QAC0B;CAC1B,IAAI,CAAC,KAAK,WAAW,CAAC,SAAS,SAAS,OAAO,CAAC;CAEhD,IAAI,CAAC,SAAS,WAAW,KAAK,SAAS;EACrC,MAAM,QAAqB;GACzB,MAAM;GACN,OAAO;GACP,QAAQ,aAAa,KAAK,OAAO;GACjC,SAAS,gCAAgC,SAAS;EACpD;EACA,MAAM,QAAkC,CAAC;EAEzC,wCACE,yBACA,OACA;GACE,QALe,SAAS,SAAS;GAMjC,MAAM;GACN,MAAM;GACN,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;GACjF,MAAM;GACN,SAAS;GACT,UAAU;GACV,QAAQ,KAAK;GACb,UAAU,CAAC;EACb,GACA,QACA,KACF;EACA,OAAO;CACT;CAEA,IAAI,UAAU,KAAK,SAAS,SAAS,OAAO,GAC1C,OAAO,CACL;EACE,QAAQ;EACR,MAAM;EACN,MAAM;EACN,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;EACjF,MAAM;EACN,SAAS;EACT,UAAU,aAAa,SAAS,OAAO;EACvC,QAAQ,aAAa,KAAK,OAAO;EACjC,UAAU,CAAC;CACb,CACF;CAGF,MAAM,QAAqB;EACzB,MAAM;EACN,OAAO;EACP,UAAU,aAAa,SAAS,OAAO;EACvC,QAAQ,aAAa,KAAK,OAAO;EACjC,SAAS,mCAAmC,SAAS;CACvD;CACA,MAAM,QAAkC,CAAC;CACzC,wCACE,yBACA,OACA;EACE,QAAQ;EACR,MAAM;EACN,MAAM;EACN,cAAc,sBAAsB,qBAAqB,eAAe,SAAS;EACjF,MAAM;EACN,SAAS;EACT,UAAU,SAAS;EACnB,QAAQ,KAAK;EACb,UAAU,CAAC;CACb,GACA,QACA,KACF;CACA,OAAO;AACT;;;AC/aA,SAAgB,mCACd,MACA,UACsB;CACtB,MAAM,iCAAiB,IAAI,IAAmC;CAC9D,KAAK,MAAM,KAAK,SAAS,aAAa,eAAe,IAAI,EAAE,MAAM,CAAC;CAElE,MAAM,6BAAa,IAAI,IAAmC;CAC1D,KAAK,MAAM,KAAK,KAAK,aAAa,WAAW,IAAI,EAAE,MAAM,CAAC;CAE1D,MAAM,gBAAgB,KAAK,YAAY,KAAK,MAC1C,2BAA2B,GAAG,eAAe,IAAI,EAAE,IAAI,CAAC,CAC1D;CACA,MAAM,oBAAoB,SAAS,YAAY,KAAK,MAClD,+BAA+B,GAAG,WAAW,IAAI,EAAE,IAAI,CAAC,CAC1D;CAEA,OAAO;EACL,MAAM,IAAIA,cAAkB,aAAa;EACzC,UAAU,IAAIA,cAAkB,iBAAiB;CACnD;AACF;AAEA,SAAS,2BACP,UACA,cACuB;CACvB,MAAM,kBAAkB,cAAc,WAAW,CAAC;CAClD,MAAM,UAAU,SAAS,QAAQ,KAAK,QACpC,sBAAsB,KAAK,6BAA6B,KAAK,eAAe,CAAC,CAC/E;CAEA,MAAM,UAAU,SAAS,UACrB,wBAAwB,SAAS,SAAS,cAAc,OAAO,IAC/D,KAAA;CAEJ,OAAO,IAAIC,sBAA0B;EACnC,MAAM,SAAS;EACf;EACA,GAAG,UAAU,aAAa,SAAS,SAAS;EAC5C,GAAG,UAAU,WAAW,OAAO;CACjC,CAAC;AACH;AAEA,SAAS,+BACP,cACA,UACuB;CAOvB,MAAM,UAAU,aAAa,QAAQ,IAAI,6BAA6B;CAEtE,MAAM,UAAU,aAAa,UACzB,4BAA4B,aAAa,SAAS,UAAU,OAAO,IACnE,KAAA;CAEJ,OAAO,IAAIA,sBAA0B;EACnC,MAAM,aAAa;EACnB;EACA,GAAG,UAAU,aAAa,aAAa,SAAS;EAChD,GAAG,UAAU,WAAW,OAAO;CACjC,CAAC;AACH;AAEA,SAAS,8BAA8B,OAA2C;CAEhF,IAAI,CADe,MAAM,KAAK,MAAM,MAAM,EAAE,cAAc,MAC5C,GAAG,OAAO;CACxB,OAAO,IAAIC,iBAAqB;EAC9B,MAAM,aAAa,MAAM,IAAI;EAC7B,QAAQ,MAAM;EACd,GAAG,UAAU,UAAU,MAAM,MAAM;EACnC,GAAG,UAAU,sBAAsB,MAAM,kBAAkB;EAC3D,GAAG,UAAU,2BAA2B,MAAM,uBAAuB;EACrE,GAAG,UAAU,sBAAsB,MAAM,kBAAkB;EAC3D,GAAG,UAAU,aAAa,MAAM,SAAS;EACzC,GAAG,UAAU,WAAW,MAAM,OAAO;EACrC,GAAG,UAAU,oBAAoB,MAAM,gBAAgB;EACvD,GAAG,UAAU,qBAAqB,MAAM,iBAAiB;CAC3D,CAAC;AACH;;;;;;;AAQA,SAAS,aACP,MAOC;CACD,MAAM,cAAc,KAAK,QAAQ,MAAM,EAAE,cAAc,MAAM;CAC7D,IAAI,YAAY,UAAU,GAAG,OAAO;CACpC,MAAM,aAAa,CAAC,GAAG,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;CACjF,IAAI,UAAU;CACd,OAAO,KAAK,KAAK,MAAM;EACrB,IAAI,EAAE,cAAc,QAAQ,OAAO;EACnC,MAAM,OAAO,WAAW;;EAExB,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,0CAA0C;EAE5D,OAAO;CACT,CAAC;AACH;AAEA,SAAS,sBACP,WACA,eACkB;CAClB,MAAM,gBAAgB,aAAa,qBAAqB,SAAS,CAAC;CAClE,MAAM,YAAY,UAAU,YACxB,uBAAuB,UAAU,WAAW,eAAe,SAAS,IACpE,UAAU;CAUd,MAAM,UACJ,eAAe,YAAY,KAAA,KAAa,sBAAsB,eAAe,UAAU,OAAO,IAC1F,KAAA,IACA,UAAU;CAChB,MAAM,mBACJ,eAAe,qBAAqB,KAAA,KAAa,UAAU,qBAAqB,YAC5E,KAAA,IACA,UAAU;CAChB,MAAM,oBACJ,eAAe,sBAAsB,KAAA,KAAa,UAAU,sBAAsB,aAC9E,KAAA,IACA,UAAU;CAEhB,OAAO,IAAIA,iBAAqB;EAC9B,MAAM;EACN,QAAQ,UAAU;EAClB,GAAG,UAAU,UAAU,UAAU,MAAM;EACvC,GAAG,UAAU,sBAAsB,UAAU,kBAAkB;EAC/D,GAAG,UAAU,2BAA2B,UAAU,uBAAuB;EACzE,GAAG,UAAU,sBAAsB,UAAU,kBAAkB;EAC/D,GAAG,UAAU,aAAa,SAAS;EACnC,GAAG,UAAU,WAAW,OAAO;EAC/B,GAAG,UAAU,oBAAoB,gBAAgB;EACjD,GAAG,UAAU,qBAAqB,iBAAiB;CACrD,CAAC;AACH;;;;;;;;;AAUA,SAAS,6BACP,WACA,iBAC8B;CAE9B,MAAM,aADoB,aAAa,qBAAqB,SAAS,CAClC,EAAE,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,WAAW,EAAE,KAAK,GAAG;CACrF,KAAK,MAAM,YAAY,iBAIrB,IAHuB,aAAa,SAAS,IAAI,EAC9C,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,WAAW,EACtC,KAAK,GACS,MAAM,YAAY,OAAO;AAG9C;;;;;;;;;;AAWA,SAAS,qBAAqB,WAG3B;CAKD,IAAI,EAHF,UAAU,KAAK,UAAU,KACzB,UAAU,KAAK,MAAM,MAAM,EAAE,UAAU,UAAU,EAAE,cAAc,MAAM,MAErD,CAAC,UAAU,SAAS,OAAO,UAAU;CAEzD,MAAM,WAAW,OAAO,KAAK,UAAU,OAAO,EAAE,KAAK,WAAW;EAC9D;EACA,WAAW;CACb,EAAE;CAWF,MAAM,gBAA4B,CAAC;CACnC,KAAK,MAAM,OAAO,UAAU,MAAM;EAChC,IAAI,IAAI,UAAU,SAAS;EAC3B,IAAI,IAAI,UAAU,QAAQ;GACxB,cAAc,KAAK,GAAG,QAAQ;GAC9B;EACF;EACA,cAAc,KAAK,GAAG;CACxB;CACA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAS,sBACP,eAIA,aACS;CACT,IAAI,gBAAgB,KAAA,GAAW,OAAO;CAEtC,OADmB,cAAc,QAAQ,MAAM,EAAE,cAAc,MAAM,EAAE,KAAK,MAAM,EAAE,KACpE,EAAE,OAAO,UAAU,YAAY,WAAW,CAAC;AAC7D;AAEA,SAAS,wBACP,aACA,iBAC0C;CAC1C,MAAM,YAAY,YAAY,YAC1B,uBAAuB,YAAY,WAAW,iBAAiB,SAAS,IACxE,KAAA;CAIJ,MAAM,aAAa,YAAY,aAC1B,uBACC,YAAY,YACZ,iBAAiB,UACnB,IACA,KAAA;CAIJ,MAAM,iBAAiB,YAAY,iBAC9B,uBACC,YAAY,gBACZ,iBAAiB,cACnB,IACA,KAAA;CAKJ,MAAM,+BAA+B,uBACnC,YAAY,4BACd,IACI,KAAA,IACA,YAAY;CAIhB,IAAI,EADF,YAAY,UAAU,cAAc,aAAa,gCAAgC,iBAC/D,OAAO,KAAA;CAE3B,OAAO,IAAIC,6BAAiC;EAC1C,GAAG,UAAU,UAAU,YAAY,MAAM;EACzC,GAAG,UAAU,cAAc,UAAU;EACrC,GAAG,UAAU,aAAa,SAAS;EACnC,GAAG,UAAU,gCAAgC,4BAA4B;EACzE,GAAG,UAAU,kBAAkB,cAAc;CAC/C,CAAC;AACH;AAEA,SAAS,4BACP,iBACA,cAC0C;CAE1C,MAAM,+BAA+B,uBACnC,gBAAgB,4BAClB,IACI,KAAA,IACA,gBAAgB;CAQpB,IAAI,EALF,gBAAgB,UAChB,gBAAgB,cAChB,gBAAgB,aAChB,gCACA,gBAAgB,iBACE,OAAO,KAAA;CAE3B,OAAO,IAAIA,6BAAiC;EAC1C,GAAG,UAAU,UAAU,gBAAgB,MAAM;EAC7C,GAAG,UAAU,cAAc,gBAAgB,UAAU;EACrD,GAAG,UAAU,aAAa,gBAAgB,SAAS;EACnD,GAAG,UAAU,gCAAgC,4BAA4B;EACzE,GAAG,UAAU,kBAAkB,gBAAgB,cAAc;CAC/D,CAAC;AACH;AAEA,SAAS,uBAAuB,OAAkD;CAChF,OAAO,UAAU,KAAA,KAAa,MAAM,YAAY;AAClD;;;;;;;;;;;;;;AAeA,SAAS,uBACP,MACA,UACyB;CACzB,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,MAAM,MAA+B,CAAC;CACtC,KAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,GACpC,IAAI,OAAO,OAAO,MAAM,GAAG,GAAG,IAAI,OAAO,KAAK;CAEhD,OAAO;AACT;;;ACxWA,SAAgB,kBAAkB,SAA+D;CAC/F,MAAM,EAAE,UAAU,QAAQ,QAAQ,YAAY;CAC9C,MAAM,YAAY,KAAK,IAAI;CAK3B,MAAM,EAAE,MAAM,eAAe,UAAU,sBAAsB,mCAC3D,QAJiB,wBAAwB,QAKhC,CACX;CAEA,MAAM,EAAE,MAAM,QAAQ,WAAW,iBAC/B,eACA,mBACA,QAJ8B,oCAAoC,QAK5C,CACxB;CAEA,MAAM,KAAK,OAAO,SAAS;CAC3B,MAAM,cAAc,OAAO,SAAS,gBAAgB,WAAW,SAAS,cAAc;CAEtF,OAAO;EACL;EACA,GAAG,UAAU,QAAQ,KAAK,KAAA,IAAY,0BAA0B;EAChE,SAAS,KAAK,4BAA4B,6BAA6B,OAAO,KAAK;EACnF,UAAU;GACR,aAAa,SAAS,QAAQ;GAC9B,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;EACvC;EACA,QAAQ,EAAE,UAAU,SAAS,OAAO;EACpC,QAAQ;GAAE;GAAQ;GAAM;EAAO;EAC/B,MAAM;GACJ;GACA,GAAG,UAAU,gBAAgB,SAAS,YAAY;GAClD,GAAG,UAAU,cAAc,SAAS,UAAU;EAChD;EACA,SAAS,EAAE,OAAO,KAAK,IAAI,IAAI,UAAU;CAC3C;AACF;AAEA,SAAS,oCACP,UAC2C;CAE3C,MAAM,cADY,SAAS,QAAQ,WAAW,uBACkB,eAAe,CAAC;CAChF,MAAM,iBAAiB,SAAS;CAChC,QAAQ,mBACN,uBAAuB,YAAY,iBAAiB,SAAS,cAAc;AAC/E"}
@@ -1,4 +0,0 @@
1
- export {
2
- defaultMongoDomainNamespaceId,
3
- defaultMongoStorageNamespaceId,
4
- } from '@prisma-next/mongo-contract';