@prisma-next/mongo-contract-ts 0.12.0-dev.5 → 0.12.0-dev.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -83,6 +83,10 @@ export const contract = defineContract({
83
83
  });
84
84
  ```
85
85
 
86
+ ## Config helper
87
+
88
+ `typescriptContract` and `typescriptContractFromPath` accept an optional third options bag with `defaultControlPolicy`. The specifier applies it only when the loaded contract omits `defaultControlPolicy`.
89
+
86
90
  ## Notes
87
91
 
88
92
  - Use `@prisma-next/family-mongo/pack` and `@prisma-next/target-mongo/pack` in authoring flows. They are pure pack refs and do not pull in control-plane runtime code.
@@ -1,9 +1,12 @@
1
- import { Contract } from "@prisma-next/contract/types";
1
+ import { Contract, ControlPolicy } from "@prisma-next/contract/types";
2
2
  import { ContractConfig, ContractConfig as ContractConfig$1 } from "@prisma-next/config/config-types";
3
3
 
4
4
  //#region src/config-types.d.ts
5
- declare function typescriptContract(contract: Contract, output?: string): ContractConfig$1;
6
- declare function typescriptContractFromPath(contractPath: string, output?: string): ContractConfig$1;
5
+ interface TypeScriptContractSpecifierOptions {
6
+ readonly defaultControlPolicy?: ControlPolicy;
7
+ }
8
+ declare function typescriptContract(contract: Contract, output?: string, options?: TypeScriptContractSpecifierOptions): ContractConfig$1;
9
+ declare function typescriptContractFromPath(contractPath: string, output?: string, options?: TypeScriptContractSpecifierOptions): ContractConfig$1;
7
10
  //#endregion
8
11
  export { type ContractConfig, typescriptContract, typescriptContractFromPath };
9
12
  //# sourceMappingURL=config-types.d.mts.map
@@ -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,gBAAc;AAAA,iBASvE,0BAAA,CAA2B,YAAA,UAAsB,MAAA,YAAkB,gBAAc"}
1
+ {"version":3,"file":"config-types.d.mts","names":[],"sources":["../src/config-types.ts"],"mappings":";;;;UAOiB,kCAAA;EAAA,SACN,oBAAA,GAAuB,aAAa;AAAA;AAAA,iBAK/B,kBAAA,CACd,QAAA,EAAU,QAAA,EACV,MAAA,WACA,OAAA,GAAU,kCAAA,GACT,gBAAA;AAAA,iBAUa,0BAAA,CACd,YAAA,UACA,MAAA,WACA,OAAA,GAAU,kCAAA,GACT,gBAAc"}
@@ -1,14 +1,15 @@
1
- import { pathToFileURL } from "node:url";
2
1
  import { ifDefined } from "@prisma-next/utils/defined";
2
+ import { pathToFileURL } from "node:url";
3
+ import { applySpecifierDefaultControlPolicy } from "@prisma-next/contract/apply-specifier-default-control-policy";
3
4
  import { ok } from "@prisma-next/utils/result";
4
5
  //#region src/config-types.ts
5
- function typescriptContract(contract, output) {
6
+ function typescriptContract(contract, output, options) {
6
7
  return {
7
- source: { load: async () => ok(contract) },
8
+ source: { load: async () => ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy)) },
8
9
  ...ifDefined("output", output)
9
10
  };
10
11
  }
11
- function typescriptContractFromPath(contractPath, output) {
12
+ function typescriptContractFromPath(contractPath, output, options) {
12
13
  return {
13
14
  source: {
14
15
  inputs: [contractPath],
@@ -18,7 +19,7 @@ function typescriptContractFromPath(contractPath, output) {
18
19
  const mod = await import(pathToFileURL(absolutePath).href);
19
20
  const contract = mod.default ?? mod.contract;
20
21
  if (contract === void 0) throw new Error(`typescriptContractFromPath: module at "${absolutePath}" has no "default" or "contract" export.`);
21
- return ok(contract);
22
+ return ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy));
22
23
  }
23
24
  },
24
25
  ...ifDefined("output", output)
@@ -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,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
+ {"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 { applySpecifierDefaultControlPolicy } from '@prisma-next/contract/apply-specifier-default-control-policy';\nimport type { Contract, ControlPolicy } from '@prisma-next/contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { ok } from '@prisma-next/utils/result';\n\nexport interface TypeScriptContractSpecifierOptions {\n readonly defaultControlPolicy?: ControlPolicy;\n}\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(\n contract: Contract,\n output?: string,\n options?: TypeScriptContractSpecifierOptions,\n): ContractConfig {\n return {\n source: {\n load: async () =>\n ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy)),\n },\n ...ifDefined('output', output),\n };\n}\n\nexport function typescriptContractFromPath(\n contractPath: string,\n output?: string,\n options?: TypeScriptContractSpecifierOptions,\n): 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(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy));\n },\n },\n ...ifDefined('output', output),\n };\n}\n"],"mappings":";;;;;AAaA,SAAgB,mBACd,UACA,QACA,SACgB;CAChB,OAAO;EACL,QAAQ,EACN,MAAM,YACJ,GAAG,mCAAmC,UAAU,SAAS,oBAAoB,CAAC,EAClF;EACA,GAAG,UAAU,UAAU,MAAM;CAC/B;AACF;AAEA,SAAgB,2BACd,cACA,QACA,SACgB;CAChB,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,mCAAmC,UAAU,SAAS,oBAAoB,CAAC;GACvF;EACF;EACA,GAAG,UAAU,UAAU,MAAM;CAC/B;AACF"}
@@ -1,4 +1,4 @@
1
- import { ContractFieldType, CrossReference, ProfileHashBase, StorageHashBase } from "@prisma-next/contract/types";
1
+ import { ContractFieldType, ControlPolicy, CrossReference, ProfileHashBase, StorageHashBase } from "@prisma-next/contract/types";
2
2
  import { EntityHelpersFromNamespace, ExtractAuthoringNamespaceFromPack, MergeExtensionAuthoringNamespaces } from "@prisma-next/contract-authoring";
3
3
  import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
4
4
  import { MongoCollection, MongoCollectionOptionsAuthoringInput, MongoContractWithTypeMaps, MongoIndexAuthoringInput, MongoIndexFields, MongoIndexOptionsInput, MongoStorageShape, MongoTypeMaps } from "@prisma-next/mongo-contract";
@@ -93,6 +93,7 @@ interface ModelBuilder<Name extends string = string, Fields extends Record<strin
93
93
  readonly __relations: Relations;
94
94
  readonly __indexes: readonly MongoIndexAuthoringInput[] | undefined;
95
95
  readonly __collectionOptions: MongoCollectionOptionsAuthoringInput | undefined;
96
+ readonly __controlPolicy: ControlPolicy | undefined;
96
97
  readonly __collection: Collection;
97
98
  readonly __owner: Owner;
98
99
  readonly __base: Base;
@@ -225,6 +226,7 @@ type MongoContractBaseFromDefinition<Definition> = Simplify<{
225
226
  readonly extensionPacks: DefinitionExtensionPacks<Definition>;
226
227
  readonly profileHash: ProfileHashBase<string>;
227
228
  readonly meta: Record<string, never>;
229
+ readonly defaultControlPolicy?: ControlPolicy;
228
230
  }>;
229
231
  type CodecTypesFromDefinition<Definition> = MongoCodecTypes & MergeExtensionCodecTypesSafe<DefinitionExtensionPacks<Definition>>;
230
232
  type MongoContractResult<Definition> = MongoContractWithTypeMaps<MongoContractBaseFromDefinition<Definition>, MongoTypeMaps<CodecTypesFromDefinition<Definition>>>;
@@ -242,6 +244,7 @@ type ContractScaffold<Family extends FamilyPackRef<string>, Target extends Targe
242
244
  readonly target: Target;
243
245
  readonly extensionPacks?: ExtensionPacks;
244
246
  readonly roots?: Roots;
247
+ readonly defaultControlPolicy?: ControlPolicy;
245
248
  };
246
249
  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> & {
247
250
  readonly models?: Models;
@@ -336,6 +339,7 @@ type ModelInput<Fields extends Record<string, AnyFieldBuilder>, Relations extend
336
339
  readonly collection?: Collection;
337
340
  readonly indexes?: Indexes;
338
341
  readonly collectionOptions?: StrictShape<CollectionOptions, MongoCollectionOptionsAuthoringInput>;
342
+ readonly controlPolicy?: ControlPolicy;
339
343
  readonly storageRelations?: StorageRelations;
340
344
  readonly fields: Fields;
341
345
  readonly relations?: Relations;
@@ -350,12 +354,40 @@ declare function model<const Name extends string, const Fields extends Record<st
350
354
  } : undefined, Discriminator extends {
351
355
  readonly variants: infer Variants extends Record<string, VariantSpec>;
352
356
  } ? Variants : undefined>;
357
+ type BoundDefinitionInput<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> = {
358
+ readonly extensionPacks?: ExtensionPacks;
359
+ readonly roots?: Roots;
360
+ readonly defaultControlPolicy?: ControlPolicy;
361
+ readonly models?: Models;
362
+ readonly valueObjects?: ValueObjects;
363
+ };
364
+ type WithFamilyTarget<Input, F extends FamilyPackRef<string>, T extends TargetPackRef<string, string>> = Input & {
365
+ readonly family: F;
366
+ readonly target: T;
367
+ };
368
+ /**
369
+ * Shared builder that assembles a MongoContract with pre-bound family and target.
370
+ * Extension wrappers keep their own public overloads and delegate their impl body here;
371
+ * this is a plain overloaded function (not a factory returning an overloaded function)
372
+ * so no overloaded-function-return cast is needed.
373
+ *
374
+ * Overload 1: definition form (no factory).
375
+ */
376
+ declare function buildBoundContract<const F extends FamilyPackRef<string>, const T extends TargetPackRef<string, string>, const Definition extends BoundDefinitionInput<Record<string, AnyModelBuilder>, Record<string, AnyValueObjectBuilder>, Record<string, ExtensionPackRef<string, string>> | undefined, Record<string, ModelNameInput> | undefined>>(family: F, target: T, definition: Definition, factory?: undefined): MongoContractResult<WithFamilyTarget<Definition, F, T>>;
377
+ /**
378
+ * Overload 2: factory form.
379
+ */
380
+ declare function buildBoundContract<const F extends FamilyPackRef<string>, const T extends TargetPackRef<string, string>, const Definition extends BoundDefinitionInput<Record<string, AnyModelBuilder>, Record<string, AnyValueObjectBuilder>, Record<string, ExtensionPackRef<string, string>> | undefined, Record<string, ModelNameInput> | undefined>, const Built extends {
381
+ readonly models?: Record<string, AnyModelBuilder>;
382
+ readonly valueObjects?: Record<string, AnyValueObjectBuilder>;
383
+ readonly roots?: Record<string, ModelNameInput> | undefined;
384
+ }>(family: F, target: T, definition: Definition, factory: (helpers: ContractAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>) => Built): MongoContractResult<WithFamilyTarget<Definition & Built, F, T>>;
353
385
  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
386
  declare function defineContract<const Definition extends ContractScaffold<Family, Target, ExtensionPacks, Record<string, ModelNameInput> | undefined>, const Built extends {
355
387
  readonly models?: Record<string, AnyModelBuilder>;
356
388
  readonly valueObjects?: Record<string, AnyValueObjectBuilder>;
357
- readonly roots?: Record<string, ModelNameInput>;
389
+ readonly roots?: Record<string, ModelNameInput> | undefined;
358
390
  }, const Family extends FamilyPackRef<string> = FamilyPackRef<string>, const Target extends TargetPackRef<string, string> = TargetPackRef<string, string>, const ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined>(definition: Definition, factory: (helpers: ContractAuthoringHelpers<Family, Target, ExtensionPacks>) => Built): MongoContractResult<Definition & Built>;
359
391
  //#endregion
360
- export { type ContractDefinition, type ContractFactory, type ContractScaffold, type FieldBuilder, type FieldReference, type ModelBuilder, type MongoContractResult, type RelationBuilder, type ValueObjectBuilder, defineContract, field, index, model, rel, valueObject };
392
+ export { type ContractDefinition, type ContractFactory, type ContractScaffold, type FieldBuilder, type FieldReference, type ModelBuilder, type MongoContractResult, type RelationBuilder, type ValueObjectBuilder, buildBoundContract, defineContract, field, index, model, rel, valueObject };
361
393
  //# sourceMappingURL=contract-builder.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract-builder.d.mts","names":[],"sources":["../src/contract-builder.ts"],"mappings":"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"}
1
+ {"version":3,"file":"contract-builder.d.mts","names":[],"sources":["../src/contract-builder.ts"],"mappings":";;;;;;;KAiFK,WAAA;EAAA,SACM,KAAK;AAAA;AAAA,KAGX,mBAAA;EAAA,SACM,KAAK;AAAA;AAAA,KAGX,eAAA;AAAA,KACA,OAAA,MAAa,OAAO,CAAC,CAAA;AAAA,KACrB,WAAA,GAAc,MAAM;AAAA,KACpB,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,KAAK,6BACtE,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,IAAI;EAAA;EAAA,SAC7D,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,SAAS;AAAA;AAAA,UAGd,UAAA;EAAA,SAIN,WAAA,EAAa,WAAA;EAAA,SACb,YAAA,EAAc,YAAY;AAAA;AAAA,UAGpB,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,eAAA,EAAiB,aAAA;EAAA,SACjB,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,YAAY,CAAC,iBAAA;AAAA,KAC/B,2BAAA,GAA8B,eAAe,gCAAgC,UAAA;AAAA,KAC7E,uBAAA,GAA0B,eAAe;AAAA,KACzC,kBAAA,GAAqB,2BAAA,GAA8B,uBAAuB;AAAA,KAC1E,iBAAA,GAAoB,cAAc;AAAA,KAClC,uBAAA,8CAEY,MAAA,SAAe,eAAA,IAAmB,MAAA,SAAe,eAAA,KAC9D,kBAAA,CAAmB,IAAA,EAAM,MAAA;AAAA,KACxB,qBAAA,GAAwB,uBAAuB;AAAA,KAC/C,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,iBAAiB;AAAA,KAEnC,yBAAA,MACH,CAAA,SAAU,cAAc,2CAA2C,SAAA;AAAA,KAChE,gBAAA,MAAsB,CAAA,SAAU,iBAAiB,eAAe,IAAA;AAAA,KAChE,sBAAA,MAA4B,CAAA,SAAU,uBAAuB,eAAe,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,eAAe;AAAA,KACzC,oBAAA,YAAgC,qBAAqB;AAAA,KACrD,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,WAAA,CAAY,EAAA;EAAA,SAChB,WAAA,EAAa,WAAA;EAAA,SACb,EAAA,EAAI,EAAA;AAAA;EAAA,SAGJ,EAAA,EAAI,WAAA,CAAY,EAAA;EAAA,SAChB,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,wBACpB,WAAA;EAAA,SACW,IAAA,EAAM,WAAA,CAAY,IAAA;AAAA;AAAA,KAC5B,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,WAAA,qBAAgC,cAAA;EAAA,SAA4B,KAAA,EAAO,CAAC;AAAA;AAAA,KAEpE,iBAAA,gBAAiC,MAAA,SAAe,eAAA,KAAoB,QAAA,wBAClD,MAAA,IAAU,mBAAA,CAAoB,MAAA,CAAO,CAAA,KAAM,WAAA,CAC9D,aAAA,CAAc,MAAA,CAAO,CAAA;AAAA,KAIpB,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,WAAA,CAAY,kBAAA,CAAmB,KAAA,CAAM,CAAA;AAAA,KAG/D,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,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,IAE5B,QAAA;AAAA,KAGC,kBAAA,eAAiC,UAAA;EAAA,SAC3B,MAAA,EAAQ,aAAa;AAAA,IAE5B,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,kCAAA,eAAiD,QAAA;EAAA,SAEzC,MAAA,EAAQ,wBAAA,CAAyB,gBAAA,CAAiB,UAAA;AAAA,IACzD,wBAAA,CAAyB,sBAAA,CAAuB,UAAA;AAAA,KAGjD,+BAAA,eAA8C,QAAA;EAAA,SACxC,MAAA,EAAQ,kBAAA,CAAmB,UAAA;EAAA,SAC3B,YAAA,EAAc,kBAAA,CAAmB,UAAA;EAAA,SACjC,KAAA,EAAO,eAAA,CAAgB,UAAA;EAAA,SACvB,MAAA;IAAA,SACE,UAAA,0BACe,oBAAA,GAAuB,kCAAA,CAAmC,UAAA;EAAA;EAAA,SAG3E,OAAA,EAAS,iBAAA,CAAkB,UAAA;EAAA,SAC3B,YAAA,EAAc,MAAA;EAAA,SACd,cAAA,EAAgB,wBAAA,CAAyB,UAAA;EAAA,SACzC,WAAA,EAAa,eAAA;EAAA,SACb,IAAA,EAAM,MAAA;EAAA,SACN,oBAAA,GAAuB,aAAA;AAAA;AAAA,KAG7B,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,iCAAiC,CACrF,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,yDACxB,MAAA,SAAe,cAAA;EAAA,SAEpB,MAAA,EAAQ,MAAA;EAAA,SACR,MAAA,EAAQ,MAAA;EAAA,SACR,cAAA,GAAiB,cAAA;EAAA,SACjB,KAAA,GAAQ,KAAA;EAAA,SACR,oBAAA,GAAuB,aAAA;AAAA;AAAA,KAGtB,kBAAA,gBACK,aAAA,yBACA,aAAA,iCACA,MAAA,SAAe,eAAA,IAAmB,MAAA,qCAC5B,MAAA,SAAe,qBAAA,IAAyB,MAAA,uCACtC,MAAA,SAAe,gBAAA,yDACxB,MAAA,SAAe,cAAA,6BAC3B,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,cAAA,EAAgB,KAAA;EAAA,SAC1C,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,aAAA,GAAgB,aAAA;EAAA,SAChB,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,KAugBD,oBAAA,gBACY,MAAA,SAAe,eAAA,IAAmB,MAAA,qCAC5B,MAAA,SAAe,qBAAA,IAAyB,MAAA,uCACtC,MAAA,SAAe,gBAAA,yDACxB,MAAA,SAAe,cAAA;EAAA,SAEpB,cAAA,GAAiB,cAAA;EAAA,SACjB,KAAA,GAAQ,KAAA;EAAA,SACR,oBAAA,GAAuB,aAAA;EAAA,SACvB,MAAA,GAAS,MAAA;EAAA,SACT,YAAA,GAAe,YAAA;AAAA;AAAA,KAIrB,gBAAA,kBAEO,aAAA,oBACA,aAAA,oBACR,KAAA;EAAA,SAAmB,MAAA,EAAQ,CAAA;EAAA,SAAY,MAAA,EAAQ,CAAA;AAAA;;;;;;AAt4ChB;AAClC;;iBA+4Ce,kBAAA,iBACE,aAAA,0BACA,aAAA,2CACS,oBAAA,CACvB,MAAA,SAAe,eAAA,GACf,MAAA,SAAe,qBAAA,GACf,MAAA,SAAe,gBAAA,+BACf,MAAA,SAAe,cAAA,eAAA,CAGjB,MAAA,EAAQ,CAAA,EACR,MAAA,EAAQ,CAAA,EACR,UAAA,EAAY,UAAA,EACZ,OAAA,eACC,mBAAA,CAAoB,gBAAA,CAAiB,UAAA,EAAY,CAAA,EAAG,CAAA;;AA35CF;AAAA;iBA+5CrC,kBAAA,iBACE,aAAA,0BACA,aAAA,2CACS,oBAAA,CACvB,MAAA,SAAe,eAAA,GACf,MAAA,SAAe,qBAAA,GACf,MAAA,SAAe,gBAAA,+BACf,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,EAAA,CAGlC,MAAA,EAAQ,CAAA,EACR,MAAA,EAAQ,CAAA,EACR,UAAA,EAAY,UAAA,EACZ,OAAA,GACE,OAAA,EAAS,wBAAA,CAAyB,CAAA,EAAG,CAAA,EAAG,WAAA,CAAY,UAAA,yBACjD,KAAA,GACJ,mBAAA,CAAoB,gBAAA,CAAiB,UAAA,GAAa,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,iBAqD/C,cAAA,0BACW,kBAAA,CACvB,aAAA,UACA,aAAA,kBACA,MAAA,SAAe,eAAA,GACf,MAAA,SAAe,qBAAA,GACf,MAAA,SAAe,gBAAA,+BACf,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,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"}
@@ -6,6 +6,8 @@ import { UNBOUND_NAMESPACE_ID } from "@prisma-next/framework-components/ir";
6
6
  import { MongoCollection, MongoCollectionOptions, MongoIndex, MongoStorage, applyPolymorphicScopeToMongoIndex, buildMongoNamespace } from "@prisma-next/mongo-contract";
7
7
  import { mongoContractCanonicalizationHooks } from "@prisma-next/mongo-contract/canonicalization-hooks";
8
8
  import { canonicalStringify } from "@prisma-next/utils/canonical-stringify";
9
+ import { blindCast } from "@prisma-next/utils/casts";
10
+ import { ifDefined } from "@prisma-next/utils/defined";
9
11
  //#region src/contract-builder.ts
10
12
  function stableStringify(value) {
11
13
  if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
@@ -204,6 +206,7 @@ function model(name, input) {
204
206
  __relations: input.relations ?? {},
205
207
  __indexes: input.indexes,
206
208
  __collectionOptions: input.collectionOptions,
209
+ __controlPolicy: input.controlPolicy,
207
210
  __collection: input.collection,
208
211
  __owner: input.owner ? resolveModelName(input.owner) : void 0,
209
212
  __base: input.base ? resolveModelName(input.base) : void 0,
@@ -367,11 +370,13 @@ function buildCollections(models) {
367
370
  if (!modelBuilder.__collection) {
368
371
  if (modelBuilder.__indexes && modelBuilder.__indexes.length > 0) throw new Error(`Model "${modelBuilder.__name}" defines indexes but has no collection to attach them to.`);
369
372
  if (modelBuilder.__collectionOptions) throw new Error(`Model "${modelBuilder.__name}" defines collectionOptions but has no collection to attach them to.`);
373
+ if (modelBuilder.__controlPolicy) throw new Error(`Model "${modelBuilder.__name}" defines controlPolicy but has no collection to attach it to.`);
370
374
  continue;
371
375
  }
372
376
  const existingCollection = intermediate[modelBuilder.__collection] ?? {};
373
377
  const existingIndexes = existingCollection.indexes ?? [];
374
378
  if (existingCollection.options && modelBuilder.__collectionOptions) throw new Error(`Collection "${modelBuilder.__collection}" has collectionOptions declared by multiple models. Author collectionOptions on a single model per collection.`);
379
+ if (existingCollection.control !== void 0 && modelBuilder.__controlPolicy) throw new Error(`Collection "${modelBuilder.__collection}" has controlPolicy declared by multiple models. Author controlPolicy on a single model per collection.`);
375
380
  for (const collectionIndex of modelBuilder.__indexes ?? []) {
376
381
  const missingField = findMissingIndexField(collectionIndex, modelBuilder.__fields);
377
382
  if (missingField !== void 0) {
@@ -396,13 +401,19 @@ function buildCollections(models) {
396
401
  declaredIndexOwners.set(collectionIndexKey, modelBuilder.__name);
397
402
  }
398
403
  const storageOptions = modelBuilder.__collectionOptions ? toStorageCollectionOptions(modelBuilder.__collectionOptions) : void 0;
404
+ const controlPatch = modelBuilder.__controlPolicy !== void 0 ? { control: modelBuilder.__controlPolicy } : {};
399
405
  intermediate[modelBuilder.__collection] = storageIndexes.length > 0 ? {
400
406
  ...existingCollection,
401
407
  indexes: [...existingIndexes, ...storageIndexes],
402
- ...storageOptions ? { options: storageOptions } : {}
408
+ ...storageOptions ? { options: storageOptions } : {},
409
+ ...controlPatch
403
410
  } : storageOptions ? {
404
411
  ...existingCollection,
405
- options: storageOptions
412
+ options: storageOptions,
413
+ ...controlPatch
414
+ } : Object.keys(controlPatch).length > 0 ? {
415
+ ...existingCollection,
416
+ ...controlPatch
406
417
  } : existingCollection;
407
418
  }
408
419
  const collections = {};
@@ -430,12 +441,13 @@ function buildContractFromDefinition(definition) {
430
441
  }),
431
442
  namespaces: { [UNBOUND_NAMESPACE_ID]: buildMongoNamespace({
432
443
  id: UNBOUND_NAMESPACE_ID,
433
- collections
444
+ entries: { collection: collections }
434
445
  }) }
435
446
  });
436
- return {
447
+ return blindCast({
437
448
  target: definition.target.targetId,
438
449
  targetFamily: definition.family.familyId,
450
+ ...ifDefined("defaultControlPolicy", definition.defaultControlPolicy),
439
451
  roots,
440
452
  domain: { namespaces: { [UNBOUND_NAMESPACE_ID]: {
441
453
  models: builtModels,
@@ -450,25 +462,39 @@ function buildContractFromDefinition(definition) {
450
462
  capabilities
451
463
  }),
452
464
  meta: {}
465
+ });
466
+ }
467
+ /** Implementation. */
468
+ function buildBoundContract(family, target, definition, factory) {
469
+ const full = {
470
+ ...definition,
471
+ family,
472
+ target
453
473
  };
474
+ if (factory !== void 0) {
475
+ const built = factory({
476
+ ...composeMongoEntityHelpers(family, target, definition.extensionPacks),
477
+ field,
478
+ index,
479
+ model,
480
+ rel,
481
+ valueObject
482
+ });
483
+ return buildContractFromDefinition({
484
+ ...full,
485
+ ...ifDefined("models", built.models),
486
+ ...ifDefined("valueObjects", built.valueObjects),
487
+ ...ifDefined("roots", built.roots)
488
+ });
489
+ }
490
+ return buildContractFromDefinition(full);
454
491
  }
455
492
  function defineContract(definition, factory) {
456
493
  if (!isContractScaffold(definition)) throw new TypeError("defineContract expects a contract definition object. Define your contract with defineContract({ family, target, models, ... }).");
457
- if (!factory) return buildContractFromDefinition(definition);
458
- const helpers = {
459
- ...composeMongoEntityHelpers(definition.family, definition.target, definition.extensionPacks),
460
- field,
461
- index,
462
- model,
463
- rel,
464
- valueObject
465
- };
466
- return buildContractFromDefinition({
467
- ...definition,
468
- ...factory(helpers)
469
- });
494
+ if (factory !== void 0) return buildBoundContract(definition.family, definition.target, definition, factory);
495
+ return buildBoundContract(definition.family, definition.target, definition);
470
496
  }
471
497
  //#endregion
472
- export { defineContract, field, index, model, rel, valueObject };
498
+ export { buildBoundContract, defineContract, field, index, model, rel, valueObject };
473
499
 
474
500
  //# sourceMappingURL=contract-builder.mjs.map
@@ -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 {\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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"}
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 ContractModelDefinitions,\n type ContractReferenceRelation,\n type ContractValueObject,\n type ControlPolicy,\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';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\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 __controlPolicy: ControlPolicy | 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 readonly defaultControlPolicy?: ControlPolicy;\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 readonly defaultControlPolicy?: ControlPolicy;\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 controlPolicy?: ControlPolicy;\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 __controlPolicy: input.controlPolicy,\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, ContractModelDefinitions<MongoContract>[string]> {\n const builtModels: Record<string, ContractModelDefinitions<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 if (modelBuilder.__controlPolicy) {\n throw new Error(\n `Model \"${modelBuilder.__name}\" defines controlPolicy but has no collection to attach it 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 if (existingCollection.control !== undefined && modelBuilder.__controlPolicy) {\n throw new Error(\n `Collection \"${modelBuilder.__collection}\" has controlPolicy declared by multiple models. Author controlPolicy 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 const controlPatch =\n modelBuilder.__controlPolicy !== undefined ? { control: modelBuilder.__controlPolicy } : {};\n\n intermediate[modelBuilder.__collection] =\n storageIndexes.length > 0\n ? {\n ...existingCollection,\n indexes: [...existingIndexes, ...storageIndexes],\n ...(storageOptions ? { options: storageOptions } : {}),\n ...controlPatch,\n }\n : storageOptions\n ? {\n ...existingCollection,\n options: storageOptions,\n ...controlPatch,\n }\n : Object.keys(controlPatch).length > 0\n ? { ...existingCollection, ...controlPatch }\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 entries: { collection: collections },\n }),\n },\n }) as unknown as MongoStorageShape<string>;\n\n const builtContract = {\n target: definition.target.targetId,\n targetFamily: definition.family.familyId,\n ...ifDefined('defaultControlPolicy', definition.defaultControlPolicy),\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 blindCast<\n MongoContractResult<Definition>,\n \"builtContract satisfies MongoContract erases Definition's literal type parameters; MongoContractResult<Definition> re-applies them so callers see the precise model/value-object/roots/namespace shapes\"\n >(builtContract);\n}\n\n// Input for buildBoundContract that omits family/target (injected by the builder).\ntype BoundDefinitionInput<\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> = {\n readonly extensionPacks?: ExtensionPacks;\n readonly roots?: Roots;\n readonly defaultControlPolicy?: ControlPolicy;\n readonly models?: Models;\n readonly valueObjects?: ValueObjects;\n};\n\n// Merges a bound input with the pre-bound family/target to produce a full ContractDefinition.\ntype WithFamilyTarget<\n Input,\n F extends FamilyPackRef<string>,\n T extends TargetPackRef<string, string>,\n> = Input & { readonly family: F; readonly target: T };\n\n/**\n * Shared builder that assembles a MongoContract with pre-bound family and target.\n * Extension wrappers keep their own public overloads and delegate their impl body here;\n * this is a plain overloaded function (not a factory returning an overloaded function)\n * so no overloaded-function-return cast is needed.\n *\n * Overload 1: definition form (no factory).\n */\nexport function buildBoundContract<\n const F extends FamilyPackRef<string>,\n const T extends TargetPackRef<string, string>,\n const Definition extends BoundDefinitionInput<\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ExtensionPackRef<string, string>> | undefined,\n Record<string, ModelNameInput> | undefined\n >,\n>(\n family: F,\n target: T,\n definition: Definition,\n factory?: undefined,\n): MongoContractResult<WithFamilyTarget<Definition, F, T>>;\n/**\n * Overload 2: factory form.\n */\nexport function buildBoundContract<\n const F extends FamilyPackRef<string>,\n const T extends TargetPackRef<string, string>,\n const Definition extends BoundDefinitionInput<\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ExtensionPackRef<string, string>> | 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> | undefined;\n },\n>(\n family: F,\n target: T,\n definition: Definition,\n factory: (\n helpers: ContractAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>,\n ) => Built,\n): MongoContractResult<WithFamilyTarget<Definition & Built, F, T>>;\n/** Implementation. */\nexport function buildBoundContract<\n const F extends FamilyPackRef<string>,\n const T extends TargetPackRef<string, string>,\n const Definition extends BoundDefinitionInput<\n Record<string, AnyModelBuilder>,\n Record<string, AnyValueObjectBuilder>,\n Record<string, ExtensionPackRef<string, string>> | 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> | undefined;\n },\n>(\n family: F,\n target: T,\n definition: Definition,\n factory?:\n | ((\n helpers: ContractAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>,\n ) => Built)\n | undefined,\n) {\n const full = { ...definition, family, target };\n\n if (factory !== undefined) {\n const entities = composeMongoEntityHelpers(family, target, definition.extensionPacks);\n // composeMongoEntityHelpers returns Record<string, unknown> via an opaque runtime\n // namespace walk; there is no way to reconstruct ContractAuthoringHelpers<F,T,Ext>\n // structurally from that return type, so this single cast is irreducible.\n const helpers = {\n ...entities,\n field,\n index,\n model,\n rel,\n valueObject,\n } as unknown as ContractAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>;\n const built = factory(helpers);\n return buildContractFromDefinition({\n ...full,\n ...ifDefined('models', built.models),\n ...ifDefined('valueObjects', built.valueObjects),\n ...ifDefined('roots', built.roots),\n });\n }\n\n return buildContractFromDefinition(full);\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> | undefined;\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 !== undefined) {\n return buildBoundContract(definition.family, definition.target, definition, factory);\n }\n return buildBoundContract(definition.family, definition.target, definition);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "name": "@prisma-next/mongo-contract-ts",
3
- "version": "0.12.0-dev.5",
3
+ "version": "0.12.0-dev.50",
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.12.0-dev.5",
10
- "@prisma-next/contract": "0.12.0-dev.5",
11
- "@prisma-next/contract-authoring": "0.12.0-dev.5",
12
- "@prisma-next/framework-components": "0.12.0-dev.5",
13
- "@prisma-next/mongo-contract": "0.12.0-dev.5",
14
- "@prisma-next/utils": "0.12.0-dev.5",
9
+ "@prisma-next/config": "0.12.0-dev.50",
10
+ "@prisma-next/contract": "0.12.0-dev.50",
11
+ "@prisma-next/contract-authoring": "0.12.0-dev.50",
12
+ "@prisma-next/framework-components": "0.12.0-dev.50",
13
+ "@prisma-next/mongo-contract": "0.12.0-dev.50",
14
+ "@prisma-next/utils": "0.12.0-dev.50",
15
15
  "pathe": "^2.0.3"
