@prisma/orm-family-mongo 8.0.0-rc.19-dev.1 → 8.0.0-rc.19-dev.2

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":"control-XeK2IiTX.mjs","names":[],"sources":["../../../../2-mongo-family/9-family/dist/control.mjs"],"sourcesContent":["import { i as contractToMongoSchemaIR, n as canonicalizeSchemasForVerification, r as diffMongoSchemas, t as verifyMongoSchema } from \"./verify-mongo-schema-CeQP5N4k.mjs\";\nimport { n as mongoFamilyPslBlockDescriptors, t as mongoFamilyEntityTypes } from \"./authoring-entity-types-CvqTq1Za.mjs\";\nimport { t as MongoContractSerializer } from \"./mongo-contract-serializer-Zx1rvil3.mjs\";\nimport { ifDefined } from \"@internal/utils/defined\";\nimport { describeUnresolvedMongoType, describeUnsupportedMongoAttribute, mongoAttributeSpecs } from \"@internal/mongo-contract-psl\";\nimport { mongoEmission } from \"@internal/mongo-emitter\";\nimport { structuredError } from \"@internal/utils/structured-error\";\nimport { APP_SPACE_ID, SchemaTreeNode, VERIFY_CODE_HASH_MISMATCH, VERIFY_CODE_MARKER_MISSING, VERIFY_CODE_TARGET_MISMATCH, sameMarkerHashes } from \"@internal/framework-components/control\";\nimport { validatorRootShapesOf } from \"@internal/mongo-contract\";\nimport { blindCast } from \"@internal/utils/casts\";\nimport { assertDescriptorSelfConsistency } from \"@internal/migration-tools/spaces\";\nimport { mongoContractCanonicalizationHooks } from \"@internal/mongo-contract/canonicalization-hooks\";\nimport { InternalError } from \"@internal/utils/internal-error\";\nimport { RawUpdateManyCommand } from \"@internal/mongo-query-ast/execution\";\n//#region src/core/field-rewrite.ts\nconst FIELD_OPERATORS = /* @__PURE__ */ new Set([\"$rename\", \"$unset\"]);\nfunction onlyKey(value) {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return void 0;\n\tconst keys = Object.keys(value);\n\tconst [key] = keys;\n\treturn keys.length === 1 ? key : void 0;\n}\n/**\n* The planner's field rewrite an operation is, if it is one: a single `updateMany` that skips\n* validation and renames or unsets one field.\n*/\nfunction fieldRewriteOf(operation) {\n\tconst run = Reflect.get(operation, \"run\");\n\tif (!Array.isArray(run) || run.length !== 1) return void 0;\n\tconst [step] = run;\n\tconst command = typeof step === \"object\" && step !== null ? Reflect.get(step, \"command\") : void 0;\n\tif (!(command instanceof RawUpdateManyCommand) || command.bypassDocumentValidation !== true) return;\n\tconst operator = onlyKey(command.update);\n\tif (operator === void 0 || !FIELD_OPERATORS.has(operator)) return void 0;\n\tconst field = onlyKey(Reflect.get(command.update, operator));\n\treturn field === void 0 ? void 0 : {\n\t\tcollection: command.collection,\n\t\tfield,\n\t\tcommand\n\t};\n}\n//#endregion\n//#region src/core/operation-preview.ts\nfunction formatKeySpec(keys) {\n\treturn `{ ${keys.map((k) => `${JSON.stringify(k.field)}: ${JSON.stringify(k.direction)}`).join(\", \")} }`;\n}\nconst COMMAND_META_KEYS = /* @__PURE__ */ new Set([\n\t\"kind\",\n\t\"collection\",\n\t\"keys\"\n]);\nfunction formatOptionEntries(cmd) {\n\tconst parts = Object.entries(cmd).filter(([key, value]) => !COMMAND_META_KEYS.has(key) && value !== void 0).map(([key, value]) => `${key}: ${JSON.stringify(value)}`);\n\tif (parts.length === 0) return void 0;\n\treturn `{ ${parts.join(\", \")} }`;\n}\nfunction formatOptions(cmd) {\n\treturn formatOptionEntries(cmd);\n}\nfunction formatCreateCollectionOptions(cmd) {\n\treturn formatOptionEntries(cmd);\n}\nfunction collectionRef(name) {\n\treturn `db.getCollection(${JSON.stringify(name)})`;\n}\nvar MongoDdlCommandFormatter = class {\n\tcreateIndex(cmd) {\n\t\tconst keySpec = formatKeySpec(cmd.keys);\n\t\tconst opts = formatOptions(cmd);\n\t\treturn opts ? `${collectionRef(cmd.collection)}.createIndex(${keySpec}, ${opts})` : `${collectionRef(cmd.collection)}.createIndex(${keySpec})`;\n\t}\n\tdropIndex(cmd) {\n\t\treturn `${collectionRef(cmd.collection)}.dropIndex(${JSON.stringify(cmd.name)})`;\n\t}\n\tcreateCollection(cmd) {\n\t\tconst opts = formatCreateCollectionOptions(cmd);\n\t\treturn opts ? `db.createCollection(${JSON.stringify(cmd.collection)}, ${opts})` : `db.createCollection(${JSON.stringify(cmd.collection)})`;\n\t}\n\tdropCollection(cmd) {\n\t\treturn `${collectionRef(cmd.collection)}.drop()`;\n\t}\n\trenameCollection(cmd) {\n\t\treturn `${collectionRef(cmd.collection)}.renameCollection(${JSON.stringify(cmd.to)})`;\n\t}\n\tcollMod(cmd) {\n\t\tconst parts = [`collMod: ${JSON.stringify(cmd.collection)}`];\n\t\tfor (const [key, value] of Object.entries(cmd)) if (!COMMAND_META_KEYS.has(key) && value !== void 0) parts.push(`${key}: ${JSON.stringify(value)}`);\n\t\treturn `db.runCommand({ ${parts.join(\", \")} })`;\n\t}\n};\nconst formatter = new MongoDdlCommandFormatter();\nfunction formatUpdateMany(cmd) {\n\tconst args = [JSON.stringify(cmd.filter), JSON.stringify(cmd.update)];\n\tif (cmd.bypassDocumentValidation) args.push(\"{ bypassDocumentValidation: true }\");\n\treturn `${collectionRef(cmd.collection)}.updateMany(${args.join(\", \")})`;\n}\nfunction arrayAt(value, key) {\n\tconst entry = Reflect.get(value, key);\n\treturn Array.isArray(entry) ? entry : [];\n}\nfunction objectAt(value, key) {\n\tif (typeof value !== \"object\" || value === null) return void 0;\n\tconst entry = Reflect.get(value, key);\n\treturn typeof entry === \"object\" && entry !== null ? entry : void 0;\n}\nfunction isDdlCommand(value) {\n\treturn value !== void 0 && typeof Reflect.get(value, \"accept\") === \"function\";\n}\nfunction formatMongoOperations(operations) {\n\tconst statements = [];\n\tfor (const operation of operations) {\n\t\tfor (const step of arrayAt(operation, \"execute\")) {\n\t\t\tconst command = objectAt(step, \"command\");\n\t\t\tif (isDdlCommand(command)) statements.push(command.accept(formatter));\n\t\t}\n\t\tconst rewrite = fieldRewriteOf(operation);\n\t\tif (rewrite !== void 0) statements.push(formatUpdateMany(rewrite.command));\n\t}\n\treturn statements;\n}\n/**\n* Wraps `formatMongoOperations` into the family-agnostic\n* `OperationPreview` shape. Each statement carries\n* `language: 'mongodb-shell'`. Mirrors `sqlOperationsToPreview`.\n*/\nfunction mongoOperationsToPreview(operations) {\n\treturn { statements: formatMongoOperations(operations).map((text) => ({\n\t\ttext,\n\t\tlanguage: \"mongodb-shell\"\n\t})) };\n}\n//#endregion\n//#region src/core/operation-storage-name.ts\nfunction collectionOfStep(step) {\n\tif (typeof step !== \"object\" || step === null) return void 0;\n\tconst command = Reflect.get(step, \"command\");\n\tif (typeof command !== \"object\" || command === null) return void 0;\n\tconst collection = Reflect.get(command, \"collection\");\n\treturn typeof collection === \"string\" ? collection : void 0;\n}\n/**\n* The collection an operation's command names, as the database knows it: the name the Mongo\n* planner gives a dropped collection. A planner field rewrite is named `<collection>.<field>`. An operation\n* whose commands name no collection is named by its id.\n*/\nfunction mongoStorageNameOf(operation) {\n\tconst execute = Reflect.get(operation, \"execute\");\n\tconst steps = Array.isArray(execute) ? execute : [];\n\tfor (const step of steps) {\n\t\tconst collection = collectionOfStep(step);\n\t\tif (collection !== void 0) return collection;\n\t}\n\tconst rewrite = fieldRewriteOf(operation);\n\tif (rewrite !== void 0) return `${rewrite.collection}.${rewrite.field}`;\n\tconst run = Reflect.get(operation, \"run\");\n\tfor (const step of Array.isArray(run) ? run : []) {\n\t\tconst collection = collectionOfStep(step);\n\t\tif (collection !== void 0) return collection;\n\t}\n\treturn operation.id;\n}\n//#endregion\n//#region src/core/schema-to-view.ts\nfunction mongoSchemaToView(schema) {\n\tconst collectionNodes = schema.collections.map((collection) => collectionToSchemaNode(collection.name, collection));\n\treturn { root: new SchemaTreeNode({\n\t\tkind: \"root\",\n\t\tid: \"mongo-schema\",\n\t\tlabel: \"database\",\n\t\t...ifDefined(\"children\", collectionNodes.length > 0 ? collectionNodes : void 0)\n\t}) };\n}\nfunction collectionToSchemaNode(name, collection) {\n\tconst children = [];\n\tfor (const index of collection.indexes) {\n\t\tconst keysSummary = index.keys.map((k) => {\n\t\t\tif (k.direction === 1) return k.field;\n\t\t\tif (k.direction === -1) return `${k.field} desc`;\n\t\t\treturn `${k.field} ${k.direction}`;\n\t\t}).join(\", \");\n\t\tconst prefix = index.unique ? \"unique index\" : \"index\";\n\t\tconst options = [];\n\t\tif (index.sparse) options.push(\"sparse\");\n\t\tif (index.expireAfterSeconds != null) options.push(`ttl: ${index.expireAfterSeconds}s`);\n\t\tif (index.partialFilterExpression) options.push(\"partial\");\n\t\tconst optsSuffix = options.length > 0 ? ` (${options.join(\", \")})` : \"\";\n\t\tchildren.push(new SchemaTreeNode({\n\t\t\tkind: \"index\",\n\t\t\tid: `index-${name}-${index.keys.map((k) => `${k.field}_${k.direction}`).join(\"_\")}`,\n\t\t\tlabel: `${prefix} (${keysSummary})${optsSuffix}`,\n\t\t\tmeta: {\n\t\t\t\tkeys: index.keys,\n\t\t\t\tunique: index.unique,\n\t\t\t\t...ifDefined(\"sparse\", index.sparse || void 0),\n\t\t\t\t...ifDefined(\"expireAfterSeconds\", index.expireAfterSeconds ?? void 0),\n\t\t\t\t...ifDefined(\"partialFilterExpression\", index.partialFilterExpression ?? void 0)\n\t\t\t}\n\t\t}));\n\t}\n\tif (collection.validator) {\n\t\tconst validatorChildren = [];\n\t\tconst roots = validatorRootShapesOf(collection.validator.jsonSchema);\n\t\tconst fields = /* @__PURE__ */ new Map();\n\t\tfor (const root of roots) for (const [propName, propDef] of Object.entries(root.properties)) {\n\t\t\tconst types = fields.get(propName) ?? /* @__PURE__ */ new Set();\n\t\t\tfor (const type of bsonTypesOf(propDef)) types.add(type);\n\t\t\tfields.set(propName, types);\n\t\t}\n\t\tfor (const [propName, types] of fields) {\n\t\t\tconst bsonType = types.has(\"any\") ? \"any\" : [...types].join(\",\");\n\t\t\tconst required = roots.every((root) => !Object.hasOwn(root.properties, propName) || root.required.includes(propName));\n\t\t\tvalidatorChildren.push(new SchemaTreeNode({\n\t\t\t\tkind: \"field\",\n\t\t\t\tid: `field-${name}-${propName}`,\n\t\t\t\tlabel: `${propName}: ${bsonType}${required ? \" (required)\" : \"\"}`\n\t\t\t}));\n\t\t}\n\t\tchildren.push(new SchemaTreeNode({\n\t\t\tkind: \"field\",\n\t\t\tid: `validator-${name}`,\n\t\t\tlabel: `validator (level: ${collection.validator.validationLevel}, action: ${collection.validator.validationAction})`,\n\t\t\tmeta: {\n\t\t\t\tvalidationLevel: collection.validator.validationLevel,\n\t\t\t\tvalidationAction: collection.validator.validationAction,\n\t\t\t\tjsonSchema: collection.validator.jsonSchema\n\t\t\t},\n\t\t\t...ifDefined(\"children\", validatorChildren.length > 0 ? validatorChildren : void 0)\n\t\t}));\n\t}\n\tif (collection.options) {\n\t\tconst opts = collection.options;\n\t\tconst optLabels = [];\n\t\tif (opts.capped) optLabels.push(\"capped\");\n\t\tif (opts.timeseries) optLabels.push(\"timeseries\");\n\t\tif (opts.collation) optLabels.push(\"collation\");\n\t\tif (opts.changeStreamPreAndPostImages) optLabels.push(\"changeStreamPreAndPostImages\");\n\t\tif (opts.clusteredIndex) optLabels.push(\"clusteredIndex\");\n\t\tif (optLabels.length > 0) children.push(new SchemaTreeNode({\n\t\t\tkind: \"field\",\n\t\t\tid: `options-${name}`,\n\t\t\tlabel: `options (${optLabels.join(\", \")})`,\n\t\t\tmeta: {\n\t\t\t\t...ifDefined(\"capped\", opts.capped ?? void 0),\n\t\t\t\t...ifDefined(\"timeseries\", opts.timeseries ?? void 0),\n\t\t\t\t...ifDefined(\"collation\", opts.collation ?? void 0),\n\t\t\t\t...ifDefined(\"changeStreamPreAndPostImages\", opts.changeStreamPreAndPostImages ?? void 0),\n\t\t\t\t...ifDefined(\"clusteredIndex\", opts.clusteredIndex ?? void 0)\n\t\t\t}\n\t\t}));\n\t}\n\treturn new SchemaTreeNode({\n\t\tkind: \"collection\",\n\t\tid: `collection-${name}`,\n\t\tlabel: `collection ${name}`,\n\t\t...ifDefined(\"children\", children.length > 0 ? children : void 0)\n\t});\n}\nfunction bsonTypesOf(propDef) {\n\tif (typeof propDef !== \"object\" || propDef === null || !(\"bsonType\" in propDef)) return [\"any\"];\n\tconst { bsonType } = propDef;\n\treturn Array.isArray(bsonType) ? bsonType.map(String) : [String(bsonType)];\n}\n//#endregion\n//#region src/core/control-instance.ts\nfunction deserializeMongoContract(contractJson) {\n\treturn new MongoContractSerializer().deserializeContract(contractJson);\n}\n/**\n* Family-method contract input. By the time control-plane methods\n* (`verify`, `verifySchema`, `sign`, …) are invoked through the CLI\n* control client (`client.ts`), the input has already been threaded\n* through `familyInstance.deserializeContract`. The value is therefore a\n* class-form `MongoTargetContract` (or a structurally-equivalent\n* envelope post-deserialization) and must NOT be re-fed through\n* structural validation (arktype rejects extra keys like `namespaces`).\n*\n* The parameter type on the framework SPI is `unknown` for variance\n* reasons (so the family can express its own contract type without\n* leaking it to the framework). This helper recovers the validated\n* shape with a single narrow cast.\n*/\nfunction asValidatedMongoContract(contract) {\n\treturn blindCast(contract);\n}\nfunction buildVerifyResult(opts) {\n\treturn {\n\t\tok: opts.ok,\n\t\t...ifDefined(\"code\", opts.code),\n\t\tsummary: opts.summary,\n\t\tcontract: {\n\t\t\tstorageHash: opts.contractStorageHash,\n\t\t\t...ifDefined(\"profileHash\", opts.contractProfileHash)\n\t\t},\n\t\t...ifDefined(\"marker\", opts.marker ? {\n\t\t\tstorageHash: opts.marker.storageHash,\n\t\t\tprofileHash: opts.marker.profileHash\n\t\t} : void 0),\n\t\ttarget: {\n\t\t\texpected: opts.expectedTargetId,\n\t\t\t...ifDefined(\"actual\", opts.actualTargetId)\n\t\t},\n\t\tmeta: {\n\t\t\tcontractPath: opts.contractPath,\n\t\t\t...ifDefined(\"configPath\", opts.configPath)\n\t\t},\n\t\ttimings: { total: opts.totalTime }\n\t};\n}\nfunction createMongoFamilyInstance(controlStack) {\n\tconst extensions = blindCast(controlStack.extensions ?? []);\n\tfor (const extension of extensions) if (extension.contractSpace) {\n\t\tconst { contractJson, headRef } = extension.contractSpace;\n\t\tassertDescriptorSelfConsistency({\n\t\t\textensionId: extension.id,\n\t\t\ttarget: contractJson.target,\n\t\t\ttargetFamily: contractJson.targetFamily,\n\t\t\tstorage: contractJson.storage,\n\t\t\theadRefHash: headRef.hash,\n\t\t\t...mongoContractCanonicalizationHooks\n\t\t});\n\t}\n\tconst adapter = blindCast(controlStack.adapter);\n\tconst getControlAdapter = () => {\n\t\tif (!adapter) throw new InternalError(\"Mongo family requires an adapter descriptor in ControlStack\");\n\t\treturn adapter.create(blindCast(controlStack));\n\t};\n\tfunction isMongoTargetDriver(driver) {\n\t\treturn driver.targetId === \"mongo\";\n\t}\n\tfunction asMongoDriver(driver) {\n\t\tif (!isMongoTargetDriver(driver)) throw structuredError(\"CONTRACT.TARGET_MISMATCH\", `Expected Mongo control driver with targetId 'mongo', got '${driver.targetId}'`);\n\t\treturn driver;\n\t}\n\tasync function signSpaceMarker(driver, { space, contract, expected }) {\n\t\tconst storageHash = contract.storage.storageHash;\n\t\tconst profileHash = contract.profileHash;\n\t\tconst signed = {\n\t\t\tspace,\n\t\t\tcontract: {\n\t\t\t\tstorageHash,\n\t\t\t\tprofileHash\n\t\t\t}\n\t\t};\n\t\tconst controlAdapter = getControlAdapter();\n\t\tconst readHashes = async () => {\n\t\t\tconst marker = await controlAdapter.readMarker(driver, space);\n\t\t\treturn marker === null ? null : {\n\t\t\t\tstorageHash: marker.storageHash,\n\t\t\t\tprofileHash: marker.profileHash\n\t\t\t};\n\t\t};\n\t\tconst existing = await readHashes();\n\t\tif (!sameMarkerHashes(existing, expected)) return {\n\t\t\t...signed,\n\t\t\tstatus: \"conflict\",\n\t\t\texpected,\n\t\t\tfound: existing\n\t\t};\n\t\tif (existing === null) {\n\t\t\tawait controlAdapter.initMarker(driver, space, {\n\t\t\t\tstorageHash,\n\t\t\t\tprofileHash\n\t\t\t});\n\t\t\treturn {\n\t\t\t\t...signed,\n\t\t\t\tstatus: \"created\"\n\t\t\t};\n\t\t}\n\t\tif (existing.storageHash === storageHash && existing.profileHash === profileHash) return {\n\t\t\t...signed,\n\t\t\tstatus: \"unchanged\"\n\t\t};\n\t\tif (!await controlAdapter.updateMarker(driver, space, existing.storageHash, {\n\t\t\tstorageHash,\n\t\t\tprofileHash\n\t\t})) return {\n\t\t\t...signed,\n\t\t\tstatus: \"conflict\",\n\t\t\texpected,\n\t\t\tfound: await readHashes()\n\t\t};\n\t\treturn {\n\t\t\t...signed,\n\t\t\tstatus: \"updated\",\n\t\t\tprevious: existing\n\t\t};\n\t}\n\treturn {\n\t\tfamilyId: \"mongo\",\n\t\tdeserializeContract(contractJson) {\n\t\t\treturn blindCast(deserializeMongoContract(contractJson));\n\t\t},\n\t\tasync verify(options) {\n\t\t\tconst { driver, contract: rawContract, expectedTargetId, contractPath, configPath } = options;\n\t\t\tconst startTime = Date.now();\n\t\t\tconst contract = asValidatedMongoContract(rawContract);\n\t\t\tconst contractStorageHash = contract.storage.storageHash;\n\t\t\tconst contractProfileHash = contract.profileHash;\n\t\t\tconst contractTarget = contract.target;\n\t\t\tconst baseOpts = {\n\t\t\t\tcontractStorageHash,\n\t\t\t\tcontractProfileHash,\n\t\t\t\texpectedTargetId,\n\t\t\t\tcontractPath,\n\t\t\t\t...ifDefined(\"configPath\", configPath)\n\t\t\t};\n\t\t\tif (contractTarget !== expectedTargetId) return buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: false,\n\t\t\t\tcode: VERIFY_CODE_TARGET_MISMATCH,\n\t\t\t\tsummary: \"Target mismatch\",\n\t\t\t\tactualTargetId: contractTarget,\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t\tconst marker = await getControlAdapter().readMarker(asMongoDriver(driver), APP_SPACE_ID);\n\t\t\tif (!marker) return buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: false,\n\t\t\t\tcode: VERIFY_CODE_MARKER_MISSING,\n\t\t\t\tsummary: \"Marker missing\",\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t\tif (marker.storageHash !== contractStorageHash) return buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: false,\n\t\t\t\tcode: VERIFY_CODE_HASH_MISMATCH,\n\t\t\t\tsummary: \"Hash mismatch\",\n\t\t\t\tmarker,\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t\tif (contractProfileHash && marker.profileHash !== contractProfileHash) return buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: false,\n\t\t\t\tcode: VERIFY_CODE_HASH_MISMATCH,\n\t\t\t\tsummary: \"Hash mismatch\",\n\t\t\t\tmarker,\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t\treturn buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: true,\n\t\t\t\tsummary: \"Database matches contract\",\n\t\t\t\tmarker,\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t},\n\t\tverifySchema(options) {\n\t\t\treturn verifyMongoSchema({\n\t\t\t\tcontract: asValidatedMongoContract(options.contract),\n\t\t\t\tschema: options.schema,\n\t\t\t\tstrict: options.strict,\n\t\t\t\tframeworkComponents: options.frameworkComponents\n\t\t\t});\n\t\t},\n\t\tasync signSpaces(options) {\n\t\t\tconst mongoDriver = asMongoDriver(options.driver);\n\t\t\tconst signatures = [];\n\t\t\tfor (const space of options.spaces) signatures.push(await signSpaceMarker(mongoDriver, space));\n\t\t\treturn signatures;\n\t\t},\n\t\tasync readMarker(options) {\n\t\t\treturn getControlAdapter().readMarker(asMongoDriver(options.driver), options.space);\n\t\t},\n\t\tasync readAllMarkers(options) {\n\t\t\treturn getControlAdapter().readAllMarkers(asMongoDriver(options.driver));\n\t\t},\n\t\tasync readLedger(options) {\n\t\t\treturn getControlAdapter().readLedger(asMongoDriver(options.driver), options.space);\n\t\t},\n\t\tasync introspect(options) {\n\t\t\treturn getControlAdapter().introspectSchema(asMongoDriver(options.driver));\n\t\t},\n\t\tcreateRunnerDependencies(options) {\n\t\t\treturn getControlAdapter().createRunnerDependencies(asMongoDriver(options.driver));\n\t\t},\n\t\ttoSchemaView(schema) {\n\t\t\treturn mongoSchemaToView(schema);\n\t\t},\n\t\ttoOperationPreview(operations) {\n\t\t\treturn mongoOperationsToPreview(operations);\n\t\t},\n\t\tstorageNameOf(operation) {\n\t\t\treturn mongoStorageNameOf(operation);\n\t\t}\n\t};\n}\n//#endregion\n//#region src/core/control-descriptor.ts\nconst mongoFamilyAttributeSpecs = mongoAttributeSpecs;\nconst mongoFamilyDescribeUnsupportedAttribute = describeUnsupportedMongoAttribute;\nconst mongoFamilyDescribeUnresolvedType = describeUnresolvedMongoType;\nvar MongoFamilyDescriptor = class {\n\tkind = \"family\";\n\tid = \"mongo\";\n\tfamilyId = \"mongo\";\n\tversion = \"0.0.1\";\n\temission = mongoEmission;\n\tauthoring = {\n\t\tentityTypes: mongoFamilyEntityTypes,\n\t\tpslBlockDescriptors: mongoFamilyPslBlockDescriptors,\n\t\tattributeSpecs: mongoFamilyAttributeSpecs\n\t};\n\tpslDiagnostics = {\n\t\tdescribeUnsupportedAttribute: mongoFamilyDescribeUnsupportedAttribute,\n\t\tdescribeUnresolvedType: mongoFamilyDescribeUnresolvedType\n\t};\n\tcreate(stack) {\n\t\treturn createMongoFamilyInstance(stack);\n\t}\n};\nconst mongoFamilyDescriptor = new MongoFamilyDescriptor();\n//#endregion\nexport { canonicalizeSchemasForVerification, contractToMongoSchemaIR, createMongoFamilyInstance, diffMongoSchemas, fieldRewriteOf, formatMongoOperations, mongoFamilyDescriptor, mongoOperationsToPreview };\n\n//# sourceMappingURL=control.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"control-DDNPkUnb.mjs","names":[],"sources":["../../../../2-mongo-family/9-family/dist/control.mjs"],"sourcesContent":["import { i as contractToMongoSchemaIR, n as canonicalizeSchemasForVerification, r as diffMongoSchemas, t as verifyMongoSchema } from \"./verify-mongo-schema-CeQP5N4k.mjs\";\nimport { n as mongoFamilyPslBlockDescriptors, t as mongoFamilyEntityTypes } from \"./authoring-entity-types-CvqTq1Za.mjs\";\nimport { t as MongoContractSerializer } from \"./mongo-contract-serializer-Zx1rvil3.mjs\";\nimport { ifDefined } from \"@internal/utils/defined\";\nimport { describeUnresolvedMongoType, describeUnsupportedMongoAttribute, mongoAttributeSpecs } from \"@internal/mongo-contract-psl\";\nimport { mongoEmission } from \"@internal/mongo-emitter\";\nimport { structuredError } from \"@internal/utils/structured-error\";\nimport { APP_SPACE_ID, SchemaTreeNode, VERIFY_CODE_HASH_MISMATCH, VERIFY_CODE_MARKER_MISSING, VERIFY_CODE_TARGET_MISMATCH, sameMarkerHashes } from \"@internal/framework-components/control\";\nimport { validatorRootShapesOf } from \"@internal/mongo-contract\";\nimport { blindCast } from \"@internal/utils/casts\";\nimport { assertDescriptorSelfConsistency } from \"@internal/migration-tools/spaces\";\nimport { mongoContractCanonicalizationHooks } from \"@internal/mongo-contract/canonicalization-hooks\";\nimport { InternalError } from \"@internal/utils/internal-error\";\nimport { RawUpdateManyCommand } from \"@internal/mongo-query-ast/execution\";\n//#region src/core/field-rewrite.ts\nconst FIELD_OPERATORS = /* @__PURE__ */ new Set([\"$rename\", \"$unset\"]);\nfunction onlyKey(value) {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return void 0;\n\tconst keys = Object.keys(value);\n\tconst [key] = keys;\n\treturn keys.length === 1 ? key : void 0;\n}\n/**\n* The planner's field rewrite an operation is, if it is one: a single `updateMany` that skips\n* validation and renames or unsets one field.\n*/\nfunction fieldRewriteOf(operation) {\n\tconst run = Reflect.get(operation, \"run\");\n\tif (!Array.isArray(run) || run.length !== 1) return void 0;\n\tconst [step] = run;\n\tconst command = typeof step === \"object\" && step !== null ? Reflect.get(step, \"command\") : void 0;\n\tif (!(command instanceof RawUpdateManyCommand) || command.bypassDocumentValidation !== true) return;\n\tconst operator = onlyKey(command.update);\n\tif (operator === void 0 || !FIELD_OPERATORS.has(operator)) return void 0;\n\tconst field = onlyKey(Reflect.get(command.update, operator));\n\treturn field === void 0 ? void 0 : {\n\t\tcollection: command.collection,\n\t\tfield,\n\t\tcommand\n\t};\n}\n//#endregion\n//#region src/core/operation-preview.ts\nfunction formatKeySpec(keys) {\n\treturn `{ ${keys.map((k) => `${JSON.stringify(k.field)}: ${JSON.stringify(k.direction)}`).join(\", \")} }`;\n}\nconst COMMAND_META_KEYS = /* @__PURE__ */ new Set([\n\t\"kind\",\n\t\"collection\",\n\t\"keys\"\n]);\nfunction formatOptionEntries(cmd) {\n\tconst parts = Object.entries(cmd).filter(([key, value]) => !COMMAND_META_KEYS.has(key) && value !== void 0).map(([key, value]) => `${key}: ${JSON.stringify(value)}`);\n\tif (parts.length === 0) return void 0;\n\treturn `{ ${parts.join(\", \")} }`;\n}\nfunction formatOptions(cmd) {\n\treturn formatOptionEntries(cmd);\n}\nfunction formatCreateCollectionOptions(cmd) {\n\treturn formatOptionEntries(cmd);\n}\nfunction collectionRef(name) {\n\treturn `db.getCollection(${JSON.stringify(name)})`;\n}\nvar MongoDdlCommandFormatter = class {\n\tcreateIndex(cmd) {\n\t\tconst keySpec = formatKeySpec(cmd.keys);\n\t\tconst opts = formatOptions(cmd);\n\t\treturn opts ? `${collectionRef(cmd.collection)}.createIndex(${keySpec}, ${opts})` : `${collectionRef(cmd.collection)}.createIndex(${keySpec})`;\n\t}\n\tdropIndex(cmd) {\n\t\treturn `${collectionRef(cmd.collection)}.dropIndex(${JSON.stringify(cmd.name)})`;\n\t}\n\tcreateCollection(cmd) {\n\t\tconst opts = formatCreateCollectionOptions(cmd);\n\t\treturn opts ? `db.createCollection(${JSON.stringify(cmd.collection)}, ${opts})` : `db.createCollection(${JSON.stringify(cmd.collection)})`;\n\t}\n\tdropCollection(cmd) {\n\t\treturn `${collectionRef(cmd.collection)}.drop()`;\n\t}\n\trenameCollection(cmd) {\n\t\treturn `${collectionRef(cmd.collection)}.renameCollection(${JSON.stringify(cmd.to)})`;\n\t}\n\tcollMod(cmd) {\n\t\tconst parts = [`collMod: ${JSON.stringify(cmd.collection)}`];\n\t\tfor (const [key, value] of Object.entries(cmd)) if (!COMMAND_META_KEYS.has(key) && value !== void 0) parts.push(`${key}: ${JSON.stringify(value)}`);\n\t\treturn `db.runCommand({ ${parts.join(\", \")} })`;\n\t}\n};\nconst formatter = new MongoDdlCommandFormatter();\nfunction formatUpdateMany(cmd) {\n\tconst args = [JSON.stringify(cmd.filter), JSON.stringify(cmd.update)];\n\tif (cmd.bypassDocumentValidation) args.push(\"{ bypassDocumentValidation: true }\");\n\treturn `${collectionRef(cmd.collection)}.updateMany(${args.join(\", \")})`;\n}\nfunction arrayAt(value, key) {\n\tconst entry = Reflect.get(value, key);\n\treturn Array.isArray(entry) ? entry : [];\n}\nfunction objectAt(value, key) {\n\tif (typeof value !== \"object\" || value === null) return void 0;\n\tconst entry = Reflect.get(value, key);\n\treturn typeof entry === \"object\" && entry !== null ? entry : void 0;\n}\nfunction isDdlCommand(value) {\n\treturn value !== void 0 && typeof Reflect.get(value, \"accept\") === \"function\";\n}\nfunction formatMongoOperations(operations) {\n\tconst statements = [];\n\tfor (const operation of operations) {\n\t\tfor (const step of arrayAt(operation, \"execute\")) {\n\t\t\tconst command = objectAt(step, \"command\");\n\t\t\tif (isDdlCommand(command)) statements.push(command.accept(formatter));\n\t\t}\n\t\tconst rewrite = fieldRewriteOf(operation);\n\t\tif (rewrite !== void 0) statements.push(formatUpdateMany(rewrite.command));\n\t}\n\treturn statements;\n}\n/**\n* Wraps `formatMongoOperations` into the family-agnostic\n* `OperationPreview` shape. Each statement carries\n* `language: 'mongodb-shell'`. Mirrors `sqlOperationsToPreview`.\n*/\nfunction mongoOperationsToPreview(operations) {\n\treturn { statements: formatMongoOperations(operations).map((text) => ({\n\t\ttext,\n\t\tlanguage: \"mongodb-shell\"\n\t})) };\n}\n//#endregion\n//#region src/core/operation-storage-name.ts\nfunction collectionOfStep(step) {\n\tif (typeof step !== \"object\" || step === null) return void 0;\n\tconst command = Reflect.get(step, \"command\");\n\tif (typeof command !== \"object\" || command === null) return void 0;\n\tconst collection = Reflect.get(command, \"collection\");\n\treturn typeof collection === \"string\" ? collection : void 0;\n}\n/**\n* The collection an operation's command names, as the database knows it: the name the Mongo\n* planner gives a dropped collection. A planner field rewrite is named `<collection>.<field>`. An operation\n* whose commands name no collection is named by its id.\n*/\nfunction mongoStorageNameOf(operation) {\n\tconst execute = Reflect.get(operation, \"execute\");\n\tconst steps = Array.isArray(execute) ? execute : [];\n\tfor (const step of steps) {\n\t\tconst collection = collectionOfStep(step);\n\t\tif (collection !== void 0) return collection;\n\t}\n\tconst rewrite = fieldRewriteOf(operation);\n\tif (rewrite !== void 0) return `${rewrite.collection}.${rewrite.field}`;\n\tconst run = Reflect.get(operation, \"run\");\n\tfor (const step of Array.isArray(run) ? run : []) {\n\t\tconst collection = collectionOfStep(step);\n\t\tif (collection !== void 0) return collection;\n\t}\n\treturn operation.id;\n}\n//#endregion\n//#region src/core/schema-to-view.ts\nfunction mongoSchemaToView(schema) {\n\tconst collectionNodes = schema.collections.map((collection) => collectionToSchemaNode(collection.name, collection));\n\treturn { root: new SchemaTreeNode({\n\t\tkind: \"root\",\n\t\tid: \"mongo-schema\",\n\t\tlabel: \"database\",\n\t\t...ifDefined(\"children\", collectionNodes.length > 0 ? collectionNodes : void 0)\n\t}) };\n}\nfunction collectionToSchemaNode(name, collection) {\n\tconst children = [];\n\tfor (const index of collection.indexes) {\n\t\tconst keysSummary = index.keys.map((k) => {\n\t\t\tif (k.direction === 1) return k.field;\n\t\t\tif (k.direction === -1) return `${k.field} desc`;\n\t\t\treturn `${k.field} ${k.direction}`;\n\t\t}).join(\", \");\n\t\tconst prefix = index.unique ? \"unique index\" : \"index\";\n\t\tconst options = [];\n\t\tif (index.sparse) options.push(\"sparse\");\n\t\tif (index.expireAfterSeconds != null) options.push(`ttl: ${index.expireAfterSeconds}s`);\n\t\tif (index.partialFilterExpression) options.push(\"partial\");\n\t\tconst optsSuffix = options.length > 0 ? ` (${options.join(\", \")})` : \"\";\n\t\tchildren.push(new SchemaTreeNode({\n\t\t\tkind: \"index\",\n\t\t\tid: `index-${name}-${index.keys.map((k) => `${k.field}_${k.direction}`).join(\"_\")}`,\n\t\t\tlabel: `${prefix} (${keysSummary})${optsSuffix}`,\n\t\t\tmeta: {\n\t\t\t\tkeys: index.keys,\n\t\t\t\tunique: index.unique,\n\t\t\t\t...ifDefined(\"sparse\", index.sparse || void 0),\n\t\t\t\t...ifDefined(\"expireAfterSeconds\", index.expireAfterSeconds ?? void 0),\n\t\t\t\t...ifDefined(\"partialFilterExpression\", index.partialFilterExpression ?? void 0)\n\t\t\t}\n\t\t}));\n\t}\n\tif (collection.validator) {\n\t\tconst validatorChildren = [];\n\t\tconst roots = validatorRootShapesOf(collection.validator.jsonSchema);\n\t\tconst fields = /* @__PURE__ */ new Map();\n\t\tfor (const root of roots) for (const [propName, propDef] of Object.entries(root.properties)) {\n\t\t\tconst types = fields.get(propName) ?? /* @__PURE__ */ new Set();\n\t\t\tfor (const type of bsonTypesOf(propDef)) types.add(type);\n\t\t\tfields.set(propName, types);\n\t\t}\n\t\tfor (const [propName, types] of fields) {\n\t\t\tconst bsonType = types.has(\"any\") ? \"any\" : [...types].join(\",\");\n\t\t\tconst required = roots.every((root) => !Object.hasOwn(root.properties, propName) || root.required.includes(propName));\n\t\t\tvalidatorChildren.push(new SchemaTreeNode({\n\t\t\t\tkind: \"field\",\n\t\t\t\tid: `field-${name}-${propName}`,\n\t\t\t\tlabel: `${propName}: ${bsonType}${required ? \" (required)\" : \"\"}`\n\t\t\t}));\n\t\t}\n\t\tchildren.push(new SchemaTreeNode({\n\t\t\tkind: \"field\",\n\t\t\tid: `validator-${name}`,\n\t\t\tlabel: `validator (level: ${collection.validator.validationLevel}, action: ${collection.validator.validationAction})`,\n\t\t\tmeta: {\n\t\t\t\tvalidationLevel: collection.validator.validationLevel,\n\t\t\t\tvalidationAction: collection.validator.validationAction,\n\t\t\t\tjsonSchema: collection.validator.jsonSchema\n\t\t\t},\n\t\t\t...ifDefined(\"children\", validatorChildren.length > 0 ? validatorChildren : void 0)\n\t\t}));\n\t}\n\tif (collection.options) {\n\t\tconst opts = collection.options;\n\t\tconst optLabels = [];\n\t\tif (opts.capped) optLabels.push(\"capped\");\n\t\tif (opts.timeseries) optLabels.push(\"timeseries\");\n\t\tif (opts.collation) optLabels.push(\"collation\");\n\t\tif (opts.changeStreamPreAndPostImages) optLabels.push(\"changeStreamPreAndPostImages\");\n\t\tif (opts.clusteredIndex) optLabels.push(\"clusteredIndex\");\n\t\tif (optLabels.length > 0) children.push(new SchemaTreeNode({\n\t\t\tkind: \"field\",\n\t\t\tid: `options-${name}`,\n\t\t\tlabel: `options (${optLabels.join(\", \")})`,\n\t\t\tmeta: {\n\t\t\t\t...ifDefined(\"capped\", opts.capped ?? void 0),\n\t\t\t\t...ifDefined(\"timeseries\", opts.timeseries ?? void 0),\n\t\t\t\t...ifDefined(\"collation\", opts.collation ?? void 0),\n\t\t\t\t...ifDefined(\"changeStreamPreAndPostImages\", opts.changeStreamPreAndPostImages ?? void 0),\n\t\t\t\t...ifDefined(\"clusteredIndex\", opts.clusteredIndex ?? void 0)\n\t\t\t}\n\t\t}));\n\t}\n\treturn new SchemaTreeNode({\n\t\tkind: \"collection\",\n\t\tid: `collection-${name}`,\n\t\tlabel: `collection ${name}`,\n\t\t...ifDefined(\"children\", children.length > 0 ? children : void 0)\n\t});\n}\nfunction bsonTypesOf(propDef) {\n\tif (typeof propDef !== \"object\" || propDef === null || !(\"bsonType\" in propDef)) return [\"any\"];\n\tconst { bsonType } = propDef;\n\treturn Array.isArray(bsonType) ? bsonType.map(String) : [String(bsonType)];\n}\n//#endregion\n//#region src/core/control-instance.ts\nfunction deserializeMongoContract(contractJson) {\n\treturn new MongoContractSerializer().deserializeContract(contractJson);\n}\n/**\n* Family-method contract input. By the time control-plane methods\n* (`verify`, `verifySchema`, `sign`, …) are invoked through the CLI\n* control client (`client.ts`), the input has already been threaded\n* through `familyInstance.deserializeContract`. The value is therefore a\n* class-form `MongoTargetContract` (or a structurally-equivalent\n* envelope post-deserialization) and must NOT be re-fed through\n* structural validation (arktype rejects extra keys like `namespaces`).\n*\n* The parameter type on the framework SPI is `unknown` for variance\n* reasons (so the family can express its own contract type without\n* leaking it to the framework). This helper recovers the validated\n* shape with a single narrow cast.\n*/\nfunction asValidatedMongoContract(contract) {\n\treturn blindCast(contract);\n}\nfunction buildVerifyResult(opts) {\n\treturn {\n\t\tok: opts.ok,\n\t\t...ifDefined(\"code\", opts.code),\n\t\tsummary: opts.summary,\n\t\tcontract: {\n\t\t\tstorageHash: opts.contractStorageHash,\n\t\t\t...ifDefined(\"profileHash\", opts.contractProfileHash)\n\t\t},\n\t\t...ifDefined(\"marker\", opts.marker ? {\n\t\t\tstorageHash: opts.marker.storageHash,\n\t\t\tprofileHash: opts.marker.profileHash\n\t\t} : void 0),\n\t\ttarget: {\n\t\t\texpected: opts.expectedTargetId,\n\t\t\t...ifDefined(\"actual\", opts.actualTargetId)\n\t\t},\n\t\tmeta: {\n\t\t\tcontractPath: opts.contractPath,\n\t\t\t...ifDefined(\"configPath\", opts.configPath)\n\t\t},\n\t\ttimings: { total: opts.totalTime }\n\t};\n}\nfunction createMongoFamilyInstance(controlStack) {\n\tconst extensions = blindCast(controlStack.extensions ?? []);\n\tfor (const extension of extensions) if (extension.contractSpace) {\n\t\tconst { contractJson, headRef } = extension.contractSpace;\n\t\tassertDescriptorSelfConsistency({\n\t\t\textensionId: extension.id,\n\t\t\ttarget: contractJson.target,\n\t\t\ttargetFamily: contractJson.targetFamily,\n\t\t\tstorage: contractJson.storage,\n\t\t\theadRefHash: headRef.hash,\n\t\t\t...mongoContractCanonicalizationHooks\n\t\t});\n\t}\n\tconst adapter = blindCast(controlStack.adapter);\n\tconst getControlAdapter = () => {\n\t\tif (!adapter) throw new InternalError(\"Mongo family requires an adapter descriptor in ControlStack\");\n\t\treturn adapter.create(blindCast(controlStack));\n\t};\n\tfunction isMongoTargetDriver(driver) {\n\t\treturn driver.targetId === \"mongo\";\n\t}\n\tfunction asMongoDriver(driver) {\n\t\tif (!isMongoTargetDriver(driver)) throw structuredError(\"CONTRACT.TARGET_MISMATCH\", `Expected Mongo control driver with targetId 'mongo', got '${driver.targetId}'`);\n\t\treturn driver;\n\t}\n\tasync function signSpaceMarker(driver, { space, contract, expected }) {\n\t\tconst storageHash = contract.storage.storageHash;\n\t\tconst profileHash = contract.profileHash;\n\t\tconst signed = {\n\t\t\tspace,\n\t\t\tcontract: {\n\t\t\t\tstorageHash,\n\t\t\t\tprofileHash\n\t\t\t}\n\t\t};\n\t\tconst controlAdapter = getControlAdapter();\n\t\tconst readHashes = async () => {\n\t\t\tconst marker = await controlAdapter.readMarker(driver, space);\n\t\t\treturn marker === null ? null : {\n\t\t\t\tstorageHash: marker.storageHash,\n\t\t\t\tprofileHash: marker.profileHash\n\t\t\t};\n\t\t};\n\t\tconst existing = await readHashes();\n\t\tif (!sameMarkerHashes(existing, expected)) return {\n\t\t\t...signed,\n\t\t\tstatus: \"conflict\",\n\t\t\texpected,\n\t\t\tfound: existing\n\t\t};\n\t\tif (existing === null) {\n\t\t\tawait controlAdapter.initMarker(driver, space, {\n\t\t\t\tstorageHash,\n\t\t\t\tprofileHash\n\t\t\t});\n\t\t\treturn {\n\t\t\t\t...signed,\n\t\t\t\tstatus: \"created\"\n\t\t\t};\n\t\t}\n\t\tif (existing.storageHash === storageHash && existing.profileHash === profileHash) return {\n\t\t\t...signed,\n\t\t\tstatus: \"unchanged\"\n\t\t};\n\t\tif (!await controlAdapter.updateMarker(driver, space, existing.storageHash, {\n\t\t\tstorageHash,\n\t\t\tprofileHash\n\t\t})) return {\n\t\t\t...signed,\n\t\t\tstatus: \"conflict\",\n\t\t\texpected,\n\t\t\tfound: await readHashes()\n\t\t};\n\t\treturn {\n\t\t\t...signed,\n\t\t\tstatus: \"updated\",\n\t\t\tprevious: existing\n\t\t};\n\t}\n\treturn {\n\t\tfamilyId: \"mongo\",\n\t\tdeserializeContract(contractJson) {\n\t\t\treturn blindCast(deserializeMongoContract(contractJson));\n\t\t},\n\t\tasync verify(options) {\n\t\t\tconst { driver, contract: rawContract, expectedTargetId, contractPath, configPath } = options;\n\t\t\tconst startTime = Date.now();\n\t\t\tconst contract = asValidatedMongoContract(rawContract);\n\t\t\tconst contractStorageHash = contract.storage.storageHash;\n\t\t\tconst contractProfileHash = contract.profileHash;\n\t\t\tconst contractTarget = contract.target;\n\t\t\tconst baseOpts = {\n\t\t\t\tcontractStorageHash,\n\t\t\t\tcontractProfileHash,\n\t\t\t\texpectedTargetId,\n\t\t\t\tcontractPath,\n\t\t\t\t...ifDefined(\"configPath\", configPath)\n\t\t\t};\n\t\t\tif (contractTarget !== expectedTargetId) return buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: false,\n\t\t\t\tcode: VERIFY_CODE_TARGET_MISMATCH,\n\t\t\t\tsummary: \"Target mismatch\",\n\t\t\t\tactualTargetId: contractTarget,\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t\tconst marker = await getControlAdapter().readMarker(asMongoDriver(driver), APP_SPACE_ID);\n\t\t\tif (!marker) return buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: false,\n\t\t\t\tcode: VERIFY_CODE_MARKER_MISSING,\n\t\t\t\tsummary: \"Marker missing\",\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t\tif (marker.storageHash !== contractStorageHash) return buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: false,\n\t\t\t\tcode: VERIFY_CODE_HASH_MISMATCH,\n\t\t\t\tsummary: \"Hash mismatch\",\n\t\t\t\tmarker,\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t\tif (contractProfileHash && marker.profileHash !== contractProfileHash) return buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: false,\n\t\t\t\tcode: VERIFY_CODE_HASH_MISMATCH,\n\t\t\t\tsummary: \"Hash mismatch\",\n\t\t\t\tmarker,\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t\treturn buildVerifyResult({\n\t\t\t\t...baseOpts,\n\t\t\t\tok: true,\n\t\t\t\tsummary: \"Database matches contract\",\n\t\t\t\tmarker,\n\t\t\t\ttotalTime: Date.now() - startTime\n\t\t\t});\n\t\t},\n\t\tverifySchema(options) {\n\t\t\treturn verifyMongoSchema({\n\t\t\t\tcontract: asValidatedMongoContract(options.contract),\n\t\t\t\tschema: options.schema,\n\t\t\t\tstrict: options.strict,\n\t\t\t\tframeworkComponents: options.frameworkComponents\n\t\t\t});\n\t\t},\n\t\tasync signSpaces(options) {\n\t\t\tconst mongoDriver = asMongoDriver(options.driver);\n\t\t\tconst signatures = [];\n\t\t\tfor (const space of options.spaces) signatures.push(await signSpaceMarker(mongoDriver, space));\n\t\t\treturn signatures;\n\t\t},\n\t\tasync readMarker(options) {\n\t\t\treturn getControlAdapter().readMarker(asMongoDriver(options.driver), options.space);\n\t\t},\n\t\tasync readAllMarkers(options) {\n\t\t\treturn getControlAdapter().readAllMarkers(asMongoDriver(options.driver));\n\t\t},\n\t\tasync readLedger(options) {\n\t\t\treturn getControlAdapter().readLedger(asMongoDriver(options.driver), options.space);\n\t\t},\n\t\tasync introspect(options) {\n\t\t\treturn getControlAdapter().introspectSchema(asMongoDriver(options.driver));\n\t\t},\n\t\tcreateRunnerDependencies(options) {\n\t\t\treturn getControlAdapter().createRunnerDependencies(asMongoDriver(options.driver));\n\t\t},\n\t\ttoSchemaView(schema) {\n\t\t\treturn mongoSchemaToView(schema);\n\t\t},\n\t\ttoOperationPreview(operations) {\n\t\t\treturn mongoOperationsToPreview(operations);\n\t\t},\n\t\tstorageNameOf(operation) {\n\t\t\treturn mongoStorageNameOf(operation);\n\t\t}\n\t};\n}\n//#endregion\n//#region src/core/control-descriptor.ts\nconst mongoFamilyAttributeSpecs = mongoAttributeSpecs;\nconst mongoFamilyDescribeUnsupportedAttribute = describeUnsupportedMongoAttribute;\nconst mongoFamilyDescribeUnresolvedType = describeUnresolvedMongoType;\nvar MongoFamilyDescriptor = class {\n\tkind = \"family\";\n\tid = \"mongo\";\n\tfamilyId = \"mongo\";\n\tversion = \"0.0.1\";\n\temission = mongoEmission;\n\tauthoring = {\n\t\tentityTypes: mongoFamilyEntityTypes,\n\t\tpslBlockDescriptors: mongoFamilyPslBlockDescriptors,\n\t\tattributeSpecs: mongoFamilyAttributeSpecs\n\t};\n\tpslDiagnostics = {\n\t\tdescribeUnsupportedAttribute: mongoFamilyDescribeUnsupportedAttribute,\n\t\tdescribeUnresolvedType: mongoFamilyDescribeUnresolvedType\n\t};\n\tcreate(stack) {\n\t\treturn createMongoFamilyInstance(stack);\n\t}\n};\nconst mongoFamilyDescriptor = new MongoFamilyDescriptor();\n//#endregion\nexport { canonicalizeSchemasForVerification, contractToMongoSchemaIR, createMongoFamilyInstance, diffMongoSchemas, fieldRewriteOf, formatMongoOperations, mongoFamilyDescriptor, mongoOperationsToPreview };\n\n//# sourceMappingURL=control.mjs.map"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dist-xk_0xOR-.mjs","names":[],"sources":["../../../../2-mongo-family/2-authoring/contract-psl/dist/index.mjs"],"sourcesContent":["import { i as mongoAttributeSpecs, n as pairMongoBackRelations, r as describeUnsupportedMongoAttribute, t as interpretPslDocumentToMongoContract } from \"./interpreter-DytgJgyY.mjs\";\nimport { collectScalarTypeConstructors, isAuthoringTypeConstructorDescriptor } from \"@internal/framework-components/authoring\";\n//#region src/describe-unresolved-type.ts\nconst EARLIER_MONGO_SCALAR_NAMES = {\n\tBigInt: \"Int64\",\n\tBytes: \"Binary\",\n\tDecimal: \"Decimal128\"\n};\nfunction scalarTypesSentence(types) {\n\tconst current = [...collectScalarTypeConstructors(types).keys()].filter((name) => {\n\t\tconst descriptor = types[name];\n\t\treturn !(descriptor !== void 0 && isAuthoringTypeConstructorDescriptor(descriptor) && descriptor.deprecated !== void 0);\n\t});\n\treturn current.length === 0 ? \"No Mongo scalar types are registered.\" : `The Mongo scalar types are ${current.length === 1 ? current.join(\"\") : `${current.slice(0, -1).join(\", \")} and ${current.at(-1)}`}.`;\n}\nfunction describeUnresolvedMongoType(contributions) {\n\tconst types = contributions.type;\n\tconst scalars = collectScalarTypeConstructors(types);\n\treturn ({ field, owner, written }) => {\n\t\tif (field.typeNamespaceId !== void 0 || field.typeConstructor !== void 0) return;\n\t\tconst replacement = EARLIER_MONGO_SCALAR_NAMES[written];\n\t\tif (replacement === void 0 || !scalars.has(replacement)) return `Field \"${owner.name}.${field.name}\" has type \"${written}\", which is not a scalar type, an enum, a composite type or a model. ${scalarTypesSentence(types)}`;\n\t\treturn `Field \"${owner.name}.${field.name}\" has type \"${written}\", which is not a Mongo scalar type; use \"${replacement}\".`;\n\t};\n}\n//#endregion\nexport { describeUnresolvedMongoType, describeUnsupportedMongoAttribute, interpretPslDocumentToMongoContract, mongoAttributeSpecs, pairMongoBackRelations };\n\n//# sourceMappingURL=index.mjs.map"],"mappings":";;AAGA,MAAM,6BAA6B;CAClC,QAAQ;CACR,OAAO;CACP,SAAS;AACV;AACA,SAAS,oBAAoB,OAAO;CACnC,MAAM,UAAU,CAAC,GAAG,8BAA8B,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,SAAS;EACjF,MAAM,aAAa,MAAM;EACzB,OAAO,EAAE,eAAe,KAAK,KAAK,qCAAqC,UAAU,KAAK,WAAW,eAAe,KAAK;CACtH,CAAC;CACD,OAAO,QAAQ,WAAW,IAAI,0CAA0C,8BAA8B,QAAQ,WAAW,IAAI,QAAQ,KAAK,EAAE,IAAI,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,QAAQ,GAAG,EAAE,IAAI;AAC5M;AACA,SAAS,4BAA4B,eAAe;CACnD,MAAM,QAAQ,cAAc;CAC5B,MAAM,UAAU,8BAA8B,KAAK;CACnD,QAAQ,EAAE,OAAO,OAAO,cAAc;EACrC,IAAI,MAAM,oBAAoB,KAAK,KAAK,MAAM,oBAAoB,KAAK,GAAG;EAC1E,MAAM,cAAc,2BAA2B;EAC/C,IAAI,gBAAgB,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,GAAG,OAAO,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK,cAAc,QAAQ,uEAAuE,oBAAoB,KAAK;EACzN,OAAO,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK,cAAc,QAAQ,4CAA4C,YAAY;CACzH;AACD"}
1
+ {"version":3,"file":"dist-xk_0xOR-.mjs","names":[],"sources":["../../../../2-mongo-family/2-authoring/contract-psl/dist/index.mjs"],"sourcesContent":["import { i as mongoAttributeSpecs, n as pairMongoBackRelations, r as describeUnsupportedMongoAttribute, t as interpretPslDocumentToMongoContract } from \"./interpreter-mcrmtSBJ.mjs\";\nimport { collectScalarTypeConstructors, isAuthoringTypeConstructorDescriptor } from \"@internal/framework-components/authoring\";\n//#region src/describe-unresolved-type.ts\nconst EARLIER_MONGO_SCALAR_NAMES = {\n\tBigInt: \"Int64\",\n\tBytes: \"Binary\",\n\tDecimal: \"Decimal128\"\n};\nfunction scalarTypesSentence(types) {\n\tconst current = [...collectScalarTypeConstructors(types).keys()].filter((name) => {\n\t\tconst descriptor = types[name];\n\t\treturn !(descriptor !== void 0 && isAuthoringTypeConstructorDescriptor(descriptor) && descriptor.deprecated !== void 0);\n\t});\n\treturn current.length === 0 ? \"No Mongo scalar types are registered.\" : `The Mongo scalar types are ${current.length === 1 ? current.join(\"\") : `${current.slice(0, -1).join(\", \")} and ${current.at(-1)}`}.`;\n}\nfunction describeUnresolvedMongoType(contributions) {\n\tconst types = contributions.type;\n\tconst scalars = collectScalarTypeConstructors(types);\n\treturn ({ field, owner, written }) => {\n\t\tif (field.typeNamespaceId !== void 0 || field.typeConstructor !== void 0) return;\n\t\tconst replacement = EARLIER_MONGO_SCALAR_NAMES[written];\n\t\tif (replacement === void 0 || !scalars.has(replacement)) return `Field \"${owner.name}.${field.name}\" has type \"${written}\", which is not a scalar type, an enum, a composite type or a model. ${scalarTypesSentence(types)}`;\n\t\treturn `Field \"${owner.name}.${field.name}\" has type \"${written}\", which is not a Mongo scalar type; use \"${replacement}\".`;\n\t};\n}\n//#endregion\nexport { describeUnresolvedMongoType, describeUnsupportedMongoAttribute, interpretPslDocumentToMongoContract, mongoAttributeSpecs, pairMongoBackRelations };\n\n//# sourceMappingURL=index.mjs.map"],"mappings":";;AAGA,MAAM,6BAA6B;CAClC,QAAQ;CACR,OAAO;CACP,SAAS;AACV;AACA,SAAS,oBAAoB,OAAO;CACnC,MAAM,UAAU,CAAC,GAAG,8BAA8B,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,SAAS;EACjF,MAAM,aAAa,MAAM;EACzB,OAAO,EAAE,eAAe,KAAK,KAAK,qCAAqC,UAAU,KAAK,WAAW,eAAe,KAAK;CACtH,CAAC;CACD,OAAO,QAAQ,WAAW,IAAI,0CAA0C,8BAA8B,QAAQ,WAAW,IAAI,QAAQ,KAAK,EAAE,IAAI,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,QAAQ,GAAG,EAAE,IAAI;AAC5M;AACA,SAAS,4BAA4B,eAAe;CACnD,MAAM,QAAQ,cAAc;CAC5B,MAAM,UAAU,8BAA8B,KAAK;CACnD,QAAQ,EAAE,OAAO,OAAO,cAAc;EACrC,IAAI,MAAM,oBAAoB,KAAK,KAAK,MAAM,oBAAoB,KAAK,GAAG;EAC1E,MAAM,cAAc,2BAA2B;EAC/C,IAAI,gBAAgB,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,GAAG,OAAO,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK,cAAc,QAAQ,uEAAuE,oBAAoB,KAAK;EACzN,OAAO,UAAU,MAAM,KAAK,GAAG,MAAM,KAAK,cAAc,QAAQ,4CAA4C,YAAY;CACzH;AACD"}
package/dist/family.mjs CHANGED
@@ -2,7 +2,7 @@ import { h as defaultMongoStorageNamespaceId, m as defaultMongoDomainNamespaceId
2
2
  import { i as verifyMongoSchema, n as contractToMongoSchemaIR, r as diffMongoSchemas, t as canonicalizeSchemasForVerification } from "./verify-mongo-schema-CeQP5N4k-CNOctppM.mjs";
3
3
  import { n as mongoFamilyPslBlockDescriptors, t as mongoFamilyEntityTypes } from "./authoring-entity-types-CvqTq1Za-KBOkOZYm.mjs";
4
4
  import { n as MongoContractSerializerBase, t as MongoContractSerializer } from "./mongo-contract-serializer-Zx1rvil3-BywiKCpn.mjs";
5
- import { a as mongoOperationsToPreview, i as mongoFamilyDescriptor, n as fieldRewriteOf, r as formatMongoOperations, t as createMongoFamilyInstance } from "./control-XeK2IiTX.mjs";
5
+ import { a as mongoOperationsToPreview, i as mongoFamilyDescriptor, n as fieldRewriteOf, r as formatMongoOperations, t as createMongoFamilyInstance } from "./control-DDNPkUnb.mjs";
6
6
  import { t as MongoContractView$1 } from "./mongo-contract-view-D5yu2LrY-DCAZYJ4q.mjs";
7
7
  import { t as MongoSchemaVerifierBase } from "./ir-DGm0HXbP.mjs";
8
8
  import { t as MongoMigration } from "./migration-DnQ7_A_B.mjs";
@@ -1,3 +1,3 @@
1
1
  import { n as contractToMongoSchemaIR, r as diffMongoSchemas, t as canonicalizeSchemasForVerification } from "./verify-mongo-schema-CeQP5N4k-CNOctppM.mjs";
2
- import { a as mongoOperationsToPreview, i as mongoFamilyDescriptor, n as fieldRewriteOf, r as formatMongoOperations, t as createMongoFamilyInstance } from "./control-XeK2IiTX.mjs";
2
+ import { a as mongoOperationsToPreview, i as mongoFamilyDescriptor, n as fieldRewriteOf, r as formatMongoOperations, t as createMongoFamilyInstance } from "./control-DDNPkUnb.mjs";
3
3
  export { canonicalizeSchemasForVerification, contractToMongoSchemaIR, createMongoFamilyInstance, diffMongoSchemas, fieldRewriteOf, formatMongoOperations, mongoFamilyDescriptor, mongoOperationsToPreview };
@@ -1,4 +1,4 @@
1
- import { r as mongoAttributeSpecs } from "./interpreter-DytgJgyY-C5FooCz-.mjs";
1
+ import { r as mongoAttributeSpecs } from "./interpreter-mcrmtSBJ-BrAG04TC.mjs";
2
2
  import { n as mongoFamilyPslBlockDescriptors, t as mongoFamilyEntityTypes } from "./authoring-entity-types-CvqTq1Za-KBOkOZYm.mjs";
3
3
  //#region ../../../2-mongo-family/9-family/dist/pack.mjs
4
4
  const mongoFamilyPack = {
@@ -8,11 +8,11 @@ import { assertDefined, invariant } from "@prisma/orm-framework/utils/assertions
8
8
  import { ArrayLiteralAst, FunctionCallAst, PathExprAst } from "@prisma/orm-framework/psl-parser/syntax";
9
9
  import { notOk, ok } from "@prisma/orm-framework/utils/result";
10
10
  import { resolveToOneRelationNullable } from "@prisma/orm-framework/contract-authoring";
11
- import { encodeEnumMembers, enumMemberProblemDiagnostic, instantiateAuthoringEntityType, isAuthoringEntityTypeDescriptor, isAuthoringTypeConstructorDescriptor } from "@prisma/orm-framework/components/authoring";
12
- import { bool, contributedTypeOf, createPslDiagnosticCollector, diagnosticSource, entityRef, fieldAttribute, fieldRef, funcCall, generatorAttributeSpec, identifier, int, interpretAttribute, interpretExtensionBlocks, json, list, mapPslDiagnostics, modelAttribute, nodePslSpan, num, oneOf, optional, record, referencedFieldRef, str, typeReferenceNode } from "@prisma/orm-framework/psl-parser";
11
+ import { encodeEnumMembers, enumMemberProblemDiagnostic, instantiateAuthoringEntityType, instantiateAuthoringTypeAlias, instantiateAuthoringTypeConstructor, isAuthoringEntityTypeDescriptor, isAuthoringTypeConstructorDescriptor, resolveTypeAliasGenerators } from "@prisma/orm-framework/components/authoring";
12
+ import { bool, contributedTypeAliasOf, contributedTypeOf, createPslDiagnosticCollector, diagnosticSource, entityRef, fieldAttribute, fieldRef, funcCall, generatorAttributeSpec, identifier, int, interpretAttribute, interpretExtensionBlocks, json, list, mapPslDiagnostics, modelAttribute, nodePslSpan, num, oneOf, optional, record, referencedFieldRef, refuseRepeatedTypeAliasAttributes, resolveTypeAliases, str, typeAliasSpecContext, typeAttributeSpecContextOfField, typeAttributeSubjectLabel, typeGeneratorAttributeSpec, typeReferenceNode } from "@prisma/orm-framework/psl-parser";
13
13
  import { claimedBlockKeywords, consumeInvalidFkPairing, enumMemberAttributeDiagnostics, fkRelationPairKey, instantiatePslFieldPreset, isBareTypeConstructor, reportPresetNotCalled, reportTypeConstructorNotCalled, requiredOneToOneBackrelationDiagnostic, unsupportedBlockDiagnostic } from "@prisma/orm-framework/psl-parser/interpret";
14
14
  import { ifDefined } from "@prisma/orm-framework/utils/defined";
15
- //#region ../../../2-mongo-family/2-authoring/contract-psl/dist/interpreter-DytgJgyY.mjs
15
+ //#region ../../../2-mongo-family/2-authoring/contract-psl/dist/interpreter-mcrmtSBJ.mjs
16
16
  /** Storage collection name of a model that declares no `@@map`: the model name, verbatim. */
17
17
  function defaultCollectionName(modelName) {
18
18
  return modelName;
@@ -133,8 +133,9 @@ function buildFieldAttributeCtx(input) {
133
133
  symbols: input.symbols
134
134
  };
135
135
  }
136
- const UNLOWERED_FIELD_ATTRIBUTE_HINTS = /* @__PURE__ */ new Map([["updatedAt", "Use @onCreate(now()) @onUpdate(now()) instead."]]);
136
+ const UNLOWERED_FIELD_ATTRIBUTE_HINTS = /* @__PURE__ */ new Map([["updatedAt", "Use @onCreate(now()) @onUpdate(now()), or type the field temporal.UpdatedAt."]]);
137
137
  const DEFAULT_NOW_HINT = "Use @onCreate(now()) instead; MongoDB has no database defaults.";
138
+ /** The hint for an attribute MongoDB PSL does not lower, naming what to write instead. */
138
139
  function unloweredAttributeHint(attribute) {
139
140
  if (attribute.name === "default" && attribute.args[0]?.value.replace(/\s/g, "") === "now()") return DEFAULT_NOW_HINT;
140
141
  return UNLOWERED_FIELD_ATTRIBUTE_HINTS.get(attribute.name);
@@ -474,6 +475,167 @@ function pairMongoBackRelations(input) {
474
475
  diagnostics
475
476
  };
476
477
  }
478
+ /** The field type a type constructor gives, keeping a bare constructor's fixed type params. */
479
+ function scalarTypeOfConstructor(descriptor, call) {
480
+ if (call !== void 0) return {
481
+ kind: "scalar",
482
+ codecId: descriptor.output.codecId
483
+ };
484
+ const { codecId, typeParams } = instantiateAuthoringTypeConstructor(descriptor, []);
485
+ return {
486
+ kind: "scalar",
487
+ codecId,
488
+ ...ifDefined("typeParams", typeParams)
489
+ };
490
+ }
491
+ const GENERATOR_PHASES$1 = ["onCreate", "onUpdate"];
492
+ const MONGO_TYPE_ALIAS_ATTRIBUTE_NAMES = new Set(GENERATOR_PHASES$1);
493
+ function describeUnsupportedMongoAliasAttribute(attribute, declaration) {
494
+ if (attribute.name !== "default") return void 0;
495
+ const base = `Type alias "${declaration.name}" uses unsupported attribute "@default"`;
496
+ const hint = unloweredAttributeHint(attribute);
497
+ return hint === void 0 ? base : `${base}. ${hint}`;
498
+ }
499
+ /**
500
+ * The generator a field's or type alias's `@onCreate(fn())` or `@onUpdate(fn())` resolves to for its type, or `undefined` once the attribute is diagnosed.
501
+ */
502
+ function lowerGeneratorAttribute(input) {
503
+ const interpreted = interpretAttribute(input.attribute.node, typeGeneratorAttributeSpec(input.phase, input.specContext), {
504
+ sources: input.sources,
505
+ symbols: input.symbols,
506
+ binder: input.binder
507
+ });
508
+ if (!interpreted.ok) {
509
+ input.diagnostics.push(...interpreted.failure);
510
+ return;
511
+ }
512
+ const call = interpreted.value.value;
513
+ const { type } = input;
514
+ const resolution = type.kind === "scalar" ? input.generatorFunctions.resolve({
515
+ name: call.fn,
516
+ args: call.args
517
+ }, {
518
+ codecId: type.codecId,
519
+ typeParams: type.typeParams,
520
+ length: void 0
521
+ }) : void 0;
522
+ if (resolution?.ok === true) return resolution.generator;
523
+ const label = typeAttributeSubjectLabel(input.specContext.subject);
524
+ input.diagnostics.push({
525
+ code: "PSL_GENERATOR_NOT_APPLICABLE",
526
+ message: resolution?.reason === "refused" ? `${label}: ${resolution.message}` : `${label}: ${call.fn}() does not apply to this field's type.`,
527
+ ...diagnosticSource(input.sources, input.attribute.node.syntax).at(call.span)
528
+ });
529
+ }
530
+ function aliasType(alias, input) {
531
+ const { base, symbol } = alias;
532
+ if (base.kind === "typeConstructor") return {
533
+ type: scalarTypeOfConstructor(base.descriptor, base.call),
534
+ valueSet: void 0
535
+ };
536
+ if (base.symbol.keyword !== "enum") {
537
+ input.diagnostics.push({
538
+ code: "PSL_UNSUPPORTED_NAMED_TYPE_BASE",
539
+ message: `Type alias "${symbol.name}" references unsupported base type "${alias.baseName}"`,
540
+ ...diagnosticSource(input.sources, symbol.node.syntax).at(symbol.span)
541
+ });
542
+ return;
543
+ }
544
+ const codecId = input.codecIdByEnumName.get(base.symbol.name);
545
+ if (codecId === void 0 || alias.baseResolution.kind !== "block") return void 0;
546
+ return {
547
+ type: {
548
+ kind: "scalar",
549
+ codecId
550
+ },
551
+ valueSet: {
552
+ plane: "domain",
553
+ entityKind: "enum",
554
+ namespaceId: alias.baseResolution.namespace.id,
555
+ entityName: base.symbol.name
556
+ }
557
+ };
558
+ }
559
+ function lowerAliasGenerators(alias, type, input) {
560
+ const specContext = typeAliasSpecContext(alias, input);
561
+ const phases = {};
562
+ for (const phase of GENERATOR_PHASES$1) {
563
+ const [attribute, duplicate] = alias.attributes.filter(({ name }) => name === phase);
564
+ if (attribute === void 0) continue;
565
+ if (duplicate !== void 0) {
566
+ input.diagnostics.push({
567
+ code: "PSL_DUPLICATE_ATTRIBUTE",
568
+ message: `\`@${phase}\` declared more than once on type alias "${alias.symbol.name}".`,
569
+ ...diagnosticSource(input.sources, duplicate.node.syntax).at(duplicate.span)
570
+ });
571
+ continue;
572
+ }
573
+ const generator = lowerGeneratorAttribute({
574
+ ...input,
575
+ phase,
576
+ attribute,
577
+ specContext,
578
+ type
579
+ });
580
+ if (generator !== void 0) phases[phase] = generator;
581
+ }
582
+ return phases.onCreate === void 0 && phases.onUpdate === void 0 ? void 0 : phases;
583
+ }
584
+ function resolveContributedTypeAlias(alias, generatorFunctions) {
585
+ const { type } = instantiateAuthoringTypeAlias(alias.descriptor);
586
+ return {
587
+ alias,
588
+ name: alias.name,
589
+ type: {
590
+ kind: "scalar",
591
+ codecId: type.codecId,
592
+ ...ifDefined("typeParams", type.typeParams)
593
+ },
594
+ valueSet: void 0,
595
+ executionDefaults: resolveTypeAliasGenerators({
596
+ path: alias.name,
597
+ descriptor: alias.descriptor,
598
+ generatorFunctions,
599
+ length: void 0
600
+ })
601
+ };
602
+ }
603
+ /**
604
+ * Resolves each `types {}` alias once: its field type and the values its `@onCreate` and `@onUpdate` generate. MongoDB has no database defaults, so an alias's `@default` is refused here, once, not at each field typed by it.
605
+ */
606
+ function resolveMongoTypeAliases(input) {
607
+ const declared = /* @__PURE__ */ new Map();
608
+ const aliases = resolveTypeAliases({
609
+ declarations: input.declarations,
610
+ binder: input.binder,
611
+ sources: input.sources,
612
+ diagnostics: input.diagnostics,
613
+ authoringTypes: input.authoringTypes,
614
+ acceptedAttributes: MONGO_TYPE_ALIAS_ATTRIBUTE_NAMES,
615
+ describeUnsupportedAttribute: describeUnsupportedMongoAliasAttribute
616
+ });
617
+ for (const alias of aliases.values()) {
618
+ const resolved = aliasType(alias, input);
619
+ if (resolved === void 0) continue;
620
+ declared.set(alias.symbol, {
621
+ alias,
622
+ name: alias.symbol.name,
623
+ ...resolved,
624
+ executionDefaults: lowerAliasGenerators(alias, resolved.type, input)
625
+ });
626
+ }
627
+ const contributed = /* @__PURE__ */ new Map();
628
+ return { ofResolution(resolution) {
629
+ if (resolution?.kind === "namedType") return declared.get(resolution.symbol);
630
+ const alias = contributedTypeAliasOf(resolution);
631
+ if (alias === void 0) return void 0;
632
+ const existing = contributed.get(alias.descriptor);
633
+ if (existing !== void 0) return existing;
634
+ const resolved = resolveContributedTypeAlias(alias, input.generatorFunctions);
635
+ contributed.set(alias.descriptor, resolved);
636
+ return resolved;
637
+ } };
638
+ }
477
639
  /**
478
640
  * Reports `PSL_DEPRECATED_SCALAR_NAME` at the type of a field whose scalar name is a deprecated alias, naming the replacement. The alias resolves to the same codec, so the contract does not change.
479
641
  */
@@ -1229,41 +1391,67 @@ function lowerGeneratorAttributes(input) {
1229
1391
  });
1230
1392
  return "invalid";
1231
1393
  }
