@prisma-next/mongo-contract 0.5.0-dev.9 → 0.5.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/index.d.mts CHANGED
@@ -139,9 +139,8 @@ type MongoTypeMaps<TCodecTypes extends Record<string, {
139
139
  output: unknown;
140
140
  }> = Record<string, {
141
141
  output: unknown;
142
- }>, TOperationTypes extends Record<string, unknown> = Record<string, never>, TFieldOutputTypes extends Record<string, Record<string, unknown>> = Record<string, Record<string, unknown>>, TFieldInputTypes extends Record<string, Record<string, unknown>> = Record<string, Record<string, unknown>>> = {
142
+ }>, TFieldOutputTypes extends Record<string, Record<string, unknown>> = Record<string, Record<string, unknown>>, TFieldInputTypes extends Record<string, Record<string, unknown>> = Record<string, Record<string, unknown>>> = {
143
143
  readonly codecTypes: TCodecTypes;
144
- readonly operationTypes: TOperationTypes;
145
144
  readonly fieldOutputTypes: TFieldOutputTypes;
146
145
  readonly fieldInputTypes: TFieldInputTypes;
147
146
  };
@@ -163,7 +162,7 @@ type ExtractValueObjects<TContract> = TContract extends {
163
162
  valueObjects: infer VO extends Record<string, ContractValueObject>;
164
163
  } ? VO : Record<never, never>;
165
164
  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']>;
165
+ type ExtractValueObjectFields<TValueObjects extends Record<string, ContractValueObject>, VOName extends keyof TValueObjects> = NormalizeContractFields<TValueObjects[VOName]['fields']>;
167
166
  type InferFieldBaseType<TFieldType, TValueObjects extends Record<string, ContractValueObject>, TCodecTypes extends Record<string, {
168
167
  output: unknown;
169
168
  }>> = TFieldType extends {
@@ -185,6 +184,20 @@ type InferModelRow<TContract extends MongoContractWithTypeMaps<MongoContract, Mo
185
184
  output: unknown;
186
185
  }> = ExtractMongoCodecTypes<TContract>, TValueObjects extends Record<string, ContractValueObject> = ExtractValueObjects<TContract>> = { -readonly [FieldName in keyof TFields]: InferFieldType<TFields[FieldName], TValueObjects, TCodecTypes> };
187
186
  //#endregion
187
+ //#region src/polymorphic-index-scope.d.ts
188
+ type PolymorphicIndexScope = {
189
+ readonly discriminatorField: string;
190
+ readonly discriminatorValue: string | number | boolean;
191
+ };
192
+ type ApplyScopeResult = {
193
+ readonly kind: 'ok';
194
+ readonly index: MongoStorageIndex;
195
+ } | {
196
+ readonly kind: 'conflict';
197
+ readonly reason: string;
198
+ };
199
+ declare function applyPolymorphicScopeToMongoIndex(index: MongoStorageIndex, scope: PolymorphicIndexScope): ApplyScopeResult;
200
+ //#endregion
188
201
  //#region src/validate-mongo-contract.d.ts
189
202
  interface MongoContractIndices {
190
203
  readonly variantToBase: Record<string, string>;
@@ -199,5 +212,5 @@ declare function validateMongoContract<TContract extends MongoContract>(value: u
199
212
  //#region src/validate-storage.d.ts
200
213
  declare function validateMongoStorage(contract: MongoContract): void;
201
214
  //#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 };
215
+ 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
216
  //# 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":"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"}
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,19 +1,20 @@
1
1
  {
2
2
  "name": "@prisma-next/mongo-contract",
3
- "version": "0.5.0-dev.9",
3
+ "version": "0.5.0",
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.9"
10
+ "@prisma-next/contract": "0.5.0"
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/tsdown": "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
18
  "@prisma-next/tsconfig": "0.0.0"
18
19
  },
19
20
  "files": [
@@ -166,7 +166,6 @@ export type MongoContract<
166
166
 
167
167
  export type MongoTypeMaps<
168
168
  TCodecTypes extends Record<string, { output: unknown }> = Record<string, { output: unknown }>,
169
- TOperationTypes extends Record<string, unknown> = Record<string, never>,
170
169
  TFieldOutputTypes extends Record<string, Record<string, unknown>> = Record<
171
170
  string,
172
171
  Record<string, unknown>
@@ -177,7 +176,6 @@ export type MongoTypeMaps<
177
176
  >,
178
177
  > = {
179
178
  readonly codecTypes: TCodecTypes;
180
- readonly operationTypes: TOperationTypes;
181
179
  readonly fieldOutputTypes: TFieldOutputTypes;
182
180
  readonly fieldInputTypes: TFieldInputTypes;
183
181
  };
@@ -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
+ }