16
16
  },
17
17
  "devDependencies": {
18
- "@prisma-next/test-utils": "0.12.0-dev.5",
19
- "@prisma-next/tsconfig": "0.12.0-dev.5",
20
- "@prisma-next/tsdown": "0.12.0-dev.5",
18
+ "@prisma-next/test-utils": "0.12.0-dev.50",
19
+ "@prisma-next/tsconfig": "0.12.0-dev.50",
20
+ "@prisma-next/tsdown": "0.12.0-dev.50",
21
21
  "tsdown": "0.22.0",
22
22
  "typescript": "5.9.3",
23
23
  "vitest": "4.1.6"
@@ -1,21 +1,35 @@
1
1
  import { pathToFileURL } from 'node:url';
2
2
  import type { ContractConfig } from '@prisma-next/config/config-types';
3
- import type { Contract } from '@prisma-next/contract/types';
3
+ import { applySpecifierDefaultControlPolicy } from '@prisma-next/contract/apply-specifier-default-control-policy';
4
+ import type { Contract, ControlPolicy } from '@prisma-next/contract/types';
4
5
  import { ifDefined } from '@prisma-next/utils/defined';
5
6
  import { ok } from '@prisma-next/utils/result';
6
7
 
8
+ export interface TypeScriptContractSpecifierOptions {
9
+ readonly defaultControlPolicy?: ControlPolicy;
10
+ }
11
+
7
12
  // This helper stays family-agnostic and intentionally accepts the base Contract shape even when
8
13
  // re-exported from a Mongo-specific package.
9
- export function typescriptContract(contract: Contract, output?: string): ContractConfig {
14
+ export function typescriptContract(
15
+ contract: Contract,
16
+ output?: string,
17
+ options?: TypeScriptContractSpecifierOptions,
18
+ ): ContractConfig {
10
19
  return {
11
20
  source: {
12
- load: async () => ok(contract),
21
+ load: async () =>
22
+ ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy)),
13
23
  },
14
24
  ...ifDefined('output', output),
15
25
  };
16
26
  }