1232
- const interpreted = interpretFieldAttribute({
1394
+ const generator = lowerGeneratorAttribute({
1395
+ phase,
1396
+ attribute,
1397
+ specContext: typeAttributeSpecContextOfField(input.specContext),
1398
+ type: input.resolved.field.type,
1233
1399
  symbols: input.specContext.symbols,
1234
- node: attribute.node,
1235
- spec: mongoAttributeSpecs.field[phase](input.specContext),
1236
- model: input.model,
1237
- field,
1238
- sources: input.sources,
1239
1400
  binder: input.binder,
1401
+ sources: input.sources,
1402
+ generatorFunctions: input.generatorFunctions,
1240
1403
  diagnostics
1241
1404
  });
1242
- if (interpreted === void 0) return "invalid";
1243
- const type = input.resolved.field.type;
1244
- const call = interpreted.value;
1245
- const resolution = type.kind === "scalar" ? input.generatorFunctions.resolve({
1246
- name: call.fn,
1247
- args: call.args
1248
- }, {
1249
- codecId: type.codecId,
1250
- typeParams: type.typeParams,
1251
- length: void 0
1252
- }) : void 0;
1253
- if (resolution?.ok === true) {
1254
- phases[phase] = resolution.generator;
1255
- continue;
1256
- }
1405
+ if (generator === void 0) return "invalid";
1406
+ phases[phase] = generator;
1407
+ }
1408
+ return phases.onCreate === void 0 && phases.onUpdate === void 0 ? void 0 : phases;
1409
+ }
1410
+ function fieldOfTypeAlias(field, typeAlias) {
1411
+ return {
1412
+ field: {
1413
+ type: typeAlias.type,
1414
+ nullable: field.optional,
1415
+ many: field.list ? { elementNullable: field.elementOptional } : false,
1416
+ ...ifDefined("valueSet", typeAlias.valueSet)
1417
+ },
1418
+ typeAlias
1419
+ };
1420
+ }
1421
+ /**
1422
+ * Whether a field may take what its type alias carries: it repeats none of the alias's attributes, and, when the alias generates a value, it is required and not a list. Reports each refusal at the field.
1423
+ */
1424
+ function acceptsTypeAliasGenerators(input) {
1425
+ const { field, typeAlias, diagnostics } = input;
1426
+ const fieldPath = `${input.modelName}.${field.name}`;
1427
+ if (refuseRepeatedTypeAliasAttributes({
1428
+ field,
1429
+ fieldPath,
1430
+ alias: typeAlias.alias,
1431
+ sources: input.sources,
1432
+ diagnostics
1433
+ })) return false;
1434
+ if (typeAlias.executionDefaults === void 0) return true;
1435
+ const at = diagnosticSource(input.sources, field.node.syntax).at(field.span);
1436
+ if (field.list) {
1257
1437
  diagnostics.push({
1258
- code: "PSL_GENERATOR_NOT_APPLICABLE",
1259
- message: resolution?.reason === "refused" ? `${fieldLabel}: ${resolution.message}` : `${fieldLabel}: ${call.fn}() does not apply to this field's type.`,
1260
- ...diagnosticSource(input.sources, field.node.syntax).at(call.span)
1438
+ code: "PSL_LIST_EXECUTION_DEFAULT_UNSUPPORTED",
1439
+ message: `Field "${fieldPath}" is a list, and its type alias "${typeAlias.name}" generates a value. Lists have no per-element generated values; remove "[]" or type the field without the alias.`,
1440
+ ...at
1261
1441
  });
1262
- return "invalid";
1442
+ return false;
1263
1443
  }
1264
- return phases.onCreate === void 0 && phases.onUpdate === void 0 ? void 0 : phases;
1444
+ if (field.optional) {
1445
+ diagnostics.push({
1446
+ code: "PSL_OPTIONAL_EXECUTION_DEFAULT_UNSUPPORTED",
1447
+ message: `Field "${fieldPath}" is optional, and its type alias "${typeAlias.name}" generates a value, which needs a required field in MongoDB. Remove "?" or type the field without the alias.`,
1448
+ ...at
1449
+ });
1450
+ return false;
1451
+ }
1452
+ return true;
1265
1453
  }
