@prisma-next/mongo-contract-ts 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import { ContractConfig, ContractConfig as ContractConfig$1 } from "@prisma-next/config/config-types";
2
1
  import { Contract } from "@prisma-next/contract/types";
2
+ import { ContractConfig, ContractConfig as ContractConfig$1 } from "@prisma-next/config/config-types";
3
3
 
4
4
  //#region src/config-types.d.ts
5
5
  declare function typescriptContract(contract: Contract, output?: string): ContractConfig$1;
@@ -1 +1 @@
1
- {"version":3,"file":"config-types.d.mts","names":[],"sources":["../src/config-types.ts"],"mappings":";;;;iBAQgB,kBAAA,CAAmB,QAAA,EAAU,QAAA,EAAU,MAAA,YAAkB,gBAAA;AAAA,iBASzD,0BAAA,CAA2B,YAAA,UAAsB,MAAA,YAAkB,gBAAA"}
1
+ {"version":3,"file":"config-types.d.mts","names":[],"sources":["../src/config-types.ts"],"mappings":";;;;iBAQgB,kBAAA,CAAmB,QAAA,EAAU,QAAA,EAAU,MAAA,YAAkB,gBAAc;AAAA,iBASvE,0BAAA,CAA2B,YAAA,UAAsB,MAAA,YAAkB,gBAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-types.mjs","names":[],"sources":["../src/config-types.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport type { ContractConfig } from '@prisma-next/config/config-types';\nimport type { Contract } from '@prisma-next/contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { ok } from '@prisma-next/utils/result';\n\n// This helper stays family-agnostic and intentionally accepts the base Contract shape even when\n// re-exported from a Mongo-specific package.\nexport function typescriptContract(contract: Contract, output?: string): ContractConfig {\n return {\n source: {\n load: async () => ok(contract),\n },\n ...ifDefined('output', output),\n };\n}\n\nexport function typescriptContractFromPath(contractPath: string, output?: string): ContractConfig {\n return {\n source: {\n inputs: [contractPath],\n load: async (context) => {\n const [absolutePath] = context.resolvedInputs;\n if (absolutePath === undefined) {\n throw new Error(\n 'typescriptContractFromPath: context.resolvedInputs is empty. The CLI config loader should populate it positional-matched with source.inputs.',\n );\n }\n const mod = await import(pathToFileURL(absolutePath).href);\n const contract: Contract | undefined = mod.default ?? mod.contract;\n if (contract === undefined) {\n throw new Error(\n `typescriptContractFromPath: module at \"${absolutePath}\" has no \"default\" or \"contract\" export.`,\n );\n }\n return ok(contract);\n },\n },\n ...ifDefined('output', output),\n };\n}\n"],"mappings":";;;;AAQA,SAAgB,mBAAmB,UAAoB,QAAiC;CACtF,OAAO;EACL,QAAQ,EACN,MAAM,YAAY,GAAG,SAAS,EAC/B;EACD,GAAG,UAAU,UAAU,OAAO;EAC/B;;AAGH,SAAgB,2BAA2B,cAAsB,QAAiC;CAChG,OAAO;EACL,QAAQ;GACN,QAAQ,CAAC,aAAa;GACtB,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,gBAAgB,QAAQ;IAC/B,IAAI,iBAAiB,KAAA,GACnB,MAAM,IAAI,MACR,+IACD;IAEH,MAAM,MAAM,MAAM,OAAO,cAAc,aAAa,CAAC;IACrD,MAAM,WAAiC,IAAI,WAAW,IAAI;IAC1D,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MACR,0CAA0C,aAAa,0CACxD;IAEH,OAAO,GAAG,SAAS;;GAEtB;EACD,GAAG,UAAU,UAAU,OAAO;EAC/B"}
1
+ {"version":3,"file":"config-types.mjs","names":[],"sources":["../src/config-types.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport type { ContractConfig } from '@prisma-next/config/config-types';\nimport type { Contract } from '@prisma-next/contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { ok } from '@prisma-next/utils/result';\n\n// This helper stays family-agnostic and intentionally accepts the base Contract shape even when\n// re-exported from a Mongo-specific package.\nexport function typescriptContract(contract: Contract, output?: string): ContractConfig {\n return {\n source: {\n load: async () => ok(contract),\n },\n ...ifDefined('output', output),\n };\n}\n\nexport function typescriptContractFromPath(contractPath: string, output?: string): ContractConfig {\n return {\n source: {\n inputs: [contractPath],\n load: async (context) => {\n const [absolutePath] = context.resolvedInputs;\n if (absolutePath === undefined) {\n throw new Error(\n 'typescriptContractFromPath: context.resolvedInputs is empty. The CLI config loader should populate it positional-matched with source.inputs.',\n );\n }\n const mod = await import(pathToFileURL(absolutePath).href);\n const contract: Contract | undefined = mod.default ?? mod.contract;\n if (contract === undefined) {\n throw new Error(\n `typescriptContractFromPath: module at \"${absolutePath}\" has no \"default\" or \"contract\" export.`,\n );\n }\n return ok(contract);\n },\n },\n ...ifDefined('output', output),\n };\n}\n"],"mappings":";;;;AAQA,SAAgB,mBAAmB,UAAoB,QAAiC;CACtF,OAAO;EACL,QAAQ,EACN,MAAM,YAAY,GAAG,QAAQ,EAC/B;EACA,GAAG,UAAU,UAAU,MAAM;CAC/B;AACF;AAEA,SAAgB,2BAA2B,cAAsB,QAAiC;CAChG,OAAO;EACL,QAAQ;GACN,QAAQ,CAAC,YAAY;GACrB,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,gBAAgB,QAAQ;IAC/B,IAAI,iBAAiB,KAAA,GACnB,MAAM,IAAI,MACR,8IACF;IAEF,MAAM,MAAM,MAAM,OAAO,cAAc,YAAY,EAAE;IACrD,MAAM,WAAiC,IAAI,WAAW,IAAI;IAC1D,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MACR,0CAA0C,aAAa,yCACzD;IAEF,OAAO,GAAG,QAAQ;GACpB;EACF;EACA,GAAG,UAAU,UAAU,MAAM;CAC/B;AACF"}
@@ -1,6 +1,7 @@
1
+ import { ContractFieldType, CrossReference, ProfileHashBase, StorageHashBase } from "@prisma-next/contract/types";
1
2
  import { EntityHelpersFromNamespace, ExtractAuthoringNamespaceFromPack, MergeExtensionAuthoringNamespaces } from "@prisma-next/contract-authoring";
3
+ import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
2
4
  import { MongoCollection, MongoCollectionOptionsAuthoringInput, MongoContractWithTypeMaps, MongoIndexAuthoringInput, MongoIndexFields, MongoIndexOptionsInput, MongoStorageShape, MongoTypeMaps } from "@prisma-next/mongo-contract";
3
- import { ContractFieldType, ProfileHashBase, StorageHashBase } from "@prisma-next/contract/types";
4
5
  import { ExtensionPackRef, FamilyPackRef, TargetPackRef } from "@prisma-next/framework-components/components";
5
6
 
6
7
  //#region src/contract-builder.d.ts
@@ -10,7 +11,6 @@ type VariantSpec = {
10
11
  type StorageRelationSpec = {
11
12
  readonly field: string;
12
13
  };
13
- type ContractCapabilities = Record<string, Record<string, boolean>>;
14
14
  type StringListInput = string | readonly string[];
15
15
  type Present<T> = Exclude<T, undefined>;
16
16
  type EmptyObject = Record<never, never>;
@@ -150,11 +150,11 @@ type ContractValueObjectFromBuilder<TBuilder> = TBuilder extends ValueObjectBuil
150
150
  }> : never;
151
151
  type ContractValueObjectsFromRecord<ValueObjects extends Record<string, AnyValueObjectBuilder>> = Simplify<{ readonly [K in keyof ValueObjects as ExtractValueObjectName<ValueObjects[K]>]: ContractValueObjectFromBuilder<ValueObjects[K]> }>;
152
152
  type ContractRelationFromBuilder<TBuilder> = TBuilder extends RelationBuilder<infer To extends string, infer Cardinality extends '1:1' | '1:N' | 'N:1', infer On extends RelationOn | undefined> ? On extends RelationOn ? {
153
- readonly to: To;
153
+ readonly to: CrossRefFor<To>;
154
154
  readonly cardinality: Cardinality;
155
155
  readonly on: On;
156
156
  } : {
157
- readonly to: To;
157
+ readonly to: CrossRefFor<To>;
158
158
  readonly cardinality: Cardinality;
159
159
  } : never;
160
160
  type ContractRelationsFromRecord<Relations extends Record<string, AnyRelationBuilder>> = keyof Relations extends never ? Record<string, never> : Simplify<{ readonly [K in keyof Relations]: ContractRelationFromBuilder<Relations[K]> }>;
@@ -163,7 +163,7 @@ type MaybeOwner<Owner> = [Owner] extends [undefined] ? EmptyObject : {
163
163
  readonly owner: Owner & string;
164
164
  };
165
165
  type MaybeBase<Base> = [Base] extends [undefined] ? EmptyObject : {
166
- readonly base: Base & string;
166
+ readonly base: CrossRefFor<Base & string>;
167
167
  };
