@prisma-next/mongo-contract 0.5.0-dev.8 → 0.5.0-dev.81

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/index.d.mts CHANGED
@@ -163,7 +163,7 @@ type ExtractValueObjects<TContract> = TContract extends {
163
163
  valueObjects: infer VO extends Record<string, ContractValueObject>;
164
164
  } ? VO : Record<never, never>;
165
165
  type NormalizeContractFields<TFields> = { [K in keyof TFields]: TFields[K] extends ContractField ? TFields[K] : never };
166
- type ExtractValueObjectFields<TValueObjects extends Record<string, ContractValueObject>, VOName$1 extends keyof TValueObjects> = NormalizeContractFields<TValueObjects[VOName$1]['fields']>;
166
+ type ExtractValueObjectFields<TValueObjects extends Record<string, ContractValueObject>, VOName extends keyof TValueObjects> = NormalizeContractFields<TValueObjects[VOName]['fields']>;
167
167
  type InferFieldBaseType<TFieldType, TValueObjects extends Record<string, ContractValueObject>, TCodecTypes extends Record<string, {
168
168
  output: unknown;
169
169
  }>> = TFieldType extends {
@@ -185,6 +185,20 @@ type InferModelRow<TContract extends MongoContractWithTypeMaps<MongoContract, Mo
185
185
  output: unknown;
186
186
  }> = ExtractMongoCodecTypes<TContract>, TValueObjects extends Record<string, ContractValueObject> = ExtractValueObjects<TContract>> = { -readonly [FieldName in keyof TFields]: InferFieldType<TFields[FieldName], TValueObjects, TCodecTypes> };
187
187
  //#endregion
188
+ //#region src/polymorphic-index-scope.d.ts
189
+ type PolymorphicIndexScope = {
190
+ readonly discriminatorField: string;
191
+ readonly discriminatorValue: string | number | boolean;
192
+ };
193
+ type ApplyScopeResult = {
194
+ readonly kind: 'ok';
195
+ readonly index: MongoStorageIndex;
196
+ } | {
197
+ readonly kind: 'conflict';
198
+ readonly reason: string;
199
+ };
200
+ declare function applyPolymorphicScopeToMongoIndex(index: MongoStorageIndex, scope: PolymorphicIndexScope): ApplyScopeResult;
201
+ //#endregion
188
202
  //#region src/validate-mongo-contract.d.ts
