@prisma-next/mongo-contract-ts 0.7.0 → 0.8.0-dev.1
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.
- package/dist/contract-builder.d.mts +17 -14
- package/dist/contract-builder.d.mts.map +1 -1
- package/dist/contract-builder.mjs +69 -28
- package/dist/contract-builder.mjs.map +1 -1
- package/package.json +12 -11
- package/src/contract-builder.ts +201 -52
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EntityHelpersFromNamespace, ExtractAuthoringNamespaceFromPack, MergeExtensionAuthoringNamespaces } from "@prisma-next/contract-authoring";
|
|
2
|
+
import { MongoCollection, MongoCollectionOptionsAuthoringInput, MongoContractWithTypeMaps, MongoIndexAuthoringInput, MongoIndexFields, MongoIndexOptionsInput, MongoStorageShape, MongoTypeMaps } from "@prisma-next/mongo-contract";
|
|
2
3
|
import { ContractFieldType, ProfileHashBase, StorageHashBase } from "@prisma-next/contract/types";
|
|
3
4
|
import { ExtensionPackRef, FamilyPackRef, TargetPackRef } from "@prisma-next/framework-components/components";
|
|
4
5
|
|
|
@@ -90,8 +91,8 @@ interface ModelBuilder<Name extends string = string, Fields extends Record<strin
|
|
|
90
91
|
readonly __name: Name;
|
|
91
92
|
readonly __fields: Fields;
|
|
92
93
|
readonly __relations: Relations;
|
|
93
|
-
readonly __indexes: readonly
|
|
94
|
-
readonly __collectionOptions:
|
|
94
|
+
readonly __indexes: readonly MongoIndexAuthoringInput[] | undefined;
|
|
95
|
+
readonly __collectionOptions: MongoCollectionOptionsAuthoringInput | undefined;
|
|
95
96
|
readonly __collection: Collection;
|
|
96
97
|
readonly __owner: Owner;
|
|
97
98
|
readonly __base: Base;
|
|
@@ -179,7 +180,7 @@ type ContractModelFromBuilder<TBuilder> = TBuilder extends NamedModelBuilder<str
|
|
|
179
180
|
} & MaybeOwner<Owner> & MaybeBase<Base> & MaybeDiscriminator<Discriminator> & MaybeVariants<Variants>> : never;
|
|
180
181
|
type ContractModelsFromRecord<Models extends Record<string, AnyModelBuilder>> = Simplify<{ readonly [K in keyof Models as ExtractModelName<Models[K]>]: ContractModelFromBuilder<Models[K]> }>;
|
|
181
182
|
type DerivedRootModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{ readonly [K in keyof Models as RootModelCollection<Models[K]>]: RootModelName<Models[K]> }>;
|
|
182
|
-
type StorageCollectionsFromModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{ readonly [K in keyof Models as CollectionName<Models[K]>]:
|
|
183
|
+
type StorageCollectionsFromModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{ readonly [K in keyof Models as CollectionName<Models[K]>]: MongoCollection }>;
|
|
183
184
|
type NormalizeRoots<Roots extends Record<string, ModelNameInput>> = Simplify<{ readonly [K in keyof Roots]: NormalizeModelName<Roots[K]> }>;
|
|
184
185
|
type DefinitionModels<Definition> = Definition extends {
|
|
185
186
|
readonly models?: infer Models extends Record<string, AnyModelBuilder>;
|
|
@@ -202,7 +203,7 @@ type DefinitionFamilyId<Definition> = Definition extends {
|
|
|
202
203
|
type DefinitionTargetId<Definition> = Definition extends {
|
|
203
204
|
readonly target: TargetPackRef<string, infer TargetId>;
|
|
204
205
|
} ? TargetId : string;
|
|
205
|
-
type DefinitionStorage<Definition> = Simplify<
|
|
206
|
+
type DefinitionStorage<Definition> = Simplify<MongoStorageShape & {
|
|
206
207
|
readonly collections: StorageCollectionsFromModels<DefinitionModels<Definition>>;
|
|
207
208
|
readonly storageHash: StorageHashBase<string>;
|
|
208
209
|
}>;
|
|
@@ -222,7 +223,9 @@ type MongoContractBaseFromDefinition<Definition> = Simplify<{
|
|
|
222
223
|
} & MaybeValueObjectsSection<DefinitionValueObjects<Definition>>>;
|
|
223
224
|
type CodecTypesFromDefinition<Definition> = MongoCodecTypes & MergeExtensionCodecTypesSafe<DefinitionExtensionPacks<Definition>>;
|
|
224
225
|
type MongoContractResult<Definition> = MongoContractWithTypeMaps<MongoContractBaseFromDefinition<Definition>, MongoTypeMaps<CodecTypesFromDefinition<Definition>>>;
|
|
225
|
-
type
|
|
226
|
+
type ExtractEntitiesNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<Pack, 'entityTypes', Record<never, never>>;
|
|
227
|
+
type MergeExtensionEntityNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<ExtensionPacks, 'entityTypes'>;
|
|
228
|
+
type ContractAuthoringHelpers<Family extends FamilyPackRef<string> = FamilyPackRef<string>, Target extends TargetPackRef<string, string> = TargetPackRef<string, string>, ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined> = EntityHelpersFromNamespace<ExtractEntitiesNamespaceFromPack<Family> & ExtractEntitiesNamespaceFromPack<Target> & MergeExtensionEntityNamespaces<ExtensionPacks>> & {
|
|
226
229
|
readonly field: typeof field;
|
|
227
230
|
readonly index: typeof index;
|
|
228
231
|
readonly model: typeof model;
|
|
@@ -240,7 +243,7 @@ type ContractDefinition<Family extends FamilyPackRef<string>, Target extends Tar
|
|
|
240
243
|
readonly models?: Models;
|
|
241
244
|
readonly valueObjects?: ValueObjects;
|
|
242
245
|
};
|
|
243
|
-
type ContractFactory<Models extends Record<string, AnyModelBuilder> = Record<never, never>, ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>, Roots extends Record<string, ModelNameInput> | undefined = undefined> = (helpers: ContractAuthoringHelpers) => {
|
|
246
|
+
type ContractFactory<Models extends Record<string, AnyModelBuilder> = Record<never, never>, ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>, Roots extends Record<string, ModelNameInput> | undefined = undefined, Family extends FamilyPackRef<string> = FamilyPackRef<string>, Target extends TargetPackRef<string, string> = TargetPackRef<string, string>, ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined> = (helpers: ContractAuthoringHelpers<Family, Target, ExtensionPacks>) => {
|
|
244
247
|
readonly models?: Models;
|
|
245
248
|
readonly valueObjects?: ValueObjects;
|
|
246
249
|
readonly roots?: Roots;
|
|
@@ -295,9 +298,9 @@ declare const field: {
|
|
|
295
298
|
declare function index<const Fields extends MongoIndexFields>(fields: Fields): {
|
|
296
299
|
readonly fields: Fields;
|
|
297
300
|
};
|
|
298
|
-
declare function index<const Fields extends MongoIndexFields, const Options>(fields: Fields, options: StrictShape<Options,
|
|
301
|
+
declare function index<const Fields extends MongoIndexFields, const Options>(fields: Fields, options: StrictShape<Options, MongoIndexOptionsInput>): {
|
|
299
302
|
readonly fields: Fields;
|
|
300
|
-
readonly options: Options &
|
|
303
|
+
readonly options: Options & MongoIndexOptionsInput;
|
|
301
304
|
};
|
|
302
305
|
type ReferenceOptions<Target extends ModelNameInput, From extends StringListInput, To extends RelationTargetFieldsInput<NormalizeModelName<Target>>> = {
|
|
303
306
|
readonly from: From;
|
|
@@ -325,10 +328,10 @@ type ModelDiscriminatorInput<Variants extends Record<string, VariantSpec>> = {
|
|
|
325
328
|
readonly field: string;
|
|
326
329
|
readonly variants: Variants;
|
|
327
330
|
};
|
|
328
|
-
type ModelInput<Fields extends Record<string, AnyFieldBuilder>, Relations extends Record<string, AnyRelationBuilder> | undefined, Collection extends string | undefined, Indexes extends readonly
|
|
331
|
+
type ModelInput<Fields extends Record<string, AnyFieldBuilder>, Relations extends Record<string, AnyRelationBuilder> | undefined, Collection extends string | undefined, Indexes extends readonly MongoIndexAuthoringInput[] | undefined, CollectionOptions, Owner extends ModelNameInput | undefined, Base extends ModelNameInput | undefined, StorageRelations extends Record<string, StorageRelationSpec> | undefined, Discriminator extends ModelDiscriminatorInput<Record<string, VariantSpec>> | undefined> = {
|
|
329
332
|
readonly collection?: Collection;
|
|
330
333
|
readonly indexes?: Indexes;
|
|
331
|
-
readonly collectionOptions?: StrictShape<CollectionOptions,
|
|
334
|
+
readonly collectionOptions?: StrictShape<CollectionOptions, MongoCollectionOptionsAuthoringInput>;
|
|
332
335
|
readonly storageRelations?: StorageRelations;
|
|
333
336
|
readonly fields: Fields;
|
|
334
337
|
readonly relations?: Relations;
|
|
@@ -336,7 +339,7 @@ type ModelInput<Fields extends Record<string, AnyFieldBuilder>, Relations extend
|
|
|
336
339
|
readonly base?: Base;
|
|
337
340
|
readonly discriminator?: Discriminator;
|
|
338
341
|
};
|
|
339
|
-
declare function model<const Name extends string, const Fields extends Record<string, AnyFieldBuilder>, const Relations extends Record<string, AnyRelationBuilder> | undefined = undefined, const Collection extends string | undefined = undefined, const Indexes extends readonly
|
|
342
|
+
declare function model<const Name extends string, const Fields extends Record<string, AnyFieldBuilder>, const Relations extends Record<string, AnyRelationBuilder> | undefined = undefined, const Collection extends string | undefined = undefined, const Indexes extends readonly MongoIndexAuthoringInput[] | undefined = undefined, const CollectionOptions = undefined, const Owner extends ModelNameInput | undefined = undefined, const Base extends ModelNameInput | undefined = undefined, const StorageRelations extends Record<string, StorageRelationSpec> | undefined = undefined, const Discriminator extends ModelDiscriminatorInput<Record<string, VariantSpec>> | undefined = undefined>(name: Name, input: ModelInput<Fields, Relations, Collection, Indexes, CollectionOptions, Owner, Base, StorageRelations, Discriminator>): ModelBuilder<Name, Fields, Relations extends Record<string, AnyRelationBuilder> ? Relations : Record<never, never>, Collection, NormalizeModelNameOrUndefined<Owner>, NormalizeModelNameOrUndefined<Base>, StorageRelations, Discriminator extends {
|
|
340
343
|
readonly field: infer Field extends string;
|
|
341
344
|
} ? {
|
|
342
345
|
readonly field: Field;
|
|
@@ -344,11 +347,11 @@ declare function model<const Name extends string, const Fields extends Record<st
|
|
|
344
347
|
readonly variants: infer Variants extends Record<string, VariantSpec>;
|
|
345
348
|
} ? Variants : undefined>;
|
|
346
349
|
declare function defineContract<const Definition extends ContractDefinition<FamilyPackRef<string>, TargetPackRef<string, string>, Record<string, AnyModelBuilder>, Record<string, AnyValueObjectBuilder>, Record<string, ExtensionPackRef<string, string>> | undefined, ContractCapabilities | undefined, Record<string, ModelNameInput> | undefined>>(definition: Definition): MongoContractResult<Definition>;
|
|
347
|
-
declare function defineContract<const Definition extends ContractScaffold<
|
|
350
|
+
declare function defineContract<const Definition extends ContractScaffold<Family, Target, ExtensionPacks, ContractCapabilities | undefined, Record<string, ModelNameInput> | undefined>, const Built extends {
|
|
348
351
|
readonly models?: Record<string, AnyModelBuilder>;
|
|
349
352
|
readonly valueObjects?: Record<string, AnyValueObjectBuilder>;
|
|
350
353
|
readonly roots?: Record<string, ModelNameInput>;
|
|
351
|
-
}>(definition: Definition, factory: (
|
|
354
|
+
}, const Family extends FamilyPackRef<string> = FamilyPackRef<string>, const Target extends TargetPackRef<string, string> = TargetPackRef<string, string>, const ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined>(definition: Definition, factory: (helpers: ContractAuthoringHelpers<Family, Target, ExtensionPacks>) => Built): MongoContractResult<Definition & Built>;
|
|
352
355
|
//#endregion
|
|
353
356
|
export { type ContractDefinition, type ContractFactory, type ContractScaffold, type FieldBuilder, type FieldReference, type ModelBuilder, type MongoContractResult, type RelationBuilder, type ValueObjectBuilder, defineContract, field, index, model, rel, valueObject };
|
|
354
357
|
//# sourceMappingURL=contract-builder.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-builder.d.mts","names":[],"sources":["../src/contract-builder.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"contract-builder.d.mts","names":[],"sources":["../src/contract-builder.ts"],"mappings":"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"}
|
|
@@ -1,7 +1,43 @@
|
|
|
1
1
|
import { computeProfileHash, computeStorageHash } from "@prisma-next/contract/hashing";
|
|
2
|
-
import {
|
|
2
|
+
import { createEntityHelpersFromNamespace } from "@prisma-next/contract-authoring";
|
|
3
|
+
import { assertNoCrossRegistryCollisions, isAuthoringEntityTypeDescriptor, mergeAuthoringNamespaces } from "@prisma-next/framework-components/authoring";
|
|
4
|
+
import { MongoCollection, MongoCollectionOptions, MongoIndex, applyPolymorphicScopeToMongoIndex } from "@prisma-next/mongo-contract";
|
|
3
5
|
import { canonicalStringify } from "@prisma-next/utils/canonical-stringify";
|
|
4
6
|
//#region src/contract-builder.ts
|
|
7
|
+
function stableStringify(value) {
|
|
8
|
+
if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
|
|
9
|
+
if (value && typeof value === "object") return `{${Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`).join(",")}}`;
|
|
10
|
+
return JSON.stringify(value);
|
|
11
|
+
}
|
|
12
|
+
function extractEntitiesNamespace(component) {
|
|
13
|
+
return component.authoring?.entityTypes ?? {};
|
|
14
|
+
}
|
|
15
|
+
const MONGO_RESERVED_HELPER_KEYS = [
|
|
16
|
+
"field",
|
|
17
|
+
"index",
|
|
18
|
+
"model",
|
|
19
|
+
"rel",
|
|
20
|
+
"valueObject"
|
|
21
|
+
];
|
|
22
|
+
function composeMongoEntityHelpers(family, target, extensionPacks) {
|
|
23
|
+
const components = [
|
|
24
|
+
family,
|
|
25
|
+
target,
|
|
26
|
+
...Object.values(extensionPacks ?? {})
|
|
27
|
+
];
|
|
28
|
+
const merged = {};
|
|
29
|
+
for (const component of components) {
|
|
30
|
+
const ns = extractEntitiesNamespace(component);
|
|
31
|
+
if (Object.keys(ns).length > 0) mergeAuthoringNamespaces(merged, ns, [], isAuthoringEntityTypeDescriptor, "entity");
|
|
32
|
+
}
|
|
33
|
+
assertNoCrossRegistryCollisions({}, {}, merged);
|
|
34
|
+
const collisions = Object.keys(merged).filter((name) => MONGO_RESERVED_HELPER_KEYS.includes(name));
|
|
35
|
+
if (collisions.length > 0) throw new Error(`Pack-contributed entity type(s) ${collisions.map((c) => `"${c}"`).join(", ")} collide with the reserved built-in helper key(s) on the Mongo composed helpers surface. Reserved keys: ${MONGO_RESERVED_HELPER_KEYS.map((k) => `"${k}"`).join(", ")}.`);
|
|
36
|
+
return createEntityHelpersFromNamespace(merged, { ctx: {
|
|
37
|
+
family: family.familyId,
|
|
38
|
+
target: target.targetId
|
|
39
|
+
} });
|
|
40
|
+
}
|
|
5
41
|
function createFieldBuilder(spec) {
|
|
6
42
|
return {
|
|
7
43
|
__kind: "field",
|
|
@@ -264,26 +300,29 @@ function normalizeRoots(roots) {
|
|
|
264
300
|
return normalizedRoots;
|
|
265
301
|
}
|
|
266
302
|
function toStorageIndex(index) {
|
|
267
|
-
const
|
|
303
|
+
const input = { keys: Object.entries(index.fields).map(([field, direction]) => ({
|
|
268
304
|
field,
|
|
269
305
|
direction
|
|
270
306
|
})) };
|
|
271
307
|
if (index.options) {
|
|
272
|
-
for (const [key, value] of Object.entries(index.options)) if (value !== void 0)
|
|
308
|
+
for (const [key, value] of Object.entries(index.options)) if (value !== void 0) input[key] = value;
|
|
273
309
|
}
|
|
274
|
-
return
|
|
310
|
+
return new MongoIndex(input);
|
|
275
311
|
}
|
|
276
312
|
function toStorageCollectionOptions(opts) {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
313
|
+
return new MongoCollectionOptions({
|
|
314
|
+
...opts.capped ? { capped: {
|
|
315
|
+
size: opts.size ?? 0,
|
|
316
|
+
...opts.max != null && { max: opts.max }
|
|
317
|
+
} } : {},
|
|
318
|
+
...opts.storageEngine !== void 0 && { storageEngine: opts.storageEngine },
|
|
319
|
+
...opts.indexOptionDefaults !== void 0 && { indexOptionDefaults: opts.indexOptionDefaults },
|
|
320
|
+
...opts.collation !== void 0 && { collation: opts.collation },
|
|
321
|
+
...opts.timeseries !== void 0 && { timeseries: opts.timeseries },
|
|
322
|
+
...opts.clusteredIndex !== void 0 && { clusteredIndex: opts.clusteredIndex.name !== void 0 ? { name: opts.clusteredIndex.name } : {} },
|
|
323
|
+
...opts.expireAfterSeconds !== void 0 && { expireAfterSeconds: opts.expireAfterSeconds },
|
|
324
|
+
...opts.changeStreamPreAndPostImages !== void 0 && { changeStreamPreAndPostImages: opts.changeStreamPreAndPostImages }
|
|
325
|
+
});
|
|
287
326
|
}
|
|
288
327
|
function findMissingIndexField(index, modelFields) {
|
|
289
328
|
for (const fieldName of Object.keys(index.fields)) {
|
|
@@ -315,7 +354,7 @@ function scopeVariantIndex(storageIndex, scope, variantName, authoredIndex) {
|
|
|
315
354
|
return result.index;
|
|
316
355
|
}
|
|
317
356
|
function buildCollections(models) {
|
|
318
|
-
const
|
|
357
|
+
const intermediate = {};
|
|
319
358
|
const declaredIndexOwners = /* @__PURE__ */ new Map();
|
|
320
359
|
const modelMap = models ?? {};
|
|
321
360
|
const modelsByName = {};
|
|
@@ -326,7 +365,7 @@ function buildCollections(models) {
|
|
|
326
365
|
if (modelBuilder.__collectionOptions) throw new Error(`Model "${modelBuilder.__name}" defines collectionOptions but has no collection to attach them to.`);
|
|
327
366
|
continue;
|
|
328
367
|
}
|
|
329
|
-
const existingCollection =
|
|
368
|
+
const existingCollection = intermediate[modelBuilder.__collection] ?? {};
|
|
330
369
|
const existingIndexes = existingCollection.indexes ?? [];
|
|
331
370
|
if (existingCollection.options && modelBuilder.__collectionOptions) throw new Error(`Collection "${modelBuilder.__collection}" has collectionOptions declared by multiple models. Author collectionOptions on a single model per collection.`);
|
|
332
371
|
for (const collectionIndex of modelBuilder.__indexes ?? []) {
|
|
@@ -342,7 +381,7 @@ function buildCollections(models) {
|
|
|
342
381
|
for (let i = 0; i < storageIndexes.length; i++) {
|
|
343
382
|
const storageIndex = storageIndexes[i];
|
|
344
383
|
if (storageIndex === void 0) continue;
|
|
345
|
-
const indexSignature =
|
|
384
|
+
const indexSignature = stableStringify(storageIndex);
|
|
346
385
|
const collectionIndexKey = `${modelBuilder.__collection}:${indexSignature}`;
|
|
347
386
|
const firstOwner = declaredIndexOwners.get(collectionIndexKey);
|
|
348
387
|
if (firstOwner) {
|
|
@@ -353,7 +392,7 @@ function buildCollections(models) {
|
|
|
353
392
|
declaredIndexOwners.set(collectionIndexKey, modelBuilder.__name);
|
|
354
393
|
}
|
|
355
394
|
const storageOptions = modelBuilder.__collectionOptions ? toStorageCollectionOptions(modelBuilder.__collectionOptions) : void 0;
|
|
356
|
-
|
|
395
|
+
intermediate[modelBuilder.__collection] = storageIndexes.length > 0 ? {
|
|
357
396
|
...existingCollection,
|
|
358
397
|
indexes: [...existingIndexes, ...storageIndexes],
|
|
359
398
|
...storageOptions ? { options: storageOptions } : {}
|
|
@@ -362,6 +401,8 @@ function buildCollections(models) {
|
|
|
362
401
|
options: storageOptions
|
|
363
402
|
} : existingCollection;
|
|
364
403
|
}
|
|
404
|
+
const collections = {};
|
|
405
|
+
for (const [name, data] of Object.entries(intermediate)) collections[name] = new MongoCollection(data);
|
|
365
406
|
return collections;
|
|
366
407
|
}
|
|
367
408
|
function buildContractFromDefinition(definition) {
|
|
@@ -372,7 +413,7 @@ function buildContractFromDefinition(definition) {
|
|
|
372
413
|
const roots = definition.roots ? normalizeRoots(definition.roots) : deriveRoots(definition.models);
|
|
373
414
|
const capabilities = definition.capabilities ?? {};
|
|
374
415
|
const storageBody = { collections: buildCollections(definition.models) };
|
|
375
|
-
|
|
416
|
+
return {
|
|
376
417
|
target: definition.target.targetId,
|
|
377
418
|
targetFamily: definition.family.familyId,
|
|
378
419
|
roots,
|
|
@@ -395,21 +436,21 @@ function buildContractFromDefinition(definition) {
|
|
|
395
436
|
}),
|
|
396
437
|
meta: {}
|
|
397
438
|
};
|
|
398
|
-
validateMongoContract(builtContract);
|
|
399
|
-
return builtContract;
|
|
400
439
|
}
|
|
401
440
|
function defineContract(definition, factory) {
|
|
402
441
|
if (!isContractScaffold(definition)) throw new TypeError("defineContract expects a contract definition object. Define your contract with defineContract({ family, target, models, ... }).");
|
|
403
442
|
if (!factory) return buildContractFromDefinition(definition);
|
|
443
|
+
const helpers = {
|
|
444
|
+
...composeMongoEntityHelpers(definition.family, definition.target, definition.extensionPacks),
|
|
445
|
+
field,
|
|
446
|
+
index,
|
|
447
|
+
model,
|
|
448
|
+
rel,
|
|
449
|
+
valueObject
|
|
450
|
+
};
|
|
404
451
|
return buildContractFromDefinition({
|
|
405
452
|
...definition,
|
|
406
|
-
...factory(
|
|
407
|
-
field,
|
|
408
|
-
index,
|
|
409
|
-
model,
|
|
410
|
-
rel,
|
|
411
|
-
valueObject
|
|
412
|
-
})
|
|
453
|
+
...factory(helpers)
|
|
413
454
|
});
|
|
414
455
|
}
|
|
415
456
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-builder.mjs","names":[],"sources":["../src/contract-builder.ts"],"sourcesContent":["import { computeProfileHash, computeStorageHash } from '@prisma-next/contract/hashing';\nimport type {\n ContractEmbedRelation,\n ContractField,\n ContractFieldType,\n ContractReferenceRelation,\n ContractValueObject,\n ProfileHashBase,\n StorageHashBase,\n} from '@prisma-next/contract/types';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport {\n applyPolymorphicScopeToMongoIndex,\n type MongoCollectionOptions,\n type MongoContract,\n type MongoContractWithTypeMaps,\n type MongoIndex,\n type MongoIndexFields,\n type MongoIndexOptions,\n type MongoStorage,\n type MongoStorageCollection,\n type MongoStorageCollectionOptions,\n type MongoStorageIndex,\n type MongoTypeMaps,\n validateMongoContract,\n} from '@prisma-next/mongo-contract';\nimport { canonicalStringify } from '@prisma-next/utils/canonical-stringify';\n\ntype VariantSpec = {\n readonly value: string;\n};\n\ntype StorageRelationSpec = {\n readonly field: string;\n};\n\ntype ContractCapabilities = Record<string, Record<string, boolean>>;\ntype StringListInput = string | readonly string[];\ntype Present<T> = Exclude<T, undefined>;\ntype EmptyObject = Record<never, never>;\ntype Simplify<T> = { [K in keyof T]: T[K] } & EmptyObject;\ntype StrictShape<Actual, Shape> = Actual &\n Shape &\n Record<Exclude<keyof Actual, keyof Shape>, never>;\n\ntype UnionToIntersection<Union> = (Union extends unknown ? (value: Union) => void : never) extends (\n value: infer Intersection,\n) => void\n ? Intersection\n : never;\n\nexport type ExtractCodecTypesFromPack<P> = P extends { __codecTypes?: infer CodecTypes }\n ? CodecTypes extends Record<string, { output: unknown }>\n ? CodecTypes\n : Record<string, never>\n : Record<string, never>;\n\n// This mirrors @prisma-next/target-mongo/codec-types because authoring must stay decoupled from\n// the target layer while still exposing the built-in Mongo codec registry to type inference.\ntype MongoCodecTypes = {\n readonly 'mongo/objectId@1': { readonly input: string; readonly output: string };\n readonly 'mongo/string@1': { readonly input: string; readonly output: string };\n readonly 'mongo/double@1': { readonly input: number; readonly output: number };\n readonly 'mongo/int32@1': { readonly input: number; readonly output: number };\n readonly 'mongo/bool@1': { readonly input: boolean; readonly output: boolean };\n readonly 'mongo/date@1': { readonly input: Date; readonly output: Date };\n readonly 'mongo/vector@1': {\n readonly input: readonly number[];\n readonly output: readonly number[];\n };\n};\n\ntype MergeExtensionCodecTypes<Packs extends Record<string, unknown>> = UnionToIntersection<\n {\n [K in keyof Packs]: ExtractCodecTypesFromPack<Packs[K]>;\n }[keyof Packs]\n>;\n\ntype MergeExtensionCodecTypesSafe<Packs> =\n Packs extends Record<string, unknown>\n ? keyof Packs extends never\n ? Record<string, never>\n : MergeExtensionCodecTypes<Packs>\n : Record<string, never>;\n\nexport interface FieldBuilder<\n Type extends ContractFieldType = ContractFieldType,\n Nullable extends boolean = boolean,\n Many extends boolean = boolean,\n> {\n readonly __kind: 'field';\n readonly __type: Type;\n readonly __nullable: Nullable;\n readonly __many: Many;\n optional(): FieldBuilder<Type, true, Many>;\n many(): FieldBuilder<Type, Nullable, true>;\n}\n\nexport interface ValueObjectBuilder<\n Name extends string = string,\n Fields extends Record<string, FieldBuilder> = Record<string, FieldBuilder>,\n> {\n readonly __kind: 'valueObject';\n readonly __name: Name;\n readonly __fields: Fields;\n}\n\nexport interface FieldReference<\n ModelName extends string = string,\n FieldName extends string = string,\n> {\n readonly __kind: 'fieldRef';\n readonly modelName: ModelName;\n readonly fieldName: FieldName;\n}\n\nexport interface RelationOn<\n LocalFields extends readonly string[] = readonly string[],\n TargetFields extends readonly string[] = readonly string[],\n> {\n readonly localFields: LocalFields;\n readonly targetFields: TargetFields;\n}\n\nexport interface RelationBuilder<\n To extends string = string,\n Cardinality extends '1:1' | '1:N' | 'N:1' = '1:1' | '1:N' | 'N:1',\n On extends RelationOn | undefined = RelationOn | undefined,\n> {\n readonly __kind: 'relation';\n readonly __to: To;\n readonly __cardinality: Cardinality;\n readonly __on: On;\n}\n\nexport interface ModelBuilder<\n Name extends string = string,\n Fields extends Record<string, FieldBuilder> = Record<string, FieldBuilder>,\n Relations extends Record<string, RelationBuilder> = Record<string, RelationBuilder>,\n Collection extends string | undefined = string | undefined,\n Owner extends string | undefined = string | undefined,\n Base extends string | undefined = string | undefined,\n StorageRelations extends Record<string, StorageRelationSpec> | undefined =\n | Record<string, StorageRelationSpec>\n | undefined,\n Discriminator extends { readonly field: string } | undefined =\n | { readonly field: string }\n | undefined,\n Variants extends Record<string, VariantSpec> | undefined =\n | Record<string, VariantSpec>\n | undefined,\n> {\n readonly __kind: 'model';\n readonly __name: Name;\n readonly __fields: Fields;\n readonly __relations: Relations;\n readonly __indexes: readonly MongoIndex[] | undefined;\n readonly __collectionOptions: MongoCollectionOptions | undefined;\n readonly __collection: Collection;\n readonly __owner: Owner;\n readonly __base: Base;\n readonly __storageRelations: StorageRelations;\n readonly __discriminator: Discriminator;\n readonly __variants: Variants;\n ref<const FieldName extends keyof Fields & string>(\n fieldName: FieldName,\n ): FieldReference<Name, FieldName>;\n}\n\ntype AnyFieldBuilder = FieldBuilder<ContractFieldType, boolean, boolean>;\ntype AnyReferenceRelationBuilder = RelationBuilder<string, '1:1' | '1:N' | 'N:1', RelationOn>;\ntype AnyEmbedRelationBuilder = RelationBuilder<string, '1:1' | '1:N', undefined>;\ntype AnyRelationBuilder = AnyReferenceRelationBuilder | AnyEmbedRelationBuilder;\ntype AnyFieldReference = FieldReference<string, string>;\ntype NamedValueObjectBuilder<\n Name extends string = string,\n Fields extends Record<string, AnyFieldBuilder> = Record<string, AnyFieldBuilder>,\n> = ValueObjectBuilder<Name, Fields>;\ntype AnyValueObjectBuilder = NamedValueObjectBuilder;\ntype NamedModelBuilder<\n Name extends string = string,\n Fields extends Record<string, AnyFieldBuilder> = Record<string, AnyFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<string, AnyRelationBuilder>,\n Collection extends string | undefined = string | undefined,\n Owner extends string | undefined = string | undefined,\n Base extends string | undefined = string | undefined,\n StorageRelations extends Record<string, StorageRelationSpec> | undefined =\n | Record<string, StorageRelationSpec>\n | undefined,\n Discriminator extends { readonly field: string } | undefined =\n | { readonly field: string }\n | undefined,\n Variants extends Record<string, VariantSpec> | undefined =\n | Record<string, VariantSpec>\n | undefined,\n> = ModelBuilder<\n Name,\n Fields,\n Relations,\n Collection,\n Owner,\n Base,\n StorageRelations,\n Discriminator,\n Variants\n>;\ntype AnyModelBuilder = NamedModelBuilder;\n\ntype ExtractFieldReferenceName<T> =\n T extends FieldReference<string, infer FieldName extends string> ? FieldName : never;\ntype ExtractModelName<T> = T extends NamedModelBuilder<infer Name> ? Name : never;\ntype ExtractValueObjectName<T> = T extends NamedValueObjectBuilder<infer Name> ? Name : never;\ntype ExtractModelCollection<T> =\n T extends NamedModelBuilder<\n string,\n Record<string, AnyFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n infer Collection\n >\n ? Collection\n : never;\ntype ExtractModelOwner<T> =\n T extends NamedModelBuilder<\n string,\n Record<string, AnyFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n string | undefined,\n infer Owner\n >\n ? Owner\n : never;\ntype ExtractModelBase<T> =\n T extends NamedModelBuilder<\n string,\n Record<string, AnyFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n string | undefined,\n string | undefined,\n infer Base\n >\n ? Base\n : never;\ntype ExtractModelStorageRelations<T> =\n T extends NamedModelBuilder<\n string,\n Record<string, AnyFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n string | undefined,\n string | undefined,\n string | undefined,\n infer StorageRelations\n >\n ? StorageRelations\n : never;\n\ntype ModelStorageSection<T> =\n ExtractModelCollection<T> extends string\n ? { readonly collection: ExtractModelCollection<T> }\n : EmptyObject;\ntype ModelStorageRelationsSection<T> =\n ExtractModelStorageRelations<T> extends Record<string, StorageRelationSpec>\n ? keyof ExtractModelStorageRelations<T> extends never\n ? EmptyObject\n : { readonly relations: ExtractModelStorageRelations<T> }\n : EmptyObject;\ntype RootModelCollection<T> =\n ExtractModelCollection<T> extends string\n ? ExtractModelOwner<T> extends undefined\n ? ExtractModelBase<T> extends undefined\n ? ExtractModelCollection<T>\n : never\n : never\n : never;\ntype RootModelName<T> = RootModelCollection<T> extends never ? never : ExtractModelName<T>;\ntype CollectionName<T> =\n ExtractModelCollection<T> extends string ? ExtractModelCollection<T> : never;\n\ntype ModelNameInput = string | AnyModelBuilder;\ntype ValueObjectNameInput = string | AnyValueObjectBuilder;\ntype RelationTargetFieldsInput<TargetName extends string> =\n | StringListInput\n | FieldReference<TargetName, string>\n | readonly FieldReference<TargetName, string>[];\n\ntype NormalizeModelName<T> = T extends string ? T : ExtractModelName<T>;\n\ntype NormalizeModelNameOrUndefined<T> = [T] extends [undefined]\n ? undefined\n : NormalizeModelName<Present<T>>;\n\ntype NormalizeValueObjectName<T> = T extends string ? T : ExtractValueObjectName<T>;\n\ntype NormalizeStringList<T> = T extends readonly string[]\n ? T\n : T extends string\n ? readonly [T]\n : readonly string[];\n\ntype NormalizeTargetFieldList<T> = T extends readonly AnyFieldReference[]\n ? {\n readonly [K in keyof T]: ExtractFieldReferenceName<T[K]>;\n }\n : T extends AnyFieldReference\n ? readonly [ExtractFieldReferenceName<T>]\n : NormalizeStringList<T>;\n\ntype ContractFieldFromBuilder<TBuilder> =\n TBuilder extends FieldBuilder<\n infer Type extends ContractFieldType,\n infer Nullable extends boolean,\n infer Many extends boolean\n >\n ? Simplify<\n {\n readonly type: Type;\n readonly nullable: Nullable;\n } & (Many extends true ? { readonly many: true } : EmptyObject)\n >\n : never;\n\ntype ContractFieldsFromRecord<Fields extends Record<string, AnyFieldBuilder>> = Simplify<{\n readonly [K in keyof Fields]: ContractFieldFromBuilder<Fields[K]>;\n}>;\n\ntype ContractValueObjectFromBuilder<TBuilder> =\n TBuilder extends ValueObjectBuilder<string, infer Fields extends Record<string, AnyFieldBuilder>>\n ? Simplify<{\n readonly fields: ContractFieldsFromRecord<Fields>;\n }>\n : never;\n\ntype ContractValueObjectsFromRecord<ValueObjects extends Record<string, AnyValueObjectBuilder>> =\n Simplify<{\n readonly [K in keyof ValueObjects as ExtractValueObjectName<\n ValueObjects[K]\n >]: ContractValueObjectFromBuilder<ValueObjects[K]>;\n }>;\n\ntype ContractRelationFromBuilder<TBuilder> =\n TBuilder extends RelationBuilder<\n infer To extends string,\n infer Cardinality extends '1:1' | '1:N' | 'N:1',\n infer On extends RelationOn | undefined\n >\n ? On extends RelationOn\n ? {\n readonly to: To;\n readonly cardinality: Cardinality;\n readonly on: On;\n }\n : {\n readonly to: To;\n readonly cardinality: Cardinality;\n }\n : never;\n\ntype ContractRelationsFromRecord<Relations extends Record<string, AnyRelationBuilder>> =\n keyof Relations extends never\n ? Record<string, never>\n : Simplify<{\n readonly [K in keyof Relations]: ContractRelationFromBuilder<Relations[K]>;\n }>;\n\ntype ContractModelStorageFromBuilder<TBuilder> = ModelStorageSection<TBuilder> &\n ModelStorageRelationsSection<TBuilder>;\n\ntype MaybeOwner<Owner> = [Owner] extends [undefined]\n ? EmptyObject\n : { readonly owner: Owner & string };\ntype MaybeBase<Base> = [Base] extends [undefined] ? EmptyObject : { readonly base: Base & string };\ntype MaybeDiscriminator<Discriminator> = [Discriminator] extends [undefined]\n ? EmptyObject\n : { readonly discriminator: Discriminator & { readonly field: string } };\ntype MaybeVariants<Variants> = [Variants] extends [undefined]\n ? EmptyObject\n : { readonly variants: Variants };\n\ntype ContractModelFromBuilder<TBuilder> =\n TBuilder extends NamedModelBuilder<\n string,\n infer Fields extends Record<string, AnyFieldBuilder>,\n infer Relations extends Record<string, AnyRelationBuilder>,\n string | undefined,\n infer Owner,\n infer Base,\n Record<string, StorageRelationSpec> | undefined,\n infer Discriminator,\n infer Variants\n >\n ? Simplify<\n {\n readonly fields: ContractFieldsFromRecord<Fields>;\n readonly relations: ContractRelationsFromRecord<Relations>;\n readonly storage: ContractModelStorageFromBuilder<TBuilder>;\n } & MaybeOwner<Owner> &\n MaybeBase<Base> &\n MaybeDiscriminator<Discriminator> &\n MaybeVariants<Variants>\n >\n : never;\n\ntype ContractModelsFromRecord<Models extends Record<string, AnyModelBuilder>> = Simplify<{\n readonly [K in keyof Models as ExtractModelName<Models[K]>]: ContractModelFromBuilder<Models[K]>;\n}>;\n\ntype DerivedRootModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{\n readonly [K in keyof Models as RootModelCollection<Models[K]>]: RootModelName<Models[K]>;\n}>;\n\ntype StorageCollectionsFromModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{\n readonly [K in keyof Models as CollectionName<Models[K]>]: MongoStorageCollection;\n}>;\n\ntype NormalizeRoots<Roots extends Record<string, ModelNameInput>> = Simplify<{\n readonly [K in keyof Roots]: NormalizeModelName<Roots[K]>;\n}>;\n\ntype DefinitionModels<Definition> = Definition extends {\n readonly models?: infer Models extends Record<string, AnyModelBuilder>;\n}\n ? Models\n : Record<never, never>;\n\ntype DefinitionValueObjects<Definition> = Definition extends {\n readonly valueObjects?: infer ValueObjects extends Record<string, AnyValueObjectBuilder>;\n}\n ? ValueObjects\n : Record<never, never>;\n\ntype DefinitionRoots<Definition> = Definition extends {\n readonly roots?: infer Roots extends Record<string, ModelNameInput>;\n}\n ? NormalizeRoots<Roots>\n : DerivedRootModels<DefinitionModels<Definition>>;\n\ntype DefinitionCapabilities<Definition> = Definition extends {\n readonly capabilities?: infer Capabilities extends ContractCapabilities;\n}\n ? Capabilities\n : Record<never, never>;\n\ntype DefinitionExtensionPacks<Definition> = Definition extends {\n readonly extensionPacks?: infer ExtensionPacks extends Record<\n string,\n ExtensionPackRef<string, string>\n >;\n}\n ? ExtensionPacks\n : Record<never, never>;\n\ntype DefinitionFamilyId<Definition> = Definition extends {\n readonly family: FamilyPackRef<infer FamilyId>;\n}\n ? FamilyId\n : string;\n\ntype DefinitionTargetId<Definition> = Definition extends {\n readonly target: TargetPackRef<string, infer TargetId>;\n}\n ? TargetId\n : string;\n\ntype DefinitionStorage<Definition> = Simplify<\n MongoStorage & {\n readonly collections: StorageCollectionsFromModels<DefinitionModels<Definition>>;\n readonly storageHash: StorageHashBase<string>;\n }\n>;\n\ntype MaybeValueObjectsSection<ValueObjects extends Record<string, AnyValueObjectBuilder>> =\n keyof ValueObjects extends never\n ? EmptyObject\n : {\n readonly valueObjects: ContractValueObjectsFromRecord<ValueObjects>;\n };\n\ntype MongoContractBaseFromDefinition<Definition> = Simplify<\n {\n readonly target: DefinitionTargetId<Definition>;\n readonly targetFamily: DefinitionFamilyId<Definition>;\n readonly roots: DefinitionRoots<Definition>;\n readonly models: ContractModelsFromRecord<DefinitionModels<Definition>>;\n readonly storage: DefinitionStorage<Definition>;\n readonly capabilities: DefinitionCapabilities<Definition>;\n readonly extensionPacks: DefinitionExtensionPacks<Definition>;\n readonly profileHash: ProfileHashBase<string>;\n readonly meta: Record<string, never>;\n } & MaybeValueObjectsSection<DefinitionValueObjects<Definition>>\n>;\n\ntype CodecTypesFromDefinition<Definition> = MongoCodecTypes &\n MergeExtensionCodecTypesSafe<DefinitionExtensionPacks<Definition>>;\n\nexport type MongoContractResult<Definition> = MongoContractWithTypeMaps<\n MongoContractBaseFromDefinition<Definition>,\n MongoTypeMaps<CodecTypesFromDefinition<Definition>>\n>;\n\ntype ContractAuthoringHelpers = {\n readonly field: typeof field;\n readonly index: typeof index;\n readonly model: typeof model;\n readonly rel: typeof rel;\n readonly valueObject: typeof valueObject;\n};\n\nexport type ContractScaffold<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<string, string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,\n Capabilities extends ContractCapabilities | undefined = undefined,\n Roots extends Record<string, ModelNameInput> | undefined = undefined,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n readonly capabilities?: Capabilities;\n readonly roots?: Roots;\n};\n\nexport type ContractDefinition<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<string, string>,\n Models extends Record<string, AnyModelBuilder> = Record<never, never>,\n ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>,\n ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,\n Capabilities extends ContractCapabilities | undefined = undefined,\n Roots extends Record<string, ModelNameInput> | undefined = undefined,\n> = ContractScaffold<Family, Target, ExtensionPacks, Capabilities, Roots> & {\n readonly models?: Models;\n readonly valueObjects?: ValueObjects;\n};\n\nexport type ContractFactory<\n Models extends Record<string, AnyModelBuilder> = Record<never, never>,\n ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>,\n Roots extends Record<string, ModelNameInput> | undefined = undefined,\n> = (helpers: ContractAuthoringHelpers) => {\n readonly models?: Models;\n readonly valueObjects?: ValueObjects;\n readonly roots?: Roots;\n};\n\ntype FieldBuilderSpec<\n Type extends ContractFieldType,\n Nullable extends boolean,\n Many extends boolean,\n> = {\n readonly type: Type;\n readonly nullable: Nullable;\n readonly many: Many;\n};\n\nfunction createFieldBuilder<\n Type extends ContractFieldType,\n Nullable extends boolean,\n Many extends boolean,\n>(spec: FieldBuilderSpec<Type, Nullable, Many>): FieldBuilder<Type, Nullable, Many> {\n return {\n __kind: 'field',\n __type: spec.type,\n __nullable: spec.nullable,\n __many: spec.many,\n optional() {\n return createFieldBuilder<Type, true, Many>({\n type: spec.type,\n nullable: true,\n many: spec.many,\n });\n },\n many() {\n return createFieldBuilder<Type, Nullable, true>({\n type: spec.type,\n nullable: spec.nullable,\n many: true,\n });\n },\n };\n}\n\nfunction normalizeOptionalTypeParams(\n typeParams: Record<string, unknown> | undefined,\n): { readonly typeParams: Record<string, unknown> } | Record<never, never> {\n if (!typeParams) {\n return {};\n }\n\n return { typeParams };\n}\n\nfunction createScalarFieldBuilder<\n CodecId extends string,\n TypeParams extends Record<string, unknown> | undefined = undefined,\n>(\n codecId: CodecId,\n options?: { readonly typeParams?: TypeParams },\n): FieldBuilder<\n {\n readonly kind: 'scalar';\n readonly codecId: CodecId;\n } & ([TypeParams] extends [undefined] ? EmptyObject : { readonly typeParams: TypeParams }),\n false,\n false\n> {\n return createFieldBuilder({\n type: {\n kind: 'scalar',\n codecId,\n ...normalizeOptionalTypeParams(options?.typeParams),\n } as {\n readonly kind: 'scalar';\n readonly codecId: CodecId;\n } & ([TypeParams] extends [undefined] ? EmptyObject : { readonly typeParams: TypeParams }),\n nullable: false,\n many: false,\n });\n}\n\nexport const field = {\n scalar: createScalarFieldBuilder,\n objectId() {\n return createScalarFieldBuilder('mongo/objectId@1');\n },\n string() {\n return createScalarFieldBuilder('mongo/string@1');\n },\n double() {\n return createScalarFieldBuilder('mongo/double@1');\n },\n int32() {\n return createScalarFieldBuilder('mongo/int32@1');\n },\n bool() {\n return createScalarFieldBuilder('mongo/bool@1');\n },\n date() {\n return createScalarFieldBuilder('mongo/date@1');\n },\n vector<const TypeParams extends Record<string, unknown> | undefined = undefined>(options?: {\n readonly typeParams?: TypeParams;\n }) {\n return createScalarFieldBuilder('mongo/vector@1', options);\n },\n valueObject<const ValueObject extends ValueObjectNameInput>(valueObjectName: ValueObject) {\n return createFieldBuilder({\n type: {\n kind: 'valueObject',\n name: resolveValueObjectName(valueObjectName),\n } as {\n readonly kind: 'valueObject';\n readonly name: NormalizeValueObjectName<ValueObject>;\n },\n nullable: false,\n many: false,\n });\n },\n} as const;\n\nexport function index<const Fields extends MongoIndexFields>(\n fields: Fields,\n): {\n readonly fields: Fields;\n};\nexport function index<const Fields extends MongoIndexFields, const Options>(\n fields: Fields,\n options: StrictShape<Options, MongoIndexOptions>,\n): {\n readonly fields: Fields;\n readonly options: Options & MongoIndexOptions;\n};\nexport function index(\n fields: MongoIndexFields,\n options?: MongoIndexOptions,\n): {\n readonly fields: MongoIndexFields;\n readonly options?: MongoIndexOptions;\n} {\n return {\n fields,\n ...(options ? { options } : {}),\n };\n}\n\nfunction createFieldReference<const ModelName extends string, const FieldName extends string>(\n modelName: ModelName,\n fieldName: FieldName,\n): FieldReference<ModelName, FieldName> {\n return {\n __kind: 'fieldRef',\n modelName,\n fieldName,\n };\n}\n\nfunction isFieldReference(value: unknown): value is FieldReference<string, string> {\n return (\n typeof value === 'object' && value !== null && '__kind' in value && value.__kind === 'fieldRef'\n );\n}\n\nfunction resolveModelName(value: ModelNameInput): string {\n return typeof value === 'string' ? value : value.__name;\n}\n\nfunction resolveValueObjectName(value: ValueObjectNameInput): string {\n return typeof value === 'string' ? value : value.__name;\n}\n\nfunction normalizeStringList(value: StringListInput): readonly string[] {\n return typeof value === 'string' ? [value] : [...value];\n}\n\nfunction normalizeTargetField(\n targetModelName: string,\n value: string | FieldReference<string, string>,\n): string {\n if (!isFieldReference(value)) {\n return value;\n }\n\n if (value.modelName !== targetModelName) {\n throw new Error(\n `Relation target \"${targetModelName}\" cannot reference field \"${value.modelName}.${value.fieldName}\".`,\n );\n }\n\n return value.fieldName;\n}\n\nfunction normalizeTargetFields(\n targetModelName: string,\n value: RelationTargetFieldsInput<string>,\n): readonly string[] {\n if (typeof value === 'string') {\n return [value];\n }\n\n if (isFieldReference(value)) {\n return [normalizeTargetField(targetModelName, value)];\n }\n\n return value.map((entry) => normalizeTargetField(targetModelName, entry));\n}\n\ntype ReferenceOptions<\n Target extends ModelNameInput,\n From extends StringListInput,\n To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n> = {\n readonly from: From;\n readonly to: To;\n};\n\ntype RelationOnFromOptions<\n From extends StringListInput,\n To extends RelationTargetFieldsInput<string>,\n> = {\n readonly localFields: NormalizeStringList<From>;\n readonly targetFields: NormalizeTargetFieldList<To>;\n};\n\nfunction createRelationBuilder<\n To extends string,\n Cardinality extends '1:1' | '1:N' | 'N:1',\n On extends RelationOn | undefined,\n>(spec: {\n readonly to: To;\n readonly cardinality: Cardinality;\n readonly on: On;\n}): RelationBuilder<To, Cardinality, On> {\n return {\n __kind: 'relation',\n __to: spec.to,\n __cardinality: spec.cardinality,\n __on: spec.on,\n };\n}\n\nfunction createReferenceRelationBuilder<\n Target extends ModelNameInput,\n Cardinality extends '1:1' | '1:N' | 'N:1',\n From extends StringListInput,\n To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n>(\n target: Target,\n cardinality: Cardinality,\n options: ReferenceOptions<Target, From, To>,\n): RelationBuilder<NormalizeModelName<Target>, Cardinality, RelationOnFromOptions<From, To>> {\n const targetModelName = resolveModelName(target);\n\n return createRelationBuilder({\n to: targetModelName as NormalizeModelName<Target>,\n cardinality,\n on: {\n localFields: normalizeStringList(options.from) as NormalizeStringList<From>,\n targetFields: normalizeTargetFields(\n targetModelName,\n options.to,\n ) as NormalizeTargetFieldList<To>,\n },\n });\n}\n\nfunction createEmbedRelationBuilder<\n Target extends ModelNameInput,\n Cardinality extends '1:1' | '1:N',\n>(\n target: Target,\n cardinality: Cardinality,\n): RelationBuilder<NormalizeModelName<Target>, Cardinality, undefined> {\n return createRelationBuilder({\n to: resolveModelName(target) as NormalizeModelName<Target>,\n cardinality,\n on: undefined,\n });\n}\n\nfunction hasOne<const Target extends ModelNameInput>(\n target: Target,\n): RelationBuilder<NormalizeModelName<Target>, '1:1', undefined>;\nfunction hasOne<\n const Target extends ModelNameInput,\n const From extends StringListInput,\n const To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n>(\n target: Target,\n options: ReferenceOptions<Target, From, To>,\n): RelationBuilder<NormalizeModelName<Target>, '1:1', RelationOnFromOptions<From, To>>;\nfunction hasOne(\n target: ModelNameInput,\n options?: ReferenceOptions<ModelNameInput, StringListInput, RelationTargetFieldsInput<string>>,\n) {\n if (!options) {\n return createEmbedRelationBuilder(target, '1:1');\n }\n\n return createReferenceRelationBuilder(target, '1:1', options);\n}\n\nfunction hasMany<const Target extends ModelNameInput>(\n target: Target,\n): RelationBuilder<NormalizeModelName<Target>, '1:N', undefined>;\nfunction hasMany<\n const Target extends ModelNameInput,\n const From extends StringListInput,\n const To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n>(\n target: Target,\n options: ReferenceOptions<Target, From, To>,\n): RelationBuilder<NormalizeModelName<Target>, '1:N', RelationOnFromOptions<From, To>>;\nfunction hasMany(\n target: ModelNameInput,\n options?: ReferenceOptions<ModelNameInput, StringListInput, RelationTargetFieldsInput<string>>,\n) {\n if (!options) {\n return createEmbedRelationBuilder(target, '1:N');\n }\n\n return createReferenceRelationBuilder(target, '1:N', options);\n}\n\nfunction belongsTo<\n const Target extends ModelNameInput,\n const From extends StringListInput,\n const To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n>(\n target: Target,\n options: ReferenceOptions<Target, From, To>,\n): RelationBuilder<NormalizeModelName<Target>, 'N:1', RelationOnFromOptions<From, To>> {\n return createReferenceRelationBuilder(target, 'N:1', options);\n}\n\nexport const rel = {\n belongsTo,\n hasMany,\n hasOne,\n} as const;\n\ntype ValueObjectInput<Fields extends Record<string, AnyFieldBuilder>> = {\n readonly fields: Fields;\n};\n\nexport function valueObject<\n const Name extends string,\n const Fields extends Record<string, AnyFieldBuilder>,\n>(name: Name, input: ValueObjectInput<Fields>): ValueObjectBuilder<Name, Fields> {\n return {\n __kind: 'valueObject',\n __name: name,\n __fields: input.fields,\n };\n}\n\ntype ModelDiscriminatorInput<Variants extends Record<string, VariantSpec>> = {\n readonly field: string;\n readonly variants: Variants;\n};\n\ntype ModelInput<\n Fields extends Record<string, AnyFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> | undefined,\n Collection extends string | undefined,\n Indexes extends readonly MongoIndex[] | undefined,\n CollectionOptions,\n Owner extends ModelNameInput | undefined,\n Base extends ModelNameInput | undefined,\n StorageRelations extends Record<string, StorageRelationSpec> | undefined,\n Discriminator extends ModelDiscriminatorInput<Record<string, VariantSpec>> | undefined,\n> = {\n readonly collection?: Collection;\n readonly indexes?: Indexes;\n readonly collectionOptions?: StrictShape<CollectionOptions, MongoCollectionOptions>;\n readonly storageRelations?: StorageRelations;\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly owner?: Owner;\n readonly base?: Base;\n readonly discriminator?: Discriminator;\n};\n\nexport function model<\n const Name extends string,\n const Fields extends Record<string, AnyFieldBuilder>,\n const Relations extends Record<string, AnyRelationBuilder> | undefined = undefined,\n const Collection extends string | undefined = undefined,\n const Indexes extends readonly MongoIndex[] | undefined = undefined,\n const CollectionOptions = undefined,\n const Owner extends ModelNameInput | undefined = undefined,\n const Base extends ModelNameInput | undefined = undefined,\n const StorageRelations extends Record<string, StorageRelationSpec> | undefined = undefined,\n const Discriminator extends\n | ModelDiscriminatorInput<Record<string, VariantSpec>>\n | undefined = undefined,\n>(\n name: Name,\n input: ModelInput<\n Fields,\n Relations,\n Collection,\n Indexes,\n CollectionOptions,\n Owner,\n Base,\n StorageRelations,\n Discriminator\n >,\n): ModelBuilder<\n Name,\n Fields,\n Relations extends Record<string, AnyRelationBuilder> ? Relations : Record<never, never>,\n Collection,\n NormalizeModelNameOrUndefined<Owner>,\n NormalizeModelNameOrUndefined<Base>,\n StorageRelations,\n Discriminator extends { readonly field: infer Field extends string }\n ? { readonly field: Field }\n : undefined,\n Discriminator extends { readonly variants: infer Variants extends Record<string, VariantSpec> }\n ? Variants\n : undefined\n> {\n return {\n __kind: 'model',\n __name: name,\n __fields: input.fields,\n __relations: (input.relations ?? {}) as Relations extends Record<string, AnyRelationBuilder>\n ? Relations\n : Record<never, never>,\n __indexes: input.indexes,\n __collectionOptions: input.collectionOptions,\n __collection: input.collection as Collection,\n __owner: (input.owner\n ? resolveModelName(input.owner)\n : undefined) as NormalizeModelNameOrUndefined<Owner>,\n __base: (input.base\n ? resolveModelName(input.base)\n : undefined) as NormalizeModelNameOrUndefined<Base>,\n __storageRelations: input.storageRelations as StorageRelations,\n __discriminator: (input.discriminator\n ? { field: input.discriminator.field }\n : undefined) as Discriminator extends { readonly field: infer Field extends string }\n ? { readonly field: Field }\n : undefined,\n __variants: input.discriminator?.variants as Discriminator extends {\n readonly variants: infer Variants extends Record<string, VariantSpec>;\n }\n ? Variants\n : undefined,\n ref(fieldName) {\n return createFieldReference(name, fieldName);\n },\n };\n}\n\nfunction validateTargetPackRef(\n family: FamilyPackRef<string>,\n target: TargetPackRef<string, string>,\n): void {\n if (family.familyId !== 'mongo') {\n throw new Error(\n `defineContract only accepts Mongo family packs. Received family \"${family.familyId}\".`,\n );\n }\n\n if (target.familyId !== family.familyId) {\n throw new Error(\n `target pack \"${target.id}\" targets family \"${target.familyId}\" but contract family is \"${family.familyId}\".`,\n );\n }\n}\n\nfunction validateExtensionPackRefs(\n target: TargetPackRef<string, string>,\n extensionPacks?: Record<string, ExtensionPackRef<string, string>>,\n): void {\n if (!extensionPacks) {\n return;\n }\n\n for (const packRef of Object.values(extensionPacks)) {\n if (packRef.kind !== 'extension') {\n throw new Error(\n `defineContract only accepts extension pack refs in extensionPacks. Received kind \"${packRef.kind}\".`,\n );\n }\n\n if (packRef.familyId !== target.familyId) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets family \"${packRef.familyId}\" but contract target family is \"${target.familyId}\".`,\n );\n }\n\n if (packRef.targetId && packRef.targetId !== target.targetId) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets \"${packRef.targetId}\" but contract target is \"${target.targetId}\".`,\n );\n }\n }\n}\n\nfunction isContractScaffold(\n value: unknown,\n): value is ContractScaffold<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n return 'family' in value && 'target' in value;\n}\n\nfunction buildContractField(builder: AnyFieldBuilder): ContractField {\n return builder.__many\n ? {\n type: builder.__type,\n nullable: builder.__nullable,\n many: true,\n }\n : {\n type: builder.__type,\n nullable: builder.__nullable,\n };\n}\n\nfunction buildFields(fields: Record<string, AnyFieldBuilder>): Record<string, ContractField> {\n const builtFields: Record<string, ContractField> = {};\n\n for (const [fieldName, fieldBuilder] of Object.entries(fields)) {\n builtFields[fieldName] = buildContractField(fieldBuilder);\n }\n\n return builtFields;\n}\n\nfunction buildRelation(\n relationBuilder: AnyRelationBuilder,\n): ContractEmbedRelation | ContractReferenceRelation {\n return relationBuilder.__on\n ? {\n to: relationBuilder.__to,\n cardinality: relationBuilder.__cardinality,\n on: relationBuilder.__on,\n }\n : {\n to: relationBuilder.__to,\n cardinality: relationBuilder.__cardinality,\n };\n}\n\nfunction buildRelations(\n relations: Record<string, AnyRelationBuilder>,\n): Record<string, ContractEmbedRelation | ContractReferenceRelation> {\n const builtRelations: Record<string, ContractEmbedRelation | ContractReferenceRelation> = {};\n\n for (const [relationName, relationBuilder] of Object.entries(relations)) {\n builtRelations[relationName] = buildRelation(relationBuilder);\n }\n\n return builtRelations;\n}\n\nfunction buildValueObjects(\n valueObjects: Record<string, AnyValueObjectBuilder> | undefined,\n): Record<string, ContractValueObject> {\n const builtValueObjects: Record<string, ContractValueObject> = {};\n\n for (const valueObjectBuilder of Object.values(valueObjects ?? {})) {\n if (valueObjectBuilder.__name in builtValueObjects) {\n throw new Error(\n `Duplicate value object name \"${valueObjectBuilder.__name}\" in defineContract().`,\n );\n }\n\n builtValueObjects[valueObjectBuilder.__name] = {\n fields: buildFields(valueObjectBuilder.__fields),\n };\n }\n\n return builtValueObjects;\n}\n\nfunction buildModels(\n models: Record<string, AnyModelBuilder> | undefined,\n): Record<string, MongoContract['models'][string]> {\n const builtModels: Record<string, MongoContract['models'][string]> = {};\n\n for (const modelBuilder of Object.values(models ?? {})) {\n if (modelBuilder.__name in builtModels) {\n throw new Error(`Duplicate model name \"${modelBuilder.__name}\" in defineContract().`);\n }\n\n const storage = {\n ...(modelBuilder.__collection ? { collection: modelBuilder.__collection } : {}),\n ...(modelBuilder.__storageRelations ? { relations: modelBuilder.__storageRelations } : {}),\n };\n\n builtModels[modelBuilder.__name] = {\n fields: buildFields(modelBuilder.__fields),\n relations: buildRelations(modelBuilder.__relations),\n storage,\n ...(modelBuilder.__owner ? { owner: modelBuilder.__owner } : {}),\n ...(modelBuilder.__base ? { base: modelBuilder.__base } : {}),\n ...(modelBuilder.__discriminator ? { discriminator: modelBuilder.__discriminator } : {}),\n ...(modelBuilder.__variants ? { variants: modelBuilder.__variants } : {}),\n };\n }\n\n return builtModels;\n}\n\nfunction deriveRoots(models: Record<string, AnyModelBuilder> | undefined): Record<string, string> {\n const roots: Record<string, string> = {};\n\n for (const modelBuilder of Object.values(models ?? {})) {\n if (!modelBuilder.__collection || modelBuilder.__owner || modelBuilder.__base) {\n continue;\n }\n\n roots[modelBuilder.__collection] = modelBuilder.__name;\n }\n\n return roots;\n}\n\nfunction normalizeRoots(roots: Record<string, ModelNameInput> | undefined): Record<string, string> {\n const normalizedRoots: Record<string, string> = {};\n\n for (const [rootName, rootValue] of Object.entries(roots ?? {})) {\n normalizedRoots[rootName] = resolveModelName(rootValue);\n }\n\n return normalizedRoots;\n}\n\nfunction toStorageIndex(index: MongoIndex): MongoStorageIndex {\n const keys = Object.entries(index.fields).map(([field, direction]) => ({\n field,\n direction,\n }));\n const result: Record<string, unknown> = { keys };\n if (index.options) {\n for (const [key, value] of Object.entries(index.options)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n }\n return result as unknown as MongoStorageIndex;\n}\n\nfunction toStorageCollectionOptions(opts: MongoCollectionOptions): MongoStorageCollectionOptions {\n const result: Record<string, unknown> = {};\n if (opts.capped) {\n result['capped'] = { size: opts.size ?? 0, ...(opts.max != null ? { max: opts.max } : {}) };\n }\n if (opts.timeseries) result['timeseries'] = opts.timeseries;\n if (opts.collation) result['collation'] = opts.collation;\n if (opts.changeStreamPreAndPostImages)\n result['changeStreamPreAndPostImages'] = opts.changeStreamPreAndPostImages;\n if (opts.clusteredIndex) result['clusteredIndex'] = { name: opts.clusteredIndex.name };\n return result as unknown as MongoStorageCollectionOptions;\n}\n\nfunction findMissingIndexField(\n index: MongoIndex,\n modelFields: Record<string, unknown>,\n): string | undefined {\n for (const fieldName of Object.keys(index.fields)) {\n const wildcardMatch = fieldName.match(/^(.+)\\.\\$\\*\\*$/);\n const lookupName = wildcardMatch ? wildcardMatch[1] : fieldName;\n if (lookupName === undefined || lookupName.length === 0) continue;\n if (lookupName === '$**') continue;\n if (!Object.hasOwn(modelFields, lookupName)) {\n return lookupName;\n }\n }\n return undefined;\n}\n\nfunction resolveVariantScope(\n modelBuilder: AnyModelBuilder,\n modelsByName: Record<string, AnyModelBuilder>,\n): { discriminatorField: string; discriminatorValue: string } | undefined {\n if (!modelBuilder.__base) return undefined;\n const baseBuilder = modelsByName[modelBuilder.__base];\n if (!baseBuilder) return undefined;\n const discriminatorField = baseBuilder.__discriminator?.field;\n const variantValue = baseBuilder.__variants?.[modelBuilder.__name]?.value;\n if (!discriminatorField || variantValue === undefined) return undefined;\n return { discriminatorField, discriminatorValue: variantValue };\n}\n\nfunction scopeVariantIndex(\n storageIndex: MongoStorageIndex,\n scope: { discriminatorField: string; discriminatorValue: string },\n variantName: string,\n authoredIndex: MongoIndex | undefined,\n): MongoStorageIndex {\n const result = applyPolymorphicScopeToMongoIndex(storageIndex, scope);\n if (result.kind === 'conflict') {\n const indexLabel = authoredIndex ? canonicalStringify(authoredIndex) : '<unknown>';\n throw new Error(\n `Variant model \"${variantName}\" index ${indexLabel} conflicts with discriminator scope: ${result.reason}`,\n );\n }\n return result.index;\n}\n\nfunction buildCollections(\n models: Record<string, AnyModelBuilder> | undefined,\n): Record<string, MongoStorageCollection> {\n const collections: Record<string, MongoStorageCollection> = {};\n const declaredIndexOwners = new Map<string, string>();\n const modelMap = models ?? {};\n const modelsByName: Record<string, AnyModelBuilder> = {};\n for (const builder of Object.values(modelMap)) {\n modelsByName[builder.__name] = builder;\n }\n\n for (const modelBuilder of Object.values(modelMap)) {\n if (!modelBuilder.__collection) {\n if (modelBuilder.__indexes && modelBuilder.__indexes.length > 0) {\n throw new Error(\n `Model \"${modelBuilder.__name}\" defines indexes but has no collection to attach them to.`,\n );\n }\n\n if (modelBuilder.__collectionOptions) {\n throw new Error(\n `Model \"${modelBuilder.__name}\" defines collectionOptions but has no collection to attach them to.`,\n );\n }\n\n continue;\n }\n\n const existingCollection = collections[modelBuilder.__collection] ?? {};\n const existingIndexes = existingCollection.indexes ?? [];\n\n if (existingCollection.options && modelBuilder.__collectionOptions) {\n throw new Error(\n `Collection \"${modelBuilder.__collection}\" has collectionOptions declared by multiple models. Author collectionOptions on a single model per collection.`,\n );\n }\n\n for (const collectionIndex of modelBuilder.__indexes ?? []) {\n const missingField = findMissingIndexField(collectionIndex, modelBuilder.__fields);\n if (missingField !== undefined) {\n const indexSignature = canonicalStringify(collectionIndex);\n throw new Error(\n `Model \"${modelBuilder.__name}\" index ${indexSignature} references unknown field \"${missingField}\".`,\n );\n }\n }\n\n const polymorphicScope = resolveVariantScope(modelBuilder, modelsByName);\n const rawStorageIndexes = (modelBuilder.__indexes ?? []).map(toStorageIndex);\n const storageIndexes = polymorphicScope\n ? rawStorageIndexes.map((idx, i) =>\n scopeVariantIndex(\n idx,\n polymorphicScope,\n modelBuilder.__name,\n modelBuilder.__indexes?.[i],\n ),\n )\n : rawStorageIndexes;\n\n // Dedup after scoping so sibling variants that authentically declare\n // identical raw indexes (e.g. Bug and Feature both index severity) do\n // not collide — their post-scoping storage indexes differ by\n // partialFilterExpression and are correctly distinct on MongoDB.\n for (let i = 0; i < storageIndexes.length; i++) {\n const storageIndex = storageIndexes[i];\n if (storageIndex === undefined) continue;\n const indexSignature = canonicalStringify(storageIndex);\n const collectionIndexKey = `${modelBuilder.__collection}:${indexSignature}`;\n const firstOwner = declaredIndexOwners.get(collectionIndexKey);\n if (firstOwner) {\n const authoredIndex = modelBuilder.__indexes?.[i];\n const reportedSignature = authoredIndex\n ? canonicalStringify(authoredIndex)\n : indexSignature;\n throw new Error(\n `Collection \"${modelBuilder.__collection}\" defines duplicate index ${reportedSignature}. First declared on model \"${firstOwner}\" and duplicated on model \"${modelBuilder.__name}\".`,\n );\n }\n declaredIndexOwners.set(collectionIndexKey, modelBuilder.__name);\n }\n const storageOptions = modelBuilder.__collectionOptions\n ? toStorageCollectionOptions(modelBuilder.__collectionOptions)\n : undefined;\n\n collections[modelBuilder.__collection] =\n storageIndexes.length > 0\n ? {\n ...existingCollection,\n indexes: [...existingIndexes, ...storageIndexes],\n ...(storageOptions ? { options: storageOptions } : {}),\n }\n : storageOptions\n ? {\n ...existingCollection,\n options: storageOptions,\n }\n : existingCollection;\n }\n\n return collections;\n}\n\nfunction buildContractFromDefinition<\n const Definition extends ContractDefinition<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n>(definition: Definition): MongoContractResult<Definition> {\n validateTargetPackRef(definition.family, definition.target);\n validateExtensionPackRefs(definition.target, definition.extensionPacks);\n\n const builtModels = buildModels(definition.models);\n const builtValueObjects = buildValueObjects(definition.valueObjects);\n const roots = definition.roots\n ? normalizeRoots(definition.roots)\n : deriveRoots(definition.models);\n const capabilities = definition.capabilities ?? {};\n const collections = buildCollections(definition.models);\n const storageBody = {\n collections,\n };\n\n const builtContract = {\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n roots,\n models: builtModels,\n ...(Object.keys(builtValueObjects).length > 0 ? { valueObjects: builtValueObjects } : {}),\n storage: {\n ...storageBody,\n storageHash: computeStorageHash({\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n storage: storageBody,\n }),\n },\n capabilities,\n extensionPacks: definition.extensionPacks ?? {},\n profileHash: computeProfileHash({\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n capabilities,\n }),\n meta: {},\n } satisfies MongoContract;\n\n validateMongoContract(builtContract);\n\n return builtContract as MongoContractResult<Definition>;\n}\n\nexport function defineContract<\n const Definition extends ContractDefinition<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n>(definition: Definition): MongoContractResult<Definition>;\nexport function defineContract<\n const Definition extends ContractScaffold<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n const Built extends {\n readonly models?: Record<string, AnyModelBuilder>;\n readonly valueObjects?: Record<string, AnyValueObjectBuilder>;\n readonly roots?: Record<string, ModelNameInput>;\n },\n>(\n definition: Definition,\n factory: (_helpers: ContractAuthoringHelpers) => Built,\n): MongoContractResult<Definition & Built>;\nexport function defineContract(\n definition: ContractScaffold<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n factory?: ContractFactory<\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ModelNameInput> | undefined\n >,\n) {\n if (!isContractScaffold(definition)) {\n throw new TypeError(\n 'defineContract expects a contract definition object. Define your contract with defineContract({ family, target, models, ... }).',\n );\n }\n\n if (!factory) {\n return buildContractFromDefinition(definition);\n }\n\n return buildContractFromDefinition({\n ...definition,\n ...factory({ field, index, model, rel, valueObject }),\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"contract-builder.mjs","names":[],"sources":["../src/contract-builder.ts"],"sourcesContent":["import { computeProfileHash, computeStorageHash } from '@prisma-next/contract/hashing';\nimport type {\n ContractEmbedRelation,\n ContractField,\n ContractFieldType,\n ContractReferenceRelation,\n ContractValueObject,\n ProfileHashBase,\n StorageHashBase,\n} from '@prisma-next/contract/types';\nimport {\n createEntityHelpersFromNamespace,\n type EntityHelpersFromNamespace,\n type ExtractAuthoringNamespaceFromPack,\n type MergeExtensionAuthoringNamespaces,\n} from '@prisma-next/contract-authoring';\nimport type { AuthoringEntityTypeNamespace } from '@prisma-next/framework-components/authoring';\nimport {\n assertNoCrossRegistryCollisions,\n isAuthoringEntityTypeDescriptor,\n mergeAuthoringNamespaces,\n} from '@prisma-next/framework-components/authoring';\nimport type {\n ExtensionPackRef,\n FamilyPackRef,\n TargetPackRef,\n} from '@prisma-next/framework-components/components';\nimport {\n applyPolymorphicScopeToMongoIndex,\n MongoCollection,\n type MongoCollectionInput,\n MongoCollectionOptions,\n type MongoCollectionOptionsAuthoringInput,\n type MongoCollectionOptionsInput,\n type MongoContract,\n type MongoContractWithTypeMaps,\n MongoIndex,\n type MongoIndexAuthoringInput,\n type MongoIndexFields,\n type MongoIndexInput,\n type MongoIndexOptionsInput,\n type MongoStorageShape,\n type MongoTypeMaps,\n} from '@prisma-next/mongo-contract';\nimport { canonicalStringify } from '@prisma-next/utils/canonical-stringify';\n\n// `canonicalStringify` rejects non-plain objects so a `Map` or class\n// instance cannot silently collapse to `{}`. The storage-shape values\n// produced by `toStorageIndex` post-M2-R2 are `MongoIndex` class\n// instances (see ADR for the storage-map class flip / FR18), which\n// trips that guard. This local helper produces the same key-sorted,\n// JSON-like representation `canonicalStringify` produces for plain\n// objects, but accepts class instances by reading their enumerable\n// properties via `Object.entries`. The output is only used as an\n// in-memory dedup signature for collection indexes; it never leaves\n// the builder.\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`;\n }\n\n if (value && typeof value === 'object') {\n return `{${Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`)\n .join(',')}}`;\n }\n\n return JSON.stringify(value);\n}\n\ntype VariantSpec = {\n readonly value: string;\n};\n\ntype StorageRelationSpec = {\n readonly field: string;\n};\n\ntype ContractCapabilities = Record<string, Record<string, boolean>>;\ntype StringListInput = string | readonly string[];\ntype Present<T> = Exclude<T, undefined>;\ntype EmptyObject = Record<never, never>;\ntype Simplify<T> = { [K in keyof T]: T[K] } & EmptyObject;\ntype StrictShape<Actual, Shape> = Actual &\n Shape &\n Record<Exclude<keyof Actual, keyof Shape>, never>;\n\ntype UnionToIntersection<Union> = (Union extends unknown ? (value: Union) => void : never) extends (\n value: infer Intersection,\n) => void\n ? Intersection\n : never;\n\nexport type ExtractCodecTypesFromPack<P> = P extends { __codecTypes?: infer CodecTypes }\n ? CodecTypes extends Record<string, { output: unknown }>\n ? CodecTypes\n : Record<string, never>\n : Record<string, never>;\n\n// This mirrors @prisma-next/target-mongo/codec-types because authoring must stay decoupled from\n// the target layer while still exposing the built-in Mongo codec registry to type inference.\ntype MongoCodecTypes = {\n readonly 'mongo/objectId@1': { readonly input: string; readonly output: string };\n readonly 'mongo/string@1': { readonly input: string; readonly output: string };\n readonly 'mongo/double@1': { readonly input: number; readonly output: number };\n readonly 'mongo/int32@1': { readonly input: number; readonly output: number };\n readonly 'mongo/bool@1': { readonly input: boolean; readonly output: boolean };\n readonly 'mongo/date@1': { readonly input: Date; readonly output: Date };\n readonly 'mongo/vector@1': {\n readonly input: readonly number[];\n readonly output: readonly number[];\n };\n};\n\ntype MergeExtensionCodecTypes<Packs extends Record<string, unknown>> = UnionToIntersection<\n {\n [K in keyof Packs]: ExtractCodecTypesFromPack<Packs[K]>;\n }[keyof Packs]\n>;\n\ntype MergeExtensionCodecTypesSafe<Packs> =\n Packs extends Record<string, unknown>\n ? keyof Packs extends never\n ? Record<string, never>\n : MergeExtensionCodecTypes<Packs>\n : Record<string, never>;\n\nexport interface FieldBuilder<\n Type extends ContractFieldType = ContractFieldType,\n Nullable extends boolean = boolean,\n Many extends boolean = boolean,\n> {\n readonly __kind: 'field';\n readonly __type: Type;\n readonly __nullable: Nullable;\n readonly __many: Many;\n optional(): FieldBuilder<Type, true, Many>;\n many(): FieldBuilder<Type, Nullable, true>;\n}\n\nexport interface ValueObjectBuilder<\n Name extends string = string,\n Fields extends Record<string, FieldBuilder> = Record<string, FieldBuilder>,\n> {\n readonly __kind: 'valueObject';\n readonly __name: Name;\n readonly __fields: Fields;\n}\n\nexport interface FieldReference<\n ModelName extends string = string,\n FieldName extends string = string,\n> {\n readonly __kind: 'fieldRef';\n readonly modelName: ModelName;\n readonly fieldName: FieldName;\n}\n\nexport interface RelationOn<\n LocalFields extends readonly string[] = readonly string[],\n TargetFields extends readonly string[] = readonly string[],\n> {\n readonly localFields: LocalFields;\n readonly targetFields: TargetFields;\n}\n\nexport interface RelationBuilder<\n To extends string = string,\n Cardinality extends '1:1' | '1:N' | 'N:1' = '1:1' | '1:N' | 'N:1',\n On extends RelationOn | undefined = RelationOn | undefined,\n> {\n readonly __kind: 'relation';\n readonly __to: To;\n readonly __cardinality: Cardinality;\n readonly __on: On;\n}\n\nexport interface ModelBuilder<\n Name extends string = string,\n Fields extends Record<string, FieldBuilder> = Record<string, FieldBuilder>,\n Relations extends Record<string, RelationBuilder> = Record<string, RelationBuilder>,\n Collection extends string | undefined = string | undefined,\n Owner extends string | undefined = string | undefined,\n Base extends string | undefined = string | undefined,\n StorageRelations extends Record<string, StorageRelationSpec> | undefined =\n | Record<string, StorageRelationSpec>\n | undefined,\n Discriminator extends { readonly field: string } | undefined =\n | { readonly field: string }\n | undefined,\n Variants extends Record<string, VariantSpec> | undefined =\n | Record<string, VariantSpec>\n | undefined,\n> {\n readonly __kind: 'model';\n readonly __name: Name;\n readonly __fields: Fields;\n readonly __relations: Relations;\n readonly __indexes: readonly MongoIndexAuthoringInput[] | undefined;\n readonly __collectionOptions: MongoCollectionOptionsAuthoringInput | undefined;\n readonly __collection: Collection;\n readonly __owner: Owner;\n readonly __base: Base;\n readonly __storageRelations: StorageRelations;\n readonly __discriminator: Discriminator;\n readonly __variants: Variants;\n ref<const FieldName extends keyof Fields & string>(\n fieldName: FieldName,\n ): FieldReference<Name, FieldName>;\n}\n\ntype AnyFieldBuilder = FieldBuilder<ContractFieldType, boolean, boolean>;\ntype AnyReferenceRelationBuilder = RelationBuilder<string, '1:1' | '1:N' | 'N:1', RelationOn>;\ntype AnyEmbedRelationBuilder = RelationBuilder<string, '1:1' | '1:N', undefined>;\ntype AnyRelationBuilder = AnyReferenceRelationBuilder | AnyEmbedRelationBuilder;\ntype AnyFieldReference = FieldReference<string, string>;\ntype NamedValueObjectBuilder<\n Name extends string = string,\n Fields extends Record<string, AnyFieldBuilder> = Record<string, AnyFieldBuilder>,\n> = ValueObjectBuilder<Name, Fields>;\ntype AnyValueObjectBuilder = NamedValueObjectBuilder;\ntype NamedModelBuilder<\n Name extends string = string,\n Fields extends Record<string, AnyFieldBuilder> = Record<string, AnyFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> = Record<string, AnyRelationBuilder>,\n Collection extends string | undefined = string | undefined,\n Owner extends string | undefined = string | undefined,\n Base extends string | undefined = string | undefined,\n StorageRelations extends Record<string, StorageRelationSpec> | undefined =\n | Record<string, StorageRelationSpec>\n | undefined,\n Discriminator extends { readonly field: string } | undefined =\n | { readonly field: string }\n | undefined,\n Variants extends Record<string, VariantSpec> | undefined =\n | Record<string, VariantSpec>\n | undefined,\n> = ModelBuilder<\n Name,\n Fields,\n Relations,\n Collection,\n Owner,\n Base,\n StorageRelations,\n Discriminator,\n Variants\n>;\ntype AnyModelBuilder = NamedModelBuilder;\n\ntype ExtractFieldReferenceName<T> =\n T extends FieldReference<string, infer FieldName extends string> ? FieldName : never;\ntype ExtractModelName<T> = T extends NamedModelBuilder<infer Name> ? Name : never;\ntype ExtractValueObjectName<T> = T extends NamedValueObjectBuilder<infer Name> ? Name : never;\ntype ExtractModelCollection<T> =\n T extends NamedModelBuilder<\n string,\n Record<string, AnyFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n infer Collection\n >\n ? Collection\n : never;\ntype ExtractModelOwner<T> =\n T extends NamedModelBuilder<\n string,\n Record<string, AnyFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n string | undefined,\n infer Owner\n >\n ? Owner\n : never;\ntype ExtractModelBase<T> =\n T extends NamedModelBuilder<\n string,\n Record<string, AnyFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n string | undefined,\n string | undefined,\n infer Base\n >\n ? Base\n : never;\ntype ExtractModelStorageRelations<T> =\n T extends NamedModelBuilder<\n string,\n Record<string, AnyFieldBuilder>,\n Record<string, AnyRelationBuilder>,\n string | undefined,\n string | undefined,\n string | undefined,\n infer StorageRelations\n >\n ? StorageRelations\n : never;\n\ntype ModelStorageSection<T> =\n ExtractModelCollection<T> extends string\n ? { readonly collection: ExtractModelCollection<T> }\n : EmptyObject;\ntype ModelStorageRelationsSection<T> =\n ExtractModelStorageRelations<T> extends Record<string, StorageRelationSpec>\n ? keyof ExtractModelStorageRelations<T> extends never\n ? EmptyObject\n : { readonly relations: ExtractModelStorageRelations<T> }\n : EmptyObject;\ntype RootModelCollection<T> =\n ExtractModelCollection<T> extends string\n ? ExtractModelOwner<T> extends undefined\n ? ExtractModelBase<T> extends undefined\n ? ExtractModelCollection<T>\n : never\n : never\n : never;\ntype RootModelName<T> = RootModelCollection<T> extends never ? never : ExtractModelName<T>;\ntype CollectionName<T> =\n ExtractModelCollection<T> extends string ? ExtractModelCollection<T> : never;\n\ntype ModelNameInput = string | AnyModelBuilder;\ntype ValueObjectNameInput = string | AnyValueObjectBuilder;\ntype RelationTargetFieldsInput<TargetName extends string> =\n | StringListInput\n | FieldReference<TargetName, string>\n | readonly FieldReference<TargetName, string>[];\n\ntype NormalizeModelName<T> = T extends string ? T : ExtractModelName<T>;\n\ntype NormalizeModelNameOrUndefined<T> = [T] extends [undefined]\n ? undefined\n : NormalizeModelName<Present<T>>;\n\ntype NormalizeValueObjectName<T> = T extends string ? T : ExtractValueObjectName<T>;\n\ntype NormalizeStringList<T> = T extends readonly string[]\n ? T\n : T extends string\n ? readonly [T]\n : readonly string[];\n\ntype NormalizeTargetFieldList<T> = T extends readonly AnyFieldReference[]\n ? {\n readonly [K in keyof T]: ExtractFieldReferenceName<T[K]>;\n }\n : T extends AnyFieldReference\n ? readonly [ExtractFieldReferenceName<T>]\n : NormalizeStringList<T>;\n\ntype ContractFieldFromBuilder<TBuilder> =\n TBuilder extends FieldBuilder<\n infer Type extends ContractFieldType,\n infer Nullable extends boolean,\n infer Many extends boolean\n >\n ? Simplify<\n {\n readonly type: Type;\n readonly nullable: Nullable;\n } & (Many extends true ? { readonly many: true } : EmptyObject)\n >\n : never;\n\ntype ContractFieldsFromRecord<Fields extends Record<string, AnyFieldBuilder>> = Simplify<{\n readonly [K in keyof Fields]: ContractFieldFromBuilder<Fields[K]>;\n}>;\n\ntype ContractValueObjectFromBuilder<TBuilder> =\n TBuilder extends ValueObjectBuilder<string, infer Fields extends Record<string, AnyFieldBuilder>>\n ? Simplify<{\n readonly fields: ContractFieldsFromRecord<Fields>;\n }>\n : never;\n\ntype ContractValueObjectsFromRecord<ValueObjects extends Record<string, AnyValueObjectBuilder>> =\n Simplify<{\n readonly [K in keyof ValueObjects as ExtractValueObjectName<\n ValueObjects[K]\n >]: ContractValueObjectFromBuilder<ValueObjects[K]>;\n }>;\n\ntype ContractRelationFromBuilder<TBuilder> =\n TBuilder extends RelationBuilder<\n infer To extends string,\n infer Cardinality extends '1:1' | '1:N' | 'N:1',\n infer On extends RelationOn | undefined\n >\n ? On extends RelationOn\n ? {\n readonly to: To;\n readonly cardinality: Cardinality;\n readonly on: On;\n }\n : {\n readonly to: To;\n readonly cardinality: Cardinality;\n }\n : never;\n\ntype ContractRelationsFromRecord<Relations extends Record<string, AnyRelationBuilder>> =\n keyof Relations extends never\n ? Record<string, never>\n : Simplify<{\n readonly [K in keyof Relations]: ContractRelationFromBuilder<Relations[K]>;\n }>;\n\ntype ContractModelStorageFromBuilder<TBuilder> = ModelStorageSection<TBuilder> &\n ModelStorageRelationsSection<TBuilder>;\n\ntype MaybeOwner<Owner> = [Owner] extends [undefined]\n ? EmptyObject\n : { readonly owner: Owner & string };\ntype MaybeBase<Base> = [Base] extends [undefined] ? EmptyObject : { readonly base: Base & string };\ntype MaybeDiscriminator<Discriminator> = [Discriminator] extends [undefined]\n ? EmptyObject\n : { readonly discriminator: Discriminator & { readonly field: string } };\ntype MaybeVariants<Variants> = [Variants] extends [undefined]\n ? EmptyObject\n : { readonly variants: Variants };\n\ntype ContractModelFromBuilder<TBuilder> =\n TBuilder extends NamedModelBuilder<\n string,\n infer Fields extends Record<string, AnyFieldBuilder>,\n infer Relations extends Record<string, AnyRelationBuilder>,\n string | undefined,\n infer Owner,\n infer Base,\n Record<string, StorageRelationSpec> | undefined,\n infer Discriminator,\n infer Variants\n >\n ? Simplify<\n {\n readonly fields: ContractFieldsFromRecord<Fields>;\n readonly relations: ContractRelationsFromRecord<Relations>;\n readonly storage: ContractModelStorageFromBuilder<TBuilder>;\n } & MaybeOwner<Owner> &\n MaybeBase<Base> &\n MaybeDiscriminator<Discriminator> &\n MaybeVariants<Variants>\n >\n : never;\n\ntype ContractModelsFromRecord<Models extends Record<string, AnyModelBuilder>> = Simplify<{\n readonly [K in keyof Models as ExtractModelName<Models[K]>]: ContractModelFromBuilder<Models[K]>;\n}>;\n\ntype DerivedRootModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{\n readonly [K in keyof Models as RootModelCollection<Models[K]>]: RootModelName<Models[K]>;\n}>;\n\ntype StorageCollectionsFromModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{\n readonly [K in keyof Models as CollectionName<Models[K]>]: MongoCollection;\n}>;\n\ntype NormalizeRoots<Roots extends Record<string, ModelNameInput>> = Simplify<{\n readonly [K in keyof Roots]: NormalizeModelName<Roots[K]>;\n}>;\n\ntype DefinitionModels<Definition> = Definition extends {\n readonly models?: infer Models extends Record<string, AnyModelBuilder>;\n}\n ? Models\n : Record<never, never>;\n\ntype DefinitionValueObjects<Definition> = Definition extends {\n readonly valueObjects?: infer ValueObjects extends Record<string, AnyValueObjectBuilder>;\n}\n ? ValueObjects\n : Record<never, never>;\n\ntype DefinitionRoots<Definition> = Definition extends {\n readonly roots?: infer Roots extends Record<string, ModelNameInput>;\n}\n ? NormalizeRoots<Roots>\n : DerivedRootModels<DefinitionModels<Definition>>;\n\ntype DefinitionCapabilities<Definition> = Definition extends {\n readonly capabilities?: infer Capabilities extends ContractCapabilities;\n}\n ? Capabilities\n : Record<never, never>;\n\ntype DefinitionExtensionPacks<Definition> = Definition extends {\n readonly extensionPacks?: infer ExtensionPacks extends Record<\n string,\n ExtensionPackRef<string, string>\n >;\n}\n ? ExtensionPacks\n : Record<never, never>;\n\ntype DefinitionFamilyId<Definition> = Definition extends {\n readonly family: FamilyPackRef<infer FamilyId>;\n}\n ? FamilyId\n : string;\n\ntype DefinitionTargetId<Definition> = Definition extends {\n readonly target: TargetPackRef<string, infer TargetId>;\n}\n ? TargetId\n : string;\n\ntype DefinitionStorage<Definition> = Simplify<\n MongoStorageShape & {\n readonly collections: StorageCollectionsFromModels<DefinitionModels<Definition>>;\n readonly storageHash: StorageHashBase<string>;\n }\n>;\n\ntype MaybeValueObjectsSection<ValueObjects extends Record<string, AnyValueObjectBuilder>> =\n keyof ValueObjects extends never\n ? EmptyObject\n : {\n readonly valueObjects: ContractValueObjectsFromRecord<ValueObjects>;\n };\n\ntype MongoContractBaseFromDefinition<Definition> = Simplify<\n {\n readonly target: DefinitionTargetId<Definition>;\n readonly targetFamily: DefinitionFamilyId<Definition>;\n readonly roots: DefinitionRoots<Definition>;\n readonly models: ContractModelsFromRecord<DefinitionModels<Definition>>;\n readonly storage: DefinitionStorage<Definition>;\n readonly capabilities: DefinitionCapabilities<Definition>;\n readonly extensionPacks: DefinitionExtensionPacks<Definition>;\n readonly profileHash: ProfileHashBase<string>;\n readonly meta: Record<string, never>;\n } & MaybeValueObjectsSection<DefinitionValueObjects<Definition>>\n>;\n\ntype CodecTypesFromDefinition<Definition> = MongoCodecTypes &\n MergeExtensionCodecTypesSafe<DefinitionExtensionPacks<Definition>>;\n\nexport type MongoContractResult<Definition> = MongoContractWithTypeMaps<\n MongoContractBaseFromDefinition<Definition>,\n MongoTypeMaps<CodecTypesFromDefinition<Definition>>\n>;\n\ntype ExtractEntitiesNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<\n Pack,\n 'entityTypes',\n Record<never, never>\n>;\n\ntype MergeExtensionEntityNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<\n ExtensionPacks,\n 'entityTypes'\n>;\n\nexport type ContractAuthoringHelpers<\n Family extends FamilyPackRef<string> = FamilyPackRef<string>,\n Target extends TargetPackRef<string, string> = TargetPackRef<string, string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,\n> = EntityHelpersFromNamespace<\n ExtractEntitiesNamespaceFromPack<Family> &\n ExtractEntitiesNamespaceFromPack<Target> &\n MergeExtensionEntityNamespaces<ExtensionPacks>\n> & {\n readonly field: typeof field;\n readonly index: typeof index;\n readonly model: typeof model;\n readonly rel: typeof rel;\n readonly valueObject: typeof valueObject;\n};\n\ntype AuthoringComponent = {\n readonly authoring?: { readonly entityTypes?: unknown };\n};\n\nfunction extractEntitiesNamespace(component: AuthoringComponent): AuthoringEntityTypeNamespace {\n return (component.authoring?.entityTypes ?? {}) as AuthoringEntityTypeNamespace;\n}\n\nconst MONGO_RESERVED_HELPER_KEYS: readonly string[] = [\n 'field',\n 'index',\n 'model',\n 'rel',\n 'valueObject',\n];\n\nfunction composeMongoEntityHelpers(\n family: FamilyPackRef<string>,\n target: TargetPackRef<string, string>,\n extensionPacks: Record<string, ExtensionPackRef<string, string>> | undefined,\n): Record<string, unknown> {\n const components: readonly AuthoringComponent[] = [\n family,\n target,\n ...Object.values(extensionPacks ?? {}),\n ];\n const merged: Record<string, unknown> = {};\n for (const component of components) {\n const ns = extractEntitiesNamespace(component);\n if (Object.keys(ns).length > 0) {\n mergeAuthoringNamespaces(merged, ns, [], isAuthoringEntityTypeDescriptor, 'entity');\n }\n }\n // Mongo authoring does not yet ship contributed field / type namespaces in\n // the TS DSL surface, but the cross-registry guard mirrors SQL's call so\n // any future field / type contributions surface a structurally identical\n // collision error.\n assertNoCrossRegistryCollisions({}, {}, merged as AuthoringEntityTypeNamespace);\n // Pack-contributed entity types flatten onto the same top-level shape\n // as the built-in helpers (`model`, `rel`, `field`, `index`,\n // `valueObject`). Detect collisions explicitly so a contributed name\n // can't silently overwrite a built-in at runtime.\n const collisions = Object.keys(merged).filter((name) =>\n MONGO_RESERVED_HELPER_KEYS.includes(name),\n );\n if (collisions.length > 0) {\n throw new Error(\n `Pack-contributed entity type(s) ${collisions.map((c) => `\"${c}\"`).join(', ')} collide with the reserved built-in helper key(s) on the Mongo composed helpers surface. Reserved keys: ${MONGO_RESERVED_HELPER_KEYS.map((k) => `\"${k}\"`).join(', ')}.`,\n );\n }\n return createEntityHelpersFromNamespace(merged as AuthoringEntityTypeNamespace, {\n ctx: { family: family.familyId, target: target.targetId },\n });\n}\n\nexport type ContractScaffold<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<string, string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,\n Capabilities extends ContractCapabilities | undefined = undefined,\n Roots extends Record<string, ModelNameInput> | undefined = undefined,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\n readonly capabilities?: Capabilities;\n readonly roots?: Roots;\n};\n\nexport type ContractDefinition<\n Family extends FamilyPackRef<string>,\n Target extends TargetPackRef<string, string>,\n Models extends Record<string, AnyModelBuilder> = Record<never, never>,\n ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>,\n ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,\n Capabilities extends ContractCapabilities | undefined = undefined,\n Roots extends Record<string, ModelNameInput> | undefined = undefined,\n> = ContractScaffold<Family, Target, ExtensionPacks, Capabilities, Roots> & {\n readonly models?: Models;\n readonly valueObjects?: ValueObjects;\n};\n\nexport type ContractFactory<\n Models extends Record<string, AnyModelBuilder> = Record<never, never>,\n ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>,\n Roots extends Record<string, ModelNameInput> | undefined = undefined,\n Family extends FamilyPackRef<string> = FamilyPackRef<string>,\n Target extends TargetPackRef<string, string> = TargetPackRef<string, string>,\n ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,\n> = (helpers: ContractAuthoringHelpers<Family, Target, ExtensionPacks>) => {\n readonly models?: Models;\n readonly valueObjects?: ValueObjects;\n readonly roots?: Roots;\n};\n\ntype FieldBuilderSpec<\n Type extends ContractFieldType,\n Nullable extends boolean,\n Many extends boolean,\n> = {\n readonly type: Type;\n readonly nullable: Nullable;\n readonly many: Many;\n};\n\nfunction createFieldBuilder<\n Type extends ContractFieldType,\n Nullable extends boolean,\n Many extends boolean,\n>(spec: FieldBuilderSpec<Type, Nullable, Many>): FieldBuilder<Type, Nullable, Many> {\n return {\n __kind: 'field',\n __type: spec.type,\n __nullable: spec.nullable,\n __many: spec.many,\n optional() {\n return createFieldBuilder<Type, true, Many>({\n type: spec.type,\n nullable: true,\n many: spec.many,\n });\n },\n many() {\n return createFieldBuilder<Type, Nullable, true>({\n type: spec.type,\n nullable: spec.nullable,\n many: true,\n });\n },\n };\n}\n\nfunction normalizeOptionalTypeParams(\n typeParams: Record<string, unknown> | undefined,\n): { readonly typeParams: Record<string, unknown> } | Record<never, never> {\n if (!typeParams) {\n return {};\n }\n\n return { typeParams };\n}\n\nfunction createScalarFieldBuilder<\n CodecId extends string,\n TypeParams extends Record<string, unknown> | undefined = undefined,\n>(\n codecId: CodecId,\n options?: { readonly typeParams?: TypeParams },\n): FieldBuilder<\n {\n readonly kind: 'scalar';\n readonly codecId: CodecId;\n } & ([TypeParams] extends [undefined] ? EmptyObject : { readonly typeParams: TypeParams }),\n false,\n false\n> {\n return createFieldBuilder({\n type: {\n kind: 'scalar',\n codecId,\n ...normalizeOptionalTypeParams(options?.typeParams),\n } as {\n readonly kind: 'scalar';\n readonly codecId: CodecId;\n } & ([TypeParams] extends [undefined] ? EmptyObject : { readonly typeParams: TypeParams }),\n nullable: false,\n many: false,\n });\n}\n\nexport const field = {\n scalar: createScalarFieldBuilder,\n objectId() {\n return createScalarFieldBuilder('mongo/objectId@1');\n },\n string() {\n return createScalarFieldBuilder('mongo/string@1');\n },\n double() {\n return createScalarFieldBuilder('mongo/double@1');\n },\n int32() {\n return createScalarFieldBuilder('mongo/int32@1');\n },\n bool() {\n return createScalarFieldBuilder('mongo/bool@1');\n },\n date() {\n return createScalarFieldBuilder('mongo/date@1');\n },\n vector<const TypeParams extends Record<string, unknown> | undefined = undefined>(options?: {\n readonly typeParams?: TypeParams;\n }) {\n return createScalarFieldBuilder('mongo/vector@1', options);\n },\n valueObject<const ValueObject extends ValueObjectNameInput>(valueObjectName: ValueObject) {\n return createFieldBuilder({\n type: {\n kind: 'valueObject',\n name: resolveValueObjectName(valueObjectName),\n } as {\n readonly kind: 'valueObject';\n readonly name: NormalizeValueObjectName<ValueObject>;\n },\n nullable: false,\n many: false,\n });\n },\n} as const;\n\nexport function index<const Fields extends MongoIndexFields>(\n fields: Fields,\n): {\n readonly fields: Fields;\n};\nexport function index<const Fields extends MongoIndexFields, const Options>(\n fields: Fields,\n options: StrictShape<Options, MongoIndexOptionsInput>,\n): {\n readonly fields: Fields;\n readonly options: Options & MongoIndexOptionsInput;\n};\nexport function index(\n fields: MongoIndexFields,\n options?: MongoIndexOptionsInput,\n): {\n readonly fields: MongoIndexFields;\n readonly options?: MongoIndexOptionsInput;\n} {\n return {\n fields,\n ...(options ? { options } : {}),\n };\n}\n\nfunction createFieldReference<const ModelName extends string, const FieldName extends string>(\n modelName: ModelName,\n fieldName: FieldName,\n): FieldReference<ModelName, FieldName> {\n return {\n __kind: 'fieldRef',\n modelName,\n fieldName,\n };\n}\n\nfunction isFieldReference(value: unknown): value is FieldReference<string, string> {\n return (\n typeof value === 'object' && value !== null && '__kind' in value && value.__kind === 'fieldRef'\n );\n}\n\nfunction resolveModelName(value: ModelNameInput): string {\n return typeof value === 'string' ? value : value.__name;\n}\n\nfunction resolveValueObjectName(value: ValueObjectNameInput): string {\n return typeof value === 'string' ? value : value.__name;\n}\n\nfunction normalizeStringList(value: StringListInput): readonly string[] {\n return typeof value === 'string' ? [value] : [...value];\n}\n\nfunction normalizeTargetField(\n targetModelName: string,\n value: string | FieldReference<string, string>,\n): string {\n if (!isFieldReference(value)) {\n return value;\n }\n\n if (value.modelName !== targetModelName) {\n throw new Error(\n `Relation target \"${targetModelName}\" cannot reference field \"${value.modelName}.${value.fieldName}\".`,\n );\n }\n\n return value.fieldName;\n}\n\nfunction normalizeTargetFields(\n targetModelName: string,\n value: RelationTargetFieldsInput<string>,\n): readonly string[] {\n if (typeof value === 'string') {\n return [value];\n }\n\n if (isFieldReference(value)) {\n return [normalizeTargetField(targetModelName, value)];\n }\n\n return value.map((entry) => normalizeTargetField(targetModelName, entry));\n}\n\ntype ReferenceOptions<\n Target extends ModelNameInput,\n From extends StringListInput,\n To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n> = {\n readonly from: From;\n readonly to: To;\n};\n\ntype RelationOnFromOptions<\n From extends StringListInput,\n To extends RelationTargetFieldsInput<string>,\n> = {\n readonly localFields: NormalizeStringList<From>;\n readonly targetFields: NormalizeTargetFieldList<To>;\n};\n\nfunction createRelationBuilder<\n To extends string,\n Cardinality extends '1:1' | '1:N' | 'N:1',\n On extends RelationOn | undefined,\n>(spec: {\n readonly to: To;\n readonly cardinality: Cardinality;\n readonly on: On;\n}): RelationBuilder<To, Cardinality, On> {\n return {\n __kind: 'relation',\n __to: spec.to,\n __cardinality: spec.cardinality,\n __on: spec.on,\n };\n}\n\nfunction createReferenceRelationBuilder<\n Target extends ModelNameInput,\n Cardinality extends '1:1' | '1:N' | 'N:1',\n From extends StringListInput,\n To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n>(\n target: Target,\n cardinality: Cardinality,\n options: ReferenceOptions<Target, From, To>,\n): RelationBuilder<NormalizeModelName<Target>, Cardinality, RelationOnFromOptions<From, To>> {\n const targetModelName = resolveModelName(target);\n\n return createRelationBuilder({\n to: targetModelName as NormalizeModelName<Target>,\n cardinality,\n on: {\n localFields: normalizeStringList(options.from) as NormalizeStringList<From>,\n targetFields: normalizeTargetFields(\n targetModelName,\n options.to,\n ) as NormalizeTargetFieldList<To>,\n },\n });\n}\n\nfunction createEmbedRelationBuilder<\n Target extends ModelNameInput,\n Cardinality extends '1:1' | '1:N',\n>(\n target: Target,\n cardinality: Cardinality,\n): RelationBuilder<NormalizeModelName<Target>, Cardinality, undefined> {\n return createRelationBuilder({\n to: resolveModelName(target) as NormalizeModelName<Target>,\n cardinality,\n on: undefined,\n });\n}\n\nfunction hasOne<const Target extends ModelNameInput>(\n target: Target,\n): RelationBuilder<NormalizeModelName<Target>, '1:1', undefined>;\nfunction hasOne<\n const Target extends ModelNameInput,\n const From extends StringListInput,\n const To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n>(\n target: Target,\n options: ReferenceOptions<Target, From, To>,\n): RelationBuilder<NormalizeModelName<Target>, '1:1', RelationOnFromOptions<From, To>>;\nfunction hasOne(\n target: ModelNameInput,\n options?: ReferenceOptions<ModelNameInput, StringListInput, RelationTargetFieldsInput<string>>,\n) {\n if (!options) {\n return createEmbedRelationBuilder(target, '1:1');\n }\n\n return createReferenceRelationBuilder(target, '1:1', options);\n}\n\nfunction hasMany<const Target extends ModelNameInput>(\n target: Target,\n): RelationBuilder<NormalizeModelName<Target>, '1:N', undefined>;\nfunction hasMany<\n const Target extends ModelNameInput,\n const From extends StringListInput,\n const To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n>(\n target: Target,\n options: ReferenceOptions<Target, From, To>,\n): RelationBuilder<NormalizeModelName<Target>, '1:N', RelationOnFromOptions<From, To>>;\nfunction hasMany(\n target: ModelNameInput,\n options?: ReferenceOptions<ModelNameInput, StringListInput, RelationTargetFieldsInput<string>>,\n) {\n if (!options) {\n return createEmbedRelationBuilder(target, '1:N');\n }\n\n return createReferenceRelationBuilder(target, '1:N', options);\n}\n\nfunction belongsTo<\n const Target extends ModelNameInput,\n const From extends StringListInput,\n const To extends RelationTargetFieldsInput<NormalizeModelName<Target>>,\n>(\n target: Target,\n options: ReferenceOptions<Target, From, To>,\n): RelationBuilder<NormalizeModelName<Target>, 'N:1', RelationOnFromOptions<From, To>> {\n return createReferenceRelationBuilder(target, 'N:1', options);\n}\n\nexport const rel = {\n belongsTo,\n hasMany,\n hasOne,\n} as const;\n\ntype ValueObjectInput<Fields extends Record<string, AnyFieldBuilder>> = {\n readonly fields: Fields;\n};\n\nexport function valueObject<\n const Name extends string,\n const Fields extends Record<string, AnyFieldBuilder>,\n>(name: Name, input: ValueObjectInput<Fields>): ValueObjectBuilder<Name, Fields> {\n return {\n __kind: 'valueObject',\n __name: name,\n __fields: input.fields,\n };\n}\n\ntype ModelDiscriminatorInput<Variants extends Record<string, VariantSpec>> = {\n readonly field: string;\n readonly variants: Variants;\n};\n\ntype ModelInput<\n Fields extends Record<string, AnyFieldBuilder>,\n Relations extends Record<string, AnyRelationBuilder> | undefined,\n Collection extends string | undefined,\n Indexes extends readonly MongoIndexAuthoringInput[] | undefined,\n CollectionOptions,\n Owner extends ModelNameInput | undefined,\n Base extends ModelNameInput | undefined,\n StorageRelations extends Record<string, StorageRelationSpec> | undefined,\n Discriminator extends ModelDiscriminatorInput<Record<string, VariantSpec>> | undefined,\n> = {\n readonly collection?: Collection;\n readonly indexes?: Indexes;\n readonly collectionOptions?: StrictShape<CollectionOptions, MongoCollectionOptionsAuthoringInput>;\n readonly storageRelations?: StorageRelations;\n readonly fields: Fields;\n readonly relations?: Relations;\n readonly owner?: Owner;\n readonly base?: Base;\n readonly discriminator?: Discriminator;\n};\n\nexport function model<\n const Name extends string,\n const Fields extends Record<string, AnyFieldBuilder>,\n const Relations extends Record<string, AnyRelationBuilder> | undefined = undefined,\n const Collection extends string | undefined = undefined,\n const Indexes extends readonly MongoIndexAuthoringInput[] | undefined = undefined,\n const CollectionOptions = undefined,\n const Owner extends ModelNameInput | undefined = undefined,\n const Base extends ModelNameInput | undefined = undefined,\n const StorageRelations extends Record<string, StorageRelationSpec> | undefined = undefined,\n const Discriminator extends\n | ModelDiscriminatorInput<Record<string, VariantSpec>>\n | undefined = undefined,\n>(\n name: Name,\n input: ModelInput<\n Fields,\n Relations,\n Collection,\n Indexes,\n CollectionOptions,\n Owner,\n Base,\n StorageRelations,\n Discriminator\n >,\n): ModelBuilder<\n Name,\n Fields,\n Relations extends Record<string, AnyRelationBuilder> ? Relations : Record<never, never>,\n Collection,\n NormalizeModelNameOrUndefined<Owner>,\n NormalizeModelNameOrUndefined<Base>,\n StorageRelations,\n Discriminator extends { readonly field: infer Field extends string }\n ? { readonly field: Field }\n : undefined,\n Discriminator extends { readonly variants: infer Variants extends Record<string, VariantSpec> }\n ? Variants\n : undefined\n> {\n return {\n __kind: 'model',\n __name: name,\n __fields: input.fields,\n __relations: (input.relations ?? {}) as Relations extends Record<string, AnyRelationBuilder>\n ? Relations\n : Record<never, never>,\n __indexes: input.indexes,\n __collectionOptions: input.collectionOptions,\n __collection: input.collection as Collection,\n __owner: (input.owner\n ? resolveModelName(input.owner)\n : undefined) as NormalizeModelNameOrUndefined<Owner>,\n __base: (input.base\n ? resolveModelName(input.base)\n : undefined) as NormalizeModelNameOrUndefined<Base>,\n __storageRelations: input.storageRelations as StorageRelations,\n __discriminator: (input.discriminator\n ? { field: input.discriminator.field }\n : undefined) as Discriminator extends { readonly field: infer Field extends string }\n ? { readonly field: Field }\n : undefined,\n __variants: input.discriminator?.variants as Discriminator extends {\n readonly variants: infer Variants extends Record<string, VariantSpec>;\n }\n ? Variants\n : undefined,\n ref(fieldName) {\n return createFieldReference(name, fieldName);\n },\n };\n}\n\nfunction validateTargetPackRef(\n family: FamilyPackRef<string>,\n target: TargetPackRef<string, string>,\n): void {\n if (family.familyId !== 'mongo') {\n throw new Error(\n `defineContract only accepts Mongo family packs. Received family \"${family.familyId}\".`,\n );\n }\n\n if (target.familyId !== family.familyId) {\n throw new Error(\n `target pack \"${target.id}\" targets family \"${target.familyId}\" but contract family is \"${family.familyId}\".`,\n );\n }\n}\n\nfunction validateExtensionPackRefs(\n target: TargetPackRef<string, string>,\n extensionPacks?: Record<string, ExtensionPackRef<string, string>>,\n): void {\n if (!extensionPacks) {\n return;\n }\n\n for (const packRef of Object.values(extensionPacks)) {\n if (packRef.kind !== 'extension') {\n throw new Error(\n `defineContract only accepts extension pack refs in extensionPacks. Received kind \"${packRef.kind}\".`,\n );\n }\n\n if (packRef.familyId !== target.familyId) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets family \"${packRef.familyId}\" but contract target family is \"${target.familyId}\".`,\n );\n }\n\n if (packRef.targetId && packRef.targetId !== target.targetId) {\n throw new Error(\n `extension pack \"${packRef.id}\" targets \"${packRef.targetId}\" but contract target is \"${target.targetId}\".`,\n );\n }\n }\n}\n\nfunction isContractScaffold(\n value: unknown,\n): value is ContractScaffold<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n return 'family' in value && 'target' in value;\n}\n\nfunction buildContractField(builder: AnyFieldBuilder): ContractField {\n return builder.__many\n ? {\n type: builder.__type,\n nullable: builder.__nullable,\n many: true,\n }\n : {\n type: builder.__type,\n nullable: builder.__nullable,\n };\n}\n\nfunction buildFields(fields: Record<string, AnyFieldBuilder>): Record<string, ContractField> {\n const builtFields: Record<string, ContractField> = {};\n\n for (const [fieldName, fieldBuilder] of Object.entries(fields)) {\n builtFields[fieldName] = buildContractField(fieldBuilder);\n }\n\n return builtFields;\n}\n\nfunction buildRelation(\n relationBuilder: AnyRelationBuilder,\n): ContractEmbedRelation | ContractReferenceRelation {\n return relationBuilder.__on\n ? {\n to: relationBuilder.__to,\n cardinality: relationBuilder.__cardinality,\n on: relationBuilder.__on,\n }\n : {\n to: relationBuilder.__to,\n cardinality: relationBuilder.__cardinality,\n };\n}\n\nfunction buildRelations(\n relations: Record<string, AnyRelationBuilder>,\n): Record<string, ContractEmbedRelation | ContractReferenceRelation> {\n const builtRelations: Record<string, ContractEmbedRelation | ContractReferenceRelation> = {};\n\n for (const [relationName, relationBuilder] of Object.entries(relations)) {\n builtRelations[relationName] = buildRelation(relationBuilder);\n }\n\n return builtRelations;\n}\n\nfunction buildValueObjects(\n valueObjects: Record<string, AnyValueObjectBuilder> | undefined,\n): Record<string, ContractValueObject> {\n const builtValueObjects: Record<string, ContractValueObject> = {};\n\n for (const valueObjectBuilder of Object.values(valueObjects ?? {})) {\n if (valueObjectBuilder.__name in builtValueObjects) {\n throw new Error(\n `Duplicate value object name \"${valueObjectBuilder.__name}\" in defineContract().`,\n );\n }\n\n builtValueObjects[valueObjectBuilder.__name] = {\n fields: buildFields(valueObjectBuilder.__fields),\n };\n }\n\n return builtValueObjects;\n}\n\nfunction buildModels(\n models: Record<string, AnyModelBuilder> | undefined,\n): Record<string, MongoContract['models'][string]> {\n const builtModels: Record<string, MongoContract['models'][string]> = {};\n\n for (const modelBuilder of Object.values(models ?? {})) {\n if (modelBuilder.__name in builtModels) {\n throw new Error(`Duplicate model name \"${modelBuilder.__name}\" in defineContract().`);\n }\n\n const storage = {\n ...(modelBuilder.__collection ? { collection: modelBuilder.__collection } : {}),\n ...(modelBuilder.__storageRelations ? { relations: modelBuilder.__storageRelations } : {}),\n };\n\n builtModels[modelBuilder.__name] = {\n fields: buildFields(modelBuilder.__fields),\n relations: buildRelations(modelBuilder.__relations),\n storage,\n ...(modelBuilder.__owner ? { owner: modelBuilder.__owner } : {}),\n ...(modelBuilder.__base ? { base: modelBuilder.__base } : {}),\n ...(modelBuilder.__discriminator ? { discriminator: modelBuilder.__discriminator } : {}),\n ...(modelBuilder.__variants ? { variants: modelBuilder.__variants } : {}),\n };\n }\n\n return builtModels;\n}\n\nfunction deriveRoots(models: Record<string, AnyModelBuilder> | undefined): Record<string, string> {\n const roots: Record<string, string> = {};\n\n for (const modelBuilder of Object.values(models ?? {})) {\n if (!modelBuilder.__collection || modelBuilder.__owner || modelBuilder.__base) {\n continue;\n }\n\n roots[modelBuilder.__collection] = modelBuilder.__name;\n }\n\n return roots;\n}\n\nfunction normalizeRoots(roots: Record<string, ModelNameInput> | undefined): Record<string, string> {\n const normalizedRoots: Record<string, string> = {};\n\n for (const [rootName, rootValue] of Object.entries(roots ?? {})) {\n normalizedRoots[rootName] = resolveModelName(rootValue);\n }\n\n return normalizedRoots;\n}\n\nfunction toStorageIndex(index: MongoIndexAuthoringInput): MongoIndex {\n const keys = Object.entries(index.fields).map(([field, direction]) => ({\n field,\n direction,\n }));\n const input: Record<string, unknown> = { keys };\n if (index.options) {\n for (const [key, value] of Object.entries(index.options)) {\n if (value !== undefined) {\n input[key] = value;\n }\n }\n }\n return new MongoIndex(input as unknown as MongoIndexInput);\n}\n\nfunction toStorageCollectionOptions(\n opts: MongoCollectionOptionsAuthoringInput,\n): MongoCollectionOptions {\n const input: MongoCollectionOptionsInput = {\n ...(opts.capped\n ? { capped: { size: opts.size ?? 0, ...(opts.max != null && { max: opts.max }) } }\n : {}),\n ...(opts.storageEngine !== undefined && { storageEngine: opts.storageEngine }),\n ...(opts.indexOptionDefaults !== undefined && {\n indexOptionDefaults: opts.indexOptionDefaults,\n }),\n ...(opts.collation !== undefined && { collation: opts.collation }),\n ...(opts.timeseries !== undefined && { timeseries: opts.timeseries }),\n ...(opts.clusteredIndex !== undefined && {\n clusteredIndex:\n opts.clusteredIndex.name !== undefined ? { name: opts.clusteredIndex.name } : {},\n }),\n ...(opts.expireAfterSeconds !== undefined && { expireAfterSeconds: opts.expireAfterSeconds }),\n ...(opts.changeStreamPreAndPostImages !== undefined && {\n changeStreamPreAndPostImages: opts.changeStreamPreAndPostImages,\n }),\n };\n return new MongoCollectionOptions(input);\n}\n\nfunction findMissingIndexField(\n index: MongoIndexAuthoringInput,\n modelFields: Record<string, unknown>,\n): string | undefined {\n for (const fieldName of Object.keys(index.fields)) {\n const wildcardMatch = fieldName.match(/^(.+)\\.\\$\\*\\*$/);\n const lookupName = wildcardMatch ? wildcardMatch[1] : fieldName;\n if (lookupName === undefined || lookupName.length === 0) continue;\n if (lookupName === '$**') continue;\n if (!Object.hasOwn(modelFields, lookupName)) {\n return lookupName;\n }\n }\n return undefined;\n}\n\nfunction resolveVariantScope(\n modelBuilder: AnyModelBuilder,\n modelsByName: Record<string, AnyModelBuilder>,\n): { discriminatorField: string; discriminatorValue: string } | undefined {\n if (!modelBuilder.__base) return undefined;\n const baseBuilder = modelsByName[modelBuilder.__base];\n if (!baseBuilder) return undefined;\n const discriminatorField = baseBuilder.__discriminator?.field;\n const variantValue = baseBuilder.__variants?.[modelBuilder.__name]?.value;\n if (!discriminatorField || variantValue === undefined) return undefined;\n return { discriminatorField, discriminatorValue: variantValue };\n}\n\nfunction scopeVariantIndex(\n storageIndex: MongoIndex,\n scope: { discriminatorField: string; discriminatorValue: string },\n variantName: string,\n authoredIndex: MongoIndexAuthoringInput | undefined,\n): MongoIndex {\n const result = applyPolymorphicScopeToMongoIndex(storageIndex, scope);\n if (result.kind === 'conflict') {\n const indexLabel = authoredIndex ? canonicalStringify(authoredIndex) : '<unknown>';\n throw new Error(\n `Variant model \"${variantName}\" index ${indexLabel} conflicts with discriminator scope: ${result.reason}`,\n );\n }\n return result.index;\n}\n\nfunction buildCollections(\n models: Record<string, AnyModelBuilder> | undefined,\n): Record<string, MongoCollection> {\n const intermediate: Record<string, MongoCollectionInput> = {};\n const declaredIndexOwners = new Map<string, string>();\n const modelMap = models ?? {};\n const modelsByName: Record<string, AnyModelBuilder> = {};\n for (const builder of Object.values(modelMap)) {\n modelsByName[builder.__name] = builder;\n }\n\n for (const modelBuilder of Object.values(modelMap)) {\n if (!modelBuilder.__collection) {\n if (modelBuilder.__indexes && modelBuilder.__indexes.length > 0) {\n throw new Error(\n `Model \"${modelBuilder.__name}\" defines indexes but has no collection to attach them to.`,\n );\n }\n\n if (modelBuilder.__collectionOptions) {\n throw new Error(\n `Model \"${modelBuilder.__name}\" defines collectionOptions but has no collection to attach them to.`,\n );\n }\n\n continue;\n }\n\n const existingCollection: MongoCollectionInput = intermediate[modelBuilder.__collection] ?? {};\n const existingIndexes = existingCollection.indexes ?? [];\n\n if (existingCollection.options && modelBuilder.__collectionOptions) {\n throw new Error(\n `Collection \"${modelBuilder.__collection}\" has collectionOptions declared by multiple models. Author collectionOptions on a single model per collection.`,\n );\n }\n\n for (const collectionIndex of modelBuilder.__indexes ?? []) {\n const missingField = findMissingIndexField(collectionIndex, modelBuilder.__fields);\n if (missingField !== undefined) {\n const indexSignature = canonicalStringify(collectionIndex);\n throw new Error(\n `Model \"${modelBuilder.__name}\" index ${indexSignature} references unknown field \"${missingField}\".`,\n );\n }\n }\n\n const polymorphicScope = resolveVariantScope(modelBuilder, modelsByName);\n const rawStorageIndexes = (modelBuilder.__indexes ?? []).map(toStorageIndex);\n const storageIndexes = polymorphicScope\n ? rawStorageIndexes.map((idx, i) =>\n scopeVariantIndex(\n idx,\n polymorphicScope,\n modelBuilder.__name,\n modelBuilder.__indexes?.[i],\n ),\n )\n : rawStorageIndexes;\n\n // Dedup after scoping so sibling variants that authentically declare\n // identical raw indexes (e.g. Bug and Feature both index severity) do\n // not collide — their post-scoping storage indexes differ by\n // partialFilterExpression and are correctly distinct on MongoDB.\n for (let i = 0; i < storageIndexes.length; i++) {\n const storageIndex = storageIndexes[i];\n if (storageIndex === undefined) continue;\n const indexSignature = stableStringify(storageIndex);\n const collectionIndexKey = `${modelBuilder.__collection}:${indexSignature}`;\n const firstOwner = declaredIndexOwners.get(collectionIndexKey);\n if (firstOwner) {\n const authoredIndex = modelBuilder.__indexes?.[i];\n const reportedSignature = authoredIndex\n ? canonicalStringify(authoredIndex)\n : indexSignature;\n throw new Error(\n `Collection \"${modelBuilder.__collection}\" defines duplicate index ${reportedSignature}. First declared on model \"${firstOwner}\" and duplicated on model \"${modelBuilder.__name}\".`,\n );\n }\n declaredIndexOwners.set(collectionIndexKey, modelBuilder.__name);\n }\n const storageOptions = modelBuilder.__collectionOptions\n ? toStorageCollectionOptions(modelBuilder.__collectionOptions)\n : undefined;\n\n intermediate[modelBuilder.__collection] =\n storageIndexes.length > 0\n ? {\n ...existingCollection,\n indexes: [...existingIndexes, ...storageIndexes],\n ...(storageOptions ? { options: storageOptions } : {}),\n }\n : storageOptions\n ? {\n ...existingCollection,\n options: storageOptions,\n }\n : existingCollection;\n }\n\n const collections: Record<string, MongoCollection> = {};\n for (const [name, data] of Object.entries(intermediate)) {\n collections[name] = new MongoCollection(data);\n }\n return collections;\n}\n\nfunction buildContractFromDefinition<\n const Definition extends ContractDefinition<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n>(definition: Definition): MongoContractResult<Definition> {\n validateTargetPackRef(definition.family, definition.target);\n validateExtensionPackRefs(definition.target, definition.extensionPacks);\n\n const builtModels = buildModels(definition.models);\n const builtValueObjects = buildValueObjects(definition.valueObjects);\n const roots = definition.roots\n ? normalizeRoots(definition.roots)\n : deriveRoots(definition.models);\n const capabilities = definition.capabilities ?? {};\n const collections = buildCollections(definition.models);\n const storageBody = {\n collections,\n };\n\n const builtContract = {\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n roots,\n models: builtModels,\n ...(Object.keys(builtValueObjects).length > 0 ? { valueObjects: builtValueObjects } : {}),\n storage: {\n ...storageBody,\n storageHash: computeStorageHash({\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n storage: storageBody,\n }),\n },\n capabilities,\n extensionPacks: definition.extensionPacks ?? {},\n profileHash: computeProfileHash({\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n capabilities,\n }),\n meta: {},\n } satisfies MongoContract;\n\n return builtContract as MongoContractResult<Definition>;\n}\n\nexport function defineContract<\n const Definition extends ContractDefinition<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n>(definition: Definition): MongoContractResult<Definition>;\nexport function defineContract<\n const Definition extends ContractScaffold<\n Family,\n Target,\n ExtensionPacks,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n const Built extends {\n readonly models?: Record<string, AnyModelBuilder>;\n readonly valueObjects?: Record<string, AnyValueObjectBuilder>;\n readonly roots?: Record<string, ModelNameInput>;\n },\n const Family extends FamilyPackRef<string> = FamilyPackRef<string>,\n const Target extends TargetPackRef<string, string> = TargetPackRef<string, string>,\n const ExtensionPacks extends\n | Record<string, ExtensionPackRef<string, string>>\n | undefined = undefined,\n>(\n definition: Definition,\n factory: (helpers: ContractAuthoringHelpers<Family, Target, ExtensionPacks>) => Built,\n): MongoContractResult<Definition & Built>;\nexport function defineContract(\n definition: ContractScaffold<\n FamilyPackRef<string>,\n TargetPackRef<string, string>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n ContractCapabilities | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n factory?: ContractFactory<\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ModelNameInput> | undefined\n >,\n) {\n if (!isContractScaffold(definition)) {\n throw new TypeError(\n 'defineContract expects a contract definition object. Define your contract with defineContract({ family, target, models, ... }).',\n );\n }\n\n if (!factory) {\n return buildContractFromDefinition(definition);\n }\n\n const entities = composeMongoEntityHelpers(\n definition.family,\n definition.target,\n definition.extensionPacks,\n );\n const helpers = {\n ...entities,\n field,\n index,\n model,\n rel,\n valueObject,\n } as unknown as ContractAuthoringHelpers;\n\n return buildContractFromDefinition({\n ...definition,\n ...factory(helpers),\n });\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/mongo-contract-ts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0-dev.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "Mongo-specific TypeScript contract authoring surface for Prisma Next",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/contract": "0.
|
|
12
|
-
"@prisma-next/framework-components": "0.
|
|
13
|
-
"@prisma-next/
|
|
14
|
-
"@prisma-next/
|
|
9
|
+
"@prisma-next/config": "0.8.0-dev.1",
|
|
10
|
+
"@prisma-next/contract": "0.8.0-dev.1",
|
|
11
|
+
"@prisma-next/contract-authoring": "0.8.0-dev.1",
|
|
12
|
+
"@prisma-next/framework-components": "0.8.0-dev.1",
|
|
13
|
+
"@prisma-next/mongo-contract": "0.8.0-dev.1",
|
|
14
|
+
"@prisma-next/utils": "0.8.0-dev.1",
|
|
15
|
+
"pathe": "^2.0.3"
|
|
15
16
|
},
|
|
16
17
|
"devDependencies": {
|
|
18
|
+
"@prisma-next/test-utils": "0.8.0-dev.1",
|
|
19
|
+
"@prisma-next/tsconfig": "0.8.0-dev.1",
|
|
20
|
+
"@prisma-next/tsdown": "0.8.0-dev.1",
|
|
17
21
|
"tsdown": "0.22.0",
|
|
18
22
|
"typescript": "5.9.3",
|
|
19
|
-
"vitest": "4.1.5"
|
|
20
|
-
"@prisma-next/tsconfig": "0.7.0",
|
|
21
|
-
"@prisma-next/tsdown": "0.7.0",
|
|
22
|
-
"@prisma-next/test-utils": "0.7.0"
|
|
23
|
+
"vitest": "4.1.5"
|
|
23
24
|
},
|
|
24
25
|
"files": [
|
|
25
26
|
"dist",
|
package/src/contract-builder.ts
CHANGED
|
@@ -8,6 +8,18 @@ import type {
|
|
|
8
8
|
ProfileHashBase,
|
|
9
9
|
StorageHashBase,
|
|
10
10
|
} from '@prisma-next/contract/types';
|
|
11
|
+
import {
|
|
12
|
+
createEntityHelpersFromNamespace,
|
|
13
|
+
type EntityHelpersFromNamespace,
|
|
14
|
+
type ExtractAuthoringNamespaceFromPack,
|
|
15
|
+
type MergeExtensionAuthoringNamespaces,
|
|
16
|
+
} from '@prisma-next/contract-authoring';
|
|
17
|
+
import type { AuthoringEntityTypeNamespace } from '@prisma-next/framework-components/authoring';
|
|
18
|
+
import {
|
|
19
|
+
assertNoCrossRegistryCollisions,
|
|
20
|
+
isAuthoringEntityTypeDescriptor,
|
|
21
|
+
mergeAuthoringNamespaces,
|
|
22
|
+
} from '@prisma-next/framework-components/authoring';
|
|
11
23
|
import type {
|
|
12
24
|
ExtensionPackRef,
|
|
13
25
|
FamilyPackRef,
|
|
@@ -15,21 +27,48 @@ import type {
|
|
|
15
27
|
} from '@prisma-next/framework-components/components';
|
|
16
28
|
import {
|
|
17
29
|
applyPolymorphicScopeToMongoIndex,
|
|
18
|
-
|
|
30
|
+
MongoCollection,
|
|
31
|
+
type MongoCollectionInput,
|
|
32
|
+
MongoCollectionOptions,
|
|
33
|
+
type MongoCollectionOptionsAuthoringInput,
|
|
34
|
+
type MongoCollectionOptionsInput,
|
|
19
35
|
type MongoContract,
|
|
20
36
|
type MongoContractWithTypeMaps,
|
|
21
|
-
|
|
37
|
+
MongoIndex,
|
|
38
|
+
type MongoIndexAuthoringInput,
|
|
22
39
|
type MongoIndexFields,
|
|
23
|
-
type
|
|
24
|
-
type
|
|
25
|
-
type
|
|
26
|
-
type MongoStorageCollectionOptions,
|
|
27
|
-
type MongoStorageIndex,
|
|
40
|
+
type MongoIndexInput,
|
|
41
|
+
type MongoIndexOptionsInput,
|
|
42
|
+
type MongoStorageShape,
|
|
28
43
|
type MongoTypeMaps,
|
|
29
|
-
validateMongoContract,
|
|
30
44
|
} from '@prisma-next/mongo-contract';
|
|
31
45
|
import { canonicalStringify } from '@prisma-next/utils/canonical-stringify';
|
|
32
46
|
|
|
47
|
+
// `canonicalStringify` rejects non-plain objects so a `Map` or class
|
|
48
|
+
// instance cannot silently collapse to `{}`. The storage-shape values
|
|
49
|
+
// produced by `toStorageIndex` post-M2-R2 are `MongoIndex` class
|
|
50
|
+
// instances (see ADR for the storage-map class flip / FR18), which
|
|
51
|
+
// trips that guard. This local helper produces the same key-sorted,
|
|
52
|
+
// JSON-like representation `canonicalStringify` produces for plain
|
|
53
|
+
// objects, but accepts class instances by reading their enumerable
|
|
54
|
+
// properties via `Object.entries`. The output is only used as an
|
|
55
|
+
// in-memory dedup signature for collection indexes; it never leaves
|
|
56
|
+
// the builder.
|
|
57
|
+
function stableStringify(value: unknown): string {
|
|
58
|
+
if (Array.isArray(value)) {
|
|
59
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (value && typeof value === 'object') {
|
|
63
|
+
return `{${Object.entries(value as Record<string, unknown>)
|
|
64
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
65
|
+
.map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`)
|
|
66
|
+
.join(',')}}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return JSON.stringify(value);
|
|
70
|
+
}
|
|
71
|
+
|
|
33
72
|
type VariantSpec = {
|
|
34
73
|
readonly value: string;
|
|
35
74
|
};
|
|
@@ -158,8 +197,8 @@ export interface ModelBuilder<
|
|
|
158
197
|
readonly __name: Name;
|
|
159
198
|
readonly __fields: Fields;
|
|
160
199
|
readonly __relations: Relations;
|
|
161
|
-
readonly __indexes: readonly
|
|
162
|
-
readonly __collectionOptions:
|
|
200
|
+
readonly __indexes: readonly MongoIndexAuthoringInput[] | undefined;
|
|
201
|
+
readonly __collectionOptions: MongoCollectionOptionsAuthoringInput | undefined;
|
|
163
202
|
readonly __collection: Collection;
|
|
164
203
|
readonly __owner: Owner;
|
|
165
204
|
readonly __base: Base;
|
|
@@ -412,7 +451,7 @@ type DerivedRootModels<Models extends Record<string, AnyModelBuilder>> = Simplif
|
|
|
412
451
|
}>;
|
|
413
452
|
|
|
414
453
|
type StorageCollectionsFromModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{
|
|
415
|
-
readonly [K in keyof Models as CollectionName<Models[K]>]:
|
|
454
|
+
readonly [K in keyof Models as CollectionName<Models[K]>]: MongoCollection;
|
|
416
455
|
}>;
|
|
417
456
|
|
|
418
457
|
type NormalizeRoots<Roots extends Record<string, ModelNameInput>> = Simplify<{
|
|
@@ -465,7 +504,7 @@ type DefinitionTargetId<Definition> = Definition extends {
|
|
|
465
504
|
: string;
|
|
466
505
|
|
|
467
506
|
type DefinitionStorage<Definition> = Simplify<
|
|
468
|
-
|
|
507
|
+
MongoStorageShape & {
|
|
469
508
|
readonly collections: StorageCollectionsFromModels<DefinitionModels<Definition>>;
|
|
470
509
|
readonly storageHash: StorageHashBase<string>;
|
|
471
510
|
}
|
|
@@ -500,7 +539,26 @@ export type MongoContractResult<Definition> = MongoContractWithTypeMaps<
|
|
|
500
539
|
MongoTypeMaps<CodecTypesFromDefinition<Definition>>
|
|
501
540
|
>;
|
|
502
541
|
|
|
503
|
-
type
|
|
542
|
+
type ExtractEntitiesNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<
|
|
543
|
+
Pack,
|
|
544
|
+
'entityTypes',
|
|
545
|
+
Record<never, never>
|
|
546
|
+
>;
|
|
547
|
+
|
|
548
|
+
type MergeExtensionEntityNamespaces<ExtensionPacks> = MergeExtensionAuthoringNamespaces<
|
|
549
|
+
ExtensionPacks,
|
|
550
|
+
'entityTypes'
|
|
551
|
+
>;
|
|
552
|
+
|
|
553
|
+
export type ContractAuthoringHelpers<
|
|
554
|
+
Family extends FamilyPackRef<string> = FamilyPackRef<string>,
|
|
555
|
+
Target extends TargetPackRef<string, string> = TargetPackRef<string, string>,
|
|
556
|
+
ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,
|
|
557
|
+
> = EntityHelpersFromNamespace<
|
|
558
|
+
ExtractEntitiesNamespaceFromPack<Family> &
|
|
559
|
+
ExtractEntitiesNamespaceFromPack<Target> &
|
|
560
|
+
MergeExtensionEntityNamespaces<ExtensionPacks>
|
|
561
|
+
> & {
|
|
504
562
|
readonly field: typeof field;
|
|
505
563
|
readonly index: typeof index;
|
|
506
564
|
readonly model: typeof model;
|
|
@@ -508,6 +566,61 @@ type ContractAuthoringHelpers = {
|
|
|
508
566
|
readonly valueObject: typeof valueObject;
|
|
509
567
|
};
|
|
510
568
|
|
|
569
|
+
type AuthoringComponent = {
|
|
570
|
+
readonly authoring?: { readonly entityTypes?: unknown };
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
function extractEntitiesNamespace(component: AuthoringComponent): AuthoringEntityTypeNamespace {
|
|
574
|
+
return (component.authoring?.entityTypes ?? {}) as AuthoringEntityTypeNamespace;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
const MONGO_RESERVED_HELPER_KEYS: readonly string[] = [
|
|
578
|
+
'field',
|
|
579
|
+
'index',
|
|
580
|
+
'model',
|
|
581
|
+
'rel',
|
|
582
|
+
'valueObject',
|
|
583
|
+
];
|
|
584
|
+
|
|
585
|
+
function composeMongoEntityHelpers(
|
|
586
|
+
family: FamilyPackRef<string>,
|
|
587
|
+
target: TargetPackRef<string, string>,
|
|
588
|
+
extensionPacks: Record<string, ExtensionPackRef<string, string>> | undefined,
|
|
589
|
+
): Record<string, unknown> {
|
|
590
|
+
const components: readonly AuthoringComponent[] = [
|
|
591
|
+
family,
|
|
592
|
+
target,
|
|
593
|
+
...Object.values(extensionPacks ?? {}),
|
|
594
|
+
];
|
|
595
|
+
const merged: Record<string, unknown> = {};
|
|
596
|
+
for (const component of components) {
|
|
597
|
+
const ns = extractEntitiesNamespace(component);
|
|
598
|
+
if (Object.keys(ns).length > 0) {
|
|
599
|
+
mergeAuthoringNamespaces(merged, ns, [], isAuthoringEntityTypeDescriptor, 'entity');
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
// Mongo authoring does not yet ship contributed field / type namespaces in
|
|
603
|
+
// the TS DSL surface, but the cross-registry guard mirrors SQL's call so
|
|
604
|
+
// any future field / type contributions surface a structurally identical
|
|
605
|
+
// collision error.
|
|
606
|
+
assertNoCrossRegistryCollisions({}, {}, merged as AuthoringEntityTypeNamespace);
|
|
607
|
+
// Pack-contributed entity types flatten onto the same top-level shape
|
|
608
|
+
// as the built-in helpers (`model`, `rel`, `field`, `index`,
|
|
609
|
+
// `valueObject`). Detect collisions explicitly so a contributed name
|
|
610
|
+
// can't silently overwrite a built-in at runtime.
|
|
611
|
+
const collisions = Object.keys(merged).filter((name) =>
|
|
612
|
+
MONGO_RESERVED_HELPER_KEYS.includes(name),
|
|
613
|
+
);
|
|
614
|
+
if (collisions.length > 0) {
|
|
615
|
+
throw new Error(
|
|
616
|
+
`Pack-contributed entity type(s) ${collisions.map((c) => `"${c}"`).join(', ')} collide with the reserved built-in helper key(s) on the Mongo composed helpers surface. Reserved keys: ${MONGO_RESERVED_HELPER_KEYS.map((k) => `"${k}"`).join(', ')}.`,
|
|
617
|
+
);
|
|
618
|
+
}
|
|
619
|
+
return createEntityHelpersFromNamespace(merged as AuthoringEntityTypeNamespace, {
|
|
620
|
+
ctx: { family: family.familyId, target: target.targetId },
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
|
|
511
624
|
export type ContractScaffold<
|
|
512
625
|
Family extends FamilyPackRef<string>,
|
|
513
626
|
Target extends TargetPackRef<string, string>,
|
|
@@ -539,7 +652,10 @@ export type ContractFactory<
|
|
|
539
652
|
Models extends Record<string, AnyModelBuilder> = Record<never, never>,
|
|
540
653
|
ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>,
|
|
541
654
|
Roots extends Record<string, ModelNameInput> | undefined = undefined,
|
|
542
|
-
> =
|
|
655
|
+
Family extends FamilyPackRef<string> = FamilyPackRef<string>,
|
|
656
|
+
Target extends TargetPackRef<string, string> = TargetPackRef<string, string>,
|
|
657
|
+
ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,
|
|
658
|
+
> = (helpers: ContractAuthoringHelpers<Family, Target, ExtensionPacks>) => {
|
|
543
659
|
readonly models?: Models;
|
|
544
660
|
readonly valueObjects?: ValueObjects;
|
|
545
661
|
readonly roots?: Roots;
|
|
@@ -667,17 +783,17 @@ export function index<const Fields extends MongoIndexFields>(
|
|
|
667
783
|
};
|
|
668
784
|
export function index<const Fields extends MongoIndexFields, const Options>(
|
|
669
785
|
fields: Fields,
|
|
670
|
-
options: StrictShape<Options,
|
|
786
|
+
options: StrictShape<Options, MongoIndexOptionsInput>,
|
|
671
787
|
): {
|
|
672
788
|
readonly fields: Fields;
|
|
673
|
-
readonly options: Options &
|
|
789
|
+
readonly options: Options & MongoIndexOptionsInput;
|
|
674
790
|
};
|
|
675
791
|
export function index(
|
|
676
792
|
fields: MongoIndexFields,
|
|
677
|
-
options?:
|
|
793
|
+
options?: MongoIndexOptionsInput,
|
|
678
794
|
): {
|
|
679
795
|
readonly fields: MongoIndexFields;
|
|
680
|
-
readonly options?:
|
|
796
|
+
readonly options?: MongoIndexOptionsInput;
|
|
681
797
|
} {
|
|
682
798
|
return {
|
|
683
799
|
fields,
|
|
@@ -904,7 +1020,7 @@ type ModelInput<
|
|
|
904
1020
|
Fields extends Record<string, AnyFieldBuilder>,
|
|
905
1021
|
Relations extends Record<string, AnyRelationBuilder> | undefined,
|
|
906
1022
|
Collection extends string | undefined,
|
|
907
|
-
Indexes extends readonly
|
|
1023
|
+
Indexes extends readonly MongoIndexAuthoringInput[] | undefined,
|
|
908
1024
|
CollectionOptions,
|
|
909
1025
|
Owner extends ModelNameInput | undefined,
|
|
910
1026
|
Base extends ModelNameInput | undefined,
|
|
@@ -913,7 +1029,7 @@ type ModelInput<
|
|
|
913
1029
|
> = {
|
|
914
1030
|
readonly collection?: Collection;
|
|
915
1031
|
readonly indexes?: Indexes;
|
|
916
|
-
readonly collectionOptions?: StrictShape<CollectionOptions,
|
|
1032
|
+
readonly collectionOptions?: StrictShape<CollectionOptions, MongoCollectionOptionsAuthoringInput>;
|
|
917
1033
|
readonly storageRelations?: StorageRelations;
|
|
918
1034
|
readonly fields: Fields;
|
|
919
1035
|
readonly relations?: Relations;
|
|
@@ -927,7 +1043,7 @@ export function model<
|
|
|
927
1043
|
const Fields extends Record<string, AnyFieldBuilder>,
|
|
928
1044
|
const Relations extends Record<string, AnyRelationBuilder> | undefined = undefined,
|
|
929
1045
|
const Collection extends string | undefined = undefined,
|
|
930
|
-
const Indexes extends readonly
|
|
1046
|
+
const Indexes extends readonly MongoIndexAuthoringInput[] | undefined = undefined,
|
|
931
1047
|
const CollectionOptions = undefined,
|
|
932
1048
|
const Owner extends ModelNameInput | undefined = undefined,
|
|
933
1049
|
const Base extends ModelNameInput | undefined = undefined,
|
|
@@ -1181,37 +1297,49 @@ function normalizeRoots(roots: Record<string, ModelNameInput> | undefined): Reco
|
|
|
1181
1297
|
return normalizedRoots;
|
|
1182
1298
|
}
|
|
1183
1299
|
|
|
1184
|
-
function toStorageIndex(index:
|
|
1300
|
+
function toStorageIndex(index: MongoIndexAuthoringInput): MongoIndex {
|
|
1185
1301
|
const keys = Object.entries(index.fields).map(([field, direction]) => ({
|
|
1186
1302
|
field,
|
|
1187
1303
|
direction,
|
|
1188
1304
|
}));
|
|
1189
|
-
const
|
|
1305
|
+
const input: Record<string, unknown> = { keys };
|
|
1190
1306
|
if (index.options) {
|
|
1191
1307
|
for (const [key, value] of Object.entries(index.options)) {
|
|
1192
1308
|
if (value !== undefined) {
|
|
1193
|
-
|
|
1309
|
+
input[key] = value;
|
|
1194
1310
|
}
|
|
1195
1311
|
}
|
|
1196
1312
|
}
|
|
1197
|
-
return
|
|
1313
|
+
return new MongoIndex(input as unknown as MongoIndexInput);
|
|
1198
1314
|
}
|
|
1199
1315
|
|
|
1200
|
-
function toStorageCollectionOptions(
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1316
|
+
function toStorageCollectionOptions(
|
|
1317
|
+
opts: MongoCollectionOptionsAuthoringInput,
|
|
1318
|
+
): MongoCollectionOptions {
|
|
1319
|
+
const input: MongoCollectionOptionsInput = {
|
|
1320
|
+
...(opts.capped
|
|
1321
|
+
? { capped: { size: opts.size ?? 0, ...(opts.max != null && { max: opts.max }) } }
|
|
1322
|
+
: {}),
|
|
1323
|
+
...(opts.storageEngine !== undefined && { storageEngine: opts.storageEngine }),
|
|
1324
|
+
...(opts.indexOptionDefaults !== undefined && {
|
|
1325
|
+
indexOptionDefaults: opts.indexOptionDefaults,
|
|
1326
|
+
}),
|
|
1327
|
+
...(opts.collation !== undefined && { collation: opts.collation }),
|
|
1328
|
+
...(opts.timeseries !== undefined && { timeseries: opts.timeseries }),
|
|
1329
|
+
...(opts.clusteredIndex !== undefined && {
|
|
1330
|
+
clusteredIndex:
|
|
1331
|
+
opts.clusteredIndex.name !== undefined ? { name: opts.clusteredIndex.name } : {},
|
|
1332
|
+
}),
|
|
1333
|
+
...(opts.expireAfterSeconds !== undefined && { expireAfterSeconds: opts.expireAfterSeconds }),
|
|
1334
|
+
...(opts.changeStreamPreAndPostImages !== undefined && {
|
|
1335
|
+
changeStreamPreAndPostImages: opts.changeStreamPreAndPostImages,
|
|
1336
|
+
}),
|
|
1337
|
+
};
|
|
1338
|
+
return new MongoCollectionOptions(input);
|
|
1211
1339
|
}
|
|
1212
1340
|
|
|
1213
1341
|
function findMissingIndexField(
|
|
1214
|
-
index:
|
|
1342
|
+
index: MongoIndexAuthoringInput,
|
|
1215
1343
|
modelFields: Record<string, unknown>,
|
|
1216
1344
|
): string | undefined {
|
|
1217
1345
|
for (const fieldName of Object.keys(index.fields)) {
|
|
@@ -1240,11 +1368,11 @@ function resolveVariantScope(
|
|
|
1240
1368
|
}
|
|
1241
1369
|
|
|
1242
1370
|
function scopeVariantIndex(
|
|
1243
|
-
storageIndex:
|
|
1371
|
+
storageIndex: MongoIndex,
|
|
1244
1372
|
scope: { discriminatorField: string; discriminatorValue: string },
|
|
1245
1373
|
variantName: string,
|
|
1246
|
-
authoredIndex:
|
|
1247
|
-
):
|
|
1374
|
+
authoredIndex: MongoIndexAuthoringInput | undefined,
|
|
1375
|
+
): MongoIndex {
|
|
1248
1376
|
const result = applyPolymorphicScopeToMongoIndex(storageIndex, scope);
|
|
1249
1377
|
if (result.kind === 'conflict') {
|
|
1250
1378
|
const indexLabel = authoredIndex ? canonicalStringify(authoredIndex) : '<unknown>';
|
|
@@ -1257,8 +1385,8 @@ function scopeVariantIndex(
|
|
|
1257
1385
|
|
|
1258
1386
|
function buildCollections(
|
|
1259
1387
|
models: Record<string, AnyModelBuilder> | undefined,
|
|
1260
|
-
): Record<string,
|
|
1261
|
-
const
|
|
1388
|
+
): Record<string, MongoCollection> {
|
|
1389
|
+
const intermediate: Record<string, MongoCollectionInput> = {};
|
|
1262
1390
|
const declaredIndexOwners = new Map<string, string>();
|
|
1263
1391
|
const modelMap = models ?? {};
|
|
1264
1392
|
const modelsByName: Record<string, AnyModelBuilder> = {};
|
|
@@ -1283,7 +1411,7 @@ function buildCollections(
|
|
|
1283
1411
|
continue;
|
|
1284
1412
|
}
|
|
1285
1413
|
|
|
1286
|
-
const existingCollection =
|
|
1414
|
+
const existingCollection: MongoCollectionInput = intermediate[modelBuilder.__collection] ?? {};
|
|
1287
1415
|
const existingIndexes = existingCollection.indexes ?? [];
|
|
1288
1416
|
|
|
1289
1417
|
if (existingCollection.options && modelBuilder.__collectionOptions) {
|
|
@@ -1322,7 +1450,7 @@ function buildCollections(
|
|
|
1322
1450
|
for (let i = 0; i < storageIndexes.length; i++) {
|
|
1323
1451
|
const storageIndex = storageIndexes[i];
|
|
1324
1452
|
if (storageIndex === undefined) continue;
|
|
1325
|
-
const indexSignature =
|
|
1453
|
+
const indexSignature = stableStringify(storageIndex);
|
|
1326
1454
|
const collectionIndexKey = `${modelBuilder.__collection}:${indexSignature}`;
|
|
1327
1455
|
const firstOwner = declaredIndexOwners.get(collectionIndexKey);
|
|
1328
1456
|
if (firstOwner) {
|
|
@@ -1340,7 +1468,7 @@ function buildCollections(
|
|
|
1340
1468
|
? toStorageCollectionOptions(modelBuilder.__collectionOptions)
|
|
1341
1469
|
: undefined;
|
|
1342
1470
|
|
|
1343
|
-
|
|
1471
|
+
intermediate[modelBuilder.__collection] =
|
|
1344
1472
|
storageIndexes.length > 0
|
|
1345
1473
|
? {
|
|
1346
1474
|
...existingCollection,
|
|
@@ -1355,6 +1483,10 @@ function buildCollections(
|
|
|
1355
1483
|
: existingCollection;
|
|
1356
1484
|
}
|
|
1357
1485
|
|
|
1486
|
+
const collections: Record<string, MongoCollection> = {};
|
|
1487
|
+
for (const [name, data] of Object.entries(intermediate)) {
|
|
1488
|
+
collections[name] = new MongoCollection(data);
|
|
1489
|
+
}
|
|
1358
1490
|
return collections;
|
|
1359
1491
|
}
|
|
1360
1492
|
|
|
@@ -1407,8 +1539,6 @@ function buildContractFromDefinition<
|
|
|
1407
1539
|
meta: {},
|
|
1408
1540
|
} satisfies MongoContract;
|
|
1409
1541
|
|
|
1410
|
-
validateMongoContract(builtContract);
|
|
1411
|
-
|
|
1412
1542
|
return builtContract as MongoContractResult<Definition>;
|
|
1413
1543
|
}
|
|
1414
1544
|
|
|
@@ -1425,9 +1555,9 @@ export function defineContract<
|
|
|
1425
1555
|
>(definition: Definition): MongoContractResult<Definition>;
|
|
1426
1556
|
export function defineContract<
|
|
1427
1557
|
const Definition extends ContractScaffold<
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1558
|
+
Family,
|
|
1559
|
+
Target,
|
|
1560
|
+
ExtensionPacks,
|
|
1431
1561
|
ContractCapabilities | undefined,
|
|
1432
1562
|
Record<string, ModelNameInput> | undefined
|
|
1433
1563
|
>,
|
|
@@ -1436,9 +1566,14 @@ export function defineContract<
|
|
|
1436
1566
|
readonly valueObjects?: Record<string, AnyValueObjectBuilder>;
|
|
1437
1567
|
readonly roots?: Record<string, ModelNameInput>;
|
|
1438
1568
|
},
|
|
1569
|
+
const Family extends FamilyPackRef<string> = FamilyPackRef<string>,
|
|
1570
|
+
const Target extends TargetPackRef<string, string> = TargetPackRef<string, string>,
|
|
1571
|
+
const ExtensionPacks extends
|
|
1572
|
+
| Record<string, ExtensionPackRef<string, string>>
|
|
1573
|
+
| undefined = undefined,
|
|
1439
1574
|
>(
|
|
1440
1575
|
definition: Definition,
|
|
1441
|
-
factory: (
|
|
1576
|
+
factory: (helpers: ContractAuthoringHelpers<Family, Target, ExtensionPacks>) => Built,
|
|
1442
1577
|
): MongoContractResult<Definition & Built>;
|
|
1443
1578
|
export function defineContract(
|
|
1444
1579
|
definition: ContractScaffold<
|
|
@@ -1464,8 +1599,22 @@ export function defineContract(
|
|
|
1464
1599
|
return buildContractFromDefinition(definition);
|
|
1465
1600
|
}
|
|
1466
1601
|
|
|
1602
|
+
const entities = composeMongoEntityHelpers(
|
|
1603
|
+
definition.family,
|
|
1604
|
+
definition.target,
|
|
1605
|
+
definition.extensionPacks,
|
|
1606
|
+
);
|
|
1607
|
+
const helpers = {
|
|
1608
|
+
...entities,
|
|
1609
|
+
field,
|
|
1610
|
+
index,
|
|
1611
|
+
model,
|
|
1612
|
+
rel,
|
|
1613
|
+
valueObject,
|
|
1614
|
+
} as unknown as ContractAuthoringHelpers;
|
|
1615
|
+
|
|
1467
1616
|
return buildContractFromDefinition({
|
|
1468
1617
|
...definition,
|
|
1469
|
-
...factory(
|
|
1618
|
+
...factory(helpers),
|
|
1470
1619
|
});
|
|
1471
1620
|
}
|