17
27
 
18
- export function typescriptContractFromPath(contractPath: string, output?: string): ContractConfig {
28
+ export function typescriptContractFromPath(
29
+ contractPath: string,
30
+ output?: string,
31
+ options?: TypeScriptContractSpecifierOptions,
32
+ ): ContractConfig {
19
33
  return {
20
34
  source: {
21
35
  inputs: [contractPath],
@@ -33,7 +47,7 @@ export function typescriptContractFromPath(contractPath: string, output?: string
33
47
  `typescriptContractFromPath: module at "${absolutePath}" has no "default" or "contract" export.`,
34
48
  );
35
49
  }
36
- return ok(contract);
50
+ return ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy));
37
51
  },
38
52
  },
39
53
  ...ifDefined('output', output),
@@ -3,9 +3,10 @@ import {
3
3
  type ContractEmbedRelation,
4
4
  type ContractField,
5
5
  type ContractFieldType,
6
- type ContractModelsMap,
6
+ type ContractModelDefinitions,
7
7
  type ContractReferenceRelation,
8
8
  type ContractValueObject,
9
+ type ControlPolicy,
9
10
  type CrossReference,
10
11
  crossRef,
11
12
  type ProfileHashBase,
@@ -50,6 +51,8 @@ import {
50
51
  } from '@prisma-next/mongo-contract';
51
52
  import { mongoContractCanonicalizationHooks } from '@prisma-next/mongo-contract/canonicalization-hooks';
52
53
  import { canonicalStringify } from '@prisma-next/utils/canonical-stringify';
54
+ import { blindCast } from '@prisma-next/utils/casts';
55
+ import { ifDefined } from '@prisma-next/utils/defined';
53
56
 
54
57
  // `canonicalStringify` rejects non-plain objects so a `Map` or class
55
58
  // instance cannot silently collapse to `{}`. The storage-shape values
@@ -205,6 +208,7 @@ export interface ModelBuilder<
205
208
  readonly __relations: Relations;
206
209
  readonly __indexes: readonly MongoIndexAuthoringInput[] | undefined;
207
210
  readonly __collectionOptions: MongoCollectionOptionsAuthoringInput | undefined;
211
+ readonly __controlPolicy: ControlPolicy | undefined;
208
212
  readonly __collection: Collection;
209
213
  readonly __owner: Owner;
210
214
  readonly __base: Base;
@@ -543,6 +547,7 @@ type MongoContractBaseFromDefinition<Definition> = Simplify<{
543
547
  readonly extensionPacks: DefinitionExtensionPacks<Definition>;
544
548
  readonly profileHash: ProfileHashBase<string>;
545
549
  readonly meta: Record<string, never>;
550
+ readonly defaultControlPolicy?: ControlPolicy;
546
551
  }>;
547
552
 
548
553
  type CodecTypesFromDefinition<Definition> = MongoCodecTypes &
@@ -645,6 +650,7 @@ export type ContractScaffold<
645
650
  readonly target: Target;
646
651
  readonly extensionPacks?: ExtensionPacks;
647
652
  readonly roots?: Roots;
653
+ readonly defaultControlPolicy?: ControlPolicy;
648
654
  };