189
203
  interface MongoContractIndices {
190
204
  readonly variantToBase: Record<string, string>;
@@ -199,5 +213,5 @@ declare function validateMongoContract<TContract extends MongoContract>(value: u
199
213
  //#region src/validate-storage.d.ts
200
214
  declare function validateMongoStorage(contract: MongoContract): void;
201
215
  //#endregion
202
- export { type ExtractMongoCodecTypes, type ExtractMongoFieldInputTypes, type ExtractMongoFieldOutputTypes, type ExtractMongoTypeMaps, type InferModelRow, type MongoChangeStreamPreAndPostImagesOptions, type MongoClusteredCollectionKey, type MongoClusteredCollectionOptions, type MongoCollationAlternate, type MongoCollationCaseFirst, type MongoCollationMaxVariable, type MongoCollationOptions, type MongoCollationStrength, type MongoCollectionOptions, type MongoContract, type MongoContractIndices, type MongoContractWithTypeMaps, type MongoIndex, type MongoIndexFieldValue, type MongoIndexFields, type MongoIndexKey, type MongoIndexKeyDirection, type MongoIndexOptionDefaults, type MongoIndexOptions, type MongoJsonObject, type MongoJsonPrimitive, type MongoJsonValue, type MongoModelDefinition, type MongoModelStorage, type MongoStorage, type MongoStorageCollection, type MongoStorageCollectionOptions, type MongoStorageIndex, type MongoStorageValidator, type MongoTimeSeriesCollectionOptions, type MongoTimeSeriesGranularity, type MongoTypeMaps, type MongoTypeMapsPhantomKey, type MongoWildcardProjection, type ValidatedMongoContract, validateMongoContract, validateMongoStorage };
216
+ export { type ApplyScopeResult, type ExtractMongoCodecTypes, type ExtractMongoFieldInputTypes, type ExtractMongoFieldOutputTypes, type ExtractMongoTypeMaps, type InferModelRow, type MongoChangeStreamPreAndPostImagesOptions, type MongoClusteredCollectionKey, type MongoClusteredCollectionOptions, type MongoCollationAlternate, type MongoCollationCaseFirst, type MongoCollationMaxVariable, type MongoCollationOptions, type MongoCollationStrength, type MongoCollectionOptions, type MongoContract, type MongoContractIndices, type MongoContractWithTypeMaps, type MongoIndex, type MongoIndexFieldValue, type MongoIndexFields, type MongoIndexKey, type MongoIndexKeyDirection, type MongoIndexOptionDefaults, type MongoIndexOptions, type MongoJsonObject, type MongoJsonPrimitive, type MongoJsonValue, type MongoModelDefinition, type MongoModelStorage, type MongoStorage, type MongoStorageCollection, type MongoStorageCollectionOptions, type MongoStorageIndex, type MongoStorageValidator, type MongoTimeSeriesCollectionOptions, type MongoTimeSeriesGranularity, type MongoTypeMaps, type MongoTypeMapsPhantomKey, type MongoWildcardProjection, type PolymorphicIndexScope, type ValidatedMongoContract, applyPolymorphicScopeToMongoIndex, validateMongoContract, validateMongoStorage };
203
217
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/contract-types.ts","../src/validate-mongo-contract.ts","../src/validate-storage.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/contract-types.ts","../src/polymorphic-index-scope.ts","../src/validate-mongo-contract.ts","../src/validate-storage.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,6 +1,47 @@
1
1
  import { validateContractDomain } from "@prisma-next/contract/validate-domain";
2
2
  import { type } from "arktype";
3
-
3
+ //#region src/polymorphic-index-scope.ts
4
+ function isScalarDiscriminatorValue(value) {
5
+ const t = typeof value;
6
+ return t === "string" || t === "number" || t === "boolean";
7
+ }
8
+ function formatValue(value) {
9
+ if (typeof value === "string") return JSON.stringify(value);
10
+ if (value === null) return "null";
11
+ if (Array.isArray(value)) return JSON.stringify(value);
12
+ if (typeof value === "object") return JSON.stringify(value);
13
+ return String(value);
14
+ }
15
+ function applyPolymorphicScopeToMongoIndex(index, scope) {
16
+ if (!isScalarDiscriminatorValue(scope.discriminatorValue)) return {
17
+ kind: "conflict",
18
+ reason: `Variant-scoped indexes require a scalar (string, number, or boolean) discriminator value for field "${scope.discriminatorField}", but received ${formatValue(scope.discriminatorValue)}.`
19
+ };
20
+ const existing = index.partialFilterExpression;
21
+ if (existing && Object.hasOwn(existing, scope.discriminatorField)) {
22
+ const existingValue = existing[scope.discriminatorField];
23
+ if (existingValue === scope.discriminatorValue) return {
24
+ kind: "ok",
25
+ index
26
+ };
27
+ return {
28
+ kind: "conflict",
29
+ reason: `Index partialFilterExpression sets "${scope.discriminatorField}" to ${formatValue(existingValue)}, which conflicts with the variant's discriminator value ${formatValue(scope.discriminatorValue)}.`
30
+ };
31
+ }
32
+ const merged = {
33
+ ...existing ?? {},
34
+ [scope.discriminatorField]: scope.discriminatorValue
35
+ };
36
+ return {
37
+ kind: "ok",
38
+ index: {
39
+ ...index,
40
+ partialFilterExpression: merged
41
+ }
42
+ };
43
+ }
44
+ //#endregion
4
45
  //#region src/contract-schema.ts
5
46
  const ScalarFieldTypeSchema = type({
6
47
  "+": "reject",
@@ -18,10 +59,9 @@ const UnionFieldTypeSchema = type({
18
59
  kind: "'union'",
19
60
  members: ScalarFieldTypeSchema.or(ValueObjectFieldTypeSchema).array()
20
61
  });
21
- const FieldTypeSchema = ScalarFieldTypeSchema.or(ValueObjectFieldTypeSchema).or(UnionFieldTypeSchema);
22
62
  const FieldSchema = type({
23
63
  "+": "reject",
24
- type: FieldTypeSchema,
64
+ type: ScalarFieldTypeSchema.or(ValueObjectFieldTypeSchema).or(UnionFieldTypeSchema),
25
65
  "nullable?": "boolean",
26
66
  "many?": "boolean",
27
67
  "dict?": "boolean"
@@ -29,16 +69,15 @@ const FieldSchema = type({
29
69
  ...field,
30
70
  nullable: field.nullable ?? false
31
71
  }));
32
- const RelationOnSchema = type({
33
- "+": "reject",
34
- localFields: "string[]",
35
- targetFields: "string[]"
36
- });
37
72
  const RelationSchema = type({
38
73
  "+": "reject",
39
74
  to: "string",
40
75
  cardinality: "'1:1' | '1:N' | 'N:1'",
41
- "on?": RelationOnSchema
76
+ "on?": type({
77
+ "+": "reject",
78
+ localFields: "string[]",
79
+ targetFields: "string[]"
80
+ })
42
81
  });
43
82
  const StorageRelationEntrySchema = type({
44
83
  "+": "reject",
@@ -96,21 +135,20 @@ const TimeSeriesCollectionOptionsSchema = type({
96
135
  "bucketMaxSpanSeconds?": "number",
97
136
  "bucketRoundingSeconds?": "number"
98
137
  });
99
- const ClusteredCollectionKeySchema = type({
100
- "+": "reject",
101
- "[string]": "1"
102
- }).narrow((key, ctx) => Object.keys(key).length > 0 ? true : ctx.mustBe("a clustered index key map with at least one entry"));
103
138
  const ClusteredCollectionOptionsSchema = type({
104
139
  "+": "reject",
105
140
  "name?": "string",
106
- key: ClusteredCollectionKeySchema,
141
+ key: type({
142
+ "+": "reject",
143
+ "[string]": "1"
144
+ }).narrow((key, ctx) => Object.keys(key).length > 0 ? true : ctx.mustBe("a clustered index key map with at least one entry")),
107
145
  unique: "boolean"
108
146
  });
109
147
  const ChangeStreamPreAndPostImagesSchema = type({
110
148
  "+": "reject",
111
149
  enabled: "boolean"
112
150
  });
113
- const CollectionOptionsSchema = type({
151
+ type({
114
152
  "+": "reject",
115
153
  "capped?": "boolean",
116
154
  "size?": "number",
@@ -146,43 +184,40 @@ const ModelDefinitionSchema = type({
146
184
  "base?": "string",
147
185
  "owner?": "string"
148
186
  });
149
- const WildcardProjectionSchema = type({
150
- "+": "reject",
151
- "[string]": "0 | 1"
152
- });
153
- const IndexOptionsSchema = type({
154
- "+": "reject",
155
- "unique?": "boolean",
156
- "name?": "string",
157
- "partialFilterExpression?": MongoJsonObjectSchema,
158
- "sparse?": "boolean",
159
- "expireAfterSeconds?": "number",
160
- "weights?": NumberRecordSchema,
161
- "default_language?": "string",
162
- "language_override?": "string",
163
- "textIndexVersion?": "number",
164
- "2dsphereIndexVersion?": "number",
165
- "bits?": "number",
166
- "min?": "number",
167
- "max?": "number",
168
- "bucketSize?": "number",
169
- "hidden?": "boolean",
170
- "collation?": CollationSchema,
171
- "wildcardProjection?": WildcardProjectionSchema
172
- });
173
- const IndexSchema = type({
187
+ type({
174
188
  "+": "reject",
175
189
  fields: IndexFieldsSchema,
176
- "options?": IndexOptionsSchema
177
- });
178
- const MongoIndexKeySchema = type({
179
- "+": "reject",
180
- field: "string",
181
- direction: "1 | -1 | \"text\" | \"2dsphere\" | \"2d\" | \"hashed\""
190
+ "options?": type({
191
+ "+": "reject",
192
+ "unique?": "boolean",
193
+ "name?": "string",
194
+ "partialFilterExpression?": MongoJsonObjectSchema,
195
+ "sparse?": "boolean",
196
+ "expireAfterSeconds?": "number",
197
+ "weights?": NumberRecordSchema,
198
+ "default_language?": "string",
199
+ "language_override?": "string",
200
+ "textIndexVersion?": "number",
201
+ "2dsphereIndexVersion?": "number",
202
+ "bits?": "number",
203
+ "min?": "number",
204
+ "max?": "number",
205
+ "bucketSize?": "number",
206
+ "hidden?": "boolean",
207
+ "collation?": CollationSchema,
208
+ "wildcardProjection?": type({
209
+ "+": "reject",
210
+ "[string]": "0 | 1"
211
+ })
212
+ })
182
213
  });
183
214
  const MongoStorageIndexSchema = type({
184
215
  "+": "reject",
185
- keys: MongoIndexKeySchema.array().atLeastLength(1),
216
+ keys: type({
217
+ "+": "reject",
218
+ field: "string",
219
+ direction: "1 | -1 | \"text\" | \"2dsphere\" | \"2d\" | \"hashed\""
220
+ }).array().atLeastLength(1),
186
221
  "unique?": "boolean",
187
222
  "sparse?": "boolean",
188
223
  "expireAfterSeconds?": "number",
@@ -199,34 +234,25 @@ const MongoStorageValidatorSchema = type({
199
234
  validationLevel: "'strict' | 'moderate'",
200
235
  validationAction: "'error' | 'warn'"
201
236
  });
202
- const CappedOptionsSchema = type({
203
- "+": "reject",
204
- size: "number",
205
- "max?": "number"
206
- });
207
- const TimeseriesOptionsSchema = type({
208
- "+": "reject",
209
- timeField: "string",
210
- "metaField?": "string",
211
- "granularity?": "'seconds' | 'minutes' | 'hours'"
212
- });
213
- const ClusteredIndexSchema = type({
214
- "+": "reject",
215
- "name?": "string"
216
- });
217
237
  const MongoCollectionOptionsSchema = type({
218
238
  "+": "reject",
219
- "capped?": CappedOptionsSchema,
220
- "timeseries?": TimeseriesOptionsSchema,
239
+ "capped?": type({
240
+ "+": "reject",
241
+ size: "number",
242
+ "max?": "number"
243
+ }),
244
+ "timeseries?": type({
245
+ "+": "reject",
246
+ timeField: "string",
247
+ "metaField?": "string",
248
+ "granularity?": "'seconds' | 'minutes' | 'hours'"
249
+ }),
221
250
  "collation?": "Record<string, unknown>",
222
251
  "changeStreamPreAndPostImages?": ChangeStreamPreAndPostImagesSchema,
223
- "clusteredIndex?": ClusteredIndexSchema
224
- });
225
- const StorageCollectionSchema = type({
226
- "+": "reject",
227
- "indexes?": MongoStorageIndexSchema.array(),
228
- "validator?": MongoStorageValidatorSchema,
229
- "options?": MongoCollectionOptionsSchema
252
+ "clusteredIndex?": type({
253
+ "+": "reject",
254
+ "name?": "string"
255
+ })
230
256
  });
231
257
  const MongoContractSchema = type({
232
258
  "+": "reject",
@@ -243,7 +269,12 @@ const MongoContractSchema = type({
243
269
  "_generated?": "Record<string, unknown>",
244
270
  storage: type({
245
271
  "+": "reject",
246
- collections: type({ "[string]": StorageCollectionSchema }),
272
+ collections: type({ "[string]": type({
273
+ "+": "reject",
274
+ "indexes?": MongoStorageIndexSchema.array(),
275
+ "validator?": MongoStorageValidatorSchema,
276
+ "options?": MongoCollectionOptionsSchema
277
+ }) }),
247
278
  "storageHash?": "string"
248
279
  }),
249
280
  models: type({ "[string]": ModelDefinitionSchema }),
@@ -252,7 +283,6 @@ const MongoContractSchema = type({
252
283
  fields: type({ "[string]": FieldSchema })
253
284
  }) })
254
285
  });
255
-
256
286
  //#endregion
257
287
  //#region src/validate-storage.ts
258
288
  function validateMongoStorage(contract) {
@@ -282,7 +312,6 @@ function validateMongoStorage(contract) {
282
312
  }
283
313
  if (errors.length > 0) throw new Error(`Contract storage validation failed:\n- ${errors.join("\n- ")}`);
284
314
  }
285
-
286
315
  //#endregion
287
316
  //#region src/validate-mongo-contract.ts
288
317
  function validateMongoContract(value) {
@@ -308,7 +337,7 @@ function buildIndices(contract) {
308
337
  modelToVariants
309
338
  };
310
339
  }
311
-
312
340
  //#endregion
313
- export { validateMongoContract, validateMongoStorage };
341
+ export { applyPolymorphicScopeToMongoIndex, validateMongoContract, validateMongoStorage };
342
+
314
343
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["errors: string[]","arktypeType","variantToBase: Record<string, string>","modelToVariants: Record<string, string[]>"],"sources":["../src/contract-schema.ts","../src/validate-storage.ts","../src/validate-mongo-contract.ts"],"sourcesContent":["import { type } from 'arktype';\nimport type { MongoJsonObject, MongoJsonPrimitive, MongoJsonValue } from './contract-types';\n\nconst ScalarFieldTypeSchema = type({\n '+': 'reject',\n kind: \"'scalar'\",\n codecId: 'string',\n 'typeParams?': 'Record<string, unknown>',\n});\n\nconst ValueObjectFieldTypeSchema = type({\n '+': 'reject',\n kind: \"'valueObject'\",\n name: 'string',\n});\n\nconst UnionFieldTypeSchema = type({\n '+': 'reject',\n kind: \"'union'\",\n members: ScalarFieldTypeSchema.or(ValueObjectFieldTypeSchema).array(),\n});\n\nconst FieldTypeSchema = ScalarFieldTypeSchema.or(ValueObjectFieldTypeSchema).or(\n UnionFieldTypeSchema,\n);\n\nconst RawFieldSchema = type({\n '+': 'reject',\n type: FieldTypeSchema,\n 'nullable?': 'boolean',\n 'many?': 'boolean',\n 'dict?': 'boolean',\n});\n\nconst FieldSchema = RawFieldSchema.pipe((field) => ({\n ...field,\n nullable: field.nullable ?? false,\n}));\n\nconst RelationOnSchema = type({\n '+': 'reject',\n localFields: 'string[]',\n targetFields: 'string[]',\n});\n\nconst RelationSchema = type({\n '+': 'reject',\n to: 'string',\n cardinality: \"'1:1' | '1:N' | 'N:1'\",\n 'on?': RelationOnSchema,\n});\n\nconst StorageRelationEntrySchema = type({\n '+': 'reject',\n field: 'string',\n});\n\nconst MongoJsonPrimitiveSchema = type\n .declare<MongoJsonPrimitive>()\n .type('string | number | boolean | null');\n\nfunction isMongoJsonRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction withUnseenReference(value: object, seen: WeakSet<object>, visit: () => boolean): boolean {\n if (seen.has(value)) {\n return false;\n }\n\n seen.add(value);\n const result = visit();\n seen.delete(value);\n return result;\n}\n\nfunction isMongoJsonObject(value: unknown, seen: WeakSet<object>): value is MongoJsonObject {\n return (\n isMongoJsonRecord(value) &&\n withUnseenReference(value, seen, () =>\n Object.values(value).every((entry) => isMongoJsonValue(entry, seen)),\n )\n );\n}\n\nfunction isMongoJsonValue(value: unknown, seen = new WeakSet<object>()): value is MongoJsonValue {\n if (MongoJsonPrimitiveSchema.allows(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return withUnseenReference(value, seen, () =>\n value.every((entry) => isMongoJsonValue(entry, seen)),\n );\n }\n return isMongoJsonObject(value, seen);\n}\n\nconst MongoJsonValueSchema = type('unknown').narrow((value, ctx) =>\n isMongoJsonValue(value) ? true : ctx.mustBe('a JSON-serializable MongoJsonValue'),\n);\n\nconst MongoJsonObjectSchema = type({ '[string]': 'unknown' }).narrow((value, ctx) =>\n isMongoJsonRecord(value) &&\n Object.values(value).every((entry) => MongoJsonValueSchema.allows(entry))\n ? true\n : ctx.mustBe('a JSON object with MongoJsonValue entries'),\n);\n\nconst NumberRecordSchema = type({ '[string]': 'number' });\n\nconst IndexFieldsSchema = type({\n '+': 'reject',\n '[string]': '1 | -1 | \"text\" | \"2dsphere\" | \"2d\" | \"hashed\"',\n}).narrow((fields, ctx) =>\n Object.keys(fields).length > 0 ? true : ctx.mustBe('an index field map with at least one entry'),\n);\n\nconst CollationSchema = type({\n '+': 'reject',\n locale: 'string',\n 'caseLevel?': 'boolean',\n 'caseFirst?': '\"off\" | \"upper\" | \"lower\"',\n 'strength?': '1 | 2 | 3 | 4 | 5',\n 'numericOrdering?': 'boolean',\n 'alternate?': '\"non-ignorable\" | \"shifted\"',\n 'maxVariable?': '\"punct\" | \"space\"',\n 'backwards?': 'boolean',\n 'normalization?': 'boolean',\n});\n\nconst IndexOptionDefaultsSchema = type({\n '+': 'reject',\n 'storageEngine?': MongoJsonObjectSchema,\n});\n\nconst TimeSeriesCollectionOptionsSchema = type({\n '+': 'reject',\n timeField: 'string',\n 'metaField?': 'string',\n 'granularity?': '\"seconds\" | \"minutes\" | \"hours\"',\n 'bucketMaxSpanSeconds?': 'number',\n 'bucketRoundingSeconds?': 'number',\n});\n\nconst ClusteredCollectionKeySchema = type({\n '+': 'reject',\n '[string]': '1',\n}).narrow((key, ctx) =>\n Object.keys(key).length > 0\n ? true\n : ctx.mustBe('a clustered index key map with at least one entry'),\n);\n\nconst ClusteredCollectionOptionsSchema = type({\n '+': 'reject',\n 'name?': 'string',\n key: ClusteredCollectionKeySchema,\n unique: 'boolean',\n});\n\nconst ChangeStreamPreAndPostImagesSchema = type({\n '+': 'reject',\n enabled: 'boolean',\n});\n\nconst CollectionOptionsSchema = type({\n '+': 'reject',\n 'capped?': 'boolean',\n 'size?': 'number',\n 'max?': 'number',\n 'storageEngine?': MongoJsonObjectSchema,\n 'indexOptionDefaults?': IndexOptionDefaultsSchema,\n 'collation?': CollationSchema,\n 'timeseries?': TimeSeriesCollectionOptionsSchema,\n 'clusteredIndex?': ClusteredCollectionOptionsSchema,\n 'expireAfterSeconds?': 'number',\n 'changeStreamPreAndPostImages?': ChangeStreamPreAndPostImagesSchema,\n});\n\nconst ModelStorageSchema = type({\n '+': 'reject',\n 'collection?': 'string',\n 'relations?': type({ '[string]': StorageRelationEntrySchema }),\n});\n\nconst DiscriminatorSchema = type({\n '+': 'reject',\n field: 'string',\n});\n\nconst VariantEntrySchema = type({\n '+': 'reject',\n value: 'string',\n});\n\nconst ModelDefinitionSchema = type({\n '+': 'reject',\n fields: type({ '[string]': FieldSchema }),\n storage: ModelStorageSchema,\n 'relations?': type({ '[string]': RelationSchema }),\n 'discriminator?': DiscriminatorSchema,\n 'variants?': type({ '[string]': VariantEntrySchema }),\n 'base?': 'string',\n 'owner?': 'string',\n});\n\nconst WildcardProjectionSchema = type({\n '+': 'reject',\n '[string]': '0 | 1',\n});\n\nconst IndexOptionsSchema = type({\n '+': 'reject',\n 'unique?': 'boolean',\n 'name?': 'string',\n 'partialFilterExpression?': MongoJsonObjectSchema,\n 'sparse?': 'boolean',\n 'expireAfterSeconds?': 'number',\n 'weights?': NumberRecordSchema,\n 'default_language?': 'string',\n 'language_override?': 'string',\n 'textIndexVersion?': 'number',\n '2dsphereIndexVersion?': 'number',\n 'bits?': 'number',\n 'min?': 'number',\n 'max?': 'number',\n 'bucketSize?': 'number',\n 'hidden?': 'boolean',\n 'collation?': CollationSchema,\n 'wildcardProjection?': WildcardProjectionSchema,\n});\n\nconst IndexSchema = type({\n '+': 'reject',\n fields: IndexFieldsSchema,\n 'options?': IndexOptionsSchema,\n});\n\nconst MongoIndexKeySchema = type({\n '+': 'reject',\n field: 'string',\n direction: '1 | -1 | \"text\" | \"2dsphere\" | \"2d\" | \"hashed\"',\n});\n\nconst MongoStorageIndexSchema = type({\n '+': 'reject',\n keys: MongoIndexKeySchema.array().atLeastLength(1),\n 'unique?': 'boolean',\n 'sparse?': 'boolean',\n 'expireAfterSeconds?': 'number',\n 'partialFilterExpression?': 'Record<string, unknown>',\n 'wildcardProjection?': 'Record<string, 0 | 1>',\n 'collation?': 'Record<string, unknown>',\n 'weights?': 'Record<string, number>',\n 'default_language?': 'string',\n 'language_override?': 'string',\n});\n\nconst MongoStorageValidatorSchema = type({\n '+': 'reject',\n jsonSchema: 'Record<string, unknown>',\n validationLevel: \"'strict' | 'moderate'\",\n validationAction: \"'error' | 'warn'\",\n});\n\nconst CappedOptionsSchema = type({\n '+': 'reject',\n size: 'number',\n 'max?': 'number',\n});\n\nconst TimeseriesOptionsSchema = type({\n '+': 'reject',\n timeField: 'string',\n 'metaField?': 'string',\n 'granularity?': \"'seconds' | 'minutes' | 'hours'\",\n});\n\nconst ClusteredIndexSchema = type({\n '+': 'reject',\n 'name?': 'string',\n});\n\nconst MongoCollectionOptionsSchema = type({\n '+': 'reject',\n 'capped?': CappedOptionsSchema,\n 'timeseries?': TimeseriesOptionsSchema,\n 'collation?': 'Record<string, unknown>',\n 'changeStreamPreAndPostImages?': ChangeStreamPreAndPostImagesSchema,\n 'clusteredIndex?': ClusteredIndexSchema,\n});\n\nconst StorageCollectionSchema = type({\n '+': 'reject',\n 'indexes?': MongoStorageIndexSchema.array(),\n 'validator?': MongoStorageValidatorSchema,\n 'options?': MongoCollectionOptionsSchema,\n});\n\nexport const MongoContractSchema = type({\n '+': 'reject',\n targetFamily: \"'mongo'\",\n 'schemaVersion?': 'string',\n 'target?': 'string',\n 'storageHash?': 'string',\n 'profileHash?': 'string',\n roots: 'Record<string, string>',\n 'capabilities?': 'Record<string, unknown>',\n 'extensionPacks?': 'Record<string, unknown>',\n 'meta?': 'Record<string, unknown>',\n 'sources?': 'Record<string, unknown>',\n '_generated?': 'Record<string, unknown>',\n storage: type({\n '+': 'reject',\n collections: type({ '[string]': StorageCollectionSchema }),\n 'storageHash?': 'string',\n }),\n models: type({ '[string]': ModelDefinitionSchema }),\n 'valueObjects?': type({\n '[string]': type({ '+': 'reject', fields: type({ '[string]': FieldSchema }) }),\n }),\n});\n\nexport {\n CollationSchema,\n CollectionOptionsSchema,\n IndexFieldsSchema,\n IndexOptionsSchema,\n IndexSchema,\n MongoIndexKeySchema,\n MongoStorageIndexSchema,\n NumberRecordSchema,\n WildcardProjectionSchema,\n};\n","import type { MongoContract } from './contract-types';\n\nexport function validateMongoStorage(contract: MongoContract): void {\n const errors: string[] = [];\n\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (model.storage.collection && !(model.storage.collection in contract.storage.collections)) {\n errors.push(\n `Model \"${modelName}\" references collection \"${model.storage.collection}\" which is not in storage.collections`,\n );\n }\n\n // Mongo does not support multi-table inheritance (ADR 2): all variants of a base\n // must share the same collection (single-table inheritance only).\n if (model.base) {\n const baseModel = contract.models[model.base];\n if (baseModel) {\n const variantCollection = model.storage.collection;\n const baseCollection = baseModel.storage.collection;\n if (variantCollection !== baseCollection) {\n errors.push(\n `Mongo does not support multi-table inheritance; variant \"${modelName}\" must share its base's collection (\"${baseCollection ?? '(none)'}\"), but has \"${variantCollection ?? '(none)'}\"`,\n );\n }\n }\n }\n\n for (const [relName, relation] of Object.entries(model.relations ?? {})) {\n const targetModel = contract.models[relation.to];\n\n if (targetModel?.owner) {\n if (targetModel.owner !== modelName) {\n errors.push(\n `Embed relation \"${relName}\" targets \"${relation.to}\" which is owned by \"${targetModel.owner}\", not \"${modelName}\"`,\n );\n }\n if (targetModel.storage.collection) {\n errors.push(\n `Embed relation \"${relName}\" targets \"${relation.to}\" which must not have a collection`,\n );\n }\n } else if ('on' in relation && relation.on) {\n for (const localField of relation.on.localFields) {\n if (!(localField in model.fields)) {\n errors.push(\n `Reference relation \"${relName}\": localField \"${localField}\" is not a field on model \"${modelName}\"`,\n );\n }\n }\n\n if (targetModel) {\n for (const targetField of relation.on.targetFields) {\n if (!(targetField in targetModel.fields)) {\n errors.push(\n `Reference relation \"${relName}\": targetField \"${targetField}\" is not a field on model \"${relation.to}\"`,\n );\n }\n }\n }\n }\n }\n }\n\n if (errors.length > 0) {\n throw new Error(`Contract storage validation failed:\\n- ${errors.join('\\n- ')}`);\n }\n}\n","import { validateContractDomain } from '@prisma-next/contract/validate-domain';\nimport { type as arktypeType } from 'arktype';\nimport { MongoContractSchema } from './contract-schema';\nimport type { MongoContract } from './contract-types';\nimport { validateMongoStorage } from './validate-storage';\n\nexport interface MongoContractIndices {\n readonly variantToBase: Record<string, string>;\n readonly modelToVariants: Record<string, string[]>;\n}\n\nexport interface ValidatedMongoContract<TContract extends MongoContract> {\n readonly contract: TContract;\n readonly indices: MongoContractIndices;\n}\n\nexport function validateMongoContract<TContract extends MongoContract>(\n value: unknown,\n): ValidatedMongoContract<TContract> {\n const parsed = MongoContractSchema(value);\n if (parsed instanceof arktypeType.errors) {\n throw new Error(`Contract structural validation failed: ${parsed.summary}`);\n }\n\n const contract = parsed as unknown as TContract;\n\n validateContractDomain(contract);\n validateMongoStorage(contract);\n\n const indices = buildIndices(contract);\n\n return { contract, indices };\n}\n\nfunction buildIndices(contract: MongoContract): MongoContractIndices {\n const variantToBase: Record<string, string> = {};\n const modelToVariants: Record<string, string[]> = {};\n\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (model.base) {\n variantToBase[modelName] = model.base;\n }\n if (model.variants) {\n modelToVariants[modelName] = Object.keys(model.variants);\n }\n }\n\n return { variantToBase, modelToVariants };\n}\n"],"mappings":";;;;AAGA,MAAM,wBAAwB,KAAK;CACjC,KAAK;CACL,MAAM;CACN,SAAS;CACT,eAAe;CAChB,CAAC;AAEF,MAAM,6BAA6B,KAAK;CACtC,KAAK;CACL,MAAM;CACN,MAAM;CACP,CAAC;AAEF,MAAM,uBAAuB,KAAK;CAChC,KAAK;CACL,MAAM;CACN,SAAS,sBAAsB,GAAG,2BAA2B,CAAC,OAAO;CACtE,CAAC;AAEF,MAAM,kBAAkB,sBAAsB,GAAG,2BAA2B,CAAC,GAC3E,qBACD;AAUD,MAAM,cARiB,KAAK;CAC1B,KAAK;CACL,MAAM;CACN,aAAa;CACb,SAAS;CACT,SAAS;CACV,CAAC,CAEiC,MAAM,WAAW;CAClD,GAAG;CACH,UAAU,MAAM,YAAY;CAC7B,EAAE;AAEH,MAAM,mBAAmB,KAAK;CAC5B,KAAK;CACL,aAAa;CACb,cAAc;CACf,CAAC;AAEF,MAAM,iBAAiB,KAAK;CAC1B,KAAK;CACL,IAAI;CACJ,aAAa;CACb,OAAO;CACR,CAAC;AAEF,MAAM,6BAA6B,KAAK;CACtC,KAAK;CACL,OAAO;CACR,CAAC;AAEF,MAAM,2BAA2B,KAC9B,SAA6B,CAC7B,KAAK,mCAAmC;AAE3C,SAAS,kBAAkB,OAAkD;AAC3E,KAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,CACrE,QAAO;CAET,MAAM,YAAY,OAAO,eAAe,MAAM;AAC9C,QAAO,cAAc,OAAO,aAAa,cAAc;;AAGzD,SAAS,oBAAoB,OAAe,MAAuB,OAA+B;AAChG,KAAI,KAAK,IAAI,MAAM,CACjB,QAAO;AAGT,MAAK,IAAI,MAAM;CACf,MAAM,SAAS,OAAO;AACtB,MAAK,OAAO,MAAM;AAClB,QAAO;;AAGT,SAAS,kBAAkB,OAAgB,MAAiD;AAC1F,QACE,kBAAkB,MAAM,IACxB,oBAAoB,OAAO,YACzB,OAAO,OAAO,MAAM,CAAC,OAAO,UAAU,iBAAiB,OAAO,KAAK,CAAC,CACrE;;AAIL,SAAS,iBAAiB,OAAgB,uBAAO,IAAI,SAAiB,EAA2B;AAC/F,KAAI,yBAAyB,OAAO,MAAM,CACxC,QAAO;AAET,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,oBAAoB,OAAO,YAChC,MAAM,OAAO,UAAU,iBAAiB,OAAO,KAAK,CAAC,CACtD;AAEH,QAAO,kBAAkB,OAAO,KAAK;;AAGvC,MAAM,uBAAuB,KAAK,UAAU,CAAC,QAAQ,OAAO,QAC1D,iBAAiB,MAAM,GAAG,OAAO,IAAI,OAAO,qCAAqC,CAClF;AAED,MAAM,wBAAwB,KAAK,EAAE,YAAY,WAAW,CAAC,CAAC,QAAQ,OAAO,QAC3E,kBAAkB,MAAM,IACxB,OAAO,OAAO,MAAM,CAAC,OAAO,UAAU,qBAAqB,OAAO,MAAM,CAAC,GACrE,OACA,IAAI,OAAO,4CAA4C,CAC5D;AAED,MAAM,qBAAqB,KAAK,EAAE,YAAY,UAAU,CAAC;AAEzD,MAAM,oBAAoB,KAAK;CAC7B,KAAK;CACL,YAAY;CACb,CAAC,CAAC,QAAQ,QAAQ,QACjB,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,OAAO,IAAI,OAAO,6CAA6C,CACjG;AAED,MAAM,kBAAkB,KAAK;CAC3B,KAAK;CACL,QAAQ;CACR,cAAc;CACd,cAAc;CACd,aAAa;CACb,oBAAoB;CACpB,cAAc;CACd,gBAAgB;CAChB,cAAc;CACd,kBAAkB;CACnB,CAAC;AAEF,MAAM,4BAA4B,KAAK;CACrC,KAAK;CACL,kBAAkB;CACnB,CAAC;AAEF,MAAM,oCAAoC,KAAK;CAC7C,KAAK;CACL,WAAW;CACX,cAAc;CACd,gBAAgB;CAChB,yBAAyB;CACzB,0BAA0B;CAC3B,CAAC;AAEF,MAAM,+BAA+B,KAAK;CACxC,KAAK;CACL,YAAY;CACb,CAAC,CAAC,QAAQ,KAAK,QACd,OAAO,KAAK,IAAI,CAAC,SAAS,IACtB,OACA,IAAI,OAAO,oDAAoD,CACpE;AAED,MAAM,mCAAmC,KAAK;CAC5C,KAAK;CACL,SAAS;CACT,KAAK;CACL,QAAQ;CACT,CAAC;AAEF,MAAM,qCAAqC,KAAK;CAC9C,KAAK;CACL,SAAS;CACV,CAAC;AAEF,MAAM,0BAA0B,KAAK;CACnC,KAAK;CACL,WAAW;CACX,SAAS;CACT,QAAQ;CACR,kBAAkB;CAClB,wBAAwB;CACxB,cAAc;CACd,eAAe;CACf,mBAAmB;CACnB,uBAAuB;CACvB,iCAAiC;CAClC,CAAC;AAEF,MAAM,qBAAqB,KAAK;CAC9B,KAAK;CACL,eAAe;CACf,cAAc,KAAK,EAAE,YAAY,4BAA4B,CAAC;CAC/D,CAAC;AAEF,MAAM,sBAAsB,KAAK;CAC/B,KAAK;CACL,OAAO;CACR,CAAC;AAEF,MAAM,qBAAqB,KAAK;CAC9B,KAAK;CACL,OAAO;CACR,CAAC;AAEF,MAAM,wBAAwB,KAAK;CACjC,KAAK;CACL,QAAQ,KAAK,EAAE,YAAY,aAAa,CAAC;CACzC,SAAS;CACT,cAAc,KAAK,EAAE,YAAY,gBAAgB,CAAC;CAClD,kBAAkB;CAClB,aAAa,KAAK,EAAE,YAAY,oBAAoB,CAAC;CACrD,SAAS;CACT,UAAU;CACX,CAAC;AAEF,MAAM,2BAA2B,KAAK;CACpC,KAAK;CACL,YAAY;CACb,CAAC;AAEF,MAAM,qBAAqB,KAAK;CAC9B,KAAK;CACL,WAAW;CACX,SAAS;CACT,4BAA4B;CAC5B,WAAW;CACX,uBAAuB;CACvB,YAAY;CACZ,qBAAqB;CACrB,sBAAsB;CACtB,qBAAqB;CACrB,yBAAyB;CACzB,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,eAAe;CACf,WAAW;CACX,cAAc;CACd,uBAAuB;CACxB,CAAC;AAEF,MAAM,cAAc,KAAK;CACvB,KAAK;CACL,QAAQ;CACR,YAAY;CACb,CAAC;AAEF,MAAM,sBAAsB,KAAK;CAC/B,KAAK;CACL,OAAO;CACP,WAAW;CACZ,CAAC;AAEF,MAAM,0BAA0B,KAAK;CACnC,KAAK;CACL,MAAM,oBAAoB,OAAO,CAAC,cAAc,EAAE;CAClD,WAAW;CACX,WAAW;CACX,uBAAuB;CACvB,4BAA4B;CAC5B,uBAAuB;CACvB,cAAc;CACd,YAAY;CACZ,qBAAqB;CACrB,sBAAsB;CACvB,CAAC;AAEF,MAAM,8BAA8B,KAAK;CACvC,KAAK;CACL,YAAY;CACZ,iBAAiB;CACjB,kBAAkB;CACnB,CAAC;AAEF,MAAM,sBAAsB,KAAK;CAC/B,KAAK;CACL,MAAM;CACN,QAAQ;CACT,CAAC;AAEF,MAAM,0BAA0B,KAAK;CACnC,KAAK;CACL,WAAW;CACX,cAAc;CACd,gBAAgB;CACjB,CAAC;AAEF,MAAM,uBAAuB,KAAK;CAChC,KAAK;CACL,SAAS;CACV,CAAC;AAEF,MAAM,+BAA+B,KAAK;CACxC,KAAK;CACL,WAAW;CACX,eAAe;CACf,cAAc;CACd,iCAAiC;CACjC,mBAAmB;CACpB,CAAC;AAEF,MAAM,0BAA0B,KAAK;CACnC,KAAK;CACL,YAAY,wBAAwB,OAAO;CAC3C,cAAc;CACd,YAAY;CACb,CAAC;AAEF,MAAa,sBAAsB,KAAK;CACtC,KAAK;CACL,cAAc;CACd,kBAAkB;CAClB,WAAW;CACX,gBAAgB;CAChB,gBAAgB;CAChB,OAAO;CACP,iBAAiB;CACjB,mBAAmB;CACnB,SAAS;CACT,YAAY;CACZ,eAAe;CACf,SAAS,KAAK;EACZ,KAAK;EACL,aAAa,KAAK,EAAE,YAAY,yBAAyB,CAAC;EAC1D,gBAAgB;EACjB,CAAC;CACF,QAAQ,KAAK,EAAE,YAAY,uBAAuB,CAAC;CACnD,iBAAiB,KAAK,EACpB,YAAY,KAAK;EAAE,KAAK;EAAU,QAAQ,KAAK,EAAE,YAAY,aAAa,CAAC;EAAE,CAAC,EAC/E,CAAC;CACH,CAAC;;;;ACnUF,SAAgB,qBAAqB,UAA+B;CAClE,MAAMA,SAAmB,EAAE;AAE3B,MAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,SAAS,OAAO,EAAE;AAChE,MAAI,MAAM,QAAQ,cAAc,EAAE,MAAM,QAAQ,cAAc,SAAS,QAAQ,aAC7E,QAAO,KACL,UAAU,UAAU,2BAA2B,MAAM,QAAQ,WAAW,uCACzE;AAKH,MAAI,MAAM,MAAM;GACd,MAAM,YAAY,SAAS,OAAO,MAAM;AACxC,OAAI,WAAW;IACb,MAAM,oBAAoB,MAAM,QAAQ;IACxC,MAAM,iBAAiB,UAAU,QAAQ;AACzC,QAAI,sBAAsB,eACxB,QAAO,KACL,4DAA4D,UAAU,uCAAuC,kBAAkB,SAAS,eAAe,qBAAqB,SAAS,GACtL;;;AAKP,OAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,MAAM,aAAa,EAAE,CAAC,EAAE;GACvE,MAAM,cAAc,SAAS,OAAO,SAAS;AAE7C,OAAI,aAAa,OAAO;AACtB,QAAI,YAAY,UAAU,UACxB,QAAO,KACL,mBAAmB,QAAQ,aAAa,SAAS,GAAG,uBAAuB,YAAY,MAAM,UAAU,UAAU,GAClH;AAEH,QAAI,YAAY,QAAQ,WACtB,QAAO,KACL,mBAAmB,QAAQ,aAAa,SAAS,GAAG,oCACrD;cAEM,QAAQ,YAAY,SAAS,IAAI;AAC1C,SAAK,MAAM,cAAc,SAAS,GAAG,YACnC,KAAI,EAAE,cAAc,MAAM,QACxB,QAAO,KACL,uBAAuB,QAAQ,iBAAiB,WAAW,6BAA6B,UAAU,GACnG;AAIL,QAAI,aACF;UAAK,MAAM,eAAe,SAAS,GAAG,aACpC,KAAI,EAAE,eAAe,YAAY,QAC/B,QAAO,KACL,uBAAuB,QAAQ,kBAAkB,YAAY,6BAA6B,SAAS,GAAG,GACvG;;;;;AAQb,KAAI,OAAO,SAAS,EAClB,OAAM,IAAI,MAAM,0CAA0C,OAAO,KAAK,OAAO,GAAG;;;;;AChDpF,SAAgB,sBACd,OACmC;CACnC,MAAM,SAAS,oBAAoB,MAAM;AACzC,KAAI,kBAAkBC,KAAY,OAChC,OAAM,IAAI,MAAM,0CAA0C,OAAO,UAAU;CAG7E,MAAM,WAAW;AAEjB,wBAAuB,SAAS;AAChC,sBAAqB,SAAS;AAI9B,QAAO;EAAE;EAAU,SAFH,aAAa,SAAS;EAEV;;AAG9B,SAAS,aAAa,UAA+C;CACnE,MAAMC,gBAAwC,EAAE;CAChD,MAAMC,kBAA4C,EAAE;AAEpD,MAAK,MAAM,CAAC,WAAW,UAAU,OAAO,QAAQ,SAAS,OAAO,EAAE;AAChE,MAAI,MAAM,KACR,eAAc,aAAa,MAAM;AAEnC,MAAI,MAAM,SACR,iBAAgB,aAAa,OAAO,KAAK,MAAM,SAAS;;AAI5D,QAAO;EAAE;EAAe;EAAiB"}
1
+ {"version":3,"file":"index.mjs","names":["arktypeType"],"sources":["../src/polymorphic-index-scope.ts","../src/contract-schema.ts","../src/validate-storage.ts","../src/validate-mongo-contract.ts"],"sourcesContent":["import type { MongoStorageIndex } from './contract-types';\n\nexport type PolymorphicIndexScope = {\n readonly discriminatorField: string;\n readonly discriminatorValue: string | number | boolean;\n};\n\nexport type ApplyScopeResult =\n | { readonly kind: 'ok'; readonly index: MongoStorageIndex }\n | { readonly kind: 'conflict'; readonly reason: string };\n\nfunction isScalarDiscriminatorValue(value: unknown): value is string | number | boolean {\n const t = typeof value;\n return t === 'string' || t === 'number' || t === 'boolean';\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (value === null) return 'null';\n if (Array.isArray(value)) return JSON.stringify(value);\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nexport function applyPolymorphicScopeToMongoIndex(\n index: MongoStorageIndex,\n scope: PolymorphicIndexScope,\n): ApplyScopeResult {\n if (!isScalarDiscriminatorValue(scope.discriminatorValue)) {\n return {\n kind: 'conflict',\n reason: `Variant-scoped indexes require a scalar (string, number, or boolean) discriminator value for field \"${scope.discriminatorField}\", but received ${formatValue(scope.discriminatorValue)}.`,\n };\n }\n\n const existing = index.partialFilterExpression;\n if (existing && Object.hasOwn(existing, scope.discriminatorField)) {\n const existingValue = existing[scope.discriminatorField];\n if (existingValue === scope.discriminatorValue) {\n return { kind: 'ok', index };\n }\n return {\n kind: 'conflict',\n reason: `Index partialFilterExpression sets \"${scope.discriminatorField}\" to ${formatValue(existingValue)}, which conflicts with the variant's discriminator value ${formatValue(scope.discriminatorValue)}.`,\n };\n }\n\n const merged: Record<string, unknown> = {\n ...(existing ?? {}),\n [scope.discriminatorField]: scope.discriminatorValue,\n };\n\n return {\n kind: 'ok',\n index: { ...index, partialFilterExpression: merged },\n };\n}\n","import { type } from 'arktype';\nimport type { MongoJsonObject, MongoJsonPrimitive, MongoJsonValue } from './contract-types';\n\nconst ScalarFieldTypeSchema = type({\n '+': 'reject',\n kind: \"'scalar'\",\n codecId: 'string',\n 'typeParams?': 'Record<string, unknown>',\n});\n\nconst ValueObjectFieldTypeSchema = type({\n '+': 'reject',\n kind: \"'valueObject'\",\n name: 'string',\n});\n\nconst UnionFieldTypeSchema = type({\n '+': 'reject',\n kind: \"'union'\",\n members: ScalarFieldTypeSchema.or(ValueObjectFieldTypeSchema).array(),\n});\n\nconst FieldTypeSchema = ScalarFieldTypeSchema.or(ValueObjectFieldTypeSchema).or(\n UnionFieldTypeSchema,\n);\n\nconst RawFieldSchema = type({\n '+': 'reject',\n type: FieldTypeSchema,\n 'nullable?': 'boolean',\n 'many?': 'boolean',\n 'dict?': 'boolean',\n});\n\nconst FieldSchema = RawFieldSchema.pipe((field) => ({\n ...field,\n nullable: field.nullable ?? false,\n}));\n\nconst RelationOnSchema = type({\n '+': 'reject',\n localFields: 'string[]',\n targetFields: 'string[]',\n});\n\nconst RelationSchema = type({\n '+': 'reject',\n to: 'string',\n cardinality: \"'1:1' | '1:N' | 'N:1'\",\n 'on?': RelationOnSchema,\n});\n\nconst StorageRelationEntrySchema = type({\n '+': 'reject',\n field: 'string',\n});\n\nconst MongoJsonPrimitiveSchema = type\n .declare<MongoJsonPrimitive>()\n .type('string | number | boolean | null');\n\nfunction isMongoJsonRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction withUnseenReference(value: object, seen: WeakSet<object>, visit: () => boolean): boolean {\n if (seen.has(value)) {\n return false;\n }\n\n seen.add(value);\n const result = visit();\n seen.delete(value);\n return result;\n}\n\nfunction isMongoJsonObject(value: unknown, seen: WeakSet<object>): value is MongoJsonObject {\n return (\n isMongoJsonRecord(value) &&\n withUnseenReference(value, seen, () =>\n Object.values(value).every((entry) => isMongoJsonValue(entry, seen)),\n )\n );\n}\n\nfunction isMongoJsonValue(value: unknown, seen = new WeakSet<object>()): value is MongoJsonValue {\n if (MongoJsonPrimitiveSchema.allows(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return withUnseenReference(value, seen, () =>\n value.every((entry) => isMongoJsonValue(entry, seen)),\n );\n }\n return isMongoJsonObject(value, seen);\n}\n\nconst MongoJsonValueSchema = type('unknown').narrow((value, ctx) =>\n isMongoJsonValue(value) ? true : ctx.mustBe('a JSON-serializable MongoJsonValue'),\n);\n\nconst MongoJsonObjectSchema = type({ '[string]': 'unknown' }).narrow((value, ctx) =>\n isMongoJsonRecord(value) &&\n Object.values(value).every((entry) => MongoJsonValueSchema.allows(entry))\n ? true\n : ctx.mustBe('a JSON object with MongoJsonValue entries'),\n);\n\nconst NumberRecordSchema = type({ '[string]': 'number' });\n\nconst IndexFieldsSchema = type({\n '+': 'reject',\n '[string]': '1 | -1 | \"text\" | \"2dsphere\" | \"2d\" | \"hashed\"',\n}).narrow((fields, ctx) =>\n Object.keys(fields).length > 0 ? true : ctx.mustBe('an index field map with at least one entry'),\n);\n\nconst CollationSchema = type({\n '+': 'reject',\n locale: 'string',\n 'caseLevel?': 'boolean',\n 'caseFirst?': '\"off\" | \"upper\" | \"lower\"',\n 'strength?': '1 | 2 | 3 | 4 | 5',\n 'numericOrdering?': 'boolean',\n 'alternate?': '\"non-ignorable\" | \"shifted\"',\n 'maxVariable?': '\"punct\" | \"space\"',\n 'backwards?': 'boolean',\n 'normalization?': 'boolean',\n});\n\nconst IndexOptionDefaultsSchema = type({\n '+': 'reject',\n 'storageEngine?': MongoJsonObjectSchema,\n});\n\nconst TimeSeriesCollectionOptionsSchema = type({\n '+': 'reject',\n timeField: 'string',\n 'metaField?': 'string',\n 'granularity?': '\"seconds\" | \"minutes\" | \"hours\"',\n 'bucketMaxSpanSeconds?': 'number',\n 'bucketRoundingSeconds?': 'number',\n});\n\nconst ClusteredCollectionKeySchema = type({\n '+': 'reject',\n '[string]': '1',\n}).narrow((key, ctx) =>\n Object.keys(key).length > 0\n ? true\n : ctx.mustBe('a clustered index key map with at least one entry'),\n);\n\nconst ClusteredCollectionOptionsSchema = type({\n '+': 'reject',\n 'name?': 'string',\n key: ClusteredCollectionKeySchema,\n unique: 'boolean',\n});\n\nconst ChangeStreamPreAndPostImagesSchema = type({\n '+': 'reject',\n enabled: 'boolean',\n});\n\nconst CollectionOptionsSchema = type({\n '+': 'reject',\n 'capped?': 'boolean',\n 'size?': 'number',\n 'max?': 'number',\n 'storageEngine?': MongoJsonObjectSchema,\n 'indexOptionDefaults?': IndexOptionDefaultsSchema,\n 'collation?': CollationSchema,\n 'timeseries?': TimeSeriesCollectionOptionsSchema,\n 'clusteredIndex?': ClusteredCollectionOptionsSchema,\n 'expireAfterSeconds?': 'number',\n 'changeStreamPreAndPostImages?': ChangeStreamPreAndPostImagesSchema,\n});\n\nconst ModelStorageSchema = type({\n '+': 'reject',\n 'collection?': 'string',\n 'relations?': type({ '[string]': StorageRelationEntrySchema }),\n});\n\nconst DiscriminatorSchema = type({\n '+': 'reject',\n field: 'string',\n});\n\nconst VariantEntrySchema = type({\n '+': 'reject',\n value: 'string',\n});\n\nconst ModelDefinitionSchema = type({\n '+': 'reject',\n fields: type({ '[string]': FieldSchema }),\n storage: ModelStorageSchema,\n 'relations?': type({ '[string]': RelationSchema }),\n 'discriminator?': DiscriminatorSchema,\n 'variants?': type({ '[string]': VariantEntrySchema }),\n 'base?': 'string',\n 'owner?': 'string',\n});\n\nconst WildcardProjectionSchema = type({\n '+': 'reject',\n '[string]': '0 | 1',\n});\n\nconst IndexOptionsSchema = type({\n '+': 'reject',\n 'unique?': 'boolean',\n 'name?': 'string',\n 'partialFilterExpression?': MongoJsonObjectSchema,\n 'sparse?': 'boolean',\n 'expireAfterSeconds?': 'number',\n 'weights?': NumberRecordSchema,\n 'default_language?': 'string',\n 'language_override?': 'string',\n 'textIndexVersion?': 'number',\n '2dsphereIndexVersion?': 'number',\n 'bits?': 'number',\n 'min?': 'number',\n 'max?': 'number',\n 'bucketSize?': 'number',\n 'hidden?': 'boolean',\n 'collation?': CollationSchema,\n 'wildcardProjection?': WildcardProjectionSchema,\n});\n\nconst IndexSchema = type({\n '+': 'reject',\n fields: IndexFieldsSchema,\n 'options?': IndexOptionsSchema,\n});\n\nconst MongoIndexKeySchema = type({\n '+': 'reject',\n field: 'string',\n direction: '1 | -1 | \"text\" | \"2dsphere\" | \"2d\" | \"hashed\"',\n});\n\nconst MongoStorageIndexSchema = type({\n '+': 'reject',\n keys: MongoIndexKeySchema.array().atLeastLength(1),\n 'unique?': 'boolean',\n 'sparse?': 'boolean',\n 'expireAfterSeconds?': 'number',\n 'partialFilterExpression?': 'Record<string, unknown>',\n 'wildcardProjection?': 'Record<string, 0 | 1>',\n 'collation?': 'Record<string, unknown>',\n 'weights?': 'Record<string, number>',\n 'default_language?': 'string',\n 'language_override?': 'string',\n});\n\nconst MongoStorageValidatorSchema = type({\n '+': 'reject',\n jsonSchema: 'Record<string, unknown>',\n validationLevel: \"'strict' | 'moderate'\",\n validationAction: \"'error' | 'warn'\",\n});\n\nconst CappedOptionsSchema = type({\n '+': 'reject',\n size: 'number',\n 'max?': 'number',\n});\n\nconst TimeseriesOptionsSchema = type({\n '+': 'reject',\n timeField: 'string',\n 'metaField?': 'string',\n 'granularity?': \"'seconds' | 'minutes' | 'hours'\",\n});\n\nconst ClusteredIndexSchema = type({\n '+': 'reject',\n 'name?': 'string',\n});\n\nconst MongoCollectionOptionsSchema = type({\n '+': 'reject',\n 'capped?': CappedOptionsSchema,\n 'timeseries?': TimeseriesOptionsSchema,\n 'collation?': 'Record<string, unknown>',\n 'changeStreamPreAndPostImages?': ChangeStreamPreAndPostImagesSchema,\n 'clusteredIndex?': ClusteredIndexSchema,\n});\n\nconst StorageCollectionSchema = type({\n '+': 'reject',\n 'indexes?': MongoStorageIndexSchema.array(),\n 'validator?': MongoStorageValidatorSchema,\n 'options?': MongoCollectionOptionsSchema,\n});\n\nexport const MongoContractSchema = type({\n '+': 'reject',\n targetFamily: \"'mongo'\",\n 'schemaVersion?': 'string',\n 'target?': 'string',\n 'storageHash?': 'string',\n 'profileHash?': 'string',\n roots: 'Record<string, string>',\n 'capabilities?': 'Record<string, unknown>',\n 'extensionPacks?': 'Record<string, unknown>',\n 'meta?': 'Record<string, unknown>',\n 'sources?': 'Record<string, unknown>',\n '_generated?': 'Record<string, unknown>',\n storage: type({\n '+': 'reject',\n collections: type({ '[string]': StorageCollectionSchema }),\n 'storageHash?': 'string',\n }),\n models: type({ '[string]': ModelDefinitionSchema }),\n 'valueObjects?': type({\n '[string]': type({ '+': 'reject', fields: type({ '[string]': FieldSchema }) }),\n }),\n});\n\nexport {\n CollationSchema,\n CollectionOptionsSchema,\n IndexFieldsSchema,\n IndexOptionsSchema,\n IndexSchema,\n MongoIndexKeySchema,\n MongoStorageIndexSchema,\n NumberRecordSchema,\n WildcardProjectionSchema,\n};\n","import type { MongoContract } from './contract-types';\n\nexport function validateMongoStorage(contract: MongoContract): void {\n const errors: string[] = [];\n\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (model.storage.collection && !(model.storage.collection in contract.storage.collections)) {\n errors.push(\n `Model \"${modelName}\" references collection \"${model.storage.collection}\" which is not in storage.collections`,\n );\n }\n\n // Mongo does not support multi-table inheritance (ADR 2): all variants of a base\n // must share the same collection (single-table inheritance only).\n if (model.base) {\n const baseModel = contract.models[model.base];\n if (baseModel) {\n const variantCollection = model.storage.collection;\n const baseCollection = baseModel.storage.collection;\n if (variantCollection !== baseCollection) {\n errors.push(\n `Mongo does not support multi-table inheritance; variant \"${modelName}\" must share its base's collection (\"${baseCollection ?? '(none)'}\"), but has \"${variantCollection ?? '(none)'}\"`,\n );\n }\n }\n }\n\n for (const [relName, relation] of Object.entries(model.relations ?? {})) {\n const targetModel = contract.models[relation.to];\n\n if (targetModel?.owner) {\n if (targetModel.owner !== modelName) {\n errors.push(\n `Embed relation \"${relName}\" targets \"${relation.to}\" which is owned by \"${targetModel.owner}\", not \"${modelName}\"`,\n );\n }\n if (targetModel.storage.collection) {\n errors.push(\n `Embed relation \"${relName}\" targets \"${relation.to}\" which must not have a collection`,\n );\n }\n } else if ('on' in relation && relation.on) {\n for (const localField of relation.on.localFields) {\n if (!(localField in model.fields)) {\n errors.push(\n `Reference relation \"${relName}\": localField \"${localField}\" is not a field on model \"${modelName}\"`,\n );\n }\n }\n\n if (targetModel) {\n for (const targetField of relation.on.targetFields) {\n if (!(targetField in targetModel.fields)) {\n errors.push(\n `Reference relation \"${relName}\": targetField \"${targetField}\" is not a field on model \"${relation.to}\"`,\n );\n }\n }\n }\n }\n }\n }\n\n if (errors.length > 0) {\n throw new Error(`Contract storage validation failed:\\n- ${errors.join('\\n- ')}`);\n }\n}\n","import { validateContractDomain } from '@prisma-next/contract/validate-domain';\nimport { type as arktypeType } from 'arktype';\nimport { MongoContractSchema } from './contract-schema';\nimport type { MongoContract } from './contract-types';\nimport { validateMongoStorage } from './validate-storage';\n\nexport interface MongoContractIndices {\n readonly variantToBase: Record<string, string>;\n readonly modelToVariants: Record<string, string[]>;\n}\n\nexport interface ValidatedMongoContract<TContract extends MongoContract> {\n readonly contract: TContract;\n readonly indices: MongoContractIndices;\n}\n\nexport function validateMongoContract<TContract extends MongoContract>(\n value: unknown,\n): ValidatedMongoContract<TContract> {\n const parsed = MongoContractSchema(value);\n if (parsed instanceof arktypeType.errors) {\n throw new Error(`Contract structural validation failed: ${parsed.summary}`);\n }\n\n const contract = parsed as unknown as TContract;\n\n validateContractDomain(contract);\n validateMongoStorage(contract);\n\n const indices = buildIndices(contract);\n\n return { contract, indices };\n}\n\nfunction buildIndices(contract: MongoContract): MongoContractIndices {\n const variantToBase: Record<string, string> = {};\n const modelToVariants: Record<string, string[]> = {};\n\n for (const [modelName, model] of Object.entries(contract.models)) {\n if (model.base) {\n variantToBase[modelName] = model.base;\n }\n if (model.variants) {\n modelToVariants[modelName] = Object.keys(model.variants);\n }\n }\n\n return { variantToBase, modelToVariants };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,21 @@
1
1
  {
2
2
  "name": "@prisma-next/mongo-contract",
3
- "version": "0.5.0-dev.8",
3
+ "version": "0.5.0-dev.81",
4
+ "license": "Apache-2.0",
4
5
  "type": "module",
5
6
  "sideEffects": false,
6
7
  "description": "Contract types and validation for Prisma Next MongoDB support",
7
8
  "dependencies": {
8
9
  "arktype": "^2.1.29",
9
- "@prisma-next/contract": "0.5.0-dev.8"
10
+ "@prisma-next/contract": "0.5.0-dev.81"
10
11
  },
11
12
  "devDependencies": {
12
- "tsdown": "0.18.4",
13
+ "tsdown": "0.22.0",
13
14
  "typescript": "5.9.3",
14
- "vitest": "4.0.17",
15
- "@prisma-next/tsconfig": "0.0.0",
15
+ "vitest": "4.1.5",
16
16
  "@prisma-next/test-utils": "0.0.1",
17
- "@prisma-next/tsdown": "0.0.0"
17
+ "@prisma-next/tsdown": "0.0.0",
18
+ "@prisma-next/tsconfig": "0.0.0"
18
19
  },
19
20
  "files": [
20
21
  "dist",
@@ -38,6 +38,11 @@ export type {
38
38
  MongoTypeMapsPhantomKey,
39
39
  MongoWildcardProjection,
40
40
  } from '../contract-types';
41
+ export type {
42
+ ApplyScopeResult,
43
+ PolymorphicIndexScope,
44
+ } from '../polymorphic-index-scope';
45
+ export { applyPolymorphicScopeToMongoIndex } from '../polymorphic-index-scope';
41
46
  export type { MongoContractIndices, ValidatedMongoContract } from '../validate-mongo-contract';
42
47
  export { validateMongoContract } from '../validate-mongo-contract';
43
48
  export { validateMongoStorage } from '../validate-storage';
@@ -0,0 +1,57 @@
1
+ import type { MongoStorageIndex } from './contract-types';
2
+
3
+ export type PolymorphicIndexScope = {
4
+ readonly discriminatorField: string;
5
+ readonly discriminatorValue: string | number | boolean;
6
+ };
7
+
8
+ export type ApplyScopeResult =
9
+ | { readonly kind: 'ok'; readonly index: MongoStorageIndex }
10
+ | { readonly kind: 'conflict'; readonly reason: string };
11
+
12
+ function isScalarDiscriminatorValue(value: unknown): value is string | number | boolean {
13
+ const t = typeof value;
14
+ return t === 'string' || t === 'number' || t === 'boolean';
15
+ }
16
+
17
+ function formatValue(value: unknown): string {
18
+ if (typeof value === 'string') return JSON.stringify(value);
19
+ if (value === null) return 'null';
20
+ if (Array.isArray(value)) return JSON.stringify(value);
21
+ if (typeof value === 'object') return JSON.stringify(value);
22
+ return String(value);
23
+ }
24
+
25
+ export function applyPolymorphicScopeToMongoIndex(
26
+ index: MongoStorageIndex,
27
+ scope: PolymorphicIndexScope,
28
+ ): ApplyScopeResult {
29
+ if (!isScalarDiscriminatorValue(scope.discriminatorValue)) {
30
+ return {
31
+ kind: 'conflict',
32
+ reason: `Variant-scoped indexes require a scalar (string, number, or boolean) discriminator value for field "${scope.discriminatorField}", but received ${formatValue(scope.discriminatorValue)}.`,
33
+ };
34
+ }
35
+
36
+ const existing = index.partialFilterExpression;
37
+ if (existing && Object.hasOwn(existing, scope.discriminatorField)) {
38
+ const existingValue = existing[scope.discriminatorField];
39
+ if (existingValue === scope.discriminatorValue) {
40
+ return { kind: 'ok', index };
41
+ }
42
+ return {
43
+ kind: 'conflict',
44
+ reason: `Index partialFilterExpression sets "${scope.discriminatorField}" to ${formatValue(existingValue)}, which conflicts with the variant's discriminator value ${formatValue(scope.discriminatorValue)}.`,
45
+ };
46
+ }
47
+
48
+ const merged: Record<string, unknown> = {
49
+ ...(existing ?? {}),
50
+ [scope.discriminatorField]: scope.discriminatorValue,
51
+ };
52
+
53
+ return {
54
+ kind: 'ok',
55
+ index: { ...index, partialFilterExpression: merged },
56
+ };
57
+ }