168
168
  type MaybeDiscriminator<Discriminator> = [Discriminator] extends [undefined] ? EmptyObject : {
169
169
  readonly discriminator: Discriminator & {
@@ -179,9 +179,12 @@ type ContractModelFromBuilder<TBuilder> = TBuilder extends NamedModelBuilder<str
179
179
  readonly storage: ContractModelStorageFromBuilder<TBuilder>;
180
180
  } & MaybeOwner<Owner> & MaybeBase<Base> & MaybeDiscriminator<Discriminator> & MaybeVariants<Variants>> : never;
181
181
  type ContractModelsFromRecord<Models extends Record<string, AnyModelBuilder>> = Simplify<{ readonly [K in keyof Models as ExtractModelName<Models[K]>]: ContractModelFromBuilder<Models[K]> }>;
182
- type DerivedRootModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{ readonly [K in keyof Models as RootModelCollection<Models[K]>]: RootModelName<Models[K]> }>;
182
+ type CrossRefFor<M extends string> = CrossReference & {
183
+ readonly model: M;
184
+ };
185
+ type DerivedRootModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{ readonly [K in keyof Models as RootModelCollection<Models[K]>]: CrossRefFor<RootModelName<Models[K]>> }>;
183
186
  type StorageCollectionsFromModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{ readonly [K in keyof Models as CollectionName<Models[K]>]: MongoCollection }>;
184
- type NormalizeRoots<Roots extends Record<string, ModelNameInput>> = Simplify<{ readonly [K in keyof Roots]: NormalizeModelName<Roots[K]> }>;
187
+ type NormalizeRoots<Roots extends Record<string, ModelNameInput>> = Simplify<{ readonly [K in keyof Roots]: CrossRefFor<NormalizeModelName<Roots[K]>> }>;
185
188
  type DefinitionModels<Definition> = Definition extends {
186
189
  readonly models?: infer Models extends Record<string, AnyModelBuilder>;
187
190
  } ? Models : Record<never, never>;
@@ -191,9 +194,6 @@ type DefinitionValueObjects<Definition> = Definition extends {
191
194
  type DefinitionRoots<Definition> = Definition extends {
192
195
  readonly roots?: infer Roots extends Record<string, ModelNameInput>;
193
196
  } ? NormalizeRoots<Roots> : DerivedRootModels<DefinitionModels<Definition>>;
194
- type DefinitionCapabilities<Definition> = Definition extends {
195
- readonly capabilities?: infer Capabilities extends ContractCapabilities;
196
- } ? Capabilities : Record<never, never>;
197
197
  type DefinitionExtensionPacks<Definition> = Definition extends {
198
198
  readonly extensionPacks?: infer ExtensionPacks extends Record<string, ExtensionPackRef<string, string>>;
199
199
  } ? ExtensionPacks : Record<never, never>;
@@ -210,17 +210,22 @@ type DefinitionStorage<Definition> = Simplify<MongoStorageShape & {
210
210
  type MaybeValueObjectsSection<ValueObjects extends Record<string, AnyValueObjectBuilder>> = keyof ValueObjects extends never ? EmptyObject : {
211
211
  readonly valueObjects: ContractValueObjectsFromRecord<ValueObjects>;
212
212
  };
213
+ type MongoDomainNamespaceFromDefinition<Definition> = Simplify<{
214
+ readonly models: ContractModelsFromRecord<DefinitionModels<Definition>>;
215
+ } & MaybeValueObjectsSection<DefinitionValueObjects<Definition>>>;
213
216
  type MongoContractBaseFromDefinition<Definition> = Simplify<{
214
217
  readonly target: DefinitionTargetId<Definition>;
215
218
  readonly targetFamily: DefinitionFamilyId<Definition>;
216
219
  readonly roots: DefinitionRoots<Definition>;
217
- readonly models: ContractModelsFromRecord<DefinitionModels<Definition>>;
220
+ readonly domain: {
221
+ readonly namespaces: { readonly [K in typeof UNBOUND_NAMESPACE_ID]: MongoDomainNamespaceFromDefinition<Definition> };
222
+ };
218
223
  readonly storage: DefinitionStorage<Definition>;
219
- readonly capabilities: DefinitionCapabilities<Definition>;
224
+ readonly capabilities: Record<string, never>;
220
225
  readonly extensionPacks: DefinitionExtensionPacks<Definition>;
221
226
  readonly profileHash: ProfileHashBase<string>;
222
227
  readonly meta: Record<string, never>;
223
- } & MaybeValueObjectsSection<DefinitionValueObjects<Definition>>>;
228
+ }>;
224
229
  type CodecTypesFromDefinition<Definition> = MongoCodecTypes & MergeExtensionCodecTypesSafe<DefinitionExtensionPacks<Definition>>;
225
230
  type MongoContractResult<Definition> = MongoContractWithTypeMaps<MongoContractBaseFromDefinition<Definition>, MongoTypeMaps<CodecTypesFromDefinition<Definition>>>;
226
231
  type ExtractEntitiesNamespaceFromPack<Pack> = ExtractAuthoringNamespaceFromPack<Pack, 'entityTypes', Record<never, never>>;
@@ -232,14 +237,13 @@ type ContractAuthoringHelpers<Family extends FamilyPackRef<string> = FamilyPackR
232
237
  readonly rel: typeof rel;
233
238
  readonly valueObject: typeof valueObject;
234
239
  };
235
- type ContractScaffold<Family extends FamilyPackRef<string>, Target extends TargetPackRef<string, string>, ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined, Capabilities extends ContractCapabilities | undefined = undefined, Roots extends Record<string, ModelNameInput> | undefined = undefined> = {
240
+ type ContractScaffold<Family extends FamilyPackRef<string>, Target extends TargetPackRef<string, string>, ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined, Roots extends Record<string, ModelNameInput> | undefined = undefined> = {
236
241
  readonly family: Family;
237
242
  readonly target: Target;
238
243
  readonly extensionPacks?: ExtensionPacks;
239
- readonly capabilities?: Capabilities;
240
244
  readonly roots?: Roots;
241
245
  };
242
- type ContractDefinition<Family extends FamilyPackRef<string>, Target extends TargetPackRef<string, string>, Models extends Record<string, AnyModelBuilder> = Record<never, never>, ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>, ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined, Capabilities extends ContractCapabilities | undefined = undefined, Roots extends Record<string, ModelNameInput> | undefined = undefined> = ContractScaffold<Family, Target, ExtensionPacks, Capabilities, Roots> & {
246
+ type ContractDefinition<Family extends FamilyPackRef<string>, Target extends TargetPackRef<string, string>, Models extends Record<string, AnyModelBuilder> = Record<never, never>, ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>, ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined, Roots extends Record<string, ModelNameInput> | undefined = undefined> = ContractScaffold<Family, Target, ExtensionPacks, Roots> & {
243
247
  readonly models?: Models;
244
248
  readonly valueObjects?: ValueObjects;
245
249
  };
@@ -346,8 +350,8 @@ declare function model<const Name extends string, const Fields extends Record<st
346
350
  } : undefined, Discriminator extends {
347
351
  readonly variants: infer Variants extends Record<string, VariantSpec>;
348
352
  } ? Variants : undefined>;
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>;
350
- declare function defineContract<const Definition extends ContractScaffold<Family, Target, ExtensionPacks, ContractCapabilities | undefined, Record<string, ModelNameInput> | undefined>, const Built extends {
353
+ declare function defineContract<const Definition extends ContractDefinition<FamilyPackRef<string>, TargetPackRef<string, string>, Record<string, AnyModelBuilder>, Record<string, AnyValueObjectBuilder>, Record<string, ExtensionPackRef<string, string>> | undefined, Record<string, ModelNameInput> | undefined>>(definition: Definition): MongoContractResult<Definition>;
354
+ declare function defineContract<const Definition extends ContractScaffold<Family, Target, ExtensionPacks, Record<string, ModelNameInput> | undefined>, const Built extends {
351
355
  readonly models?: Record<string, AnyModelBuilder>;
352
356
  readonly valueObjects?: Record<string, AnyValueObjectBuilder>;
353
357
  readonly roots?: Record<string, ModelNameInput>;
@@ -1 +1 @@
1
- {"version":3,"file":"contract-builder.d.mts","names":[],"sources":["../src/contract-builder.ts"],"mappings":";;;;;;KAyEK,WAAA;EAAA,SACM,KAAA;AAAA;AAAA,KAGN,mBAAA;EAAA,SACM,KAAA;AAAA;AAAA,KAGN,oBAAA,GAAuB,MAAA,SAAe,MAAA;AAAA,KACtC,eAAA;AAAA,KACA,OAAA,MAAa,OAAA,CAAQ,CAAA;AAAA,KACrB,WAAA,GAAc,MAAA;AAAA,KACd,QAAA,oBAA4B,CAAA,GAAI,CAAA,CAAE,CAAA,MAAO,WAAA;AAAA,KACzC,WAAA,kBAA6B,MAAA,GAChC,KAAA,GACA,MAAA,CAAO,OAAA,OAAc,MAAA,QAAc,KAAA;AAAA,KAEhC,mBAAA,WAA8B,KAAA,oBAAyB,KAAA,EAAO,KAAA,6BACjE,KAAA,iCAEE,YAAA;AAAA,KAGQ,yBAAA,MAA+B,CAAA;EAAY,YAAA;AAAA,IACnD,UAAA,SAAmB,MAAA;EAAiB,MAAA;AAAA,KAClC,UAAA,GACA,MAAA,kBACF,MAAA;AAAA,KAIC,eAAA;EAAA,SACM,kBAAA;IAAA,SAA+B,KAAA;IAAA,SAAwB,MAAA;EAAA;EAAA,SACvD,gBAAA;IAAA,SAA6B,KAAA;IAAA,SAAwB,MAAA;EAAA;EAAA,SACrD,gBAAA;IAAA,SAA6B,KAAA;IAAA,SAAwB,MAAA;EAAA;EAAA,SACrD,eAAA;IAAA,SAA4B,KAAA;IAAA,SAAwB,MAAA;EAAA;EAAA,SACpD,cAAA;IAAA,SAA2B,KAAA;IAAA,SAAyB,MAAA;EAAA;EAAA,SACpD,cAAA;IAAA,SAA2B,KAAA,EAAO,IAAA;IAAA,SAAe,MAAA,EAAQ,IAAA;EAAA;EAAA,SACzD,gBAAA;IAAA,SACE,KAAA;IAAA,SACA,MAAA;EAAA;AAAA;AAAA,KAIR,wBAAA,eAAuC,MAAA,qBAA2B,mBAAA,eAEvD,KAAA,GAAQ,yBAAA,CAA0B,KAAA,CAAM,CAAA,WAC9C,KAAA;AAAA,KAGL,4BAAA,UACH,KAAA,SAAc,MAAA,0BACJ,KAAA,iBACJ,MAAA,kBACA,wBAAA,CAAyB,KAAA,IAC3B,MAAA;AAAA,UAEW,YAAA,cACF,iBAAA,GAAoB,iBAAA;EAAA,SAIxB,MAAA;EAAA,SACA,MAAA,EAAQ,IAAA;EAAA,SACR,UAAA,EAAY,QAAA;EAAA,SACZ,MAAA,EAAQ,IAAA;EACjB,QAAA,IAAY,YAAA,CAAa,IAAA,QAAY,IAAA;EACrC,IAAA,IAAQ,YAAA,CAAa,IAAA,EAAM,QAAA;AAAA;AAAA,UAGZ,kBAAA,8CAEA,MAAA,SAAe,YAAA,IAAgB,MAAA,SAAe,YAAA;EAAA,SAEpD,MAAA;EAAA,SACA,MAAA,EAAQ,IAAA;EAAA,SACR,QAAA,EAAU,MAAA;AAAA;AAAA,UAGJ,cAAA;EAAA,SAIN,MAAA;EAAA,SACA,SAAA,EAAW,SAAA;EAAA,SACX,SAAA,EAAW,SAAA;AAAA;AAAA,UAGL,UAAA;EAAA,SAIN,WAAA,EAAa,WAAA;EAAA,SACb,YAAA,EAAc,YAAA;AAAA;AAAA,UAGR,eAAA,2GAGJ,UAAA,eAAyB,UAAA;EAAA,SAE3B,MAAA;EAAA,SACA,IAAA,EAAM,EAAA;EAAA,SACN,aAAA,EAAe,WAAA;EAAA,SACf,IAAA,EAAM,EAAA;AAAA;AAAA,UAGA,YAAA,8CAEA,MAAA,SAAe,YAAA,IAAgB,MAAA,SAAe,YAAA,qBAC3C,MAAA,SAAe,eAAA,IAAmB,MAAA,SAAe,eAAA,qMAI1C,MAAA,SAAe,mBAAA,gBACpC,MAAA,SAAe,mBAAA;EAAA,SAEc,KAAA;AAAA;EAAA,SAClB,KAAA;AAAA,gCAEE,MAAA,SAAe,WAAA,gBAC5B,MAAA,SAAe,WAAA;EAAA,SAGV,MAAA;EAAA,SACA,MAAA,EAAQ,IAAA;EAAA,SACR,QAAA,EAAU,MAAA;EAAA,SACV,WAAA,EAAa,SAAA;EAAA,SACb,SAAA,WAAoB,wBAAA;EAAA,SACpB,mBAAA,EAAqB,oCAAA;EAAA,SACrB,YAAA,EAAc,UAAA;EAAA,SACd,OAAA,EAAS,KAAA;EAAA,SACT,MAAA,EAAQ,IAAA;EAAA,SACR,kBAAA,EAAoB,gBAAA;EAAA,SACpB,eAAA,EAAiB,aAAA;EAAA,SACjB,UAAA,EAAY,QAAA;EACrB,GAAA,+BAAkC,MAAA,WAChC,SAAA,EAAW,SAAA,GACV,cAAA,CAAe,IAAA,EAAM,SAAA;AAAA;AAAA,KAGrB,eAAA,GAAkB,YAAA,CAAa,iBAAA;AAAA,KAC/B,2BAAA,GAA8B,eAAA,gCAA+C,UAAA;AAAA,KAC7E,uBAAA,GAA0B,eAAA;AAAA,KAC1B,kBAAA,GAAqB,2BAAA,GAA8B,uBAAA;AAAA,KACnD,iBAAA,GAAoB,cAAA;AAAA,KACpB,uBAAA,8CAEY,MAAA,SAAe,eAAA,IAAmB,MAAA,SAAe,eAAA,KAC9D,kBAAA,CAAmB,IAAA,EAAM,MAAA;AAAA,KACxB,qBAAA,GAAwB,uBAAA;AAAA,KACxB,iBAAA,8CAEY,MAAA,SAAe,eAAA,IAAmB,MAAA,SAAe,eAAA,qBAC9C,MAAA,SAAe,kBAAA,IAAsB,MAAA,SAAe,kBAAA,qMAI7C,MAAA,SAAe,mBAAA,gBACpC,MAAA,SAAe,mBAAA;EAAA,SAEc,KAAA;AAAA;EAAA,SAClB,KAAA;AAAA,gCAEE,MAAA,SAAe,WAAA,gBAC5B,MAAA,SAAe,WAAA,iBAEjB,YAAA,CACF,IAAA,EACA,MAAA,EACA,SAAA,EACA,UAAA,EACA,KAAA,EACA,IAAA,EACA,gBAAA,EACA,aAAA,EACA,QAAA;AAAA,KAEG,eAAA,GAAkB,iBAAA;AAAA,KAElB,yBAAA,MACH,CAAA,SAAU,cAAA,2CAAyD,SAAA;AAAA,KAChE,gBAAA,MAAsB,CAAA,SAAU,iBAAA,eAAgC,IAAA;AAAA,KAChE,sBAAA,MAA4B,CAAA,SAAU,uBAAA,eAAsC,IAAA;AAAA,KAC5E,sBAAA,MACH,CAAA,SAAU,iBAAA,SAER,MAAA,SAAe,eAAA,GACf,MAAA,SAAe,kBAAA,uBAGb,UAAA;AAAA,KAED,iBAAA,MACH,CAAA,SAAU,iBAAA,SAER,MAAA,SAAe,eAAA,GACf,MAAA,SAAe,kBAAA,sCAIb,KAAA;AAAA,KAED,gBAAA,MACH,CAAA,SAAU,iBAAA,SAER,MAAA,SAAe,eAAA,GACf,MAAA,SAAe,kBAAA,yDAKb,IAAA;AAAA,KAED,4BAAA,MACH,CAAA,SAAU,iBAAA,SAER,MAAA,SAAe,eAAA,GACf,MAAA,SAAe,kBAAA,yFAMb,gBAAA;AAAA,KAGD,mBAAA,MACH,sBAAA,CAAuB,CAAA;EAAA,SACR,UAAA,EAAY,sBAAA,CAAuB,CAAA;AAAA,IAC9C,WAAA;AAAA,KACD,4BAAA,MACH,4BAAA,CAA6B,CAAA,UAAW,MAAA,SAAe,mBAAA,UAC7C,4BAAA,CAA6B,CAAA,kBACjC,WAAA;EAAA,SACW,SAAA,EAAW,4BAAA,CAA6B,CAAA;AAAA,IACrD,WAAA;AAAA,KACD,mBAAA,MACH,sBAAA,CAAuB,CAAA,mBACnB,iBAAA,CAAkB,CAAA,sBAChB,gBAAA,CAAiB,CAAA,sBACf,sBAAA,CAAuB,CAAA;AAAA,KAI5B,aAAA,MAAmB,mBAAA,CAAoB,CAAA,0BAA2B,gBAAA,CAAiB,CAAA;AAAA,KACnF,cAAA,MACH,sBAAA,CAAuB,CAAA,mBAAoB,sBAAA,CAAuB,CAAA;AAAA,KAE/D,cAAA,YAA0B,eAAA;AAAA,KAC1B,oBAAA,YAAgC,qBAAA;AAAA,KAChC,yBAAA,8BACD,eAAA,GACA,cAAA,CAAe,UAAA,qBACN,cAAA,CAAe,UAAA;AAAA,KAEvB,kBAAA,MAAwB,CAAA,kBAAmB,CAAA,GAAI,gBAAA,CAAiB,CAAA;AAAA,KAEhE,6BAAA,OAAoC,CAAA,oCAErC,kBAAA,CAAmB,OAAA,CAAQ,CAAA;AAAA,KAE1B,wBAAA,MAA8B,CAAA,kBAAmB,CAAA,GAAI,sBAAA,CAAuB,CAAA;AAAA,KAE5E,mBAAA,MAAyB,CAAA,6BAC1B,CAAA,GACA,CAAA,4BACY,CAAA;AAAA,KAGX,wBAAA,MAA8B,CAAA,kBAAmB,iBAAA,4BAE3B,CAAA,GAAI,yBAAA,CAA0B,CAAA,CAAE,CAAA,OAEvD,CAAA,SAAU,iBAAA,aACE,yBAAA,CAA0B,CAAA,KACpC,mBAAA,CAAoB,CAAA;AAAA,KAErB,wBAAA,aACH,QAAA,SAAiB,YAAA,oBACI,iBAAA,gEAIjB,QAAA;EAAA,SAEa,IAAA,EAAM,IAAA;EAAA,SACN,QAAA,EAAU,QAAA;AAAA,KAChB,IAAA;EAAA,SAA+B,IAAA;AAAA,IAAe,WAAA;AAAA,KAItD,wBAAA,gBAAwC,MAAA,SAAe,eAAA,KAAoB,QAAA,wBACzD,MAAA,GAAS,wBAAA,CAAyB,MAAA,CAAO,CAAA;AAAA,KAG3D,8BAAA,aACH,QAAA,SAAiB,kBAAA,8BAAgD,MAAA,SAAe,eAAA,KAC5E,QAAA;EAAA,SACW,MAAA,EAAQ,wBAAA,CAAyB,MAAA;AAAA;AAAA,KAI7C,8BAAA,sBAAoD,MAAA,SAAe,qBAAA,KACtE,QAAA,wBACuB,YAAA,IAAgB,sBAAA,CACnC,YAAA,CAAa,CAAA,KACX,8BAAA,CAA+B,YAAA,CAAa,CAAA;AAAA,KAG/C,2BAAA,aACH,QAAA,SAAiB,eAAA,4FAGE,UAAA,gBAEf,EAAA,SAAW,UAAA;EAAA,SAEE,EAAA,EAAI,EAAA;EAAA,SACJ,WAAA,EAAa,WAAA;EAAA,SACb,EAAA,EAAI,EAAA;AAAA;EAAA,SAGJ,EAAA,EAAI,EAAA;EAAA,SACJ,WAAA,EAAa,WAAA;AAAA;AAAA,KAI3B,2BAAA,mBAA8C,MAAA,SAAe,kBAAA,WAC1D,SAAA,iBACF,MAAA,kBACA,QAAA,wBACuB,SAAA,GAAY,2BAAA,CAA4B,SAAA,CAAU,CAAA;AAAA,KAG1E,+BAAA,aAA4C,mBAAA,CAAoB,QAAA,IACnE,4BAAA,CAA6B,QAAA;AAAA,KAE1B,UAAA,WAAqB,KAAA,wBACtB,WAAA;EAAA,SACW,KAAA,EAAO,KAAA;AAAA;AAAA,KACjB,SAAA,UAAmB,IAAA,wBAA4B,WAAA;EAAA,SAAyB,IAAA,EAAM,IAAA;AAAA;AAAA,KAC9E,kBAAA,mBAAqC,aAAA,wBACtC,WAAA;EAAA,SACW,aAAA,EAAe,aAAA;IAAA,SAA2B,KAAA;EAAA;AAAA;AAAA,KACpD,aAAA,cAA2B,QAAA,wBAC5B,WAAA;EAAA,SACW,QAAA,EAAU,QAAA;AAAA;AAAA,KAEpB,wBAAA,aACH,QAAA,SAAiB,iBAAA,8BAEM,MAAA,SAAe,eAAA,2BACZ,MAAA,SAAe,kBAAA,gDAIvC,MAAA,SAAe,mBAAA,sDAIb,QAAA;EAAA,SAEa,MAAA,EAAQ,wBAAA,CAAyB,MAAA;EAAA,SACjC,SAAA,EAAW,2BAAA,CAA4B,SAAA;EAAA,SACvC,OAAA,EAAS,+BAAA,CAAgC,QAAA;AAAA,IAChD,UAAA,CAAW,KAAA,IACb,SAAA,CAAU,IAAA,IACV,kBAAA,CAAmB,aAAA,IACnB,aAAA,CAAc,QAAA;AAAA,KAInB,wBAAA,gBAAwC,MAAA,SAAe,eAAA,KAAoB,QAAA,wBACzD,MAAA,IAAU,gBAAA,CAAiB,MAAA,CAAO,CAAA,KAAM,wBAAA,CAAyB,MAAA,CAAO,CAAA;AAAA,KAG1F,iBAAA,gBAAiC,MAAA,SAAe,eAAA,KAAoB,QAAA,wBAClD,MAAA,IAAU,mBAAA,CAAoB,MAAA,CAAO,CAAA,KAAM,aAAA,CAAc,MAAA,CAAO,CAAA;AAAA,KAGlF,4BAAA,gBAA4C,MAAA,SAAe,eAAA,KAAoB,QAAA,wBAC7D,MAAA,IAAU,cAAA,CAAe,MAAA,CAAO,CAAA,KAAM,eAAA;AAAA,KAGxD,cAAA,eAA6B,MAAA,SAAe,cAAA,KAAmB,QAAA,wBAC7C,KAAA,GAAQ,kBAAA,CAAmB,KAAA,CAAM,CAAA;AAAA,KAGnD,gBAAA,eAA+B,UAAA;EAAA,SACzB,MAAA,wBAA8B,MAAA,SAAe,eAAA;AAAA,IAEpD,MAAA,GACA,MAAA;AAAA,KAEC,sBAAA,eAAqC,UAAA;EAAA,SAC/B,YAAA,8BAA0C,MAAA,SAAe,qBAAA;AAAA,IAEhE,YAAA,GACA,MAAA;AAAA,KAEC,eAAA,eAA8B,UAAA;EAAA,SACxB,KAAA,uBAA4B,MAAA,SAAe,cAAA;AAAA,IAElD,cAAA,CAAe,KAAA,IACf,iBAAA,CAAkB,gBAAA,CAAiB,UAAA;AAAA,KAElC,sBAAA,eAAqC,UAAA;EAAA,SAC/B,YAAA,8BAA0C,oBAAA;AAAA,IAEjD,YAAA,GACA,MAAA;AAAA,KAEC,wBAAA,eAAuC,UAAA;EAAA,SACjC,cAAA,gCAA8C,MAAA,SAErD,gBAAA;AAAA,IAGA,cAAA,GACA,MAAA;AAAA,KAEC,kBAAA,eAAiC,UAAA;EAAA,SAC3B,MAAA,EAAQ,aAAA;AAAA,IAEf,QAAA;AAAA,KAGC,kBAAA,eAAiC,UAAA;EAAA,SAC3B,MAAA,EAAQ,aAAA;AAAA,IAEf,QAAA;AAAA,KAGC,iBAAA,eAAgC,QAAA,CACnC,iBAAA;EAAA,SACW,WAAA,EAAa,4BAAA,CAA6B,gBAAA,CAAiB,UAAA;EAAA,SAC3D,WAAA,EAAa,eAAA;AAAA;AAAA,KAIrB,wBAAA,sBAA8C,MAAA,SAAe,qBAAA,WAC1D,YAAA,iBACF,WAAA;EAAA,SAEW,YAAA,EAAc,8BAAA,CAA+B,YAAA;AAAA;AAAA,KAGzD,+BAAA,eAA8C,QAAA;EAAA,SAEtC,MAAA,EAAQ,kBAAA,CAAmB,UAAA;EAAA,SAC3B,YAAA,EAAc,kBAAA,CAAmB,UAAA;EAAA,SACjC,KAAA,EAAO,eAAA,CAAgB,UAAA;EAAA,SACvB,MAAA,EAAQ,wBAAA,CAAyB,gBAAA,CAAiB,UAAA;EAAA,SAClD,OAAA,EAAS,iBAAA,CAAkB,UAAA;EAAA,SAC3B,YAAA,EAAc,sBAAA,CAAuB,UAAA;EAAA,SACrC,cAAA,EAAgB,wBAAA,CAAyB,UAAA;EAAA,SACzC,WAAA,EAAa,eAAA;EAAA,SACb,IAAA,EAAM,MAAA;AAAA,IACb,wBAAA,CAAyB,sBAAA,CAAuB,UAAA;AAAA,KAGjD,wBAAA,eAAuC,eAAA,GAC1C,4BAAA,CAA6B,wBAAA,CAAyB,UAAA;AAAA,KAE5C,mBAAA,eAAkC,yBAAA,CAC5C,+BAAA,CAAgC,UAAA,GAChC,aAAA,CAAc,wBAAA,CAAyB,UAAA;AAAA,KAGpC,gCAAA,SAAyC,iCAAA,CAC5C,IAAA,iBAEA,MAAA;AAAA,KAGG,8BAAA,mBAAiD,iCAAA,CACpD,cAAA;AAAA,KAIU,wBAAA,gBACK,aAAA,WAAwB,aAAA,yBACxB,aAAA,mBAAgC,aAAA,yCACxB,MAAA,SAAe,gBAAA,6CACpC,0BAAA,CACF,gCAAA,CAAiC,MAAA,IAC/B,gCAAA,CAAiC,MAAA,IACjC,8BAAA,CAA+B,cAAA;EAAA,SAExB,KAAA,SAAc,KAAA;EAAA,SACd,KAAA,SAAc,KAAA;EAAA,SACd,KAAA,SAAc,KAAA;EAAA,SACd,GAAA,SAAY,GAAA;EAAA,SACZ,WAAA,SAAoB,WAAA;AAAA;AAAA,KA0DnB,gBAAA,gBACK,aAAA,yBACA,aAAA,yCACQ,MAAA,SAAe,gBAAA,gEACjB,oBAAA,wCACP,MAAA,SAAe,cAAA;EAAA,SAEpB,MAAA,EAAQ,MAAA;EAAA,SACR,MAAA,EAAQ,MAAA;EAAA,SACR,cAAA,GAAiB,cAAA;EAAA,SACjB,YAAA,GAAe,YAAA;EAAA,SACf,KAAA,GAAQ,KAAA;AAAA;AAAA,KAGP,kBAAA,gBACK,aAAA,yBACA,aAAA,iCACA,MAAA,SAAe,eAAA,IAAmB,MAAA,qCAC5B,MAAA,SAAe,qBAAA,IAAyB,MAAA,uCACtC,MAAA,SAAe,gBAAA,gEACjB,oBAAA,wCACP,MAAA,SAAe,cAAA,6BAC3B,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,cAAA,EAAgB,YAAA,EAAc,KAAA;EAAA,SACxD,MAAA,GAAS,MAAA;EAAA,SACT,YAAA,GAAe,YAAA;AAAA;AAAA,KAGd,eAAA,gBACK,MAAA,SAAe,eAAA,IAAmB,MAAA,qCAC5B,MAAA,SAAe,qBAAA,IAAyB,MAAA,8BAC/C,MAAA,SAAe,cAAA,0CACd,aAAA,WAAwB,aAAA,yBACxB,aAAA,mBAAgC,aAAA,yCACxB,MAAA,SAAe,gBAAA,8CACnC,OAAA,EAAS,wBAAA,CAAyB,MAAA,EAAQ,MAAA,EAAQ,cAAA;EAAA,SAC5C,MAAA,GAAS,MAAA;EAAA,SACT,YAAA,GAAe,YAAA;EAAA,SACf,KAAA,GAAQ,KAAA;AAAA;AAAA,iBAkDV,wBAAA,4CAEY,MAAA,0CAAA,CAEnB,OAAA,EAAS,OAAA,EACT,OAAA;EAAA,SAAqB,UAAA,GAAa,UAAA;AAAA,IACjC,YAAA;EAAA,SAEU,IAAA;EAAA,SACA,OAAA,EAAS,OAAA;AAAA,MACd,UAAA,wBAAkC,WAAA;EAAA,SAAyB,UAAA,EAAY,UAAA;AAAA;AAAA,cAkBlE,KAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;6CAoBqB,MAAA,2CAAmC,OAAA;IAAA,SACxD,UAAA,GAAa,UAAA;EAAA,MACvB,YAAA;IAAA;;;;;mDAGqC,oBAAA,EAAoB,eAAA,EAAmB,WAAA,KAAW,YAAA;IAAA;mBAOnE,wBAAA,CAAyB,WAAA;EAAA;AAAA;AAAA,iBAQhC,KAAA,sBAA2B,gBAAA,CAAA,CACzC,MAAA,EAAQ,MAAA;EAAA,SAEC,MAAA,EAAQ,MAAA;AAAA;AAAA,iBAEH,KAAA,sBAA2B,gBAAA,gBAAA,CACzC,MAAA,EAAQ,MAAA,EACR,OAAA,EAAS,WAAA,CAAY,OAAA,EAAS,sBAAA;EAAA,SAErB,MAAA,EAAQ,MAAA;EAAA,SACR,OAAA,EAAS,OAAA,GAAU,sBAAA;AAAA;AAAA,KA4EzB,gBAAA,gBACY,cAAA,eACF,eAAA,aACF,yBAAA,CAA0B,kBAAA,CAAmB,MAAA;EAAA,SAE/C,IAAA,EAAM,IAAA;EAAA,SACN,EAAA,EAAI,EAAA;AAAA;AAAA,KAGV,qBAAA,cACU,eAAA,aACF,yBAAA;EAAA,SAEF,WAAA,EAAa,mBAAA,CAAoB,IAAA;EAAA,SACjC,YAAA,EAAc,wBAAA,CAAyB,EAAA;AAAA;AAAA,iBA2DzC,MAAA,sBAA4B,cAAA,CAAA,CACnC,MAAA,EAAQ,MAAA,GACP,eAAA,CAAgB,kBAAA,CAAmB,MAAA;AAAA,iBAC7B,MAAA,sBACc,cAAA,qBACF,eAAA,mBACF,yBAAA,CAA0B,kBAAA,CAAmB,MAAA,GAAA,CAE9D,MAAA,EAAQ,MAAA,EACR,OAAA,EAAS,gBAAA,CAAiB,MAAA,EAAQ,IAAA,EAAM,EAAA,IACvC,eAAA,CAAgB,kBAAA,CAAmB,MAAA,UAAgB,qBAAA,CAAsB,IAAA,EAAM,EAAA;AAAA,iBAYzE,OAAA,sBAA6B,cAAA,CAAA,CACpC,MAAA,EAAQ,MAAA,GACP,eAAA,CAAgB,kBAAA,CAAmB,MAAA;AAAA,iBAC7B,OAAA,sBACc,cAAA,qBACF,eAAA,mBACF,yBAAA,CAA0B,kBAAA,CAAmB,MAAA,GAAA,CAE9D,MAAA,EAAQ,MAAA,EACR,OAAA,EAAS,gBAAA,CAAiB,MAAA,EAAQ,IAAA,EAAM,EAAA,IACvC,eAAA,CAAgB,kBAAA,CAAmB,MAAA,UAAgB,qBAAA,CAAsB,IAAA,EAAM,EAAA;AAAA,iBAYzE,SAAA,sBACc,cAAA,qBACF,eAAA,mBACF,yBAAA,CAA0B,kBAAA,CAAmB,MAAA,GAAA,CAE9D,MAAA,EAAQ,MAAA,EACR,OAAA,EAAS,gBAAA,CAAiB,MAAA,EAAQ,IAAA,EAAM,EAAA,IACvC,eAAA,CAAgB,kBAAA,CAAmB,MAAA,UAAgB,qBAAA,CAAsB,IAAA,EAAM,EAAA;AAAA,cAIrE,GAAA;EAAA;;;;KAMR,gBAAA,gBAAgC,MAAA,SAAe,eAAA;EAAA,SACzC,MAAA,EAAQ,MAAA;AAAA;AAAA,iBAGH,WAAA,iDAEO,MAAA,SAAe,eAAA,EAAA,CACpC,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,gBAAA,CAAiB,MAAA,IAAU,kBAAA,CAAmB,IAAA,EAAM,MAAA;AAAA,KAQpE,uBAAA,kBAAyC,MAAA,SAAe,WAAA;EAAA,SAClD,KAAA;EAAA,SACA,QAAA,EAAU,QAAA;AAAA;AAAA,KAGhB,UAAA,gBACY,MAAA,SAAe,eAAA,qBACZ,MAAA,SAAe,kBAAA,+EAER,wBAAA,iDAEX,cAAA,2BACD,cAAA,uCACY,MAAA,SAAe,mBAAA,qCAClB,uBAAA,CAAwB,MAAA,SAAe,WAAA;EAAA,SAEpD,UAAA,GAAa,UAAA;EAAA,SACb,OAAA,GAAU,OAAA;EAAA,SACV,iBAAA,GAAoB,WAAA,CAAY,iBAAA,EAAmB,oCAAA;EAAA,SACnD,gBAAA,GAAmB,gBAAA;EAAA,SACnB,MAAA,EAAQ,MAAA;EAAA,SACR,SAAA,GAAY,SAAA;EAAA,SACZ,KAAA,GAAQ,KAAA;EAAA,SACR,IAAA,GAAO,IAAA;EAAA,SACP,aAAA,GAAgB,aAAA;AAAA;AAAA,iBAGX,KAAA,iDAEO,MAAA,SAAe,eAAA,2BACZ,MAAA,SAAe,kBAAA,mHAER,wBAAA,qFAEX,cAAA,6CACD,cAAA,yDACY,MAAA,SAAe,mBAAA,uDAE1C,uBAAA,CAAwB,MAAA,SAAe,WAAA,2BAAA,CAG3C,IAAA,EAAM,IAAA,EACN,KAAA,EAAO,UAAA,CACL,MAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACA,iBAAA,EACA,KAAA,EACA,IAAA,EACA,gBAAA,EACA,aAAA,IAED,YAAA,CACD,IAAA,EACA,MAAA,EACA,SAAA,SAAkB,MAAA,SAAe,kBAAA,IAAsB,SAAA,GAAY,MAAA,gBACnE,UAAA,EACA,6BAAA,CAA8B,KAAA,GAC9B,6BAAA,CAA8B,IAAA,GAC9B,gBAAA,EACA,aAAA;EAAA,SAAiC,KAAA;AAAA;EAAA,SAClB,KAAA,EAAO,KAAA;AAAA,eAEtB,aAAA;EAAA,SAAiC,QAAA,yBAAiC,MAAA,SAAe,WAAA;AAAA,IAC7E,QAAA;AAAA,iBA2dU,cAAA,0BACW,kBAAA,CACvB,aAAA,UACA,aAAA,kBACA,MAAA,SAAe,eAAA,GACf,MAAA,SAAe,qBAAA,GACf,MAAA,SAAe,gBAAA,+BACf,oBAAA,cACA,MAAA,SAAe,cAAA,eAAA,CAEjB,UAAA,EAAY,UAAA,GAAa,mBAAA,CAAoB,UAAA;AAAA,iBAC/B,cAAA,0BACW,gBAAA,CACvB,MAAA,EACA,MAAA,EACA,cAAA,EACA,oBAAA,cACA,MAAA,SAAe,cAAA;EAAA,SAGN,MAAA,GAAS,MAAA,SAAe,eAAA;EAAA,SACxB,YAAA,GAAe,MAAA,SAAe,qBAAA;EAAA,SAC9B,KAAA,GAAQ,MAAA,SAAe,cAAA;AAAA,wBAEb,aAAA,WAAwB,aAAA,+BACxB,aAAA,mBAAgC,aAAA,+CAEjD,MAAA,SAAe,gBAAA,0CAAA,CAGnB,UAAA,EAAY,UAAA,EACZ,OAAA,GAAU,OAAA,EAAS,wBAAA,CAAyB,MAAA,EAAQ,MAAA,EAAQ,cAAA,MAAoB,KAAA,GAC/E,mBAAA,CAAoB,UAAA,GAAa,KAAA"}
1
+ {"version":3,"file":"contract-builder.d.mts","names":[],"sources":["../src/contract-builder.ts"],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import { computeProfileHash, computeStorageHash } from "@prisma-next/contract/hashing";
2
+ import { crossRef } from "@prisma-next/contract/types";
2
3
  import { createEntityHelpersFromNamespace } from "@prisma-next/contract-authoring";
3
4
  import { assertNoCrossRegistryCollisions, isAuthoringEntityTypeDescriptor, mergeAuthoringNamespaces } from "@prisma-next/framework-components/authoring";
4
5
  import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
5
- import { MongoCollection, MongoCollectionOptions, MongoIndex, MongoStorage, applyPolymorphicScopeToMongoIndex } from "@prisma-next/mongo-contract";
6
+ import { MongoCollection, MongoCollectionOptions, MongoIndex, MongoStorage, applyPolymorphicScopeToMongoIndex, buildMongoNamespace } from "@prisma-next/mongo-contract";
7
+ import { mongoContractCanonicalizationHooks } from "@prisma-next/mongo-contract/canonicalization-hooks";
6
8
  import { canonicalStringify } from "@prisma-next/utils/canonical-stringify";
7
9
  //#region src/contract-builder.ts
8
10
  function stableStringify(value) {
@@ -245,12 +247,13 @@ function buildFields(fields) {
245
247
  return builtFields;
246
248
  }
247
249
  function buildRelation(relationBuilder) {
250
+ const to = crossRef(relationBuilder.__to, UNBOUND_NAMESPACE_ID);
248
251
  return relationBuilder.__on ? {
249
- to: relationBuilder.__to,
252
+ to,
250
253
  cardinality: relationBuilder.__cardinality,
251
254
  on: relationBuilder.__on
252
255
  } : {
253
- to: relationBuilder.__to,
256
+ to,
254
257
  cardinality: relationBuilder.__cardinality
255
258
  };
256
259
  }
@@ -280,7 +283,7 @@ function buildModels(models) {
280
283
  relations: buildRelations(modelBuilder.__relations),
281
284
  storage,
282
285
  ...modelBuilder.__owner ? { owner: modelBuilder.__owner } : {},
283
- ...modelBuilder.__base ? { base: modelBuilder.__base } : {},
286
+ ...modelBuilder.__base ? { base: crossRef(modelBuilder.__base, UNBOUND_NAMESPACE_ID) } : {},
284
287
  ...modelBuilder.__discriminator ? { discriminator: modelBuilder.__discriminator } : {},
285
288
  ...modelBuilder.__variants ? { variants: modelBuilder.__variants } : {}
286
289
  };
@@ -291,13 +294,13 @@ function deriveRoots(models) {
291
294
  const roots = {};
292
295
  for (const modelBuilder of Object.values(models ?? {})) {
293
296
  if (!modelBuilder.__collection || modelBuilder.__owner || modelBuilder.__base) continue;
294
- roots[modelBuilder.__collection] = modelBuilder.__name;
297
+ roots[modelBuilder.__collection] = crossRef(modelBuilder.__name, UNBOUND_NAMESPACE_ID);
295
298
  }
296
299
  return roots;
297
300
  }
298
301
  function normalizeRoots(roots) {
299
302
  const normalizedRoots = {};
300
- for (const [rootName, rootValue] of Object.entries(roots ?? {})) normalizedRoots[rootName] = resolveModelName(rootValue);
303
+ for (const [rootName, rootValue] of Object.entries(roots ?? {})) normalizedRoots[rootName] = crossRef(resolveModelName(rootValue), UNBOUND_NAMESPACE_ID);
301
304
  return normalizedRoots;
302
305
  }
303
306
  function toStorageIndex(index) {
@@ -412,7 +415,7 @@ function buildContractFromDefinition(definition) {
412
415
  const builtModels = buildModels(definition.models);
413
416
  const builtValueObjects = buildValueObjects(definition.valueObjects);
414
417
  const roots = definition.roots ? normalizeRoots(definition.roots) : deriveRoots(definition.models);
415
- const capabilities = definition.capabilities ?? {};
418
+ const capabilities = {};
416
419
  const collections = buildCollections(definition.models);
417
420
  const storageBody = { namespaces: { [UNBOUND_NAMESPACE_ID]: {
418
421
  id: UNBOUND_NAMESPACE_ID,
@@ -422,16 +425,22 @@ function buildContractFromDefinition(definition) {
422
425
  storageHash: computeStorageHash({
423
426
  target: definition.target.targetId,
424
427
  targetFamily: definition.family.familyId,
425
- storage: storageBody
428
+ storage: storageBody,
429
+ ...mongoContractCanonicalizationHooks
426
430
  }),
427
- ...storageBody
431
+ namespaces: { [UNBOUND_NAMESPACE_ID]: buildMongoNamespace({
432
+ id: UNBOUND_NAMESPACE_ID,
433
+ collections
434
+ }) }
428
435
  });
429
436
  return {
430
437
  target: definition.target.targetId,
431
438
  targetFamily: definition.family.familyId,
432
439
  roots,
433
- models: builtModels,
434
- ...Object.keys(builtValueObjects).length > 0 ? { valueObjects: builtValueObjects } : {},
440
+ domain: { namespaces: { [UNBOUND_NAMESPACE_ID]: {
441
+ models: builtModels,
442
+ ...Object.keys(builtValueObjects).length > 0 ? { valueObjects: builtValueObjects } : {}
443
+ } } },
435
444
  storage,
436
445
  capabilities,
437
446
  extensionPacks: definition.extensionPacks ?? {},
@@ -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 {\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 { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\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 MongoStorage,\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 namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n id: UNBOUND_NAMESPACE_ID,\n collections,\n },\n },\n };\n\n const storageHash = computeStorageHash({\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n storage: storageBody,\n });\n\n const storage = new MongoStorage({\n storageHash,\n ...storageBody,\n }) as unknown as MongoStorageShape<string>;\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 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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"}
1
+ {"version":3,"file":"contract-builder.mjs","names":[],"sources":["../src/contract-builder.ts"],"sourcesContent":["import { computeProfileHash, computeStorageHash } from '@prisma-next/contract/hashing';\nimport {\n type ContractEmbedRelation,\n type ContractField,\n type ContractFieldType,\n type ContractModelsMap,\n type ContractReferenceRelation,\n type ContractValueObject,\n type CrossReference,\n crossRef,\n type ProfileHashBase,\n type 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 { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport {\n applyPolymorphicScopeToMongoIndex,\n buildMongoNamespace,\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 MongoStorage,\n type MongoStorageShape,\n type MongoTypeMaps,\n} from '@prisma-next/mongo-contract';\nimport { mongoContractCanonicalizationHooks } from '@prisma-next/mongo-contract/canonicalization-hooks';\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 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: CrossRefFor<To>;\n readonly cardinality: Cardinality;\n readonly on: On;\n }\n : {\n readonly to: CrossRefFor<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]\n ? EmptyObject\n : { readonly base: CrossRefFor<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 CrossRefFor<M extends string> = CrossReference & { readonly model: M };\n\ntype DerivedRootModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{\n readonly [K in keyof Models as RootModelCollection<Models[K]>]: CrossRefFor<\n RootModelName<Models[K]>\n >;\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]: CrossRefFor<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 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 MongoDomainNamespaceFromDefinition<Definition> = Simplify<\n {\n readonly models: ContractModelsFromRecord<DefinitionModels<Definition>>;\n } & MaybeValueObjectsSection<DefinitionValueObjects<Definition>>\n>;\n\ntype MongoContractBaseFromDefinition<Definition> = Simplify<{\n readonly target: DefinitionTargetId<Definition>;\n readonly targetFamily: DefinitionFamilyId<Definition>;\n readonly roots: DefinitionRoots<Definition>;\n readonly domain: {\n readonly namespaces: {\n readonly [K in typeof UNBOUND_NAMESPACE_ID]: MongoDomainNamespaceFromDefinition<Definition>;\n };\n };\n readonly storage: DefinitionStorage<Definition>;\n readonly capabilities: Record<string, never>;\n readonly extensionPacks: DefinitionExtensionPacks<Definition>;\n readonly profileHash: ProfileHashBase<string>;\n readonly meta: Record<string, never>;\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 Roots extends Record<string, ModelNameInput> | undefined = undefined,\n> = {\n readonly family: Family;\n readonly target: Target;\n readonly extensionPacks?: ExtensionPacks;\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 Roots extends Record<string, ModelNameInput> | undefined = undefined,\n> = ContractScaffold<Family, Target, ExtensionPacks, 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 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 const to = crossRef(relationBuilder.__to, UNBOUND_NAMESPACE_ID);\n return relationBuilder.__on\n ? {\n to,\n cardinality: relationBuilder.__cardinality,\n on: relationBuilder.__on,\n }\n : {\n 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, ContractModelsMap<MongoContract>[string]> {\n const builtModels: Record<string, ContractModelsMap<MongoContract>[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: crossRef(modelBuilder.__base, UNBOUND_NAMESPACE_ID) } : {}),\n ...(modelBuilder.__discriminator ? { discriminator: modelBuilder.__discriminator } : {}),\n ...(modelBuilder.__variants ? { variants: modelBuilder.__variants } : {}),\n };\n }\n\n return builtModels;\n}\n\nfunction deriveRoots(\n models: Record<string, AnyModelBuilder> | undefined,\n): Record<string, CrossReference> {\n const roots: Record<string, CrossReference> = {};\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] = crossRef(modelBuilder.__name, UNBOUND_NAMESPACE_ID);\n }\n\n return roots;\n}\n\nfunction normalizeRoots(\n roots: Record<string, ModelNameInput> | undefined,\n): Record<string, CrossReference> {\n const normalizedRoots: Record<string, CrossReference> = {};\n\n for (const [rootName, rootValue] of Object.entries(roots ?? {})) {\n normalizedRoots[rootName] = crossRef(resolveModelName(rootValue), UNBOUND_NAMESPACE_ID);\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 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 // The Mongo `defineContract` input no longer accepts a `capabilities`\n // block. The build-time matrix is empty here; CLI-time `enrichContract`\n // layers in adapter / driver / extension caps. `profileHash` continues\n // to fingerprint this (now-always-empty) author subset, so it stabilises\n // at `hash({})`.\n const capabilities: Record<string, Record<string, boolean>> = {};\n const collections = buildCollections(definition.models);\n const storageBody = {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n id: UNBOUND_NAMESPACE_ID,\n collections,\n },\n },\n };\n\n const storageHash = computeStorageHash({\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n storage: storageBody,\n ...mongoContractCanonicalizationHooks,\n });\n\n const storage = new MongoStorage({\n storageHash,\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: buildMongoNamespace({\n id: UNBOUND_NAMESPACE_ID,\n collections,\n }),\n },\n }) as unknown as MongoStorageShape<string>;\n\n const builtContract = {\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n roots,\n domain: {\n namespaces: {\n [UNBOUND_NAMESPACE_ID]: {\n models: builtModels,\n ...(Object.keys(builtValueObjects).length > 0 ? { valueObjects: builtValueObjects } : {}),\n },\n },\n },\n storage,\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 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 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 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,27 +1,35 @@
1
1
  {
2
2
  "name": "@prisma-next/mongo-contract-ts",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
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
- "@prisma-next/config": "0.11.0",
10
- "@prisma-next/contract": "0.11.0",
11
- "@prisma-next/contract-authoring": "0.11.0",
12
- "@prisma-next/framework-components": "0.11.0",
13
- "@prisma-next/mongo-contract": "0.11.0",
14
- "@prisma-next/utils": "0.11.0",
9
+ "@prisma-next/config": "0.12.0",
10
+ "@prisma-next/contract": "0.12.0",
11
+ "@prisma-next/contract-authoring": "0.12.0",
12
+ "@prisma-next/framework-components": "0.12.0",
13
+ "@prisma-next/mongo-contract": "0.12.0",
14
+ "@prisma-next/utils": "0.12.0",
15
15
  "pathe": "^2.0.3"
16
16
  },
17
17
  "devDependencies": {
18
- "@prisma-next/test-utils": "0.11.0",
19
- "@prisma-next/tsconfig": "0.11.0",
20
- "@prisma-next/tsdown": "0.11.0",
18
+ "@prisma-next/test-utils": "0.12.0",
19
+ "@prisma-next/tsconfig": "0.12.0",
20
+ "@prisma-next/tsdown": "0.12.0",
21
21
  "tsdown": "0.22.0",
22
22
  "typescript": "5.9.3",
23
23
  "vitest": "4.1.6"
24
24
  },
25
+ "peerDependencies": {
26
+ "typescript": ">=5.9"
27
+ },
28
+ "peerDependenciesMeta": {
29
+ "typescript": {
30
+ "optional": true
31
+ }
32
+ },
25
33
  "files": [
26
34
  "dist",
27
35
  "src"
@@ -31,6 +39,9 @@
31
39
  "./contract-builder": "./dist/contract-builder.mjs",
32
40
  "./package.json": "./package.json"
33
41
  },
42
+ "engines": {
43
+ "node": ">=24"
44
+ },
34
45
  "repository": {
35
46
  "type": "git",
36
47
  "url": "https://github.com/prisma/prisma-next.git",
@@ -1,12 +1,15 @@
1
1
  import { computeProfileHash, computeStorageHash } from '@prisma-next/contract/hashing';
2
- import type {
3
- ContractEmbedRelation,
4
- ContractField,
5
- ContractFieldType,
6
- ContractReferenceRelation,
7
- ContractValueObject,
8
- ProfileHashBase,
9
- StorageHashBase,
2
+ import {
3
+ type ContractEmbedRelation,
4
+ type ContractField,
5
+ type ContractFieldType,
6
+ type ContractModelsMap,
7
+ type ContractReferenceRelation,
8
+ type ContractValueObject,
9
+ type CrossReference,
10
+ crossRef,
11
+ type ProfileHashBase,
12
+ type StorageHashBase,
10
13
  } from '@prisma-next/contract/types';
11
14
  import {
12
15
  createEntityHelpersFromNamespace,
@@ -28,6 +31,7 @@ import type {
28
31
  import { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';
29
32
  import {
30
33
  applyPolymorphicScopeToMongoIndex,
34
+ buildMongoNamespace,
31
35
  MongoCollection,
32
36
  type MongoCollectionInput,
33
37
  MongoCollectionOptions,
@@ -44,6 +48,7 @@ import {
44
48
  type MongoStorageShape,
45
49
  type MongoTypeMaps,
46
50
  } from '@prisma-next/mongo-contract';
51
+ import { mongoContractCanonicalizationHooks } from '@prisma-next/mongo-contract/canonicalization-hooks';
47
52
  import { canonicalStringify } from '@prisma-next/utils/canonical-stringify';
48
53
 
49
54
  // `canonicalStringify` rejects non-plain objects so a `Map` or class
@@ -79,7 +84,6 @@ type StorageRelationSpec = {
79
84
  readonly field: string;
80
85
  };
81
86
 
82
- type ContractCapabilities = Record<string, Record<string, boolean>>;
83
87
  type StringListInput = string | readonly string[];
84
88
  type Present<T> = Exclude<T, undefined>;
85
89
  type EmptyObject = Record<never, never>;
@@ -389,12 +393,12 @@ type ContractRelationFromBuilder<TBuilder> =
389
393
  >
390
394
  ? On extends RelationOn
391
395
  ? {
392
- readonly to: To;
396
+ readonly to: CrossRefFor<To>;
393
397
  readonly cardinality: Cardinality;
394
398
  readonly on: On;
395
399
  }
396
400
  : {
397
- readonly to: To;
401
+ readonly to: CrossRefFor<To>;
398
402
  readonly cardinality: Cardinality;
399
403
  }
400
404
  : never;
@@ -412,7 +416,9 @@ type ContractModelStorageFromBuilder<TBuilder> = ModelStorageSection<TBuilder> &
412
416
  type MaybeOwner<Owner> = [Owner] extends [undefined]
413
417
  ? EmptyObject
414
418
  : { readonly owner: Owner & string };
415
- type MaybeBase<Base> = [Base] extends [undefined] ? EmptyObject : { readonly base: Base & string };
419
+ type MaybeBase<Base> = [Base] extends [undefined]
420
+ ? EmptyObject
421
+ : { readonly base: CrossRefFor<Base & string> };
416
422
  type MaybeDiscriminator<Discriminator> = [Discriminator] extends [undefined]
417
423
  ? EmptyObject
418
424
  : { readonly discriminator: Discriminator & { readonly field: string } };
@@ -448,8 +454,12 @@ type ContractModelsFromRecord<Models extends Record<string, AnyModelBuilder>> =
448
454
  readonly [K in keyof Models as ExtractModelName<Models[K]>]: ContractModelFromBuilder<Models[K]>;
449
455
  }>;
450
456
 
457
+ type CrossRefFor<M extends string> = CrossReference & { readonly model: M };
458
+
451
459
  type DerivedRootModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{
452
- readonly [K in keyof Models as RootModelCollection<Models[K]>]: RootModelName<Models[K]>;
460
+ readonly [K in keyof Models as RootModelCollection<Models[K]>]: CrossRefFor<
461
+ RootModelName<Models[K]>
462
+ >;
453
463
  }>;
454
464
 
455
465
  type StorageCollectionsFromModels<Models extends Record<string, AnyModelBuilder>> = Simplify<{
@@ -457,7 +467,7 @@ type StorageCollectionsFromModels<Models extends Record<string, AnyModelBuilder>
457
467
  }>;
458
468
 
459
469
  type NormalizeRoots<Roots extends Record<string, ModelNameInput>> = Simplify<{
460
- readonly [K in keyof Roots]: NormalizeModelName<Roots[K]>;
470
+ readonly [K in keyof Roots]: CrossRefFor<NormalizeModelName<Roots[K]>>;
461
471
  }>;
462
472
 
463
473
  type DefinitionModels<Definition> = Definition extends {
@@ -478,12 +488,6 @@ type DefinitionRoots<Definition> = Definition extends {
478
488
  ? NormalizeRoots<Roots>
479
489
  : DerivedRootModels<DefinitionModels<Definition>>;
480
490
 
481
- type DefinitionCapabilities<Definition> = Definition extends {
482
- readonly capabilities?: infer Capabilities extends ContractCapabilities;
483
- }
484
- ? Capabilities
485
- : Record<never, never>;
486
-
487
491
  type DefinitionExtensionPacks<Definition> = Definition extends {
488
492
  readonly extensionPacks?: infer ExtensionPacks extends Record<
489
493
  string,
@@ -519,20 +523,28 @@ type MaybeValueObjectsSection<ValueObjects extends Record<string, AnyValueObject
519
523
  readonly valueObjects: ContractValueObjectsFromRecord<ValueObjects>;
520
524
  };
521
525
 
522
- type MongoContractBaseFromDefinition<Definition> = Simplify<
526
+ type MongoDomainNamespaceFromDefinition<Definition> = Simplify<
523
527
  {
524
- readonly target: DefinitionTargetId<Definition>;
525
- readonly targetFamily: DefinitionFamilyId<Definition>;
526
- readonly roots: DefinitionRoots<Definition>;
527
528
  readonly models: ContractModelsFromRecord<DefinitionModels<Definition>>;
528
- readonly storage: DefinitionStorage<Definition>;
529
- readonly capabilities: DefinitionCapabilities<Definition>;
530
- readonly extensionPacks: DefinitionExtensionPacks<Definition>;
531
- readonly profileHash: ProfileHashBase<string>;
532
- readonly meta: Record<string, never>;
533
529
  } & MaybeValueObjectsSection<DefinitionValueObjects<Definition>>
534
530
  >;
535
531
 
532
+ type MongoContractBaseFromDefinition<Definition> = Simplify<{
533
+ readonly target: DefinitionTargetId<Definition>;
534
+ readonly targetFamily: DefinitionFamilyId<Definition>;
535
+ readonly roots: DefinitionRoots<Definition>;
536
+ readonly domain: {
537
+ readonly namespaces: {
538
+ readonly [K in typeof UNBOUND_NAMESPACE_ID]: MongoDomainNamespaceFromDefinition<Definition>;
539
+ };
540
+ };
541
+ readonly storage: DefinitionStorage<Definition>;
542
+ readonly capabilities: Record<string, never>;
543
+ readonly extensionPacks: DefinitionExtensionPacks<Definition>;
544
+ readonly profileHash: ProfileHashBase<string>;
545
+ readonly meta: Record<string, never>;
546
+ }>;
547
+
536
548
  type CodecTypesFromDefinition<Definition> = MongoCodecTypes &
537
549
  MergeExtensionCodecTypesSafe<DefinitionExtensionPacks<Definition>>;
538
550
 
@@ -627,13 +639,11 @@ export type ContractScaffold<
627
639
  Family extends FamilyPackRef<string>,
628
640
  Target extends TargetPackRef<string, string>,
629
641
  ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,
630
- Capabilities extends ContractCapabilities | undefined = undefined,
631
642
  Roots extends Record<string, ModelNameInput> | undefined = undefined,
632
643
  > = {
633
644
  readonly family: Family;
634
645
  readonly target: Target;
635
646
  readonly extensionPacks?: ExtensionPacks;
636
- readonly capabilities?: Capabilities;
637
647
  readonly roots?: Roots;
638
648
  };
639
649
 
@@ -643,9 +653,8 @@ export type ContractDefinition<
643
653
  Models extends Record<string, AnyModelBuilder> = Record<never, never>,
644
654
  ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>,
645
655
  ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,
646
- Capabilities extends ContractCapabilities | undefined = undefined,
647
656
  Roots extends Record<string, ModelNameInput> | undefined = undefined,
648
- > = ContractScaffold<Family, Target, ExtensionPacks, Capabilities, Roots> & {
657
+ > = ContractScaffold<Family, Target, ExtensionPacks, Roots> & {
649
658
  readonly models?: Models;
650
659
  readonly valueObjects?: ValueObjects;
651
660
  };
@@ -1166,7 +1175,6 @@ function isContractScaffold(
1166
1175
  FamilyPackRef<string>,
1167
1176
  TargetPackRef<string, string>,
1168
1177
  Record<string, ExtensionPackRef<string, string>> | undefined,
1169
- ContractCapabilities | undefined,
1170
1178
  Record<string, ModelNameInput> | undefined
1171
1179
  > {
1172
1180
  if (typeof value !== 'object' || value === null) {
@@ -1202,14 +1210,15 @@ function buildFields(fields: Record<string, AnyFieldBuilder>): Record<string, Co
1202
1210
  function buildRelation(
1203
1211
  relationBuilder: AnyRelationBuilder,
1204
1212
  ): ContractEmbedRelation | ContractReferenceRelation {
1213
+ const to = crossRef(relationBuilder.__to, UNBOUND_NAMESPACE_ID);
1205
1214
  return relationBuilder.__on
1206
1215
  ? {
1207
- to: relationBuilder.__to,
1216
+ to,
1208
1217
  cardinality: relationBuilder.__cardinality,
1209
1218
  on: relationBuilder.__on,
1210
1219
  }
1211
1220
  : {
1212
- to: relationBuilder.__to,
1221
+ to,
1213
1222
  cardinality: relationBuilder.__cardinality,
1214
1223
  };
1215
1224
  }
@@ -1248,8 +1257,8 @@ function buildValueObjects(
1248
1257
 
1249
1258
  function buildModels(
1250
1259
  models: Record<string, AnyModelBuilder> | undefined,
1251
- ): Record<string, MongoContract['models'][string]> {
1252
- const builtModels: Record<string, MongoContract['models'][string]> = {};
1260
+ ): Record<string, ContractModelsMap<MongoContract>[string]> {
1261
+ const builtModels: Record<string, ContractModelsMap<MongoContract>[string]> = {};
1253
1262
 
1254
1263
  for (const modelBuilder of Object.values(models ?? {})) {
1255
1264
  if (modelBuilder.__name in builtModels) {
@@ -1266,7 +1275,7 @@ function buildModels(
1266
1275
  relations: buildRelations(modelBuilder.__relations),
1267
1276
  storage,
1268
1277
  ...(modelBuilder.__owner ? { owner: modelBuilder.__owner } : {}),
1269
- ...(modelBuilder.__base ? { base: modelBuilder.__base } : {}),
1278
+ ...(modelBuilder.__base ? { base: crossRef(modelBuilder.__base, UNBOUND_NAMESPACE_ID) } : {}),
1270
1279
  ...(modelBuilder.__discriminator ? { discriminator: modelBuilder.__discriminator } : {}),
1271
1280
  ...(modelBuilder.__variants ? { variants: modelBuilder.__variants } : {}),
1272
1281
  };
@@ -1275,25 +1284,29 @@ function buildModels(
1275
1284
  return builtModels;
1276
1285
  }
1277
1286
 
1278
- function deriveRoots(models: Record<string, AnyModelBuilder> | undefined): Record<string, string> {
1279
- const roots: Record<string, string> = {};
1287
+ function deriveRoots(
1288
+ models: Record<string, AnyModelBuilder> | undefined,
1289
+ ): Record<string, CrossReference> {
1290
+ const roots: Record<string, CrossReference> = {};
1280
1291
 
1281
1292
  for (const modelBuilder of Object.values(models ?? {})) {
1282
1293
  if (!modelBuilder.__collection || modelBuilder.__owner || modelBuilder.__base) {
1283
1294
  continue;
1284
1295
  }
1285
1296
 
1286
- roots[modelBuilder.__collection] = modelBuilder.__name;
1297
+ roots[modelBuilder.__collection] = crossRef(modelBuilder.__name, UNBOUND_NAMESPACE_ID);
1287
1298
  }
1288
1299
 
1289
1300
  return roots;
1290
1301
  }
1291
1302
 
1292
- function normalizeRoots(roots: Record<string, ModelNameInput> | undefined): Record<string, string> {
1293
- const normalizedRoots: Record<string, string> = {};
1303
+ function normalizeRoots(
1304
+ roots: Record<string, ModelNameInput> | undefined,
1305
+ ): Record<string, CrossReference> {
1306
+ const normalizedRoots: Record<string, CrossReference> = {};
1294
1307
 
1295
1308
  for (const [rootName, rootValue] of Object.entries(roots ?? {})) {
1296
- normalizedRoots[rootName] = resolveModelName(rootValue);
1309
+ normalizedRoots[rootName] = crossRef(resolveModelName(rootValue), UNBOUND_NAMESPACE_ID);
1297
1310
  }
1298
1311
 
1299
1312
  return normalizedRoots;
@@ -1499,7 +1512,6 @@ function buildContractFromDefinition<
1499
1512
  Record<string, AnyModelBuilder>,
1500
1513
  Record<string, AnyValueObjectBuilder>,
1501
1514
  Record<string, ExtensionPackRef<string, string>> | undefined,
1502
- ContractCapabilities | undefined,
1503
1515
  Record<string, ModelNameInput> | undefined
1504
1516
  >,
1505
1517
  >(definition: Definition): MongoContractResult<Definition> {
@@ -1511,7 +1523,12 @@ function buildContractFromDefinition<
1511
1523
  const roots = definition.roots
1512
1524
  ? normalizeRoots(definition.roots)
1513
1525
  : deriveRoots(definition.models);
1514
- const capabilities = definition.capabilities ?? {};
1526
+ // The Mongo `defineContract` input no longer accepts a `capabilities`
1527
+ // block. The build-time matrix is empty here; CLI-time `enrichContract`
1528
+ // layers in adapter / driver / extension caps. `profileHash` continues
1529
+ // to fingerprint this (now-always-empty) author subset, so it stabilises
1530
+ // at `hash({})`.
1531
+ const capabilities: Record<string, Record<string, boolean>> = {};
1515
1532
  const collections = buildCollections(definition.models);
1516
1533
  const storageBody = {
1517
1534
  namespaces: {
@@ -1526,19 +1543,31 @@ function buildContractFromDefinition<
1526
1543
  target: definition.target.targetId,
1527
1544
  targetFamily: definition.family.familyId,
1528
1545
  storage: storageBody,
1546
+ ...mongoContractCanonicalizationHooks,
1529
1547
  });
1530
1548
 
1531
1549
  const storage = new MongoStorage({
1532
1550
  storageHash,
1533
- ...storageBody,
1551
+ namespaces: {
1552
+ [UNBOUND_NAMESPACE_ID]: buildMongoNamespace({
1553
+ id: UNBOUND_NAMESPACE_ID,
1554
+ collections,
1555
+ }),
1556
+ },
1534
1557
  }) as unknown as MongoStorageShape<string>;
1535
1558
 
1536
1559
  const builtContract = {
1537
1560
  target: definition.target.targetId,
1538
1561
  targetFamily: definition.family.familyId,
1539
1562
  roots,
1540
- models: builtModels,
1541
- ...(Object.keys(builtValueObjects).length > 0 ? { valueObjects: builtValueObjects } : {}),
1563
+ domain: {
1564
+ namespaces: {
1565
+ [UNBOUND_NAMESPACE_ID]: {
1566
+ models: builtModels,
1567
+ ...(Object.keys(builtValueObjects).length > 0 ? { valueObjects: builtValueObjects } : {}),
1568
+ },
1569
+ },
1570
+ },
1542
1571
  storage,
1543
1572
  capabilities,
1544
1573
  extensionPacks: definition.extensionPacks ?? {},
@@ -1560,7 +1589,6 @@ export function defineContract<
1560
1589
  Record<string, AnyModelBuilder>,
1561
1590
  Record<string, AnyValueObjectBuilder>,
1562
1591
  Record<string, ExtensionPackRef<string, string>> | undefined,
1563
- ContractCapabilities | undefined,
1564
1592
  Record<string, ModelNameInput> | undefined
1565
1593
  >,
1566
1594
  >(definition: Definition): MongoContractResult<Definition>;
@@ -1569,7 +1597,6 @@ export function defineContract<
1569
1597
  Family,
1570
1598
  Target,
1571
1599
  ExtensionPacks,
1572
- ContractCapabilities | undefined,
1573
1600
  Record<string, ModelNameInput> | undefined
1574
1601
  >,
1575
1602
  const Built extends {
@@ -1591,7 +1618,6 @@ export function defineContract(
1591
1618
  FamilyPackRef<string>,
1592
1619
  TargetPackRef<string, string>,
1593
1620
  Record<string, ExtensionPackRef<string, string>> | undefined,
1594
- ContractCapabilities | undefined,
1595
1621
  Record<string, ModelNameInput> | undefined
1596
1622
  >,
1597
1623
  factory?: ContractFactory<