649
655
 
650
656
  export type ContractDefinition<
@@ -1041,6 +1047,7 @@ type ModelInput<
1041
1047
  readonly collection?: Collection;
1042
1048
  readonly indexes?: Indexes;
1043
1049
  readonly collectionOptions?: StrictShape<CollectionOptions, MongoCollectionOptionsAuthoringInput>;
1050
+ readonly controlPolicy?: ControlPolicy;
1044
1051
  readonly storageRelations?: StorageRelations;
1045
1052
  readonly fields: Fields;
1046
1053
  readonly relations?: Relations;
@@ -1099,6 +1106,7 @@ export function model<
1099
1106
  : Record<never, never>,
1100
1107
  __indexes: input.indexes,
1101
1108
  __collectionOptions: input.collectionOptions,
1109
+ __controlPolicy: input.controlPolicy,
1102
1110
  __collection: input.collection as Collection,
1103
1111
  __owner: (input.owner
1104
1112
  ? resolveModelName(input.owner)
@@ -1257,8 +1265,8 @@ function buildValueObjects(
1257
1265
 
1258
1266
  function buildModels(
1259
1267
  models: Record<string, AnyModelBuilder> | undefined,
1260
- ): Record<string, ContractModelsMap<MongoContract>[string]> {
1261
- const builtModels: Record<string, ContractModelsMap<MongoContract>[string]> = {};
1268
+ ): Record<string, ContractModelDefinitions<MongoContract>[string]> {
1269
+ const builtModels: Record<string, ContractModelDefinitions<MongoContract>[string]> = {};
1262
1270
 
1263
1271
  for (const modelBuilder of Object.values(models ?? {})) {
1264
1272
  if (modelBuilder.__name in builtModels) {
@@ -1423,6 +1431,12 @@ function buildCollections(
1423
1431
  );
1424
1432
  }
1425
1433
 
1434
+ if (modelBuilder.__controlPolicy) {
1435
+ throw new Error(
1436
+ `Model "${modelBuilder.__name}" defines controlPolicy but has no collection to attach it to.`,
1437
+ );
1438
+ }
1439
+
1426
1440
  continue;
1427
1441
  }
1428
1442
 
@@ -1435,6 +1449,12 @@ function buildCollections(
1435
1449
  );
1436
1450
  }
1437
1451
 
1452
+ if (existingCollection.control !== undefined && modelBuilder.__controlPolicy) {
1453
+ throw new Error(
1454
+ `Collection "${modelBuilder.__collection}" has controlPolicy declared by multiple models. Author controlPolicy on a single model per collection.`,
1455
+ );
1456
+ }
1457
+
1438
1458
  for (const collectionIndex of modelBuilder.__indexes ?? []) {
1439
1459
  const missingField = findMissingIndexField(collectionIndex, modelBuilder.__fields);
1440
1460
  if (missingField !== undefined) {
@@ -1482,6 +1502,8 @@ function buildCollections(
1482
1502
  const storageOptions = modelBuilder.__collectionOptions
1483
1503
  ? toStorageCollectionOptions(modelBuilder.__collectionOptions)
1484
1504
  : undefined;
1505
+ const controlPatch =
1506
+ modelBuilder.__controlPolicy !== undefined ? { control: modelBuilder.__controlPolicy } : {};
1485
1507
 
1486
1508
  intermediate[modelBuilder.__collection] =
1487
1509
  storageIndexes.length > 0
@@ -1489,13 +1511,17 @@ function buildCollections(
1489
1511
  ...existingCollection,
1490
1512
  indexes: [...existingIndexes, ...storageIndexes],
1491
1513
  ...(storageOptions ? { options: storageOptions } : {}),
1514
+ ...controlPatch,
1492
1515
  }
1493
1516
  : storageOptions
1494
1517
  ? {
1495
1518
  ...existingCollection,
1496
1519
  options: storageOptions,
1520
+ ...controlPatch,
1497
1521
  }
1498
- : existingCollection;
1522
+ : Object.keys(controlPatch).length > 0
1523
+ ? { ...existingCollection, ...controlPatch }
1524
+ : existingCollection;
1499
1525
  }
1500
1526
 
1501
1527
  const collections: Record<string, MongoCollection> = {};
@@ -1551,7 +1577,7 @@ function buildContractFromDefinition<
1551
1577
  namespaces: {
1552
1578
  [UNBOUND_NAMESPACE_ID]: buildMongoNamespace({
1553
1579
  id: UNBOUND_NAMESPACE_ID,
1554
- collections,
1580
+ entries: { collection: collections },
1555
1581
  }),
1556
1582
  },
1557
1583
  }) as unknown as MongoStorageShape<string>;
@@ -1559,6 +1585,7 @@ function buildContractFromDefinition<
1559
1585
  const builtContract = {
1560
1586
  target: definition.target.targetId,
1561
1587
  targetFamily: definition.family.familyId,
1588
+ ...ifDefined('defaultControlPolicy', definition.defaultControlPolicy),
1562
1589
  roots,
1563
1590
  domain: {
1564
1591
  namespaces: {
@@ -1579,7 +1606,131 @@ function buildContractFromDefinition<
1579
1606
  meta: {},
1580
1607
  } satisfies MongoContract;
1581
1608
 
1582
- return builtContract as MongoContractResult<Definition>;
1609
+ return blindCast<
1610
+ MongoContractResult<Definition>,
1611
+ "builtContract satisfies MongoContract erases Definition's literal type parameters; MongoContractResult<Definition> re-applies them so callers see the precise model/value-object/roots/namespace shapes"
1612
+ >(builtContract);
1613
+ }
1614
+
1615
+ // Input for buildBoundContract that omits family/target (injected by the builder).
1616
+ type BoundDefinitionInput<
1617
+ Models extends Record<string, AnyModelBuilder> = Record<never, never>,
1618
+ ValueObjects extends Record<string, AnyValueObjectBuilder> = Record<never, never>,
1619
+ ExtensionPacks extends Record<string, ExtensionPackRef<string, string>> | undefined = undefined,
1620
+ Roots extends Record<string, ModelNameInput> | undefined = undefined,
1621
+ > = {
1622
+ readonly extensionPacks?: ExtensionPacks;
1623
+ readonly roots?: Roots;
1624
+ readonly defaultControlPolicy?: ControlPolicy;
1625
+ readonly models?: Models;
1626
+ readonly valueObjects?: ValueObjects;
1627
+ };
1628
+
1629
+ // Merges a bound input with the pre-bound family/target to produce a full ContractDefinition.
1630
+ type WithFamilyTarget<
1631
+ Input,
1632
+ F extends FamilyPackRef<string>,
1633
+ T extends TargetPackRef<string, string>,
1634
+ > = Input & { readonly family: F; readonly target: T };
1635
+
1636
+ /**
1637
+ * Shared builder that assembles a MongoContract with pre-bound family and target.
1638
+ * Extension wrappers keep their own public overloads and delegate their impl body here;
1639
+ * this is a plain overloaded function (not a factory returning an overloaded function)
1640
+ * so no overloaded-function-return cast is needed.
1641
+ *
1642
+ * Overload 1: definition form (no factory).
1643
+ */
1644
+ export function buildBoundContract<
1645
+ const F extends FamilyPackRef<string>,
1646
+ const T extends TargetPackRef<string, string>,
1647
+ const Definition extends BoundDefinitionInput<
1648
+ Record<string, AnyModelBuilder>,
1649
+ Record<string, AnyValueObjectBuilder>,
1650
+ Record<string, ExtensionPackRef<string, string>> | undefined,
1651
+ Record<string, ModelNameInput> | undefined
1652
+ >,
1653
+ >(
1654
+ family: F,
1655
+ target: T,
1656
+ definition: Definition,
1657
+ factory?: undefined,
1658
+ ): MongoContractResult<WithFamilyTarget<Definition, F, T>>;
1659
+ /**
1660
+ * Overload 2: factory form.
1661
+ */
1662
+ export function buildBoundContract<
1663
+ const F extends FamilyPackRef<string>,
1664
+ const T extends TargetPackRef<string, string>,
1665
+ const Definition extends BoundDefinitionInput<
1666
+ Record<string, AnyModelBuilder>,
1667
+ Record<string, AnyValueObjectBuilder>,
1668
+ Record<string, ExtensionPackRef<string, string>> | undefined,
1669
+ Record<string, ModelNameInput> | undefined
1670
+ >,
1671
+ const Built extends {
1672
+ readonly models?: Record<string, AnyModelBuilder>;
1673
+ readonly valueObjects?: Record<string, AnyValueObjectBuilder>;
1674
+ readonly roots?: Record<string, ModelNameInput> | undefined;
1675
+ },
1676
+ >(
1677
+ family: F,
1678
+ target: T,
1679
+ definition: Definition,
1680
+ factory: (
1681
+ helpers: ContractAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>,
1682
+ ) => Built,
1683
+ ): MongoContractResult<WithFamilyTarget<Definition & Built, F, T>>;
1684
+ /** Implementation. */
1685
+ export function buildBoundContract<
1686
+ const F extends FamilyPackRef<string>,
1687
+ const T extends TargetPackRef<string, string>,
1688
+ const Definition extends BoundDefinitionInput<
1689
+ Record<string, AnyModelBuilder>,
1690
+ Record<string, AnyValueObjectBuilder>,
1691
+ Record<string, ExtensionPackRef<string, string>> | undefined,
1692
+ Record<string, ModelNameInput> | undefined
1693
+ >,
1694
+ const Built extends {
1695
+ readonly models?: Record<string, AnyModelBuilder>;
1696
+ readonly valueObjects?: Record<string, AnyValueObjectBuilder>;
1697
+ readonly roots?: Record<string, ModelNameInput> | undefined;
1698
+ },
1699
+ >(
1700
+ family: F,
1701
+ target: T,
1702
+ definition: Definition,
1703
+ factory?:
1704
+ | ((
1705
+ helpers: ContractAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>,
1706
+ ) => Built)
1707
+ | undefined,
1708
+ ) {
1709
+ const full = { ...definition, family, target };
1710
+
1711
+ if (factory !== undefined) {
1712
+ const entities = composeMongoEntityHelpers(family, target, definition.extensionPacks);
1713
+ // composeMongoEntityHelpers returns Record<string, unknown> via an opaque runtime
1714
+ // namespace walk; there is no way to reconstruct ContractAuthoringHelpers<F,T,Ext>
1715
+ // structurally from that return type, so this single cast is irreducible.
1716
+ const helpers = {
1717
+ ...entities,
1718
+ field,
1719
+ index,
1720
+ model,
1721
+ rel,
1722
+ valueObject,
1723
+ } as unknown as ContractAuthoringHelpers<F, T, NonNullable<Definition['extensionPacks']>>;
1724
+ const built = factory(helpers);
1725
+ return buildContractFromDefinition({
1726
+ ...full,
1727
+ ...ifDefined('models', built.models),
1728
+ ...ifDefined('valueObjects', built.valueObjects),
1729
+ ...ifDefined('roots', built.roots),
1730
+ });
1731
+ }
1732
+
1733
+ return buildContractFromDefinition(full);
1583
1734
  }
1584
1735
 
1585
1736
  export function defineContract<
@@ -1602,7 +1753,7 @@ export function defineContract<
1602
1753
  const Built extends {
1603
1754
  readonly models?: Record<string, AnyModelBuilder>;
1604
1755
  readonly valueObjects?: Record<string, AnyValueObjectBuilder>;
1605
- readonly roots?: Record<string, ModelNameInput>;
1756
+ readonly roots?: Record<string, ModelNameInput> | undefined;
1606
1757
  },
1607
1758
  const Family extends FamilyPackRef<string> = FamilyPackRef<string>,
1608
1759
  const Target extends TargetPackRef<string, string> = TargetPackRef<string, string>,
@@ -1632,26 +1783,8 @@ export function defineContract(
1632
1783
  );
1633
1784
  }
1634
1785
 
1635
- if (!factory) {
1636
- return buildContractFromDefinition(definition);
1786
+ if (factory !== undefined) {
1787
+ return buildBoundContract(definition.family, definition.target, definition, factory);
1637
1788
  }
1638
-
1639
- const entities = composeMongoEntityHelpers(
1640
- definition.family,
1641
- definition.target,
1642
- definition.extensionPacks,
1643
- );
1644
- const helpers = {
1645
- ...entities,
1646
- field,
1647
- index,
1648
- model,
1649
- rel,
1650
- valueObject,
1651
- } as unknown as ContractAuthoringHelpers;
1652
-
1653
- return buildContractFromDefinition({
1654
- ...definition,
1655
- ...factory(helpers),
1656
- });
1789
+ return buildBoundContract(definition.family, definition.target, definition);
1657
1790
  }
@@ -10,6 +10,7 @@ export type {
10
10
  ValueObjectBuilder,
11
11
  } from '../contract-builder';
12
12
  export {
13
+ buildBoundContract,
13
14
  defineContract,
14
15
  field,
15
16
  index,