@prisma-next/mongo-contract 0.5.0-dev.18 → 0.5.0-dev.19
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 +15 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +44 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/exports/index.ts +5 -0
- package/src/polymorphic-index-scope.ts +57 -0
package/dist/index.d.mts
CHANGED
|
@@ -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
|
package/dist/index.d.mts.map
CHANGED
|
@@ -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"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
import { validateContractDomain } from "@prisma-next/contract/validate-domain";
|
|
2
2
|
import { type } from "arktype";
|
|
3
3
|
|
|
4
|
+
//#region src/polymorphic-index-scope.ts
|
|
5
|
+
function isScalarDiscriminatorValue(value) {
|
|
6
|
+
const t = typeof value;
|
|
7
|
+
return t === "string" || t === "number" || t === "boolean";
|
|
8
|
+
}
|
|
9
|
+
function formatValue(value) {
|
|
10
|
+
if (typeof value === "string") return JSON.stringify(value);
|
|
11
|
+
if (value === null) return "null";
|
|
12
|
+
if (Array.isArray(value)) return JSON.stringify(value);
|
|
13
|
+
if (typeof value === "object") return JSON.stringify(value);
|
|
14
|
+
return String(value);
|
|
15
|
+
}
|
|
16
|
+
function applyPolymorphicScopeToMongoIndex(index, scope) {
|
|
17
|
+
if (!isScalarDiscriminatorValue(scope.discriminatorValue)) return {
|
|
18
|
+
kind: "conflict",
|
|
19
|
+
reason: `Variant-scoped indexes require a scalar (string, number, or boolean) discriminator value for field "${scope.discriminatorField}", but received ${formatValue(scope.discriminatorValue)}.`
|
|
20
|
+
};
|
|
21
|
+
const existing = index.partialFilterExpression;
|
|
22
|
+
if (existing && Object.hasOwn(existing, scope.discriminatorField)) {
|
|
23
|
+
const existingValue = existing[scope.discriminatorField];
|
|
24
|
+
if (existingValue === scope.discriminatorValue) return {
|
|
25
|
+
kind: "ok",
|
|
26
|
+
index
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
kind: "conflict",
|
|
30
|
+
reason: `Index partialFilterExpression sets "${scope.discriminatorField}" to ${formatValue(existingValue)}, which conflicts with the variant's discriminator value ${formatValue(scope.discriminatorValue)}.`
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const merged = {
|
|
34
|
+
...existing ?? {},
|
|
35
|
+
[scope.discriminatorField]: scope.discriminatorValue
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
kind: "ok",
|
|
39
|
+
index: {
|
|
40
|
+
...index,
|
|
41
|
+
partialFilterExpression: merged
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
4
47
|
//#region src/contract-schema.ts
|
|
5
48
|
const ScalarFieldTypeSchema = type({
|
|
6
49
|
"+": "reject",
|
|
@@ -310,5 +353,5 @@ function buildIndices(contract) {
|
|
|
310
353
|
}
|
|
311
354
|
|
|
312
355
|
//#endregion
|
|
313
|
-
export { validateMongoContract, validateMongoStorage };
|
|
356
|
+
export { applyPolymorphicScopeToMongoIndex, validateMongoContract, validateMongoStorage };
|
|
314
357
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -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":["merged: Record<string, unknown>","errors: string[]","arktypeType","variantToBase: Record<string, string>","modelToVariants: Record<string, string[]>"],"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,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/mongo-contract",
|
|
3
|
-
"version": "0.5.0-dev.
|
|
3
|
+
"version": "0.5.0-dev.19",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "Contract types and validation for Prisma Next MongoDB support",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"arktype": "^2.1.29",
|
|
9
|
-
"@prisma-next/contract": "0.5.0-dev.
|
|
9
|
+
"@prisma-next/contract": "0.5.0-dev.19"
|
|
10
10
|
},
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"tsdown": "0.18.4",
|
|
13
13
|
"typescript": "5.9.3",
|
|
14
14
|
"vitest": "4.0.17",
|
|
15
|
+
"@prisma-next/test-utils": "0.0.1",
|
|
15
16
|
"@prisma-next/tsconfig": "0.0.0",
|
|
16
|
-
"@prisma-next/tsdown": "0.0.0"
|
|
17
|
-
"@prisma-next/test-utils": "0.0.1"
|
|
17
|
+
"@prisma-next/tsdown": "0.0.0"
|
|
18
18
|
},
|
|
19
19
|
"files": [
|
|
20
20
|
"dist",
|
package/src/exports/index.ts
CHANGED
|
@@ -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
|
+
}
|