@prisma-next/family-mongo 0.10.0-dev.9 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/control.mjs +1 -1
- package/dist/ir.d.mts +3 -0
- package/dist/ir.d.mts.map +1 -1
- package/dist/ir.mjs +1 -1
- package/dist/{mongo-contract-serializer-D9zGIqE9.mjs → mongo-contract-serializer-qnignx7Y.mjs} +7 -3
- package/dist/mongo-contract-serializer-qnignx7Y.mjs.map +1 -0
- package/package.json +15 -15
- package/src/core/ir/mongo-contract-serializer-base.ts +16 -2
- package/dist/mongo-contract-serializer-D9zGIqE9.mjs.map +0 -1
package/dist/control.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as contractToMongoSchemaIR, n as canonicalizeSchemasForVerification, r as diffMongoSchemas, t as verifyMongoSchema } from "./verify-mongo-schema-Bhxvdah3.mjs";
|
|
2
|
-
import { t as MongoContractSerializer } from "./mongo-contract-serializer-
|
|
2
|
+
import { t as MongoContractSerializer } from "./mongo-contract-serializer-qnignx7Y.mjs";
|
|
3
3
|
import { mongoEmission } from "@prisma-next/mongo-emitter";
|
|
4
4
|
import { APP_SPACE_ID, SchemaTreeNode, VERIFY_CODE_HASH_MISMATCH, VERIFY_CODE_MARKER_MISSING, VERIFY_CODE_TARGET_MISMATCH } from "@prisma-next/framework-components/control";
|
|
5
5
|
import { assertDescriptorSelfConsistency } from "@prisma-next/migration-tools/spaces";
|
package/dist/ir.d.mts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ContractSerializer, SchemaIssue, SchemaVerifier, SchemaVerifyOptions, SchemaVerifyResult } from "@prisma-next/framework-components/control";
|
|
2
2
|
import { MongoContract, MongoStorage } from "@prisma-next/mongo-contract";
|
|
3
|
+
import { Type } from "arktype";
|
|
3
4
|
import { Namespace } from "@prisma-next/framework-components/ir";
|
|
4
5
|
import { JsonObject } from "@prisma-next/utils/json";
|
|
5
6
|
|
|
@@ -26,6 +27,8 @@ import { JsonObject } from "@prisma-next/utils/json";
|
|
|
26
27
|
* canonicalization override `serializeContract`.
|
|
27
28
|
*/
|
|
28
29
|
declare abstract class MongoContractSerializerBase<TContract> implements ContractSerializer<TContract> {
|
|
30
|
+
private readonly contractSchema;
|
|
31
|
+
constructor(validatorFragments?: ReadonlyMap<string, Type<unknown>>);
|
|
29
32
|
deserializeContract<T extends TContract = TContract>(json: unknown): T;
|
|
30
33
|
serializeContract(contract: TContract): JsonObject;
|
|
31
34
|
/**
|
package/dist/ir.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir.d.mts","names":[],"sources":["../src/core/ir/mongo-contract-serializer-base.ts","../src/core/ir/mongo-contract-serializer.ts","../src/core/ir/mongo-schema-verifier-base.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ir.d.mts","names":[],"sources":["../src/core/ir/mongo-contract-serializer-base.ts","../src/core/ir/mongo-contract-serializer.ts","../src/core/ir/mongo-schema-verifier-base.ts"],"mappings":";;;;;;;;;;AAkCA;;;;;;;;;;;;;;;;;;uBAAsB,2BAAA,uBACT,kBAAA,CAAmB,SAAA;EAAA,iBAEb,cAAA;cAEL,kBAAA,GAAqB,WAAA,SAAoB,IAAA;EAUrD,mBAAA,WAA8B,SAAA,GAAY,SAAA,CAAA,CAAW,IAAA,YAAgB,CAAA;EAKrE,iBAAA,CAAkB,QAAA,EAAU,SAAA,GAAY,UAAA;;;;;;;;;;;;;;;;;YAuB9B,2BAAA,CAA4B,IAAA,YAAgB,aAAA;EAmC5C;;;;;;EAAA,UAAA,oBAAA,CAAqB,QAAA,EAAU,aAAA,GAAgB,aAAA;EAsCa;;;;;;ACzIxE;;EDyIwE,mBAAnD,uBAAA,CAAwB,SAAA,EAAW,aAAA,GAAgB,SAAA;AAAA;;;;;;;;AApHxE;;;;;cCrBa,uBAAA,SAAgC,2BAAA,CAA4B,aAAA;EAAA,UAC7D,uBAAA,CAAwB,SAAA,EAAW,aAAA,GAAgB,aAAA;AAAA;;;;;;;ADoB/D;;;;;;;;;;;;;;;;;uBEJsB,uBAAA;EAAA,SACS,OAAA,EAAS,YAAA;AAAA,uBAE3B,cAAA,CAAe,SAAA,EAAW,OAAA;EAErC,YAAA,CAAa,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAW,OAAA,IAAW,kBAAA;EAAA,UAOtD,uBAAA,CACR,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAW,OAAA,aAC9B,WAAA;EFPK;;;;;;;;EAAA,mBEkCE,eAAA,CAAgB,OAAA;IAAA,SACxB,QAAA,EAAU,SAAA;IAAA,SACV,MAAA,EAAQ,OAAA;IAAA,SACR,WAAA;IAAA,SACA,SAAA,EAAW,SAAA;EAAA,aACT,WAAA;EFtB2B;;;;;EAAA,mBE6BrB,sBAAA,CACjB,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAW,OAAA,aAC9B,WAAA;AAAA"}
|
package/dist/ir.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as MongoContractSerializerBase, t as MongoContractSerializer } from "./mongo-contract-serializer-
|
|
1
|
+
import { n as MongoContractSerializerBase, t as MongoContractSerializer } from "./mongo-contract-serializer-qnignx7Y.mjs";
|
|
2
2
|
//#region src/core/ir/mongo-schema-verifier-base.ts
|
|
3
3
|
/**
|
|
4
4
|
* Mongo family `SchemaVerifier` abstract base. Commits the Mongo family
|
package/dist/{mongo-contract-serializer-D9zGIqE9.mjs → mongo-contract-serializer-qnignx7Y.mjs}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { validateContractDomain } from "@prisma-next/contract/validate-domain";
|
|
2
|
-
import { MongoCollection, MongoContractSchema, validateMongoStorage } from "@prisma-next/mongo-contract";
|
|
2
|
+
import { MongoCollection, MongoContractSchema, createMongoContractSchema, validateMongoStorage } from "@prisma-next/mongo-contract";
|
|
3
3
|
import { type } from "arktype";
|
|
4
4
|
//#region src/core/ir/mongo-contract-serializer-base.ts
|
|
5
5
|
/**
|
|
@@ -24,6 +24,10 @@ import { type } from "arktype";
|
|
|
24
24
|
* canonicalization override `serializeContract`.
|
|
25
25
|
*/
|
|
26
26
|
var MongoContractSerializerBase = class {
|
|
27
|
+
contractSchema;
|
|
28
|
+
constructor(validatorFragments) {
|
|
29
|
+
this.contractSchema = validatorFragments !== void 0 && validatorFragments.size > 0 ? createMongoContractSchema(validatorFragments) : void 0;
|
|
30
|
+
}
|
|
27
31
|
deserializeContract(json) {
|
|
28
32
|
const validated = this.parseMongoContractStructure(json);
|
|
29
33
|
return this.constructTargetContract(validated);
|
|
@@ -48,7 +52,7 @@ var MongoContractSerializerBase = class {
|
|
|
48
52
|
* subsystems and don't sit behind this SPI.
|
|
49
53
|
*/
|
|
50
54
|
parseMongoContractStructure(json) {
|
|
51
|
-
const parsed = MongoContractSchema(json);
|
|
55
|
+
const parsed = (this.contractSchema ?? MongoContractSchema)(json);
|
|
52
56
|
if (parsed instanceof type.errors) throw new Error(`Contract structural validation failed: ${parsed.summary}`);
|
|
53
57
|
const validatedShape = parsed;
|
|
54
58
|
const hydratedContract = this.hydrateMongoContract(validatedShape);
|
|
@@ -102,4 +106,4 @@ var MongoContractSerializer = class extends MongoContractSerializerBase {
|
|
|
102
106
|
//#endregion
|
|
103
107
|
export { MongoContractSerializerBase as n, MongoContractSerializer as t };
|
|
104
108
|
|
|
105
|
-
//# sourceMappingURL=mongo-contract-serializer-
|
|
109
|
+
//# sourceMappingURL=mongo-contract-serializer-qnignx7Y.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongo-contract-serializer-qnignx7Y.mjs","names":["arktypeType"],"sources":["../src/core/ir/mongo-contract-serializer-base.ts","../src/core/ir/mongo-contract-serializer.ts"],"sourcesContent":["import { validateContractDomain } from '@prisma-next/contract/validate-domain';\nimport type { ContractSerializer } from '@prisma-next/framework-components/control';\nimport {\n createMongoContractSchema,\n MongoCollection,\n type MongoCollectionInput,\n type MongoContract,\n MongoContractSchema,\n validateMongoStorage,\n} from '@prisma-next/mongo-contract';\nimport type { JsonObject } from '@prisma-next/utils/json';\nimport { type as arktypeType, type Type } from 'arktype';\n\n/**\n * Mongo family `ContractSerializer` abstract base. Owns the family-shared\n * deserialization pipeline:\n *\n * 1. Structural validation against the Mongo contract arktype schema\n * (`MongoContractSchema`).\n * 2. Framework-shared domain validation (`validateContractDomain`).\n * 3. Family-shared storage validation (`validateMongoStorage`).\n *\n * The validated value is handed to the target via the\n * `constructTargetContract` hook, which wraps the plain-JSON shape in\n * the family-layer `MongoStorage` class instance (carrying the\n * target-supplied `namespaces` map). Targets that need to add\n * structural checks beyond the family default can override\n * `parseMongoContractStructure`.\n *\n * Default `serializeContract` is identity over the contract — Mongo\n * target classes carry JSON-clean fields by construction, so the value\n * can be `JSON.stringify`'d directly. Targets that need on-the-way-out\n * canonicalization override `serializeContract`.\n */\nexport abstract class MongoContractSerializerBase<TContract>\n implements ContractSerializer<TContract>\n{\n private readonly contractSchema: Type<unknown> | undefined;\n\n constructor(validatorFragments?: ReadonlyMap<string, Type<unknown>>) {\n // Mirrors the SQL base: only build a fragments-aware schema when\n // pack contributions exist; otherwise the cached module-level\n // default in `contract-schema.ts` covers the validation path.\n this.contractSchema =\n validatorFragments !== undefined && validatorFragments.size > 0\n ? createMongoContractSchema(validatorFragments)\n : undefined;\n }\n\n deserializeContract<T extends TContract = TContract>(json: unknown): T {\n const validated = this.parseMongoContractStructure(json);\n return this.constructTargetContract(validated) as T;\n }\n\n serializeContract(contract: TContract): JsonObject {\n // Mongo contract class fields are JSON-clean by construction; the\n // cast asserts that. Targets that need to canonicalize on the way\n // out override this method.\n return contract as unknown as JsonObject;\n }\n\n /**\n * Family-shared structural validation: parse against the Mongo\n * contract arktype schema, then run framework-shared domain + Mongo\n * family storage checks, then hydrate the validated tree into Mongo\n * Contract IR class instances. Targets can override to add\n * target-specific structural checks; most targets accept the family\n * default.\n *\n * The returned `MongoContract` carries class instances under\n * `storage.namespaces[namespaceId].collections[collectionName]` (each value is a\n * `MongoCollection`, with nested `MongoIndex` / `MongoValidator` /\n * `MongoCollectionOptions` constructed by the `MongoCollection` constructor).\n * The rest of the contract envelope (models, valueObjects, capabilities, …)\n * remains in plain-JSON form; those IR layers are handled by sibling\n * subsystems and don't sit behind this SPI.\n */\n protected parseMongoContractStructure(json: unknown): MongoContract {\n const schema = this.contractSchema ?? MongoContractSchema;\n const parsed = schema(json);\n if (parsed instanceof arktypeType.errors) {\n throw new Error(`Contract structural validation failed: ${parsed.summary}`);\n }\n\n // arktype's `infer`d type for `MongoContractSchema` is structurally\n // equivalent to `MongoContract` (both describe the same on-disk JSON\n // envelope) but not nominally so: the arktype DSL produces a type whose\n // optional/readonly profile, narrowed string-literal positions, and\n // utility-type wrappings (`Type.infer`, `Out`, …) differ from the\n // hand-authored `MongoContract<S, M>` generic surface. The schema and\n // the type are kept in lockstep by the round-trip fixtures under\n // `test/validate.test.ts`. The hydration walk below additionally\n // re-shapes `storage.namespaces.*.collections` from plain data into IR-class\n // instances, so the `MongoContract` returned here carries class identity\n // under those collections maps (and transitively under `indexes` / `validator`\n // / `options`).\n const validatedShape = parsed as unknown as MongoContract;\n\n const hydratedContract = this.hydrateMongoContract(validatedShape);\n\n validateContractDomain(hydratedContract);\n validateMongoStorage(hydratedContract);\n\n return hydratedContract;\n }\n\n /**\n * Walk a structurally-validated Mongo contract and convert each\n * `storage.namespaces[nsId].collections[collectionName]` entry from plain\n * data into `MongoCollection` IR-class instances. Idempotent: already-class\n * instances pass through unchanged.\n */\n protected hydrateMongoContract(contract: MongoContract): MongoContract {\n const rawNamespaces = contract.storage.namespaces;\n const hydratedNamespaces = Object.fromEntries(\n Object.entries(rawNamespaces).map(([nsId, nsEnvelope]) => {\n const rawCollections = nsEnvelope.collections ?? {};\n const hydratedCollections = Object.fromEntries(\n Object.entries(rawCollections).map(([name, raw]) => [\n name,\n raw instanceof MongoCollection ? raw : new MongoCollection(raw as MongoCollectionInput),\n ]),\n );\n return [\n nsId,\n {\n ...nsEnvelope,\n id: nsEnvelope.id,\n collections: hydratedCollections,\n },\n ];\n }),\n );\n return {\n ...contract,\n storage: {\n ...contract.storage,\n namespaces: hydratedNamespaces,\n },\n };\n }\n\n /**\n * Target-specific class construction from the validated structural\n * data. The target wraps the contract envelope in the family-layer\n * `MongoStorage` class instance, supplying the `namespaces` map\n * (target concretions like `MongoTargetUnboundDatabase`). The\n * leaf collection / index shapes are already family-layer IR-class\n * instances after the hydration walk above.\n */\n protected abstract constructTargetContract(validated: MongoContract): TContract;\n}\n","import type { MongoContract } from '@prisma-next/mongo-contract';\nimport { MongoContractSerializerBase } from './mongo-contract-serializer-base';\n\n/**\n * Default Mongo family `ContractSerializer` concretion. Inherits the\n * Mongo-shared deserialization pipeline (structural validation +\n * collection-level hydration) and falls through `constructTargetContract`\n * with the validated `MongoContract` shape. Family-level call sites\n * (family-instance methods, family-layer tests that don't reach into\n * a target descriptor) instantiate this directly; targets with their\n * own storage concretion (`target-mongo`'s `MongoTargetContractSerializer`)\n * override `constructTargetContract` to wrap the storage shape.\n */\nexport class MongoContractSerializer extends MongoContractSerializerBase<MongoContract> {\n protected constructTargetContract(validated: MongoContract): MongoContract {\n return validated;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAsB,8BAAtB,MAEA;CACE;CAEA,YAAY,oBAAyD;EAInE,KAAK,iBACH,uBAAuB,KAAA,KAAa,mBAAmB,OAAO,IAC1D,0BAA0B,mBAAmB,GAC7C,KAAA;;CAGR,oBAAqD,MAAkB;EACrE,MAAM,YAAY,KAAK,4BAA4B,KAAK;EACxD,OAAO,KAAK,wBAAwB,UAAU;;CAGhD,kBAAkB,UAAiC;EAIjD,OAAO;;;;;;;;;;;;;;;;;;CAmBT,4BAAsC,MAA8B;EAElE,MAAM,UADS,KAAK,kBAAkB,qBAChB,KAAK;EAC3B,IAAI,kBAAkBA,KAAY,QAChC,MAAM,IAAI,MAAM,0CAA0C,OAAO,UAAU;EAe7E,MAAM,iBAAiB;EAEvB,MAAM,mBAAmB,KAAK,qBAAqB,eAAe;EAElE,uBAAuB,iBAAiB;EACxC,qBAAqB,iBAAiB;EAEtC,OAAO;;;;;;;;CAST,qBAA+B,UAAwC;EACrE,MAAM,gBAAgB,SAAS,QAAQ;EACvC,MAAM,qBAAqB,OAAO,YAChC,OAAO,QAAQ,cAAc,CAAC,KAAK,CAAC,MAAM,gBAAgB;GACxD,MAAM,iBAAiB,WAAW,eAAe,EAAE;GACnD,MAAM,sBAAsB,OAAO,YACjC,OAAO,QAAQ,eAAe,CAAC,KAAK,CAAC,MAAM,SAAS,CAClD,MACA,eAAe,kBAAkB,MAAM,IAAI,gBAAgB,IAA4B,CACxF,CAAC,CACH;GACD,OAAO,CACL,MACA;IACE,GAAG;IACH,IAAI,WAAW;IACf,aAAa;IACd,CACF;IACD,CACH;EACD,OAAO;GACL,GAAG;GACH,SAAS;IACP,GAAG,SAAS;IACZ,YAAY;IACb;GACF;;;;;;;;;;;;;;;AC9HL,IAAa,0BAAb,cAA6C,4BAA2C;CACtF,wBAAkC,WAAyC;EACzE,OAAO"}
|
package/package.json
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/family-mongo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "Mongo family descriptor for Prisma Next",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@prisma-next/contract": "0.
|
|
10
|
-
"@prisma-next/emitter": "0.
|
|
11
|
-
"@prisma-next/errors": "0.
|
|
12
|
-
"@prisma-next/framework-components": "0.
|
|
13
|
-
"@prisma-next/migration-tools": "0.
|
|
14
|
-
"@prisma-next/mongo-contract": "0.
|
|
15
|
-
"@prisma-next/mongo-emitter": "0.
|
|
16
|
-
"@prisma-next/mongo-query-ast": "0.
|
|
17
|
-
"@prisma-next/mongo-schema-ir": "0.
|
|
18
|
-
"@prisma-next/utils": "0.
|
|
9
|
+
"@prisma-next/contract": "0.11.0",
|
|
10
|
+
"@prisma-next/emitter": "0.11.0",
|
|
11
|
+
"@prisma-next/errors": "0.11.0",
|
|
12
|
+
"@prisma-next/framework-components": "0.11.0",
|
|
13
|
+
"@prisma-next/migration-tools": "0.11.0",
|
|
14
|
+
"@prisma-next/mongo-contract": "0.11.0",
|
|
15
|
+
"@prisma-next/mongo-emitter": "0.11.0",
|
|
16
|
+
"@prisma-next/mongo-query-ast": "0.11.0",
|
|
17
|
+
"@prisma-next/mongo-schema-ir": "0.11.0",
|
|
18
|
+
"@prisma-next/utils": "0.11.0",
|
|
19
19
|
"arktype": "^2.2.0",
|
|
20
20
|
"mongodb": "^6.16.0",
|
|
21
21
|
"pathe": "^2.0.3"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@prisma-next/mongo-contract-ts": "0.
|
|
25
|
-
"@prisma-next/test-utils": "0.
|
|
26
|
-
"@prisma-next/tsconfig": "0.
|
|
27
|
-
"@prisma-next/tsdown": "0.
|
|
24
|
+
"@prisma-next/mongo-contract-ts": "0.11.0",
|
|
25
|
+
"@prisma-next/test-utils": "0.11.0",
|
|
26
|
+
"@prisma-next/tsconfig": "0.11.0",
|
|
27
|
+
"@prisma-next/tsdown": "0.11.0",
|
|
28
28
|
"tsdown": "0.22.0",
|
|
29
29
|
"typescript": "5.9.3",
|
|
30
30
|
"vitest": "4.1.6"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { validateContractDomain } from '@prisma-next/contract/validate-domain';
|
|
2
2
|
import type { ContractSerializer } from '@prisma-next/framework-components/control';
|
|
3
3
|
import {
|
|
4
|
+
createMongoContractSchema,
|
|
4
5
|
MongoCollection,
|
|
5
6
|
type MongoCollectionInput,
|
|
6
7
|
type MongoContract,
|
|
@@ -8,7 +9,7 @@ import {
|
|
|
8
9
|
validateMongoStorage,
|
|
9
10
|
} from '@prisma-next/mongo-contract';
|
|
10
11
|
import type { JsonObject } from '@prisma-next/utils/json';
|
|
11
|
-
import { type as arktypeType } from 'arktype';
|
|
12
|
+
import { type as arktypeType, type Type } from 'arktype';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Mongo family `ContractSerializer` abstract base. Owns the family-shared
|
|
@@ -34,6 +35,18 @@ import { type as arktypeType } from 'arktype';
|
|
|
34
35
|
export abstract class MongoContractSerializerBase<TContract>
|
|
35
36
|
implements ContractSerializer<TContract>
|
|
36
37
|
{
|
|
38
|
+
private readonly contractSchema: Type<unknown> | undefined;
|
|
39
|
+
|
|
40
|
+
constructor(validatorFragments?: ReadonlyMap<string, Type<unknown>>) {
|
|
41
|
+
// Mirrors the SQL base: only build a fragments-aware schema when
|
|
42
|
+
// pack contributions exist; otherwise the cached module-level
|
|
43
|
+
// default in `contract-schema.ts` covers the validation path.
|
|
44
|
+
this.contractSchema =
|
|
45
|
+
validatorFragments !== undefined && validatorFragments.size > 0
|
|
46
|
+
? createMongoContractSchema(validatorFragments)
|
|
47
|
+
: undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
37
50
|
deserializeContract<T extends TContract = TContract>(json: unknown): T {
|
|
38
51
|
const validated = this.parseMongoContractStructure(json);
|
|
39
52
|
return this.constructTargetContract(validated) as T;
|
|
@@ -63,7 +76,8 @@ export abstract class MongoContractSerializerBase<TContract>
|
|
|
63
76
|
* subsystems and don't sit behind this SPI.
|
|
64
77
|
*/
|
|
65
78
|
protected parseMongoContractStructure(json: unknown): MongoContract {
|
|
66
|
-
const
|
|
79
|
+
const schema = this.contractSchema ?? MongoContractSchema;
|
|
80
|
+
const parsed = schema(json);
|
|
67
81
|
if (parsed instanceof arktypeType.errors) {
|
|
68
82
|
throw new Error(`Contract structural validation failed: ${parsed.summary}`);
|
|
69
83
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mongo-contract-serializer-D9zGIqE9.mjs","names":["arktypeType"],"sources":["../src/core/ir/mongo-contract-serializer-base.ts","../src/core/ir/mongo-contract-serializer.ts"],"sourcesContent":["import { validateContractDomain } from '@prisma-next/contract/validate-domain';\nimport type { ContractSerializer } from '@prisma-next/framework-components/control';\nimport {\n MongoCollection,\n type MongoCollectionInput,\n type MongoContract,\n MongoContractSchema,\n validateMongoStorage,\n} from '@prisma-next/mongo-contract';\nimport type { JsonObject } from '@prisma-next/utils/json';\nimport { type as arktypeType } from 'arktype';\n\n/**\n * Mongo family `ContractSerializer` abstract base. Owns the family-shared\n * deserialization pipeline:\n *\n * 1. Structural validation against the Mongo contract arktype schema\n * (`MongoContractSchema`).\n * 2. Framework-shared domain validation (`validateContractDomain`).\n * 3. Family-shared storage validation (`validateMongoStorage`).\n *\n * The validated value is handed to the target via the\n * `constructTargetContract` hook, which wraps the plain-JSON shape in\n * the family-layer `MongoStorage` class instance (carrying the\n * target-supplied `namespaces` map). Targets that need to add\n * structural checks beyond the family default can override\n * `parseMongoContractStructure`.\n *\n * Default `serializeContract` is identity over the contract — Mongo\n * target classes carry JSON-clean fields by construction, so the value\n * can be `JSON.stringify`'d directly. Targets that need on-the-way-out\n * canonicalization override `serializeContract`.\n */\nexport abstract class MongoContractSerializerBase<TContract>\n implements ContractSerializer<TContract>\n{\n deserializeContract<T extends TContract = TContract>(json: unknown): T {\n const validated = this.parseMongoContractStructure(json);\n return this.constructTargetContract(validated) as T;\n }\n\n serializeContract(contract: TContract): JsonObject {\n // Mongo contract class fields are JSON-clean by construction; the\n // cast asserts that. Targets that need to canonicalize on the way\n // out override this method.\n return contract as unknown as JsonObject;\n }\n\n /**\n * Family-shared structural validation: parse against the Mongo\n * contract arktype schema, then run framework-shared domain + Mongo\n * family storage checks, then hydrate the validated tree into Mongo\n * Contract IR class instances. Targets can override to add\n * target-specific structural checks; most targets accept the family\n * default.\n *\n * The returned `MongoContract` carries class instances under\n * `storage.namespaces[namespaceId].collections[collectionName]` (each value is a\n * `MongoCollection`, with nested `MongoIndex` / `MongoValidator` /\n * `MongoCollectionOptions` constructed by the `MongoCollection` constructor).\n * The rest of the contract envelope (models, valueObjects, capabilities, …)\n * remains in plain-JSON form; those IR layers are handled by sibling\n * subsystems and don't sit behind this SPI.\n */\n protected parseMongoContractStructure(json: unknown): MongoContract {\n const parsed = MongoContractSchema(json);\n if (parsed instanceof arktypeType.errors) {\n throw new Error(`Contract structural validation failed: ${parsed.summary}`);\n }\n\n // arktype's `infer`d type for `MongoContractSchema` is structurally\n // equivalent to `MongoContract` (both describe the same on-disk JSON\n // envelope) but not nominally so: the arktype DSL produces a type whose\n // optional/readonly profile, narrowed string-literal positions, and\n // utility-type wrappings (`Type.infer`, `Out`, …) differ from the\n // hand-authored `MongoContract<S, M>` generic surface. The schema and\n // the type are kept in lockstep by the round-trip fixtures under\n // `test/validate.test.ts`. The hydration walk below additionally\n // re-shapes `storage.namespaces.*.collections` from plain data into IR-class\n // instances, so the `MongoContract` returned here carries class identity\n // under those collections maps (and transitively under `indexes` / `validator`\n // / `options`).\n const validatedShape = parsed as unknown as MongoContract;\n\n const hydratedContract = this.hydrateMongoContract(validatedShape);\n\n validateContractDomain(hydratedContract);\n validateMongoStorage(hydratedContract);\n\n return hydratedContract;\n }\n\n /**\n * Walk a structurally-validated Mongo contract and convert each\n * `storage.namespaces[nsId].collections[collectionName]` entry from plain\n * data into `MongoCollection` IR-class instances. Idempotent: already-class\n * instances pass through unchanged.\n */\n protected hydrateMongoContract(contract: MongoContract): MongoContract {\n const rawNamespaces = contract.storage.namespaces;\n const hydratedNamespaces = Object.fromEntries(\n Object.entries(rawNamespaces).map(([nsId, nsEnvelope]) => {\n const rawCollections = nsEnvelope.collections ?? {};\n const hydratedCollections = Object.fromEntries(\n Object.entries(rawCollections).map(([name, raw]) => [\n name,\n raw instanceof MongoCollection ? raw : new MongoCollection(raw as MongoCollectionInput),\n ]),\n );\n return [\n nsId,\n {\n ...nsEnvelope,\n id: nsEnvelope.id,\n collections: hydratedCollections,\n },\n ];\n }),\n );\n return {\n ...contract,\n storage: {\n ...contract.storage,\n namespaces: hydratedNamespaces,\n },\n };\n }\n\n /**\n * Target-specific class construction from the validated structural\n * data. The target wraps the contract envelope in the family-layer\n * `MongoStorage` class instance, supplying the `namespaces` map\n * (target concretions like `MongoTargetUnboundDatabase`). The\n * leaf collection / index shapes are already family-layer IR-class\n * instances after the hydration walk above.\n */\n protected abstract constructTargetContract(validated: MongoContract): TContract;\n}\n","import type { MongoContract } from '@prisma-next/mongo-contract';\nimport { MongoContractSerializerBase } from './mongo-contract-serializer-base';\n\n/**\n * Default Mongo family `ContractSerializer` concretion. Inherits the\n * Mongo-shared deserialization pipeline (structural validation +\n * collection-level hydration) and falls through `constructTargetContract`\n * with the validated `MongoContract` shape. Family-level call sites\n * (family-instance methods, family-layer tests that don't reach into\n * a target descriptor) instantiate this directly; targets with their\n * own storage concretion (`target-mongo`'s `MongoTargetContractSerializer`)\n * override `constructTargetContract` to wrap the storage shape.\n */\nexport class MongoContractSerializer extends MongoContractSerializerBase<MongoContract> {\n protected constructTargetContract(validated: MongoContract): MongoContract {\n return validated;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAsB,8BAAtB,MAEA;CACE,oBAAqD,MAAkB;EACrE,MAAM,YAAY,KAAK,4BAA4B,KAAK;EACxD,OAAO,KAAK,wBAAwB,UAAU;;CAGhD,kBAAkB,UAAiC;EAIjD,OAAO;;;;;;;;;;;;;;;;;;CAmBT,4BAAsC,MAA8B;EAClE,MAAM,SAAS,oBAAoB,KAAK;EACxC,IAAI,kBAAkBA,KAAY,QAChC,MAAM,IAAI,MAAM,0CAA0C,OAAO,UAAU;EAe7E,MAAM,iBAAiB;EAEvB,MAAM,mBAAmB,KAAK,qBAAqB,eAAe;EAElE,uBAAuB,iBAAiB;EACxC,qBAAqB,iBAAiB;EAEtC,OAAO;;;;;;;;CAST,qBAA+B,UAAwC;EACrE,MAAM,gBAAgB,SAAS,QAAQ;EACvC,MAAM,qBAAqB,OAAO,YAChC,OAAO,QAAQ,cAAc,CAAC,KAAK,CAAC,MAAM,gBAAgB;GACxD,MAAM,iBAAiB,WAAW,eAAe,EAAE;GACnD,MAAM,sBAAsB,OAAO,YACjC,OAAO,QAAQ,eAAe,CAAC,KAAK,CAAC,MAAM,SAAS,CAClD,MACA,eAAe,kBAAkB,MAAM,IAAI,gBAAgB,IAA4B,CACxF,CAAC,CACH;GACD,OAAO,CACL,MACA;IACE,GAAG;IACH,IAAI,WAAW;IACf,aAAa;IACd,CACF;IACD,CACH;EACD,OAAO;GACL,GAAG;GACH,SAAS;IACP,GAAG,SAAS;IACZ,YAAY;IACb;GACF;;;;;;;;;;;;;;;AChHL,IAAa,0BAAb,cAA6C,4BAA2C;CACtF,wBAAkC,WAAyC;EACzE,OAAO"}
|