@prisma-next/mongo-schema-ir 0.5.0-dev.9 → 0.6.0-dev.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/canonicalize.ts","../../src/schema-collection-options.ts","../../src/schema-validator.ts","../../src/schema-collection.ts","../../src/schema-ir.ts","../../src/visitor.ts","../../src/schema-node.ts","../../src/schema-index.ts","../../src/index-equivalence.ts","../../src/types.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/canonicalize.ts","../../src/schema-collection-options.ts","../../src/schema-validator.ts","../../src/schema-collection.ts","../../src/schema-ir.ts","../../src/visitor.ts","../../src/schema-node.ts","../../src/schema-index.ts","../../src/index-equivalence.ts","../../src/types.ts"],"mappings":"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"}
|
package/dist/exports/index.mjs
CHANGED
|
@@ -7,7 +7,6 @@ function canonicalize(obj) {
|
|
|
7
7
|
const record = obj;
|
|
8
8
|
return `{${Object.keys(record).sort().map((k) => `${JSON.stringify(k)}:${canonicalize(record[k])}`).join(",")}}`;
|
|
9
9
|
}
|
|
10
|
-
|
|
11
10
|
//#endregion
|
|
12
11
|
//#region src/index-equivalence.ts
|
|
13
12
|
/**
|
|
@@ -60,7 +59,6 @@ function indexesEquivalent(a, b) {
|
|
|
60
59
|
if (a.language_override !== b.language_override) return false;
|
|
61
60
|
return true;
|
|
62
61
|
}
|
|
63
|
-
|
|
64
62
|
//#endregion
|
|
65
63
|
//#region src/schema-node.ts
|
|
66
64
|
var MongoSchemaNode = class {
|
|
@@ -68,7 +66,6 @@ var MongoSchemaNode = class {
|
|
|
68
66
|
Object.freeze(this);
|
|
69
67
|
}
|
|
70
68
|
};
|
|
71
|
-
|
|
72
69
|
//#endregion
|
|
73
70
|
//#region src/schema-collection.ts
|
|
74
71
|
var MongoSchemaCollection = class extends MongoSchemaNode {
|
|
@@ -89,7 +86,6 @@ var MongoSchemaCollection = class extends MongoSchemaNode {
|
|
|
89
86
|
return visitor.collection(this);
|
|
90
87
|
}
|
|
91
88
|
};
|
|
92
|
-
|
|
93
89
|
//#endregion
|
|
94
90
|
//#region src/schema-collection-options.ts
|
|
95
91
|
var MongoSchemaCollectionOptions = class extends MongoSchemaNode {
|
|
@@ -112,7 +108,6 @@ var MongoSchemaCollectionOptions = class extends MongoSchemaNode {
|
|
|
112
108
|
return visitor.collectionOptions(this);
|
|
113
109
|
}
|
|
114
110
|
};
|
|
115
|
-
|
|
116
111
|
//#endregion
|
|
117
112
|
//#region src/schema-index.ts
|
|
118
113
|
var MongoSchemaIndex = class extends MongoSchemaNode {
|
|
@@ -145,7 +140,6 @@ var MongoSchemaIndex = class extends MongoSchemaNode {
|
|
|
145
140
|
return visitor.index(this);
|
|
146
141
|
}
|
|
147
142
|
};
|
|
148
|
-
|
|
149
143
|
//#endregion
|
|
150
144
|
//#region src/schema-ir.ts
|
|
151
145
|
var MongoSchemaIR = class extends MongoSchemaNode {
|
|
@@ -168,7 +162,6 @@ var MongoSchemaIR = class extends MongoSchemaNode {
|
|
|
168
162
|
return this._byName.get(name);
|
|
169
163
|
}
|
|
170
164
|
};
|
|
171
|
-
|
|
172
165
|
//#endregion
|
|
173
166
|
//#region src/schema-validator.ts
|
|
174
167
|
var MongoSchemaValidator = class extends MongoSchemaNode {
|
|
@@ -187,7 +180,7 @@ var MongoSchemaValidator = class extends MongoSchemaNode {
|
|
|
187
180
|
return visitor.validator(this);
|
|
188
181
|
}
|
|
189
182
|
};
|
|
190
|
-
|
|
191
183
|
//#endregion
|
|
192
184
|
export { MongoSchemaCollection, MongoSchemaCollectionOptions, MongoSchemaIR, MongoSchemaIndex, MongoSchemaNode, MongoSchemaValidator, canonicalize, deepEqual, indexesEquivalent };
|
|
185
|
+
|
|
193
186
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/canonicalize.ts","../../src/index-equivalence.ts","../../src/schema-node.ts","../../src/schema-collection.ts","../../src/schema-collection-options.ts","../../src/schema-index.ts","../../src/schema-ir.ts","../../src/schema-validator.ts"],"sourcesContent":["export function canonicalize(obj: unknown): string {\n if (obj === null) return 'null';\n if (obj === undefined) return 'undefined';\n if (typeof obj !== 'object') return JSON.stringify(obj);\n if (Array.isArray(obj)) return `[${obj.map(canonicalize).join(',')}]`;\n const record = obj as Record<string, unknown>;\n const sorted = Object.keys(record).sort();\n const entries = sorted.map((k) => `${JSON.stringify(k)}:${canonicalize(record[k])}`);\n return `{${entries.join(',')}}`;\n}\n","import { canonicalize } from './canonicalize';\nimport type { MongoSchemaIndex } from './schema-index';\n\n/**\n * Key-order-sensitive structural comparison. For key-order-independent\n * comparison (e.g. lookup key construction), use {@link canonicalize}.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a === undefined || b === undefined) return false;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) {\n if (aKeys[i] !== bKeys[i]) return false;\n const key = aKeys[i] as string;\n if (!deepEqual(aObj[key], bObj[key])) return false;\n }\n return true;\n }\n\n return false;\n}\n\nexport function indexesEquivalent(a: MongoSchemaIndex, b: MongoSchemaIndex): boolean {\n if (a.keys.length !== b.keys.length) return false;\n for (let i = 0; i < a.keys.length; i++) {\n const aKey = a.keys[i];\n const bKey = b.keys[i];\n if (!aKey || !bKey) return false;\n if (aKey.field !== bKey.field) return false;\n if (aKey.direction !== bKey.direction) return false;\n }\n if (a.unique !== b.unique) return false;\n if (a.sparse !== b.sparse) return false;\n if (a.expireAfterSeconds !== b.expireAfterSeconds) return false;\n if (canonicalize(a.partialFilterExpression) !== canonicalize(b.partialFilterExpression))\n return false;\n if (canonicalize(a.wildcardProjection) !== canonicalize(b.wildcardProjection)) return false;\n if (canonicalize(a.collation) !== canonicalize(b.collation)) return false;\n if (canonicalize(a.weights) !== canonicalize(b.weights)) return false;\n if (a.default_language !== b.default_language) return false;\n if (a.language_override !== b.language_override) return false;\n return true;\n}\n","import type { MongoSchemaVisitor } from './visitor';\n\nexport abstract class MongoSchemaNode {\n abstract readonly kind: string;\n\n abstract accept<R>(visitor: MongoSchemaVisitor<R>): R;\n\n protected freeze(): void {\n Object.freeze(this);\n }\n}\n","import type { MongoSchemaCollectionOptions } from './schema-collection-options';\nimport type { MongoSchemaIndex } from './schema-index';\nimport { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaValidator } from './schema-validator';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport interface MongoSchemaCollectionCtorOptions {\n readonly name: string;\n readonly indexes?: ReadonlyArray<MongoSchemaIndex>;\n readonly validator?: MongoSchemaValidator;\n readonly options?: MongoSchemaCollectionOptions;\n}\n\nexport class MongoSchemaCollection extends MongoSchemaNode {\n readonly kind = 'collection' as const;\n readonly name: string;\n readonly indexes: ReadonlyArray<MongoSchemaIndex>;\n readonly validator?: MongoSchemaValidator | undefined;\n readonly options?: MongoSchemaCollectionOptions | undefined;\n\n constructor(options: MongoSchemaCollectionCtorOptions) {\n super();\n this.name = options.name;\n this.indexes = options.indexes ?? [];\n this.validator = options.validator;\n this.options = options.options;\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.collection(this);\n }\n}\n","import { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport interface MongoSchemaCollectionOptionsInput {\n readonly capped?: { size: number; max?: number };\n readonly timeseries?: {\n timeField: string;\n metaField?: string;\n granularity?: 'seconds' | 'minutes' | 'hours';\n };\n readonly collation?: Record<string, unknown>;\n readonly changeStreamPreAndPostImages?: { enabled: boolean };\n readonly clusteredIndex?: { name?: string };\n}\n\nexport class MongoSchemaCollectionOptions extends MongoSchemaNode {\n readonly kind = 'collectionOptions' as const;\n readonly capped?: { size: number; max?: number } | undefined;\n readonly timeseries?:\n | { timeField: string; metaField?: string; granularity?: 'seconds' | 'minutes' | 'hours' }\n | undefined;\n readonly collation?: Record<string, unknown> | undefined;\n readonly changeStreamPreAndPostImages?: { enabled: boolean } | undefined;\n readonly clusteredIndex?: { name?: string } | undefined;\n\n constructor(options: MongoSchemaCollectionOptionsInput) {\n super();\n this.capped = options.capped;\n this.timeseries = options.timeseries;\n this.collation = options.collation;\n this.changeStreamPreAndPostImages = options.changeStreamPreAndPostImages;\n this.clusteredIndex = options.clusteredIndex;\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.collectionOptions(this);\n }\n}\n","import type { MongoIndexKey } from '@prisma-next/mongo-contract';\nimport { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport interface MongoSchemaIndexOptions {\n readonly keys: ReadonlyArray<MongoIndexKey>;\n readonly unique?: boolean | undefined;\n readonly sparse?: boolean | undefined;\n readonly expireAfterSeconds?: number | undefined;\n readonly partialFilterExpression?: Record<string, unknown> | undefined;\n readonly wildcardProjection?: Record<string, 0 | 1> | undefined;\n readonly collation?: Record<string, unknown> | undefined;\n readonly weights?: Record<string, number> | undefined;\n readonly default_language?: string | undefined;\n readonly language_override?: string | undefined;\n}\n\nexport class MongoSchemaIndex extends MongoSchemaNode {\n readonly kind = 'index' as const;\n readonly keys: ReadonlyArray<MongoIndexKey>;\n readonly unique: boolean;\n readonly sparse?: boolean | undefined;\n readonly expireAfterSeconds?: number | undefined;\n readonly partialFilterExpression?: Record<string, unknown> | undefined;\n readonly wildcardProjection?: Record<string, 0 | 1> | undefined;\n readonly collation?: Record<string, unknown> | undefined;\n readonly weights?: Record<string, number> | undefined;\n readonly default_language?: string | undefined;\n readonly language_override?: string | undefined;\n\n constructor(options: MongoSchemaIndexOptions) {\n super();\n this.keys = options.keys;\n this.unique = options.unique ?? false;\n this.sparse = options.sparse;\n this.expireAfterSeconds = options.expireAfterSeconds;\n this.partialFilterExpression = options.partialFilterExpression;\n this.wildcardProjection = options.wildcardProjection;\n this.collation = options.collation;\n this.weights = options.weights;\n this.default_language = options.default_language;\n this.language_override = options.language_override;\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.index(this);\n }\n}\n","import type { MongoSchemaCollection } from './schema-collection';\nimport { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport class MongoSchemaIR extends MongoSchemaNode {\n readonly kind = 'schema' as const;\n readonly collections: ReadonlyArray<MongoSchemaCollection>;\n readonly collectionNames: ReadonlyArray<string>;\n\n private readonly _byName: Map<string, MongoSchemaCollection>;\n\n constructor(collections: ReadonlyArray<MongoSchemaCollection>) {\n super();\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n this.collections = sorted;\n this._byName = new Map(sorted.map((c) => [c.name, c]));\n this.collectionNames = sorted.map((c) => c.name);\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.schema(this);\n }\n\n collection(name: string): MongoSchemaCollection | undefined {\n return this._byName.get(name);\n }\n}\n","import { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport interface MongoSchemaValidatorOptions {\n readonly jsonSchema: Record<string, unknown>;\n readonly validationLevel: 'strict' | 'moderate';\n readonly validationAction: 'error' | 'warn';\n}\n\nexport class MongoSchemaValidator extends MongoSchemaNode {\n readonly kind = 'validator' as const;\n readonly jsonSchema: Record<string, unknown>;\n readonly validationLevel: 'strict' | 'moderate';\n readonly validationAction: 'error' | 'warn';\n\n constructor(options: MongoSchemaValidatorOptions) {\n super();\n this.jsonSchema = options.jsonSchema;\n this.validationLevel = options.validationLevel;\n this.validationAction = options.validationAction;\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.validator(this);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/canonicalize.ts","../../src/index-equivalence.ts","../../src/schema-node.ts","../../src/schema-collection.ts","../../src/schema-collection-options.ts","../../src/schema-index.ts","../../src/schema-ir.ts","../../src/schema-validator.ts"],"sourcesContent":["export function canonicalize(obj: unknown): string {\n if (obj === null) return 'null';\n if (obj === undefined) return 'undefined';\n if (typeof obj !== 'object') return JSON.stringify(obj);\n if (Array.isArray(obj)) return `[${obj.map(canonicalize).join(',')}]`;\n const record = obj as Record<string, unknown>;\n const sorted = Object.keys(record).sort();\n const entries = sorted.map((k) => `${JSON.stringify(k)}:${canonicalize(record[k])}`);\n return `{${entries.join(',')}}`;\n}\n","import { canonicalize } from './canonicalize';\nimport type { MongoSchemaIndex } from './schema-index';\n\n/**\n * Key-order-sensitive structural comparison. For key-order-independent\n * comparison (e.g. lookup key construction), use {@link canonicalize}.\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a === undefined || b === undefined) return false;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) {\n if (aKeys[i] !== bKeys[i]) return false;\n const key = aKeys[i] as string;\n if (!deepEqual(aObj[key], bObj[key])) return false;\n }\n return true;\n }\n\n return false;\n}\n\nexport function indexesEquivalent(a: MongoSchemaIndex, b: MongoSchemaIndex): boolean {\n if (a.keys.length !== b.keys.length) return false;\n for (let i = 0; i < a.keys.length; i++) {\n const aKey = a.keys[i];\n const bKey = b.keys[i];\n if (!aKey || !bKey) return false;\n if (aKey.field !== bKey.field) return false;\n if (aKey.direction !== bKey.direction) return false;\n }\n if (a.unique !== b.unique) return false;\n if (a.sparse !== b.sparse) return false;\n if (a.expireAfterSeconds !== b.expireAfterSeconds) return false;\n if (canonicalize(a.partialFilterExpression) !== canonicalize(b.partialFilterExpression))\n return false;\n if (canonicalize(a.wildcardProjection) !== canonicalize(b.wildcardProjection)) return false;\n if (canonicalize(a.collation) !== canonicalize(b.collation)) return false;\n if (canonicalize(a.weights) !== canonicalize(b.weights)) return false;\n if (a.default_language !== b.default_language) return false;\n if (a.language_override !== b.language_override) return false;\n return true;\n}\n","import type { MongoSchemaVisitor } from './visitor';\n\nexport abstract class MongoSchemaNode {\n abstract readonly kind: string;\n\n abstract accept<R>(visitor: MongoSchemaVisitor<R>): R;\n\n protected freeze(): void {\n Object.freeze(this);\n }\n}\n","import type { MongoSchemaCollectionOptions } from './schema-collection-options';\nimport type { MongoSchemaIndex } from './schema-index';\nimport { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaValidator } from './schema-validator';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport interface MongoSchemaCollectionCtorOptions {\n readonly name: string;\n readonly indexes?: ReadonlyArray<MongoSchemaIndex>;\n readonly validator?: MongoSchemaValidator;\n readonly options?: MongoSchemaCollectionOptions;\n}\n\nexport class MongoSchemaCollection extends MongoSchemaNode {\n readonly kind = 'collection' as const;\n readonly name: string;\n readonly indexes: ReadonlyArray<MongoSchemaIndex>;\n readonly validator?: MongoSchemaValidator | undefined;\n readonly options?: MongoSchemaCollectionOptions | undefined;\n\n constructor(options: MongoSchemaCollectionCtorOptions) {\n super();\n this.name = options.name;\n this.indexes = options.indexes ?? [];\n this.validator = options.validator;\n this.options = options.options;\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.collection(this);\n }\n}\n","import { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport interface MongoSchemaCollectionOptionsInput {\n readonly capped?: { size: number; max?: number };\n readonly timeseries?: {\n timeField: string;\n metaField?: string;\n granularity?: 'seconds' | 'minutes' | 'hours';\n };\n readonly collation?: Record<string, unknown>;\n readonly changeStreamPreAndPostImages?: { enabled: boolean };\n readonly clusteredIndex?: { name?: string };\n}\n\nexport class MongoSchemaCollectionOptions extends MongoSchemaNode {\n readonly kind = 'collectionOptions' as const;\n readonly capped?: { size: number; max?: number } | undefined;\n readonly timeseries?:\n | { timeField: string; metaField?: string; granularity?: 'seconds' | 'minutes' | 'hours' }\n | undefined;\n readonly collation?: Record<string, unknown> | undefined;\n readonly changeStreamPreAndPostImages?: { enabled: boolean } | undefined;\n readonly clusteredIndex?: { name?: string } | undefined;\n\n constructor(options: MongoSchemaCollectionOptionsInput) {\n super();\n this.capped = options.capped;\n this.timeseries = options.timeseries;\n this.collation = options.collation;\n this.changeStreamPreAndPostImages = options.changeStreamPreAndPostImages;\n this.clusteredIndex = options.clusteredIndex;\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.collectionOptions(this);\n }\n}\n","import type { MongoIndexKey } from '@prisma-next/mongo-contract';\nimport { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport interface MongoSchemaIndexOptions {\n readonly keys: ReadonlyArray<MongoIndexKey>;\n readonly unique?: boolean | undefined;\n readonly sparse?: boolean | undefined;\n readonly expireAfterSeconds?: number | undefined;\n readonly partialFilterExpression?: Record<string, unknown> | undefined;\n readonly wildcardProjection?: Record<string, 0 | 1> | undefined;\n readonly collation?: Record<string, unknown> | undefined;\n readonly weights?: Record<string, number> | undefined;\n readonly default_language?: string | undefined;\n readonly language_override?: string | undefined;\n}\n\nexport class MongoSchemaIndex extends MongoSchemaNode {\n readonly kind = 'index' as const;\n readonly keys: ReadonlyArray<MongoIndexKey>;\n readonly unique: boolean;\n readonly sparse?: boolean | undefined;\n readonly expireAfterSeconds?: number | undefined;\n readonly partialFilterExpression?: Record<string, unknown> | undefined;\n readonly wildcardProjection?: Record<string, 0 | 1> | undefined;\n readonly collation?: Record<string, unknown> | undefined;\n readonly weights?: Record<string, number> | undefined;\n readonly default_language?: string | undefined;\n readonly language_override?: string | undefined;\n\n constructor(options: MongoSchemaIndexOptions) {\n super();\n this.keys = options.keys;\n this.unique = options.unique ?? false;\n this.sparse = options.sparse;\n this.expireAfterSeconds = options.expireAfterSeconds;\n this.partialFilterExpression = options.partialFilterExpression;\n this.wildcardProjection = options.wildcardProjection;\n this.collation = options.collation;\n this.weights = options.weights;\n this.default_language = options.default_language;\n this.language_override = options.language_override;\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.index(this);\n }\n}\n","import type { MongoSchemaCollection } from './schema-collection';\nimport { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport class MongoSchemaIR extends MongoSchemaNode {\n readonly kind = 'schema' as const;\n readonly collections: ReadonlyArray<MongoSchemaCollection>;\n readonly collectionNames: ReadonlyArray<string>;\n\n private readonly _byName: Map<string, MongoSchemaCollection>;\n\n constructor(collections: ReadonlyArray<MongoSchemaCollection>) {\n super();\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n this.collections = sorted;\n this._byName = new Map(sorted.map((c) => [c.name, c]));\n this.collectionNames = sorted.map((c) => c.name);\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.schema(this);\n }\n\n collection(name: string): MongoSchemaCollection | undefined {\n return this._byName.get(name);\n }\n}\n","import { MongoSchemaNode } from './schema-node';\nimport type { MongoSchemaVisitor } from './visitor';\n\nexport interface MongoSchemaValidatorOptions {\n readonly jsonSchema: Record<string, unknown>;\n readonly validationLevel: 'strict' | 'moderate';\n readonly validationAction: 'error' | 'warn';\n}\n\nexport class MongoSchemaValidator extends MongoSchemaNode {\n readonly kind = 'validator' as const;\n readonly jsonSchema: Record<string, unknown>;\n readonly validationLevel: 'strict' | 'moderate';\n readonly validationAction: 'error' | 'warn';\n\n constructor(options: MongoSchemaValidatorOptions) {\n super();\n this.jsonSchema = options.jsonSchema;\n this.validationLevel = options.validationLevel;\n this.validationAction = options.validationAction;\n this.freeze();\n }\n\n accept<R>(visitor: MongoSchemaVisitor<R>): R {\n return visitor.validator(this);\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/mongo-schema-ir",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0-dev.1",
|
|
4
|
+
"license": "Apache-2.0",
|
|
4
5
|
"type": "module",
|
|
5
6
|
"sideEffects": false,
|
|
6
7
|
"description": "MongoDB schema IR AST for migration diffing",
|
|
7
8
|
"dependencies": {
|
|
8
|
-
"@prisma-next/mongo-contract": "0.
|
|
9
|
+
"@prisma-next/mongo-contract": "0.6.0-dev.1"
|
|
9
10
|
},
|
|
10
11
|
"devDependencies": {
|
|
11
|
-
"tsdown": "0.
|
|
12
|
+
"tsdown": "0.22.0",
|
|
12
13
|
"typescript": "5.9.3",
|
|
13
|
-
"vitest": "4.
|
|
14
|
+
"vitest": "4.1.5",
|
|
14
15
|
"@prisma-next/test-utils": "0.0.1",
|
|
15
16
|
"@prisma-next/tsconfig": "0.0.0",
|
|
16
17
|
"@prisma-next/tsdown": "0.0.0"
|