1266
- function resolveNonRelationField(field, owner, resolution, codecIdByEnumName, presetContext, scalarNames) {
1454
+ function resolveNonRelationField(field, owner, resolution, codecIdByEnumName, presetContext, scalarNames, typeAliases) {
1267
1455
  const ownerName = owner.name;
1268
1456
  if (resolution?.kind === "compositeType") return { field: {
1269
1457
  type: {
@@ -1292,7 +1480,19 @@ function resolveNonRelationField(field, owner, resolution, codecIdByEnumName, pr
1292
1480
  valueSet
1293
1481
  } };
1294
1482
  }
1295
- if (resolution?.kind === "model" || resolution?.kind === "namedType" || resolution?.kind === "block" || resolution?.kind === "crossSpace") {
1483
+ if (resolution?.kind === "namedType") {
1484
+ if (field.typeConstructor !== void 0) {
1485
+ presetContext.diagnostics.push({
1486
+ code: "PSL_UNSUPPORTED_FIELD_TYPE",
1487
+ message: `Field "${ownerName}.${field.name}" calls "${field.typeConstructor.path.join(".")}", which is a type alias, not a type constructor. Remove the arguments.`,
1488
+ ...diagnosticSource(presetContext.sources, field.node.syntax).at(field.span)
1489
+ });
1490
+ return;
1491
+ }
1492
+ const typeAlias = typeAliases.ofResolution(resolution);
1493
+ return typeAlias === void 0 ? void 0 : fieldOfTypeAlias(field, typeAlias);
1494
+ }
1495
+ if (resolution?.kind === "model" || resolution?.kind === "block" || resolution?.kind === "crossSpace") {
1296
1496
  presetContext.diagnostics.push({
1297
1497
  code: "PSL_UNSUPPORTED_FIELD_TYPE",
1298
1498
  message: `Field "${ownerName}.${field.name}" type "${field.typeName}" is not supported in Mongo PSL interpreter`,
@@ -1305,6 +1505,19 @@ function resolveNonRelationField(field, owner, resolution, codecIdByEnumName, pr
1305
1505
  const call = field.typeConstructor;
1306
1506
  const entityLabel = `Field "${ownerName}.${field.name}"`;
1307
1507
  const source = diagnosticSource(presetContext.sources, field.node.syntax);
1508
+ if (descriptor.kind === "typeAlias") {
1509
+ if (call !== void 0) {
1510
+ presetContext.diagnostics.push({
1511
+ code: "PSL_INVALID_ATTRIBUTE_ARGUMENT",
1512
+ message: `${path.join(".")} is a type alias and takes no arguments.`,
1513
+ ...source.at(call.span)
1514
+ });
1515
+ return;
1516
+ }
1517
+ const typeAlias = typeAliases.ofResolution(resolution);
1518
+ invariant(typeAlias !== void 0, "A contributed type alias always resolves");
1519
+ return fieldOfTypeAlias(field, typeAlias);
1520
+ }
1308
1521
  if (descriptor.kind === "fieldPreset") {
1309
1522
  if (call === void 0) {
1310
1523
  reportPresetNotCalled({
@@ -1343,10 +1556,7 @@ function resolveNonRelationField(field, owner, resolution, codecIdByEnumName, pr
1343
1556
  }
1344
1557
  if (call === void 0) scalarNames.warnDeprecated(field, descriptor);
1345
1558
  return { field: {
1346
- type: {
1347
- kind: "scalar",
1348
- codecId: descriptor.output.codecId
1349
- },
1559
+ type: scalarTypeOfConstructor(descriptor, call),
1350
1560
  nullable: field.optional,
1351
1561
  many: field.list ? { elementNullable: field.elementOptional } : false
1352
1562
  } };
@@ -1529,6 +1739,18 @@ function interpretPslDocumentToMongoContract(input) {
1529
1739
  diagnostics
1530
1740
  });
1531
1741
  const codecIdByEnumName = new Map(Object.entries(builtEnums).map(([name, e]) => [name, e.codecId]));
1742
+ const typeAliases = resolveMongoTypeAliases({
1743
+ declarations: Object.values(symbolTable.namedTypes),
1744
+ symbols: symbolTable,
1745
+ binder,
1746
+ sources,
1747
+ diagnostics,
1748
+ codecIdByEnumName,
1749
+ defaultFunctionRegistry: input.defaultFunctionRegistry,
1750
+ generatorFunctions,
1751
+ dataTypes: input.dataTypes,
1752
+ authoringTypes: input.authoringContributions?.type
1753
+ });
1532
1754
  const models = {};
1533
1755
  const collections = {};
1534
1756
  const roots = {};
@@ -1617,8 +1839,15 @@ function interpretPslDocumentToMongoContract(input) {
1617
1839
  const resolved = resolveNonRelationField(field, {
1618
1840
  name: pslModel.name,
1619
1841
  kind: "model"
1620
- }, resolution, codecIdByEnumName, presetContext, scalarNames);
1842
+ }, resolution, codecIdByEnumName, presetContext, scalarNames, typeAliases);
1621
1843
  if (!resolved) continue;
1844
+ if (resolved.typeAlias !== void 0 && !acceptsTypeAliasGenerators({
1845
+ field,
1846
+ modelName: pslModel.name,
1847
+ typeAlias: resolved.typeAlias,
1848
+ sources,
1849
+ diagnostics
1850
+ })) continue;
1622
1851
  const mappedName = physicalName(physicalNames, field);
1623
1852
  const unsupported = unsupportedStoredNameReason(mappedName);
1624
1853
  if (unsupported !== void 0) {
@@ -1644,7 +1873,6 @@ function interpretPslDocumentToMongoContract(input) {
1644
1873
  fieldSymbols.set(fieldKey(pslModel.name, field.name), field);
1645
1874
  const generated = lowerGeneratorAttributes({
1646
1875
  field,
1647
- model: pslModel,
1648
1876
  modelName: pslModel.name,
1649
1877
  resolved,
1650
1878
  specContext: {
@@ -1659,8 +1887,9 @@ function interpretPslDocumentToMongoContract(input) {
1659
1887
  diagnostics
1660
1888
  });
1661
1889
  if (generated === "invalid") continue;
1662
- const phases = resolved.executionDefaults === void 0 ? generated : {
1663
- ...resolved.executionDefaults,
1890
+ const inherited = resolved.executionDefaults ?? resolved.typeAlias?.executionDefaults;
1891
+ const phases = inherited === void 0 ? generated : {
1892
+ ...inherited,
1664
1893
  ...generated
1665
1894
  };
1666
1895
  if (phases !== void 0) presetExecutionDefaults.push({
@@ -1732,8 +1961,16 @@ function interpretPslDocumentToMongoContract(input) {
1732
1961
  const resolved = resolveNonRelationField(field, {
1733
1962
  name: compositeType.name,
1734
1963
  kind: "compositeType"
1735
- }, fieldTypeResolution(field, binder), codecIdByEnumName, presetContext, scalarNames);
1964
+ }, fieldTypeResolution(field, binder), codecIdByEnumName, presetContext, scalarNames, typeAliases);
1736
1965
  if (!resolved) continue;
1966
+ if (resolved.typeAlias?.executionDefaults !== void 0) {
1967
+ diagnostics.push({
1968
+ code: "PSL_UNSUPPORTED_FIELD_TYPE",
1969
+ message: `Member "${field.name}" of composite type "${compositeType.name}" is typed by the type alias "${resolved.typeAlias.name}", which generates a value; a composite type member has no generated values.`,
1970
+ ...diagnosticSource(sources, field.node.syntax).at(field.span)
1971
+ });
1972
+ continue;
1973
+ }
1737
1974
  fields[field.name] = resolved.field;
1738
1975
  fieldSymbols.set(fieldKey(compositeType.name, field.name), field);
1739
1976
  }
@@ -1850,4 +2087,4 @@ function interpretPslDocumentToMongoContract(input) {
1850
2087
  //#endregion
1851
2088
  export { pairMongoBackRelations as i, interpretPslDocumentToMongoContract as n, mongoAttributeSpecs as r, describeUnsupportedMongoAttribute as t };
1852
2089
 
1853
- //# sourceMappingURL=interpreter-DytgJgyY-C5FooCz-.mjs.map
2090
+ //# sourceMappingURL=interpreter-mcrmtSBJ-BrAG04TC.mjs.map