{"version":3,"file":"index-tWiOxGDc.cjs","sources":["../node_modules/.pnpm/p-map@7.0.4/node_modules/p-map/index.js","../node_modules/.pnpm/ts-error@1.0.6/node_modules/ts-error/lib/es.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/errors.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/convertWildcardToRegex.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/escapeRegexString.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/parseRegex.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/createStringTest.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/testComparisonRange.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/testRange.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/internalFilter.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/filter.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/highlight.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/isSafeUnquotedExpression.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/grammar.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/isSafePath.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/createGetValueFunctionBody.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/hydrateAst.js","../node_modules/.pnpm/nearley@2.20.1/node_modules/nearley/lib/nearley.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/parse.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/serialize.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/test.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/Liqe.js","../src/private/lucene_to_lucid_translator.ts","../node_modules/.pnpm/@nhtio+middleware@1.20251213.1/node_modules/@nhtio/middleware/index.mjs","../src/private/utils/cache_middleware.ts","../src/private/utils/deep_clone_snapshot.ts","../src/private/utils/cache_codec.ts","../src/private/utils/caching_preloader.ts","../src/private/utils/weak_cache_service.ts","../src/private/router_macro/utils/relationships.ts","../src/private/open_api_schema_service.ts","../src/private/mixin.ts","../src/private/prepare_consume_chain_builder.ts","../src/private/decorator_schemas.ts","../src/private/decorators.ts","../src/private/router_macro/utils/openapi_validation_schemas.ts","../src/private/router_macro/utils/type_guards.ts","../src/private/router_macro/utils/xml.ts","../src/private/router_macro/controllers/resourceful_model_controller.ts","../node_modules/.pnpm/dot-object@2.1.5/node_modules/dot-object/index.js","../src/private/router_macro/services/resourceful_router_options_service.ts","../src/private/router_macro/services/resourceful_router_choices_service.ts","../src/private/router_macro/services/resourceful_router_model_resolver_service.ts","../src/private/router_macro/services/resourceful_router_openapi_document_service.ts","../src/private/router_macro/services/resourceful_router_model_options_service.ts","../src/private/router_macro/index.ts","../src/private/odata_macro/utils/odata.ts","../src/private/helpers.ts","../src/private/odata_macro/services/odata_metadata_service.ts","../src/private/odata_to_lucid_translator.ts","../src/private/odata_macro/controllers/resourceful_model_controller.ts","../src/private/odata_macro/index.ts","../src/integration/configure.ts","../src/index.ts"],"sourcesContent":["export default async function pMap(\n\titerable,\n\tmapper,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tstopOnError = true,\n\t\tsignal,\n\t} = {},\n) {\n\treturn new Promise((resolve_, reject_) => {\n\t\tif (iterable[Symbol.iterator] === undefined && iterable[Symbol.asyncIterator] === undefined) {\n\t\t\tthrow new TypeError(`Expected \\`input\\` to be either an \\`Iterable\\` or \\`AsyncIterable\\`, got (${typeof iterable})`);\n\t\t}\n\n\t\tif (typeof mapper !== 'function') {\n\t\t\tthrow new TypeError('Mapper function is required');\n\t\t}\n\n\t\tif (!((Number.isSafeInteger(concurrency) && concurrency >= 1) || concurrency === Number.POSITIVE_INFINITY)) {\n\t\t\tthrow new TypeError(`Expected \\`concurrency\\` to be an integer from 1 and up or \\`Infinity\\`, got \\`${concurrency}\\` (${typeof concurrency})`);\n\t\t}\n\n\t\tconst result = [];\n\t\tconst errors = [];\n\t\tconst skippedIndexesMap = new Map();\n\t\tlet isRejected = false;\n\t\tlet isResolved = false;\n\t\tlet isIterableDone = false;\n\t\tlet resolvingCount = 0;\n\t\tlet currentIndex = 0;\n\t\tconst iterator = iterable[Symbol.iterator] === undefined ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();\n\n\t\tconst signalListener = () => {\n\t\t\treject(signal.reason);\n\t\t};\n\n\t\tconst cleanup = () => {\n\t\t\tsignal?.removeEventListener('abort', signalListener);\n\t\t};\n\n\t\tconst resolve = value => {\n\t\t\tresolve_(value);\n\t\t\tcleanup();\n\t\t};\n\n\t\tconst reject = reason => {\n\t\t\tisRejected = true;\n\t\t\tisResolved = true;\n\t\t\treject_(reason);\n\t\t\tcleanup();\n\t\t};\n\n\t\tif (signal) {\n\t\t\tif (signal.aborted) {\n\t\t\t\treject(signal.reason);\n\t\t\t}\n\n\t\t\tsignal.addEventListener('abort', signalListener, {once: true});\n\t\t}\n\n\t\tconst next = async () => {\n\t\t\tif (isResolved) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextItem = await iterator.next();\n\n\t\t\tconst index = currentIndex;\n\t\t\tcurrentIndex++;\n\n\t\t\t// Note: `iterator.next()` can be called many times in parallel.\n\t\t\t// This can cause multiple calls to this `next()` function to\n\t\t\t// receive a `nextItem` with `done === true`.\n\t\t\t// The shutdown logic that rejects/resolves must be protected\n\t\t\t// so it runs only one time as the `skippedIndex` logic is\n\t\t\t// non-idempotent.\n\t\t\tif (nextItem.done) {\n\t\t\t\tisIterableDone = true;\n\n\t\t\t\tif (resolvingCount === 0 && !isResolved) {\n\t\t\t\t\tif (!stopOnError && errors.length > 0) {\n\t\t\t\t\t\treject(new AggregateError(errors)); // eslint-disable-line unicorn/error-message\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tisResolved = true;\n\n\t\t\t\t\tif (skippedIndexesMap.size === 0) {\n\t\t\t\t\t\tresolve(result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst pureResult = [];\n\n\t\t\t\t\t// Support multiple `pMapSkip`'s.\n\t\t\t\t\tfor (const [index, value] of result.entries()) {\n\t\t\t\t\t\tif (skippedIndexesMap.get(index) === pMapSkip) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpureResult.push(value);\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(pureResult);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresolvingCount++;\n\n\t\t\t// Intentionally detached\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst element = await nextItem.value;\n\n\t\t\t\t\tif (isResolved) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst value = await mapper(element, index);\n\n\t\t\t\t\t// Use Map to stage the index of the element.\n\t\t\t\t\tif (value === pMapSkip) {\n\t\t\t\t\t\tskippedIndexesMap.set(index, value);\n\t\t\t\t\t}\n\n\t\t\t\t\tresult[index] = value;\n\n\t\t\t\t\tresolvingCount--;\n\t\t\t\t\tawait next();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (stopOnError) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors.push(error);\n\t\t\t\t\t\tresolvingCount--;\n\n\t\t\t\t\t\t// In that case we can't really continue regardless of `stopOnError` state\n\t\t\t\t\t\t// since an iterable is likely to continue throwing after it throws once.\n\t\t\t\t\t\t// If we continue calling `next()` indefinitely we will likely end up\n\t\t\t\t\t\t// in an infinite loop of failed iteration.\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait next();\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})();\n\t\t};\n\n\t\t// Create the concurrent runners in a detached (non-awaited)\n\t\t// promise. We need this so we can await the `next()` calls\n\t\t// to stop creating runners before hitting the concurrency limit\n\t\t// if the iterable has already been marked as done.\n\t\t// NOTE: We *must* do this for async iterators otherwise we'll spin up\n\t\t// infinite `next()` calls by default and never start the event loop.\n\t\t(async () => {\n\t\t\tfor (let index = 0; index < concurrency; index++) {\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\tawait next();\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (isIterableDone || isRejected) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t});\n}\n\nexport function pMapIterable(\n\titerable,\n\tmapper,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tbackpressure = concurrency,\n\t} = {},\n) {\n\tif (iterable[Symbol.iterator] === undefined && iterable[Symbol.asyncIterator] === undefined) {\n\t\tthrow new TypeError(`Expected \\`input\\` to be either an \\`Iterable\\` or \\`AsyncIterable\\`, got (${typeof iterable})`);\n\t}\n\n\tif (typeof mapper !== 'function') {\n\t\tthrow new TypeError('Mapper function is required');\n\t}\n\n\tif (!((Number.isSafeInteger(concurrency) && concurrency >= 1) || concurrency === Number.POSITIVE_INFINITY)) {\n\t\tthrow new TypeError(`Expected \\`concurrency\\` to be an integer from 1 and up or \\`Infinity\\`, got \\`${concurrency}\\` (${typeof concurrency})`);\n\t}\n\n\tif (!((Number.isSafeInteger(backpressure) && backpressure >= concurrency) || backpressure === Number.POSITIVE_INFINITY)) {\n\t\tthrow new TypeError(`Expected \\`backpressure\\` to be an integer from \\`concurrency\\` (${concurrency}) and up or \\`Infinity\\`, got \\`${backpressure}\\` (${typeof backpressure})`);\n\t}\n\n\treturn {\n\t\tasync * [Symbol.asyncIterator]() {\n\t\t\tconst iterator = iterable[Symbol.asyncIterator] === undefined ? iterable[Symbol.iterator]() : iterable[Symbol.asyncIterator]();\n\n\t\t\tconst promises = [];\n\t\t\tlet pendingPromisesCount = 0;\n\t\t\tlet isDone = false;\n\t\t\tlet index = 0;\n\n\t\t\tfunction trySpawn() {\n\t\t\t\tif (isDone || !(pendingPromisesCount < concurrency && promises.length < backpressure)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tpendingPromisesCount++;\n\n\t\t\t\tconst promise = (async () => {\n\t\t\t\t\tconst {done, value} = await iterator.next();\n\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\tpendingPromisesCount--;\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Spawn if still below concurrency and backpressure limit\n\t\t\t\t\ttrySpawn();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst returnValue = await mapper(await value, index++);\n\n\t\t\t\t\t\tpendingPromisesCount--;\n\n\t\t\t\t\t\tif (returnValue === pMapSkip) {\n\t\t\t\t\t\t\tconst index = promises.indexOf(promise);\n\n\t\t\t\t\t\t\tif (index > 0) {\n\t\t\t\t\t\t\t\tpromises.splice(index, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Spawn if still below backpressure limit and just dropped below concurrency limit\n\t\t\t\t\t\ttrySpawn();\n\n\t\t\t\t\t\treturn {done: false, value: returnValue};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tpendingPromisesCount--;\n\t\t\t\t\t\tisDone = true;\n\t\t\t\t\t\treturn {error};\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\tpromises.push(promise);\n\t\t\t}\n\n\t\t\ttrySpawn();\n\n\t\t\twhile (promises.length > 0) {\n\t\t\t\tconst {error, done, value} = await promises[0]; // eslint-disable-line no-await-in-loop\n\n\t\t\t\tpromises.shift();\n\n\t\t\t\tif (error) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\n\t\t\t\tif (done) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Spawn if just dropped below backpressure limit and below the concurrency limit\n\t\t\t\ttrySpawn();\n\n\t\t\t\tif (value === pMapSkip) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tyield value;\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport const pMapSkip = Symbol('skip');\n","export class ExtendableError extends Error {\n  constructor(...params) {\n    super(...params);\n    var message =\n      params.length > 0 && typeof params[0] === \"string\" ? params[0] : \"\";\n\n    // Replace Error with ClassName of the constructor, if it has not been overwritten already\n    if (this.name === undefined || this.name === \"Error\") {\n      Object.defineProperty(this, \"name\", {\n        configurable: true,\n        enumerable: false,\n        value: this.constructor.name,\n        writable: true,\n      });\n    }\n\n    Object.defineProperty(this, \"message\", {\n      configurable: true,\n      enumerable: false,\n      value: message,\n      writable: true,\n    });\n\n    Object.defineProperty(this, \"stack\", {\n      configurable: true,\n      enumerable: false,\n      value: \"\",\n      writable: true,\n    });\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, this.constructor);\n    } else if (this.stack === \"\") {\n      this.stack = new Error(message).stack;\n    }\n  }\n}\n\nexport default ExtendableError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SyntaxError = exports.LiqeError = void 0;\nconst ts_error_1 = require(\"ts-error\");\nclass LiqeError extends ts_error_1.ExtendableError {\n}\nexports.LiqeError = LiqeError;\nclass SyntaxError extends LiqeError {\n    constructor(message, offset, line, column) {\n        super(message);\n        this.message = message;\n        this.offset = offset;\n        this.line = line;\n        this.column = column;\n    }\n}\nexports.SyntaxError = SyntaxError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertWildcardToRegex = void 0;\nconst WILDCARD_RULE = /(\\*+)|(\\?)/g;\nconst convertWildcardToRegex = (pattern) => {\n    return new RegExp(pattern.replaceAll(WILDCARD_RULE, (_match, p1) => {\n        return p1 ? '(.+?)' : '(.)';\n    }));\n};\nexports.convertWildcardToRegex = convertWildcardToRegex;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeRegexString = void 0;\nconst ESCAPE_RULE = /[$()*+.?[\\\\\\]^{|}]/g;\nconst DASH_RULE = /-/g;\nconst escapeRegexString = (subject) => {\n    return subject.replaceAll(ESCAPE_RULE, '\\\\$&').replaceAll(DASH_RULE, '\\\\x2d');\n};\nexports.escapeRegexString = escapeRegexString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseRegex = void 0;\nconst RegExpRule = /(\\/?)(.+)\\1([a-z]*)/;\nconst FlagRule = /^(?!.*?(.).*?\\1)[AJUXgimsux]+$/;\nconst parseRegex = (subject) => {\n    const match = RegExpRule.exec(subject);\n    if (!match) {\n        throw new Error('Invalid RegExp.');\n    }\n    if (match[3] && !FlagRule.test(match[3])) {\n        return new RegExp(subject);\n    }\n    return new RegExp(match[2], match[3]);\n};\nexports.parseRegex = parseRegex;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createStringTest = void 0;\nconst convertWildcardToRegex_1 = require(\"./convertWildcardToRegex\");\nconst escapeRegexString_1 = require(\"./escapeRegexString\");\nconst parseRegex_1 = require(\"./parseRegex\");\nconst createRegexTest = (regexCache, regex) => {\n    let rule;\n    if (regexCache[regex]) {\n        rule = regexCache[regex];\n    }\n    else {\n        rule = (0, parseRegex_1.parseRegex)(regex);\n        regexCache[regex] = rule;\n    }\n    return (subject) => {\n        var _a, _b;\n        return (_b = (_a = subject.match(rule)) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : false;\n    };\n};\nconst createStringTest = (regexCache, ast) => {\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    const { expression } = ast;\n    if (expression.type === 'RangeExpression') {\n        throw new Error('Unexpected range expression.');\n    }\n    if (expression.type === 'RegexExpression') {\n        return createRegexTest(regexCache, expression.value);\n    }\n    if (expression.type !== 'LiteralExpression') {\n        throw new Error('Expected a literal expression.');\n    }\n    const value = String(expression.value);\n    if ((value.includes('*') || value.includes('?')) &&\n        expression.quoted === false) {\n        return createRegexTest(regexCache, String((0, convertWildcardToRegex_1.convertWildcardToRegex)(value)) + 'ui');\n    }\n    else {\n        return createRegexTest(regexCache, '/(' + (0, escapeRegexString_1.escapeRegexString)(value) + ')/' + (expression.quoted ? 'u' : 'ui'));\n    }\n};\nexports.createStringTest = createStringTest;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.testComparisonRange = void 0;\nconst testComparisonRange = (query, value, operator) => {\n    switch (operator) {\n        case ':<':\n            return value < query;\n        case ':<=':\n            return value <= query;\n        case ':=':\n            return value === query;\n        case ':>':\n            return value > query;\n        case ':>=':\n            return value >= query;\n        default:\n            throw new Error(`Unimplemented comparison operator: ${operator}`);\n    }\n};\nexports.testComparisonRange = testComparisonRange;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.testRange = void 0;\nconst testRange = (value, range) => {\n    if (typeof value === 'number') {\n        if (value < range.min) {\n            return false;\n        }\n        if (value === range.min && !range.minInclusive) {\n            return false;\n        }\n        if (value > range.max) {\n            return false;\n        }\n        if (value === range.max && !range.maxInclusive) {\n            return false;\n        }\n        return true;\n    }\n    // @todo handle non-numeric ranges -- https://github.com/gajus/liqe/issues/3\n    return false;\n};\nexports.testRange = testRange;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.internalFilter = void 0;\nconst createStringTest_1 = require(\"./createStringTest\");\nconst testComparisonRange_1 = require(\"./testComparisonRange\");\nconst testRange_1 = require(\"./testRange\");\nconst createValueTest = (ast) => {\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    const { expression } = ast;\n    if (expression.type === 'RangeExpression') {\n        return (value) => {\n            return (0, testRange_1.testRange)(value, expression.range);\n        };\n    }\n    if (expression.type === 'EmptyExpression') {\n        return () => {\n            return false;\n        };\n    }\n    const expressionValue = expression.value;\n    if (ast.operator && ast.operator.operator !== ':') {\n        const operator = ast.operator;\n        if (typeof expressionValue !== 'number') {\n            throw new TypeError('Expected a number.');\n        }\n        return (value) => {\n            if (typeof value !== 'number') {\n                return false;\n            }\n            return (0, testComparisonRange_1.testComparisonRange)(expressionValue, value, operator.operator);\n        };\n    }\n    else if (typeof expressionValue === 'boolean') {\n        return (value) => {\n            return value === expressionValue;\n        };\n    }\n    else if (expressionValue === null) {\n        return (value) => {\n            return value === null;\n        };\n    }\n    else {\n        const testString = (0, createStringTest_1.createStringTest)({}, ast);\n        return (value) => {\n            return testString(String(value));\n        };\n    }\n};\nconst testValue = (ast, value, resultFast, path, highlights) => {\n    if (Array.isArray(value)) {\n        let foundMatch = false;\n        let index = 0;\n        for (const item of value) {\n            if (testValue(ast, item, resultFast, [...path, String(index++)], highlights)) {\n                if (resultFast) {\n                    return true;\n                }\n                foundMatch = true;\n            }\n        }\n        return foundMatch;\n    }\n    else if (typeof value === 'object' && value !== null) {\n        let foundMatch = false;\n        for (const key in value) {\n            if (testValue(ast, value[key], resultFast, [...path, key], highlights)) {\n                if (resultFast) {\n                    return true;\n                }\n                foundMatch = true;\n            }\n        }\n        return foundMatch;\n    }\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    if (!ast.test) {\n        throw new Error('Expected test to be defined.');\n    }\n    const result = ast.test(value);\n    if (result) {\n        highlights.push({\n            ...(typeof result === 'string' && { keyword: result }),\n            path: path.join('.'),\n        });\n        return true;\n    }\n    return Boolean(result);\n};\nconst testField = (row, ast, resultFast, path, highlights) => {\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    if (!ast.test) {\n        ast.test = createValueTest(ast);\n    }\n    if (ast.field.type === 'ImplicitField') {\n        let foundMatch = false;\n        for (const fieldName in row) {\n            if (testValue({\n                ...ast,\n                field: {\n                    location: {\n                        end: -1,\n                        start: -1,\n                    },\n                    name: fieldName,\n                    quoted: true,\n                    quotes: 'double',\n                    type: 'Field',\n                },\n            }, row[fieldName], resultFast, [...path, fieldName], highlights)) {\n                if (resultFast) {\n                    return true;\n                }\n                foundMatch = true;\n            }\n        }\n        return foundMatch;\n    }\n    if (ast.field.name in row) {\n        return testValue(ast, row[ast.field.name], resultFast, path, highlights);\n    }\n    else if (ast.getValue && ast.field.path) {\n        return testValue(ast, ast.getValue(row), resultFast, ast.field.path, highlights);\n    }\n    else if (ast.field.path) {\n        let value = row;\n        for (const key of ast.field.path) {\n            if (typeof value !== 'object' || value === null) {\n                return false;\n            }\n            else if (key in value) {\n                value = value[key];\n            }\n            else {\n                return false;\n            }\n        }\n        return testValue(ast, value, resultFast, ast.field.path, highlights);\n    }\n    else {\n        return false;\n    }\n};\nconst internalFilter = (ast, rows, resultFast = true, path = [], highlights = []) => {\n    if (ast.type === 'Tag') {\n        return rows.filter((row) => {\n            return testField(row, ast, resultFast, ast.field.type === 'ImplicitField' ? path : [...path, ast.field.name], highlights);\n        });\n    }\n    if (ast.type === 'UnaryOperator') {\n        const removeRows = (0, exports.internalFilter)(ast.operand, rows, resultFast, path, []);\n        return rows.filter((row) => {\n            return !removeRows.includes(row);\n        });\n    }\n    if (ast.type === 'ParenthesizedExpression') {\n        return (0, exports.internalFilter)(ast.expression, rows, resultFast, path, highlights);\n    }\n    if (!ast.left) {\n        throw new Error('Expected left to be defined.');\n    }\n    const leftRows = (0, exports.internalFilter)(ast.left, rows, resultFast, path, highlights);\n    if (!ast.right) {\n        throw new Error('Expected right to be defined.');\n    }\n    if (ast.type !== 'LogicalExpression') {\n        throw new Error('Expected a tag expression.');\n    }\n    if (ast.operator.operator === 'OR') {\n        const rightRows = (0, exports.internalFilter)(ast.right, rows, resultFast, path, highlights);\n        return Array.from(new Set([...leftRows, ...rightRows]));\n    }\n    else if (ast.operator.operator === 'AND') {\n        return (0, exports.internalFilter)(ast.right, leftRows, resultFast, path, highlights);\n    }\n    throw new Error('Unexpected state.');\n};\nexports.internalFilter = internalFilter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.filter = void 0;\nconst internalFilter_1 = require(\"./internalFilter\");\nconst filter = (ast, data) => {\n    return (0, internalFilter_1.internalFilter)(ast, data);\n};\nexports.filter = filter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.highlight = void 0;\nconst escapeRegexString_1 = require(\"./escapeRegexString\");\nconst internalFilter_1 = require(\"./internalFilter\");\nconst highlight = (ast, data) => {\n    const highlights = [];\n    (0, internalFilter_1.internalFilter)(ast, [data], false, [], highlights);\n    const aggregatedHighlights = [];\n    for (const highlightNode of highlights) {\n        let aggregatedHighlight = aggregatedHighlights.find((maybeTarget) => {\n            return maybeTarget.path === highlightNode.path;\n        });\n        if (!aggregatedHighlight) {\n            aggregatedHighlight = {\n                keywords: [],\n                path: highlightNode.path,\n            };\n            aggregatedHighlights.push(aggregatedHighlight);\n        }\n        if (highlightNode.keyword) {\n            aggregatedHighlight.keywords.push(highlightNode.keyword);\n        }\n    }\n    return aggregatedHighlights.map((aggregatedHighlight) => {\n        if (aggregatedHighlight.keywords.length > 0) {\n            return {\n                path: aggregatedHighlight.path,\n                query: new RegExp('(' +\n                    aggregatedHighlight.keywords\n                        .map((keyword) => {\n                        return (0, escapeRegexString_1.escapeRegexString)(keyword.trim());\n                    })\n                        .join('|') +\n                    ')'),\n            };\n        }\n        return {\n            path: aggregatedHighlight.path,\n        };\n    });\n};\nexports.highlight = highlight;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSafeUnquotedExpression = void 0;\nconst isSafeUnquotedExpression = (expression) => {\n    return /^[#$*@A-Z_a-z][#$*.@A-Z_a-z-]*$/.test(expression);\n};\nexports.isSafeUnquotedExpression = isSafeUnquotedExpression;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Generated automatically by nearley, version 2.20.1\n// http://github.com/Hardmath123/nearley\n// Bypasses TS6133. Allow declared but unused functions.\n//\nfunction id(d) {\n    return d[0];\n}\nconst grammar = {\n    Lexer: undefined,\n    ParserRules: [\n        {\n            name: 'main',\n            postprocess: (data) => data[1],\n            symbols: ['_', 'logical_expression', '_'],\n        },\n        { name: '_$ebnf$1', symbols: [] },\n        {\n            name: '_$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['_$ebnf$1', 'whitespace_character'],\n        },\n        { name: '_', postprocess: (data) => data[0].length, symbols: ['_$ebnf$1'] },\n        { name: '__$ebnf$1', symbols: ['whitespace_character'] },\n        {\n            name: '__$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['__$ebnf$1', 'whitespace_character'],\n        },\n        {\n            name: '__',\n            postprocess: (data) => data[0].length,\n            symbols: ['__$ebnf$1'],\n        },\n        { name: 'whitespace_character', postprocess: id, symbols: [/[\\t\\n\\v\\f ]/] },\n        { name: 'decimal$ebnf$1', postprocess: id, symbols: [{ literal: '-' }] },\n        { name: 'decimal$ebnf$1', postprocess: () => null, symbols: [] },\n        { name: 'decimal$ebnf$2', symbols: [/\\d/] },\n        {\n            name: 'decimal$ebnf$2',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['decimal$ebnf$2', /\\d/],\n        },\n        { name: 'decimal$ebnf$3$subexpression$1$ebnf$1', symbols: [/\\d/] },\n        {\n            name: 'decimal$ebnf$3$subexpression$1$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['decimal$ebnf$3$subexpression$1$ebnf$1', /\\d/],\n        },\n        {\n            name: 'decimal$ebnf$3$subexpression$1',\n            symbols: [{ literal: '.' }, 'decimal$ebnf$3$subexpression$1$ebnf$1'],\n        },\n        {\n            name: 'decimal$ebnf$3',\n            postprocess: id,\n            symbols: ['decimal$ebnf$3$subexpression$1'],\n        },\n        { name: 'decimal$ebnf$3', postprocess: () => null, symbols: [] },\n        {\n            name: 'decimal',\n            postprocess: (data) => Number.parseFloat((data[0] || '') +\n                data[1].join('') +\n                (data[2] ? '.' + data[2][1].join('') : '')),\n            symbols: ['decimal$ebnf$1', 'decimal$ebnf$2', 'decimal$ebnf$3'],\n        },\n        { name: 'dqstring$ebnf$1', symbols: [] },\n        {\n            name: 'dqstring$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['dqstring$ebnf$1', 'dstrchar'],\n        },\n        {\n            name: 'dqstring',\n            postprocess: (data) => data[1].join(''),\n            symbols: [{ literal: '\"' }, 'dqstring$ebnf$1', { literal: '\"' }],\n        },\n        { name: 'sqstring$ebnf$1', symbols: [] },\n        {\n            name: 'sqstring$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['sqstring$ebnf$1', 'sstrchar'],\n        },\n        {\n            name: 'sqstring',\n            postprocess: (data) => data[1].join(''),\n            symbols: [{ literal: \"'\" }, 'sqstring$ebnf$1', { literal: \"'\" }],\n        },\n        { name: 'dstrchar', postprocess: id, symbols: [/[^\\n\"\\\\]/] },\n        {\n            name: 'dstrchar',\n            postprocess: (data) => JSON.parse('\"' + data.join('') + '\"'),\n            symbols: [{ literal: '\\\\' }, 'strescape'],\n        },\n        { name: 'sstrchar', postprocess: id, symbols: [/[^\\n'\\\\]/] },\n        {\n            name: 'sstrchar',\n            postprocess: (data) => JSON.parse('\"' + data.join('') + '\"'),\n            symbols: [{ literal: '\\\\' }, 'strescape'],\n        },\n        {\n            name: 'sstrchar$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: '\\\\' }, { literal: \"'\" }],\n        },\n        {\n            name: 'sstrchar',\n            postprocess: () => \"'\",\n            symbols: ['sstrchar$string$1'],\n        },\n        { name: 'strescape', postprocess: id, symbols: [/[\"/\\\\bfnrt]/] },\n        {\n            name: 'strescape',\n            postprocess: (data) => data.join(''),\n            symbols: [\n                { literal: 'u' },\n                /[\\dA-Fa-f]/,\n                /[\\dA-Fa-f]/,\n                /[\\dA-Fa-f]/,\n                /[\\dA-Fa-f]/,\n            ],\n        },\n        {\n            name: 'logical_expression',\n            postprocess: id,\n            symbols: ['two_op_logical_expression'],\n        },\n        {\n            name: 'two_op_logical_expression',\n            postprocess: (data) => ({\n                left: data[0],\n                location: {\n                    end: data[2].location.end,\n                    start: data[0].location.start,\n                },\n                operator: data[1],\n                right: data[2],\n                type: 'LogicalExpression',\n            }),\n            symbols: [\n                'pre_two_op_logical_expression',\n                'boolean_operator',\n                'post_one_op_logical_expression',\n            ],\n        },\n        {\n            name: 'two_op_logical_expression',\n            postprocess: (data) => ({\n                left: data[0],\n                location: {\n                    end: data[2].location.end,\n                    start: data[0].location.start,\n                },\n                operator: {\n                    operator: 'AND',\n                    type: 'ImplicitBooleanOperator',\n                },\n                right: data[2],\n                type: 'LogicalExpression',\n            }),\n            symbols: [\n                'pre_two_op_implicit_logical_expression',\n                '__',\n                'post_one_op_implicit_logical_expression',\n            ],\n        },\n        {\n            name: 'two_op_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['one_op_logical_expression'],\n        },\n        {\n            name: 'pre_two_op_implicit_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['two_op_logical_expression'],\n        },\n        {\n            name: 'pre_two_op_implicit_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'two_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'post_one_op_implicit_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['one_op_logical_expression'],\n        },\n        {\n            name: 'post_one_op_implicit_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'one_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'pre_two_op_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['two_op_logical_expression', '__'],\n        },\n        {\n            name: 'pre_two_op_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'two_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (d) => ({\n                expression: {\n                    location: {\n                        end: d[0].location.start + 1,\n                        start: d[0].location.start + 1,\n                    },\n                    type: 'EmptyExpression',\n                },\n                location: { end: d[2].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: ['parentheses_open', '_', 'parentheses_close'],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'two_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'one_op_logical_expression$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: 'N' }, { literal: 'O' }, { literal: 'T' }],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (data, start) => {\n                return {\n                    location: {\n                        end: data[1].location.end,\n                        start,\n                    },\n                    operand: data[1],\n                    operator: 'NOT',\n                    type: 'UnaryOperator',\n                };\n            },\n            symbols: ['one_op_logical_expression$string$1', 'post_boolean_primary'],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (data, start) => {\n                return {\n                    location: {\n                        end: data[1].location.end,\n                        start,\n                    },\n                    operand: data[1],\n                    operator: '-',\n                    type: 'UnaryOperator',\n                };\n            },\n            symbols: [{ literal: '-' }, 'boolean_primary'],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['boolean_primary'],\n        },\n        {\n            name: 'post_one_op_logical_expression',\n            postprocess: (d) => d[1],\n            symbols: ['__', 'one_op_logical_expression'],\n        },\n        {\n            name: 'post_one_op_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location + 1, start: d[0].location },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'one_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'parentheses_open',\n            postprocess: (data, start) => ({ location: { start } }),\n            symbols: [{ literal: '(' }],\n        },\n        {\n            name: 'parentheses_close',\n            postprocess: (data, start) => ({ location: { start } }),\n            symbols: [{ literal: ')' }],\n        },\n        {\n            name: 'boolean_operator$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: 'O' }, { literal: 'R' }],\n        },\n        {\n            name: 'boolean_operator',\n            postprocess: (data, start) => ({\n                location: { end: start + 2, start },\n                operator: 'OR',\n                type: 'BooleanOperator',\n            }),\n            symbols: ['boolean_operator$string$1'],\n        },\n        {\n            name: 'boolean_operator$string$2',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: 'A' }, { literal: 'N' }, { literal: 'D' }],\n        },\n        {\n            name: 'boolean_operator',\n            postprocess: (data, start) => ({\n                location: { end: start + 3, start },\n                operator: 'AND',\n                type: 'BooleanOperator',\n            }),\n            symbols: ['boolean_operator$string$2'],\n        },\n        { name: 'boolean_primary', postprocess: id, symbols: ['tag_expression'] },\n        {\n            name: 'post_boolean_primary',\n            postprocess: (d) => ({\n                expression: d[3],\n                location: { end: d[5].location.start + 1, start: d[1].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                '__',\n                'parentheses_open',\n                '_',\n                'two_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'post_boolean_primary',\n            postprocess: (d) => d[1],\n            symbols: ['__', 'boolean_primary'],\n        },\n        {\n            name: 'tag_expression',\n            postprocess: (data, start) => {\n                const field = {\n                    location: data[0].location,\n                    name: data[0].name,\n                    path: data[0].name.split('.').filter(Boolean),\n                    quoted: data[0].quoted,\n                    quotes: data[0].quotes,\n                    type: 'Field',\n                };\n                if (!data[0].quotes) {\n                    delete field.quotes;\n                }\n                return {\n                    field,\n                    location: {\n                        end: data[2].expression.location.end,\n                        start,\n                    },\n                    operator: data[1],\n                    ...data[2],\n                };\n            },\n            symbols: ['field', 'comparison_operator', 'expression'],\n        },\n        {\n            name: 'tag_expression',\n            postprocess: (data, start) => {\n                const field = {\n                    location: data[0].location,\n                    name: data[0].name,\n                    path: data[0].name.split('.').filter(Boolean),\n                    quoted: data[0].quoted,\n                    quotes: data[0].quotes,\n                    type: 'Field',\n                };\n                if (!data[0].quotes) {\n                    delete field.quotes;\n                }\n                return {\n                    expression: {\n                        location: {\n                            end: data[1].location.end,\n                            start: data[1].location.end,\n                        },\n                        type: 'EmptyExpression',\n                    },\n                    field,\n                    location: {\n                        end: data[1].location.end,\n                        start,\n                    },\n                    operator: data[1],\n                    type: 'Tag',\n                };\n            },\n            symbols: ['field', 'comparison_operator'],\n        },\n        {\n            name: 'tag_expression',\n            postprocess: (data, start) => {\n                return {\n                    field: { type: 'ImplicitField' },\n                    location: { end: data[0].expression.location.end, start },\n                    ...data[0],\n                };\n            },\n            symbols: ['expression'],\n        },\n        { name: 'field$ebnf$1', symbols: [] },\n        {\n            name: 'field$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['field$ebnf$1', /[\\w$.-]/],\n        },\n        {\n            name: 'field',\n            postprocess: (data, start) => ({\n                location: { end: start + (data[0] + data[1].join('')).length, start },\n                name: data[0] + data[1].join(''),\n                quoted: false,\n                type: 'LiteralExpression',\n            }),\n            symbols: [/[$A-Z_a-z]/, 'field$ebnf$1'],\n        },\n        {\n            name: 'field',\n            postprocess: (data, start) => ({\n                location: { end: start + data[0].length + 2, start },\n                name: data[0],\n                quoted: true,\n                quotes: 'single',\n                type: 'LiteralExpression',\n            }),\n            symbols: ['sqstring'],\n        },\n        {\n            name: 'field',\n            postprocess: (data, start) => ({\n                location: { end: start + data[0].length + 2, start },\n                name: data[0],\n                quoted: true,\n                quotes: 'double',\n                type: 'LiteralExpression',\n            }),\n            symbols: ['dqstring'],\n        },\n        {\n            name: 'expression',\n            postprocess: (data, start) => ({\n                expression: {\n                    location: { end: start + data.join('').length, start },\n                    quoted: false,\n                    type: 'LiteralExpression',\n                    value: Number(data.join('')),\n                },\n                type: 'Tag',\n            }),\n            symbols: ['decimal'],\n        },\n        {\n            name: 'expression',\n            postprocess: (data, start) => ({\n                expression: {\n                    location: { end: start + data.join('').length, start },\n                    type: 'RegexExpression',\n                    value: data.join(''),\n                },\n                type: 'Tag',\n            }),\n            symbols: ['regex'],\n        },\n        { name: 'expression', postprocess: (data) => data[0], symbols: ['range'] },\n        {\n            name: 'expression',\n            postprocess: (data, start, reject) => {\n                const value = data.join('');\n                if (data[0] === 'AND' || data[0] === 'OR' || data[0] === 'NOT') {\n                    return reject;\n                }\n                let normalizedValue;\n                if (value === 'true') {\n                    normalizedValue = true;\n                }\n                else if (value === 'false') {\n                    normalizedValue = false;\n                }\n                else if (value === 'null') {\n                    normalizedValue = null;\n                }\n                else {\n                    normalizedValue = value;\n                }\n                return {\n                    expression: {\n                        location: {\n                            end: start + value.length,\n                            start,\n                        },\n                        quoted: false,\n                        type: 'LiteralExpression',\n                        value: normalizedValue,\n                    },\n                    type: 'Tag',\n                };\n            },\n            symbols: ['unquoted_value'],\n        },\n        {\n            name: 'expression',\n            postprocess: (data, start) => ({\n                expression: {\n                    location: { end: start + data.join('').length + 2, start },\n                    quoted: true,\n                    quotes: 'single',\n                    type: 'LiteralExpression',\n                    value: data.join(''),\n                },\n                type: 'Tag',\n            }),\n            symbols: ['sqstring'],\n        },\n        {\n            name: 'expression',\n            postprocess: (data, start) => ({\n                expression: {\n                    location: { end: start + data.join('').length + 2, start },\n                    quoted: true,\n                    quotes: 'double',\n                    type: 'LiteralExpression',\n                    value: data.join(''),\n                },\n                type: 'Tag',\n            }),\n            symbols: ['dqstring'],\n        },\n        {\n            name: 'range$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [\n                { literal: ' ' },\n                { literal: 'T' },\n                { literal: 'O' },\n                { literal: ' ' },\n            ],\n        },\n        {\n            name: 'range',\n            postprocess: (data, start) => {\n                return {\n                    expression: {\n                        location: {\n                            end: data[4].location.start + 1,\n                            start: data[0].location.start,\n                        },\n                        range: {\n                            max: data[3],\n                            maxInclusive: data[4].inclusive,\n                            min: data[1],\n                            minInclusive: data[0].inclusive,\n                        },\n                        type: 'RangeExpression',\n                    },\n                    location: {\n                        start,\n                    },\n                    type: 'Tag',\n                };\n            },\n            symbols: [\n                'range_open',\n                'decimal',\n                'range$string$1',\n                'decimal',\n                'range_close',\n            ],\n        },\n        {\n            name: 'range_open',\n            postprocess: (data, start) => ({ inclusive: true, location: { start } }),\n            symbols: [{ literal: '[' }],\n        },\n        {\n            name: 'range_open',\n            postprocess: (data, start) => ({ inclusive: false, location: { start } }),\n            symbols: [{ literal: '{' }],\n        },\n        {\n            name: 'range_close',\n            postprocess: (data, start) => ({ inclusive: true, location: { start } }),\n            symbols: [{ literal: ']' }],\n        },\n        {\n            name: 'range_close',\n            postprocess: (data, start) => ({ inclusive: false, location: { start } }),\n            symbols: [{ literal: '}' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: [{ literal: ':' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '=' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$1'],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$2',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '>' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$2'],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$3',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '<' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$3'],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$4',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '>' }, { literal: '=' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$4'],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$5',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '<' }, { literal: '=' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$5'],\n        },\n        {\n            name: 'comparison_operator',\n            postprocess: (data, start) => ({\n                location: { end: start + data[0][0].length, start },\n                operator: data[0][0],\n                type: 'ComparisonOperator',\n            }),\n            symbols: ['comparison_operator$subexpression$1'],\n        },\n        {\n            name: 'regex',\n            postprocess: (d) => d.join(''),\n            symbols: ['regex_body', 'regex_flags'],\n        },\n        { name: 'regex_body$ebnf$1', symbols: [] },\n        {\n            name: 'regex_body$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['regex_body$ebnf$1', 'regex_body_char'],\n        },\n        {\n            name: 'regex_body',\n            postprocess: (data) => '/' + data[1].join('') + '/',\n            symbols: [{ literal: '/' }, 'regex_body$ebnf$1', { literal: '/' }],\n        },\n        { name: 'regex_body_char', postprocess: id, symbols: [/[^\\\\]/] },\n        {\n            name: 'regex_body_char',\n            postprocess: (d) => '\\\\' + d[1],\n            symbols: [{ literal: '\\\\' }, /[^\\\\]/],\n        },\n        { name: 'regex_flags', symbols: [] },\n        { name: 'regex_flags$ebnf$1', symbols: [/[dgimsuy]/] },\n        {\n            name: 'regex_flags$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['regex_flags$ebnf$1', /[dgimsuy]/],\n        },\n        {\n            name: 'regex_flags',\n            postprocess: (d) => d[0].join(''),\n            symbols: ['regex_flags$ebnf$1'],\n        },\n        { name: 'unquoted_value$ebnf$1', symbols: [] },\n        {\n            name: 'unquoted_value$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['unquoted_value$ebnf$1', /[\\w#$*.?@\\u0080-\\uFFFF\\-]/],\n        },\n        {\n            name: 'unquoted_value',\n            postprocess: (d) => d[0] + d[1].join(''),\n            symbols: [/[#$*?@A-Z_a-z\\u0080-\\uFFFF]/, 'unquoted_value$ebnf$1'],\n        },\n        { name: 'unquoted_value$ebnf$2', symbols: [/\\d/] },\n        {\n            name: 'unquoted_value$ebnf$2',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['unquoted_value$ebnf$2', /\\d/],\n        },\n        { name: 'unquoted_value$ebnf$3', symbols: [] },\n        {\n            name: 'unquoted_value$ebnf$3',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['unquoted_value$ebnf$3', /[\\w#$*.?@\\u0080-\\uFFFF\\-]/],\n        },\n        {\n            name: 'unquoted_value',\n            postprocess: (d) => d[0].join('') + d[1] + d[2].join(''),\n            symbols: [\n                'unquoted_value$ebnf$2',\n                /[#$*?@A-Z_a-z\\u0080-\\uFFFF\\-]/,\n                'unquoted_value$ebnf$3',\n            ],\n        },\n    ],\n    ParserStart: 'main',\n};\nexports.default = grammar;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSafePath = void 0;\nconst SAFE_PATH_RULE = /^(\\.(?:[_a-zA-Z]\\w*|\\0|[1-9]\\d*))+$/u;\nconst isSafePath = (path) => {\n    return SAFE_PATH_RULE.test(path);\n};\nexports.isSafePath = isSafePath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createGetValueFunctionBody = void 0;\nconst isSafePath_1 = require(\"./isSafePath\");\nconst createGetValueFunctionBody = (path) => {\n    if (!(0, isSafePath_1.isSafePath)(path)) {\n        throw new Error('Unsafe path.');\n    }\n    const body = 'return subject' + path;\n    return body.replaceAll(/(\\.(\\d+))/g, '.[$2]').replaceAll('.', '?.');\n};\nexports.createGetValueFunctionBody = createGetValueFunctionBody;\n","\"use strict\";\n/* eslint-disable no-new-func */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hydrateAst = void 0;\nconst createGetValueFunctionBody_1 = require(\"./createGetValueFunctionBody\");\nconst isSafePath_1 = require(\"./isSafePath\");\nconst hydrateAst = (subject) => {\n    const newSubject = {\n        ...subject,\n    };\n    if (subject.type === 'Tag' &&\n        subject.field.type === 'Field' &&\n        'field' in subject &&\n        (0, isSafePath_1.isSafePath)(subject.field.name)) {\n        newSubject.getValue = new Function('subject', (0, createGetValueFunctionBody_1.createGetValueFunctionBody)(subject.field.name));\n    }\n    if ('left' in subject) {\n        newSubject.left = (0, exports.hydrateAst)(subject.left);\n    }\n    if ('right' in subject) {\n        newSubject.right = (0, exports.hydrateAst)(subject.right);\n    }\n    if ('operand' in subject) {\n        newSubject.operand = (0, exports.hydrateAst)(subject.operand);\n    }\n    return newSubject;\n};\nexports.hydrateAst = hydrateAst;\n","(function(root, factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory();\n    } else {\n        root.nearley = factory();\n    }\n}(this, function() {\n\n    function Rule(name, symbols, postprocess) {\n        this.id = ++Rule.highestId;\n        this.name = name;\n        this.symbols = symbols;        // a list of literal | regex class | nonterminal\n        this.postprocess = postprocess;\n        return this;\n    }\n    Rule.highestId = 0;\n\n    Rule.prototype.toString = function(withCursorAt) {\n        var symbolSequence = (typeof withCursorAt === \"undefined\")\n                             ? this.symbols.map(getSymbolShortDisplay).join(' ')\n                             : (   this.symbols.slice(0, withCursorAt).map(getSymbolShortDisplay).join(' ')\n                                 + \" ● \"\n                                 + this.symbols.slice(withCursorAt).map(getSymbolShortDisplay).join(' ')     );\n        return this.name + \" → \" + symbolSequence;\n    }\n\n\n    // a State is a rule at a position from a given starting point in the input stream (reference)\n    function State(rule, dot, reference, wantedBy) {\n        this.rule = rule;\n        this.dot = dot;\n        this.reference = reference;\n        this.data = [];\n        this.wantedBy = wantedBy;\n        this.isComplete = this.dot === rule.symbols.length;\n    }\n\n    State.prototype.toString = function() {\n        return \"{\" + this.rule.toString(this.dot) + \"}, from: \" + (this.reference || 0);\n    };\n\n    State.prototype.nextState = function(child) {\n        var state = new State(this.rule, this.dot + 1, this.reference, this.wantedBy);\n        state.left = this;\n        state.right = child;\n        if (state.isComplete) {\n            state.data = state.build();\n            // Having right set here will prevent the right state and its children\n            // form being garbage collected\n            state.right = undefined;\n        }\n        return state;\n    };\n\n    State.prototype.build = function() {\n        var children = [];\n        var node = this;\n        do {\n            children.push(node.right.data);\n            node = node.left;\n        } while (node.left);\n        children.reverse();\n        return children;\n    };\n\n    State.prototype.finish = function() {\n        if (this.rule.postprocess) {\n            this.data = this.rule.postprocess(this.data, this.reference, Parser.fail);\n        }\n    };\n\n\n    function Column(grammar, index) {\n        this.grammar = grammar;\n        this.index = index;\n        this.states = [];\n        this.wants = {}; // states indexed by the non-terminal they expect\n        this.scannable = []; // list of states that expect a token\n        this.completed = {}; // states that are nullable\n    }\n\n\n    Column.prototype.process = function(nextColumn) {\n        var states = this.states;\n        var wants = this.wants;\n        var completed = this.completed;\n\n        for (var w = 0; w < states.length; w++) { // nb. we push() during iteration\n            var state = states[w];\n\n            if (state.isComplete) {\n                state.finish();\n                if (state.data !== Parser.fail) {\n                    // complete\n                    var wantedBy = state.wantedBy;\n                    for (var i = wantedBy.length; i--; ) { // this line is hot\n                        var left = wantedBy[i];\n                        this.complete(left, state);\n                    }\n\n                    // special-case nullables\n                    if (state.reference === this.index) {\n                        // make sure future predictors of this rule get completed.\n                        var exp = state.rule.name;\n                        (this.completed[exp] = this.completed[exp] || []).push(state);\n                    }\n                }\n\n            } else {\n                // queue scannable states\n                var exp = state.rule.symbols[state.dot];\n                if (typeof exp !== 'string') {\n                    this.scannable.push(state);\n                    continue;\n                }\n\n                // predict\n                if (wants[exp]) {\n                    wants[exp].push(state);\n\n                    if (completed.hasOwnProperty(exp)) {\n                        var nulls = completed[exp];\n                        for (var i = 0; i < nulls.length; i++) {\n                            var right = nulls[i];\n                            this.complete(state, right);\n                        }\n                    }\n                } else {\n                    wants[exp] = [state];\n                    this.predict(exp);\n                }\n            }\n        }\n    }\n\n    Column.prototype.predict = function(exp) {\n        var rules = this.grammar.byName[exp] || [];\n\n        for (var i = 0; i < rules.length; i++) {\n            var r = rules[i];\n            var wantedBy = this.wants[exp];\n            var s = new State(r, 0, this.index, wantedBy);\n            this.states.push(s);\n        }\n    }\n\n    Column.prototype.complete = function(left, right) {\n        var copy = left.nextState(right);\n        this.states.push(copy);\n    }\n\n\n    function Grammar(rules, start) {\n        this.rules = rules;\n        this.start = start || this.rules[0].name;\n        var byName = this.byName = {};\n        this.rules.forEach(function(rule) {\n            if (!byName.hasOwnProperty(rule.name)) {\n                byName[rule.name] = [];\n            }\n            byName[rule.name].push(rule);\n        });\n    }\n\n    // So we can allow passing (rules, start) directly to Parser for backwards compatibility\n    Grammar.fromCompiled = function(rules, start) {\n        var lexer = rules.Lexer;\n        if (rules.ParserStart) {\n          start = rules.ParserStart;\n          rules = rules.ParserRules;\n        }\n        var rules = rules.map(function (r) { return (new Rule(r.name, r.symbols, r.postprocess)); });\n        var g = new Grammar(rules, start);\n        g.lexer = lexer; // nb. storing lexer on Grammar is iffy, but unavoidable\n        return g;\n    }\n\n\n    function StreamLexer() {\n      this.reset(\"\");\n    }\n\n    StreamLexer.prototype.reset = function(data, state) {\n        this.buffer = data;\n        this.index = 0;\n        this.line = state ? state.line : 1;\n        this.lastLineBreak = state ? -state.col : 0;\n    }\n\n    StreamLexer.prototype.next = function() {\n        if (this.index < this.buffer.length) {\n            var ch = this.buffer[this.index++];\n            if (ch === '\\n') {\n              this.line += 1;\n              this.lastLineBreak = this.index;\n            }\n            return {value: ch};\n        }\n    }\n\n    StreamLexer.prototype.save = function() {\n      return {\n        line: this.line,\n        col: this.index - this.lastLineBreak,\n      }\n    }\n\n    StreamLexer.prototype.formatError = function(token, message) {\n        // nb. this gets called after consuming the offending token,\n        // so the culprit is index-1\n        var buffer = this.buffer;\n        if (typeof buffer === 'string') {\n            var lines = buffer\n                .split(\"\\n\")\n                .slice(\n                    Math.max(0, this.line - 5), \n                    this.line\n                );\n\n            var nextLineBreak = buffer.indexOf('\\n', this.index);\n            if (nextLineBreak === -1) nextLineBreak = buffer.length;\n            var col = this.index - this.lastLineBreak;\n            var lastLineDigits = String(this.line).length;\n            message += \" at line \" + this.line + \" col \" + col + \":\\n\\n\";\n            message += lines\n                .map(function(line, i) {\n                    return pad(this.line - lines.length + i + 1, lastLineDigits) + \" \" + line;\n                }, this)\n                .join(\"\\n\");\n            message += \"\\n\" + pad(\"\", lastLineDigits + col) + \"^\\n\";\n            return message;\n        } else {\n            return message + \" at index \" + (this.index - 1);\n        }\n\n        function pad(n, length) {\n            var s = String(n);\n            return Array(length - s.length + 1).join(\" \") + s;\n        }\n    }\n\n    function Parser(rules, start, options) {\n        if (rules instanceof Grammar) {\n            var grammar = rules;\n            var options = start;\n        } else {\n            var grammar = Grammar.fromCompiled(rules, start);\n        }\n        this.grammar = grammar;\n\n        // Read options\n        this.options = {\n            keepHistory: false,\n            lexer: grammar.lexer || new StreamLexer,\n        };\n        for (var key in (options || {})) {\n            this.options[key] = options[key];\n        }\n\n        // Setup lexer\n        this.lexer = this.options.lexer;\n        this.lexerState = undefined;\n\n        // Setup a table\n        var column = new Column(grammar, 0);\n        var table = this.table = [column];\n\n        // I could be expecting anything.\n        column.wants[grammar.start] = [];\n        column.predict(grammar.start);\n        // TODO what if start rule is nullable?\n        column.process();\n        this.current = 0; // token index\n    }\n\n    // create a reserved token for indicating a parse fail\n    Parser.fail = {};\n\n    Parser.prototype.feed = function(chunk) {\n        var lexer = this.lexer;\n        lexer.reset(chunk, this.lexerState);\n\n        var token;\n        while (true) {\n            try {\n                token = lexer.next();\n                if (!token) {\n                    break;\n                }\n            } catch (e) {\n                // Create the next column so that the error reporter\n                // can display the correctly predicted states.\n                var nextColumn = new Column(this.grammar, this.current + 1);\n                this.table.push(nextColumn);\n                var err = new Error(this.reportLexerError(e));\n                err.offset = this.current;\n                err.token = e.token;\n                throw err;\n            }\n            // We add new states to table[current+1]\n            var column = this.table[this.current];\n\n            // GC unused states\n            if (!this.options.keepHistory) {\n                delete this.table[this.current - 1];\n            }\n\n            var n = this.current + 1;\n            var nextColumn = new Column(this.grammar, n);\n            this.table.push(nextColumn);\n\n            // Advance all tokens that expect the symbol\n            var literal = token.text !== undefined ? token.text : token.value;\n            var value = lexer.constructor === StreamLexer ? token.value : token;\n            var scannable = column.scannable;\n            for (var w = scannable.length; w--; ) {\n                var state = scannable[w];\n                var expect = state.rule.symbols[state.dot];\n                // Try to consume the token\n                // either regex or literal\n                if (expect.test ? expect.test(value) :\n                    expect.type ? expect.type === token.type\n                                : expect.literal === literal) {\n                    // Add it\n                    var next = state.nextState({data: value, token: token, isToken: true, reference: n - 1});\n                    nextColumn.states.push(next);\n                }\n            }\n\n            // Next, for each of the rules, we either\n            // (a) complete it, and try to see if the reference row expected that\n            //     rule\n            // (b) predict the next nonterminal it expects by adding that\n            //     nonterminal's start state\n            // To prevent duplication, we also keep track of rules we have already\n            // added\n\n            nextColumn.process();\n\n            // If needed, throw an error:\n            if (nextColumn.states.length === 0) {\n                // No states at all! This is not good.\n                var err = new Error(this.reportError(token));\n                err.offset = this.current;\n                err.token = token;\n                throw err;\n            }\n\n            // maybe save lexer state\n            if (this.options.keepHistory) {\n              column.lexerState = lexer.save()\n            }\n\n            this.current++;\n        }\n        if (column) {\n          this.lexerState = lexer.save()\n        }\n\n        // Incrementally keep track of results\n        this.results = this.finish();\n\n        // Allow chaining, for whatever it's worth\n        return this;\n    };\n\n    Parser.prototype.reportLexerError = function(lexerError) {\n        var tokenDisplay, lexerMessage;\n        // Planning to add a token property to moo's thrown error\n        // even on erroring tokens to be used in error display below\n        var token = lexerError.token;\n        if (token) {\n            tokenDisplay = \"input \" + JSON.stringify(token.text[0]) + \" (lexer error)\";\n            lexerMessage = this.lexer.formatError(token, \"Syntax error\");\n        } else {\n            tokenDisplay = \"input (lexer error)\";\n            lexerMessage = lexerError.message;\n        }\n        return this.reportErrorCommon(lexerMessage, tokenDisplay);\n    };\n\n    Parser.prototype.reportError = function(token) {\n        var tokenDisplay = (token.type ? token.type + \" token: \" : \"\") + JSON.stringify(token.value !== undefined ? token.value : token);\n        var lexerMessage = this.lexer.formatError(token, \"Syntax error\");\n        return this.reportErrorCommon(lexerMessage, tokenDisplay);\n    };\n\n    Parser.prototype.reportErrorCommon = function(lexerMessage, tokenDisplay) {\n        var lines = [];\n        lines.push(lexerMessage);\n        var lastColumnIndex = this.table.length - 2;\n        var lastColumn = this.table[lastColumnIndex];\n        var expectantStates = lastColumn.states\n            .filter(function(state) {\n                var nextSymbol = state.rule.symbols[state.dot];\n                return nextSymbol && typeof nextSymbol !== \"string\";\n            });\n\n        if (expectantStates.length === 0) {\n            lines.push('Unexpected ' + tokenDisplay + '. I did not expect any more input. Here is the state of my parse table:\\n');\n            this.displayStateStack(lastColumn.states, lines);\n        } else {\n            lines.push('Unexpected ' + tokenDisplay + '. Instead, I was expecting to see one of the following:\\n');\n            // Display a \"state stack\" for each expectant state\n            // - which shows you how this state came to be, step by step.\n            // If there is more than one derivation, we only display the first one.\n            var stateStacks = expectantStates\n                .map(function(state) {\n                    return this.buildFirstStateStack(state, []) || [state];\n                }, this);\n            // Display each state that is expecting a terminal symbol next.\n            stateStacks.forEach(function(stateStack) {\n                var state = stateStack[0];\n                var nextSymbol = state.rule.symbols[state.dot];\n                var symbolDisplay = this.getSymbolDisplay(nextSymbol);\n                lines.push('A ' + symbolDisplay + ' based on:');\n                this.displayStateStack(stateStack, lines);\n            }, this);\n        }\n        lines.push(\"\");\n        return lines.join(\"\\n\");\n    }\n    \n    Parser.prototype.displayStateStack = function(stateStack, lines) {\n        var lastDisplay;\n        var sameDisplayCount = 0;\n        for (var j = 0; j < stateStack.length; j++) {\n            var state = stateStack[j];\n            var display = state.rule.toString(state.dot);\n            if (display === lastDisplay) {\n                sameDisplayCount++;\n            } else {\n                if (sameDisplayCount > 0) {\n                    lines.push('    ^ ' + sameDisplayCount + ' more lines identical to this');\n                }\n                sameDisplayCount = 0;\n                lines.push('    ' + display);\n            }\n            lastDisplay = display;\n        }\n    };\n\n    Parser.prototype.getSymbolDisplay = function(symbol) {\n        return getSymbolLongDisplay(symbol);\n    };\n\n    /*\n    Builds a the first state stack. You can think of a state stack as the call stack\n    of the recursive-descent parser which the Nearley parse algorithm simulates.\n    A state stack is represented as an array of state objects. Within a\n    state stack, the first item of the array will be the starting\n    state, with each successive item in the array going further back into history.\n\n    This function needs to be given a starting state and an empty array representing\n    the visited states, and it returns an single state stack.\n\n    */\n    Parser.prototype.buildFirstStateStack = function(state, visited) {\n        if (visited.indexOf(state) !== -1) {\n            // Found cycle, return null\n            // to eliminate this path from the results, because\n            // we don't know how to display it meaningfully\n            return null;\n        }\n        if (state.wantedBy.length === 0) {\n            return [state];\n        }\n        var prevState = state.wantedBy[0];\n        var childVisited = [state].concat(visited);\n        var childResult = this.buildFirstStateStack(prevState, childVisited);\n        if (childResult === null) {\n            return null;\n        }\n        return [state].concat(childResult);\n    };\n\n    Parser.prototype.save = function() {\n        var column = this.table[this.current];\n        column.lexerState = this.lexerState;\n        return column;\n    };\n\n    Parser.prototype.restore = function(column) {\n        var index = column.index;\n        this.current = index;\n        this.table[index] = column;\n        this.table.splice(index + 1);\n        this.lexerState = column.lexerState;\n\n        // Incrementally keep track of results\n        this.results = this.finish();\n    };\n\n    // nb. deprecated: use save/restore instead!\n    Parser.prototype.rewind = function(index) {\n        if (!this.options.keepHistory) {\n            throw new Error('set option `keepHistory` to enable rewinding')\n        }\n        // nb. recall column (table) indicies fall between token indicies.\n        //        col 0   --   token 0   --   col 1\n        this.restore(this.table[index]);\n    };\n\n    Parser.prototype.finish = function() {\n        // Return the possible parsings\n        var considerations = [];\n        var start = this.grammar.start;\n        var column = this.table[this.table.length - 1]\n        column.states.forEach(function (t) {\n            if (t.rule.name === start\n                    && t.dot === t.rule.symbols.length\n                    && t.reference === 0\n                    && t.data !== Parser.fail) {\n                considerations.push(t);\n            }\n        });\n        return considerations.map(function(c) {return c.data; });\n    };\n\n    function getSymbolLongDisplay(symbol) {\n        var type = typeof symbol;\n        if (type === \"string\") {\n            return symbol;\n        } else if (type === \"object\") {\n            if (symbol.literal) {\n                return JSON.stringify(symbol.literal);\n            } else if (symbol instanceof RegExp) {\n                return 'character matching ' + symbol;\n            } else if (symbol.type) {\n                return symbol.type + ' token';\n            } else if (symbol.test) {\n                return 'token matching ' + String(symbol.test);\n            } else {\n                throw new Error('Unknown symbol type: ' + symbol);\n            }\n        }\n    }\n\n    function getSymbolShortDisplay(symbol) {\n        var type = typeof symbol;\n        if (type === \"string\") {\n            return symbol;\n        } else if (type === \"object\") {\n            if (symbol.literal) {\n                return JSON.stringify(symbol.literal);\n            } else if (symbol instanceof RegExp) {\n                return symbol.toString();\n            } else if (symbol.type) {\n                return '%' + symbol.type;\n            } else if (symbol.test) {\n                return '<' + String(symbol.test) + '>';\n            } else {\n                throw new Error('Unknown symbol type: ' + symbol);\n            }\n        }\n    }\n\n    return {\n        Parser: Parser,\n        Grammar: Grammar,\n        Rule: Rule,\n    };\n\n}));\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parse = void 0;\nconst errors_1 = require(\"./errors\");\nconst grammar_1 = __importDefault(require(\"./grammar\"));\nconst hydrateAst_1 = require(\"./hydrateAst\");\nconst nearley_1 = __importDefault(require(\"nearley\"));\nconst rules = nearley_1.default.Grammar.fromCompiled(grammar_1.default);\nconst MESSAGE_RULE = /Syntax error at line (?<line>\\d+) col (?<column>\\d+)/;\nconst parse = (query) => {\n    if (query.trim() === '') {\n        return {\n            location: {\n                end: 0,\n                start: 0,\n            },\n            type: 'EmptyExpression',\n        };\n    }\n    const parser = new nearley_1.default.Parser(rules);\n    let results;\n    try {\n        results = parser.feed(query).results;\n    }\n    catch (error) {\n        if (typeof (error === null || error === void 0 ? void 0 : error.message) === 'string' &&\n            typeof (error === null || error === void 0 ? void 0 : error.offset) === 'number') {\n            const match = error.message.match(MESSAGE_RULE);\n            if (!match) {\n                throw error;\n            }\n            throw new errors_1.SyntaxError(`Syntax error at line ${match.groups.line} column ${match.groups.column}`, error.offset, Number(match.groups.line), Number(match.groups.column));\n        }\n        throw error;\n    }\n    if (results.length === 0) {\n        throw new Error('Found no parsings.');\n    }\n    if (results.length > 1) {\n        const firstResult = JSON.stringify(results[0]);\n        for (const result of results) {\n            // Only throw if the results are different.\n            if (JSON.stringify(result) !== firstResult) {\n                throw new errors_1.LiqeError('Ambiguous results.');\n            }\n        }\n    }\n    const hydratedAst = (0, hydrateAst_1.hydrateAst)(results[0]);\n    return hydratedAst;\n};\nexports.parse = parse;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serialize = void 0;\nconst quote = (value, quotes) => {\n    if (quotes === 'double') {\n        return `\"${value}\"`;\n    }\n    if (quotes === 'single') {\n        return `'${value}'`;\n    }\n    return value;\n};\nconst serializeExpression = (expression) => {\n    if (expression.type === 'LiteralExpression') {\n        if (expression.quoted && typeof expression.value === 'string') {\n            return quote(expression.value, expression.quotes);\n        }\n        return String(expression.value);\n    }\n    if (expression.type === 'RegexExpression') {\n        return String(expression.value);\n    }\n    if (expression.type === 'RangeExpression') {\n        const { max, maxInclusive, min, minInclusive } = expression.range;\n        return `${minInclusive ? '[' : '{'}${min} TO ${max}${maxInclusive ? ']' : '}'}`;\n    }\n    if (expression.type === 'EmptyExpression') {\n        return '';\n    }\n    throw new Error('Unexpected AST type.');\n};\nconst serializeTag = (ast) => {\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    const { expression, field, operator } = ast;\n    if (field.type === 'ImplicitField') {\n        return serializeExpression(expression);\n    }\n    const left = field.quoted ? quote(field.name, field.quotes) : field.name;\n    const patEnd = ' '.repeat(expression.location.start - operator.location.end);\n    return left + operator.operator + patEnd + serializeExpression(expression);\n};\nconst serialize = (ast) => {\n    if (ast.type === 'ParenthesizedExpression') {\n        if (!('location' in ast.expression)) {\n            throw new Error('Expected location in expression.');\n        }\n        if (!ast.location.end) {\n            throw new Error('Expected location end.');\n        }\n        const patStart = ' '.repeat(ast.expression.location.start - (ast.location.start + 1));\n        const patEnd = ' '.repeat(ast.location.end - ast.expression.location.end - 1);\n        return `(${patStart}${(0, exports.serialize)(ast.expression)}${patEnd})`;\n    }\n    if (ast.type === 'Tag') {\n        return serializeTag(ast);\n    }\n    if (ast.type === 'LogicalExpression') {\n        let operator = '';\n        if (ast.operator.type === 'BooleanOperator') {\n            operator += ' '.repeat(ast.operator.location.start - ast.left.location.end);\n            operator += ast.operator.operator;\n            operator += ' '.repeat(ast.right.location.start - ast.operator.location.end);\n        }\n        else {\n            operator = ' '.repeat(ast.right.location.start - ast.left.location.end);\n        }\n        return `${(0, exports.serialize)(ast.left)}${operator}${(0, exports.serialize)(ast.right)}`;\n    }\n    if (ast.type === 'UnaryOperator') {\n        return ((ast.operator === 'NOT' ? 'NOT ' : ast.operator) + (0, exports.serialize)(ast.operand));\n    }\n    if (ast.type === 'EmptyExpression') {\n        return '';\n    }\n    throw new Error('Unexpected AST type.');\n};\nexports.serialize = serialize;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.test = void 0;\nconst filter_1 = require(\"./filter\");\nconst test = (ast, subject) => {\n    return (0, filter_1.filter)(ast, [subject]).length === 1;\n};\nexports.test = test;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.test = exports.serialize = exports.parse = exports.isSafeUnquotedExpression = exports.highlight = exports.filter = exports.SyntaxError = exports.LiqeError = void 0;\nvar errors_1 = require(\"./errors\");\nObject.defineProperty(exports, \"LiqeError\", { enumerable: true, get: function () { return errors_1.LiqeError; } });\nObject.defineProperty(exports, \"SyntaxError\", { enumerable: true, get: function () { return errors_1.SyntaxError; } });\nvar filter_1 = require(\"./filter\");\nObject.defineProperty(exports, \"filter\", { enumerable: true, get: function () { return filter_1.filter; } });\nvar highlight_1 = require(\"./highlight\");\nObject.defineProperty(exports, \"highlight\", { enumerable: true, get: function () { return highlight_1.highlight; } });\nvar isSafeUnquotedExpression_1 = require(\"./isSafeUnquotedExpression\");\nObject.defineProperty(exports, \"isSafeUnquotedExpression\", { enumerable: true, get: function () { return isSafeUnquotedExpression_1.isSafeUnquotedExpression; } });\nvar parse_1 = require(\"./parse\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return parse_1.parse; } });\nvar serialize_1 = require(\"./serialize\");\nObject.defineProperty(exports, \"serialize\", { enumerable: true, get: function () { return serialize_1.serialize; } });\nvar test_1 = require(\"./test\");\nObject.defineProperty(exports, \"test\", { enumerable: true, get: function () { return test_1.test; } });\n","import { parse, SyntaxError } from 'liqe'\nimport {\n  E_LUCENE_SYNTAX_EXCEPTION,\n  E_LUCENE_UNEXPECTED_EXCEPTION,\n  E_LUCENE_INVALID_TYPE,\n  E_LUCENE_REGEX_NOT_SUPPORTED,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { QueryClientContract } from '@adonisjs/lucid/types/database'\nimport type { LucidModel, ModelKeysContract } from '@adonisjs/lucid/types/model'\nimport type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder'\nimport type {\n  LiqeQuery,\n  ComparisonOperatorToken,\n  EmptyExpression,\n  FieldToken,\n  ImplicitFieldToken,\n  LiteralExpressionToken,\n  LogicalExpressionToken,\n  RangeExpressionToken,\n  RegexExpressionToken,\n  TagToken,\n  UnaryOperatorToken,\n  ParenthesizedExpressionToken,\n  ExpressionToken,\n  ParserAst,\n} from 'liqe'\n\n/**\n * Database query builder contract extended for Lucene filtering capabilities.\n *\n * @template Result - The result type for the query builder\n */\nexport interface LuceneFilteredDatabaseQueryBuilderContract extends DatabaseQueryBuilderContract {}\n\nexport class LuceneLucidQueryBuilder {\n  readonly #attributesToColumns: ModelKeysContract\n  readonly #allowedColumns?: string[] | undefined\n  readonly #connection: QueryClientContract\n  readonly #dialect: string\n  // @ts-ignore - not used yet\n  readonly #primaryKey: string\n  // @ts-ignore - not used yet\n  readonly #tableName: string\n  // @ts-ignore - not used yet\n  readonly #model?: LucidModel | undefined\n\n  constructor(\n    connection: QueryClientContract,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    attributesToColumns: ModelKeysContract,\n    primaryKey: string,\n    tableName: string,\n    allowedColumns?: string[] | undefined,\n    model?: LucidModel | undefined\n  ) {\n    this.#attributesToColumns = attributesToColumns\n    this.#primaryKey = primaryKey\n    this.#tableName = tableName\n    this.#allowedColumns = allowedColumns\n    this.#model = model\n    this.#connection = connection\n    this.#dialect = query.client.dialect.name\n  }\n\n  applyLuceneAst(\n    ast: ParserAst,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    throwOnInvalidType: boolean = false\n  ) {\n    switch (ast.type) {\n      case 'EmptyExpression':\n        this.applyLuceneEmptyExpressionAst(ast, query)\n        break\n\n      case 'LogicalExpression':\n        this.applyLuceneLogicalExpressionAst(ast, query)\n        break\n\n      case 'ParenthesizedExpression':\n        this.applyLuceneParenthesizedExpressionAst(ast, query)\n        break\n\n      case 'UnaryOperator':\n        this.applyLuceneUnaryOperatorAst(ast, query)\n        break\n\n      case 'Tag':\n        this.applyLuceneTagAst(ast, query)\n        break\n\n      default:\n        if (throwOnInvalidType) {\n          throw new E_LUCENE_INVALID_TYPE((ast as any).type)\n        }\n        break\n    }\n  }\n\n  applyLuceneEmptyExpressionAst(\n    _ast: EmptyExpression,\n    _query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    // No operation for empty expressions\n  }\n\n  applyLuceneLogicalExpressionAst(\n    ast: LogicalExpressionToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    const operatorType = ast.operator.operator\n    query.where((subQuery) => {\n      if (operatorType === 'AND') {\n        this.applyLuceneAst(ast.left, subQuery)\n        this.applyLuceneAst(ast.right, subQuery)\n      } else {\n        subQuery.orWhere((orSubQuery) => {\n          this.applyLuceneAst(ast.left, orSubQuery)\n        })\n        subQuery.orWhere((orSubQuery) => {\n          this.applyLuceneAst(ast.right, orSubQuery)\n        })\n      }\n    })\n  }\n\n  applyLuceneParenthesizedExpressionAst(\n    ast: ParenthesizedExpressionToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    query.where((subQuery) => {\n      this.applyLuceneAst(ast.expression, subQuery)\n    })\n  }\n\n  applyLuceneUnaryOperatorAst(\n    ast: UnaryOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    const operator = ast.operator\n    if (operator === 'NOT' || operator === '-') {\n      query.whereNot((subQuery) => {\n        this.applyLuceneAst(ast.operand, subQuery)\n      })\n    } else {\n      query.where((subQuery) => {\n        this.applyLuceneAst(ast.operand, subQuery)\n      })\n    }\n  }\n\n  applyLuceneTagAst(ast: TagToken, query: LuceneFilteredDatabaseQueryBuilderContract) {\n    const { expression, field, operator } = ast\n    switch (field.type) {\n      case 'ImplicitField':\n        this.applyLuceneImplicitFieldAst(field, expression, operator, query)\n        break\n\n      case 'Field':\n        this.applyLuceneFieldAst(field, expression, operator, query)\n        break\n    }\n  }\n\n  #getSearchableColumns() {\n    if (\n      this.#model &&\n      '$resourcefulColumns' in this.#model &&\n      this.#model.$resourcefulColumns instanceof Map\n    ) {\n      const modelFields: string[] = []\n      this.#model.$resourcefulColumns.forEach((_c, k) => {\n        modelFields.push(k as string)\n      })\n      if (\n        '$resourcefulRelationships' in this.#model &&\n        this.#model.$resourcefulRelationships instanceof Map\n      ) {\n        this.#model.$resourcefulRelationships.forEach((_r, k) => {\n          modelFields.push(k)\n        })\n      }\n      return Array.from(new Set(modelFields)).filter(\n        (f) => !this.#allowedColumns || this.#allowedColumns.includes(f)\n      )\n    }\n    return Object.entries(this.#attributesToColumns.all())\n      .filter(([attr]) => !this.#allowedColumns || this.#allowedColumns.includes(attr))\n      .map(([, column]) => column)\n  }\n\n  applyLuceneImplicitFieldAst(\n    _field: ImplicitFieldToken,\n    expression: ExpressionToken,\n    operator: ComparisonOperatorToken | undefined,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    const searchableColumns = this.#getSearchableColumns()\n    const defaultOperator: ComparisonOperatorToken = operator || {\n      operator: ':',\n      type: 'ComparisonOperator',\n      location: { start: 0, end: 0 },\n    }\n    searchableColumns.forEach((columnName) => {\n      const fakeField: FieldToken = {\n        name: columnName,\n        type: 'Field',\n        location: { start: 0, end: 0 },\n        quoted: false,\n      }\n      query.orWhere((s) => {\n        this.applyLuceneFieldAst(fakeField, expression, defaultOperator, s, undefined, true)\n      })\n    })\n  }\n\n  applyLuceneFieldAst(\n    field: FieldToken,\n    expression: ExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    forModel?: LucidModel | undefined,\n    isImplicit: boolean = false\n  ) {\n    const columnName = !forModel\n      ? this.#attributesToColumns.get(field.name)\n      : forModel.$keys.attributesToColumns.get(field.name)\n    if (\n      !columnName ||\n      (!forModel && this.#allowedColumns && !this.#allowedColumns.includes(field.name))\n    ) {\n      if (field.name.includes('.')) {\n        const parts = field.name\n          .split('.')\n          .filter((p) => 'string' === typeof p && p.trim().length > 0)\n          .map((p) => p.trim())\n        const relationship = parts.shift()\n        if (!relationship || parts.length === 0) return\n        this.applyLuceneRelatedFieldAst(\n          relationship,\n          parts.join('.'),\n          expression,\n          operator,\n          query,\n          forModel\n        )\n      }\n      return\n    }\n    switch (expression.type) {\n      case 'EmptyExpression':\n        this.applyLuceneEmptyExpression(columnName, expression, operator, query)\n        break\n      case 'LiteralExpression':\n        this.applyLuceneLiteralExpression(columnName, expression, operator, query, isImplicit)\n        break\n      case 'RangeExpression':\n        this.applyLuceneRangeExpression(columnName, expression, operator, query)\n        break\n      case 'RegexExpression':\n        this.applyLuceneRegexExpression(columnName, expression, operator, query)\n        break\n    }\n  }\n\n  applyLuceneRelatedFieldAst(\n    relationship: string,\n    relatedProperty: string,\n    expression: ExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    forModel?: LucidModel | undefined\n  ) {\n    if (!forModel && !this.#model) return\n    const targetModel = forModel! || this.#model!\n    const lucidRelationshipDefinition = targetModel.$relationsDefinitions.get(relationship)\n    if (!lucidRelationshipDefinition) return\n    lucidRelationshipDefinition.boot()\n    const sub = lucidRelationshipDefinition.subQuery(this.#connection)\n    const relatedField: FieldToken = {\n      name: relatedProperty,\n      type: 'Field',\n      location: { start: 0, end: 0 },\n      quoted: false,\n    }\n    const relatedModel = lucidRelationshipDefinition.relatedModel()\n    this.applyLuceneFieldAst(relatedField, expression, operator, sub as any, relatedModel)\n    query.whereExists(sub.prepare())\n  }\n\n  applyLuceneEmptyExpression(\n    column: string,\n    _expression: EmptyExpression,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    switch (operator.operator) {\n      case ':':\n      case ':=':\n      case ':<=':\n      case ':>=':\n        query.where((sub) => {\n          sub.whereNull(column)\n          sub.orWhere(column, '=', '')\n        })\n        break\n    }\n  }\n\n  applyLuceneLiteralExpression(\n    column: string,\n    expression: LiteralExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    isImplicit = false\n  ) {\n    let value = expression.value\n    let isCaseSensitive = false\n    if (value === null) {\n      /*\n    |--------------------------------------------------------------------------\n    | Treat null values as empty strings or zero depending on the operator\n    |--------------------------------------------------------------------------\n    */\n      switch (operator.operator) {\n        case ':':\n        case ':=':\n          query.if(\n            ['postgres', 'pg'].includes(this.#dialect),\n            (q) => {\n              q.where((sub) => {\n                sub.whereNull(column)\n\n                // Numeric branch: compare text rep to '0'\n                sub.orWhereRaw(\n                  'pg_typeof(??) IN (' +\n                    \"'smallint'::regtype,'integer'::regtype,'bigint'::regtype,\" +\n                    \"'numeric'::regtype,'real'::regtype,'double precision'::regtype\" +\n                    \") AND COALESCE(??::text,'') = '0'\",\n                  [column, column]\n                )\n\n                // Non-numeric branch: empty string after cast\n                sub.orWhereRaw(\n                  'pg_typeof(??) NOT IN (' +\n                    \"'smallint'::regtype,'integer'::regtype,'bigint'::regtype,\" +\n                    \"'numeric'::regtype,'real'::regtype,'double precision'::regtype\" +\n                    \") AND COALESCE(??::text,'') = ''\",\n                  [column, column]\n                )\n              })\n            },\n            () => {\n              query.if(\n                ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                (q2) => {\n                  q2.where((sub) => {\n                    sub.whereNull(column)\n                    sub.orWhere(column, '=', '')\n                    /*\n                     |--------------------------------------------------------------------------\n                     | MySQL: Only match 0 if the column value is actually numeric\n                     | Check that the value equals 0 AND its string representation equals '0'\n                     | This prevents non-numeric strings from matching via type coercion\n                     |--------------------------------------------------------------------------\n                     */\n                    sub.orWhereRaw('(?? = 0 AND CAST(?? AS CHAR) = ?)', [column, column, '0'])\n                  })\n                },\n                (q2) => {\n                  q2.where((sub) => {\n                    sub.whereNull(column)\n                    sub.orWhere(column, '=', '')\n                    sub.orWhere(column, '=', 0)\n                  })\n                }\n              )\n            }\n          )\n          break\n        case ':<':\n          query.where(column, '<', 0)\n          break\n        case ':<=':\n          query.where(column, '<=', 0)\n          break\n        case ':>':\n          query.where(column, '>', 0)\n          break\n        case ':>=':\n          query.where(column, '>=', 0)\n          break\n      }\n      return\n    }\n    if ('string' === typeof value && expression.quoted) {\n      isCaseSensitive = true\n      /*\n      |--------------------------------------------------------------------------\n      | Strip quotes from the value because they are not needed\n      |--------------------------------------------------------------------------\n      */\n      if (expression.quotes === 'double') {\n        value = value.replace(/^\"/g, '').replace(/\"$/g, '')\n      } else if (expression.quotes === 'single') {\n        value = value.replace(/^'/g, '').replace(/'$/g, '')\n      }\n    } else if (\n      /*\n      |--------------------------------------------------------------------------\n      | Special case for handling unquoted string literals with : or := operators\n      | to perform a contains search by wrapping the value with wildcards (*)\n      |--------------------------------------------------------------------------\n      */\n      isImplicit &&\n      'string' === typeof value &&\n      !expression.quoted &&\n      [':', ':='].includes(operator.operator)\n    ) {\n      value = `*${value}*`\n    }\n    switch (typeof value) {\n      case 'string':\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            // Check if the value contains wildcards\n            if (value.includes('*') || value.includes('?')) {\n              // Escape any instances of `%` and `_` in the literal value\n              let likeValue = value.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_')\n              // Convert Lucene wildcards (*) to SQL wildcards (%) and (?) to (_)\n              likeValue = likeValue.replace(/\\*/g, '%').replace(/\\?/g, '_')\n              if (isCaseSensitive) {\n                query.if(\n                  ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                  (q) => {\n                    /*\n                     |--------------------------------------------------------------------------\n                     | MySQL: Use whereRaw to bypass Knex's broken utf8_bin collation\n                     | LIKE is already case-sensitive in MySQL by default\n                     |--------------------------------------------------------------------------\n                     */\n                    q.whereRaw('?? LIKE ?', [column, likeValue])\n                  },\n                  (q) => {\n                    q.whereLike(column, likeValue)\n                  }\n                )\n              } else {\n                query.if(\n                  ['postgres', 'pg'].includes(this.#dialect),\n                  (q) => {\n                    // q.whereILike(column, likeValue)\n                    /*\n                     |--------------------------------------------------------------------------\n                     | Fix to cast column to text to avoid issues with non-text columns\n                     | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                     |--------------------------------------------------------------------------\n                     */\n                    q.whereRaw(\"COALESCE(??::text, '') ILIKE ?\", [column, likeValue])\n                  },\n                  () => {\n                    query.if(\n                      ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                      (q2) => {\n                        /*\n                         |--------------------------------------------------------------------------\n                         | MySQL: Use LOWER() for case-insensitive comparison\n                         |--------------------------------------------------------------------------\n                         */\n                        q2.whereRaw('LOWER(??) LIKE LOWER(?)', [column, likeValue])\n                      },\n                      (q2) => {\n                        q2.whereLike(column, likeValue)\n                      }\n                    )\n                  }\n                )\n                query\n              }\n            } else {\n              query.where((sub) => {\n                if (isCaseSensitive) {\n                  query.if(\n                    ['postgres', 'pg'].includes(this.#dialect),\n                    () => {\n                      // sub.orWhereILike(column, value)\n                      /*\n                       |--------------------------------------------------------------------------\n                       | Fix to cast column to text to avoid issues with non-text columns\n                       | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                       |--------------------------------------------------------------------------\n                       */\n                      sub.whereRaw(\"COALESCE(??::text, '') = ?\", [column, value])\n                    },\n                    () => {\n                      query.if(\n                        ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                        () => {\n                          /*\n                          |--------------------------------------------------------------------------\n                          | Cast all columns to text for comparison\n                          |--------------------------------------------------------------------------\n                          */\n                          sub.whereRaw('CAST(?? AS CHAR) = ?', [column, value])\n                        },\n                        () => {\n                          /*\n                          |--------------------------------------------------------------------------\n                          | For exact matches (no wildcards), use = operator\n                          |--------------------------------------------------------------------------\n                          */\n                          sub.where(column, '=', value)\n                        }\n                      )\n                    }\n                  )\n                } else {\n                  query.if(\n                    ['postgres', 'pg'].includes(this.#dialect),\n                    () => {\n                      // sub.orWhereILike(column, value)\n                      /*\n                       |--------------------------------------------------------------------------\n                       | Fix to cast column to text to avoid issues with non-text columns\n                       | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                       |--------------------------------------------------------------------------\n                       */\n                      sub.whereRaw(\"COALESCE(??::text, '') ILIKE ?\", [column, value])\n                    },\n                    () => {\n                      query.if(\n                        ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                        () => {\n                          /*\n                           |--------------------------------------------------------------------------\n                           | MySQL: Use LOWER() for case-insensitive comparison\n                           |--------------------------------------------------------------------------\n                           */\n                          sub.whereRaw('LOWER(??) LIKE LOWER(?)', [column, value])\n                        },\n                        () => {\n                          sub.whereLike(column, value)\n                        }\n                      )\n                    }\n                  )\n                }\n              })\n            }\n            break\n          case ':<':\n            query.where(column, '<', value)\n            break\n          case ':<=':\n            query.where(column, '<=', value)\n            break\n          case ':>':\n            query.where(column, '>', value)\n            break\n          case ':>=':\n            query.where(column, '>=', value)\n            break\n        }\n        break\n      case 'number':\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            if (isImplicit) {\n              query.where((sub) => {\n                if (isCaseSensitive) {\n                  query.if(\n                    ['postgres', 'pg'].includes(this.#dialect),\n                    () => {\n                      // sub.orWhereILike(column, value)\n                      /*\n                       |--------------------------------------------------------------------------\n                       | Fix to cast column to text to avoid issues with non-text columns\n                       | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                       |--------------------------------------------------------------------------\n                       */\n                      sub.whereRaw(\"COALESCE(??::text, '') = ?\", [column, String(value)])\n                    },\n                    () => {\n                      query.if(\n                        ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                        () => {\n                          /*\n                          |--------------------------------------------------------------------------\n                          | Cast all columns to text for comparison\n                          |--------------------------------------------------------------------------\n                          */\n                          sub.whereRaw('CAST(?? AS CHAR) = ?', [column, String(value)])\n                        },\n                        () => {\n                          /*\n                          |--------------------------------------------------------------------------\n                          | For exact matches (no wildcards), use = operator\n                          |--------------------------------------------------------------------------\n                          */\n                          sub.where(column, '=', String(value))\n                        }\n                      )\n                    }\n                  )\n                } else {\n                  query.if(\n                    ['postgres', 'pg'].includes(this.#dialect),\n                    () => {\n                      // sub.orWhereILike(column, value)\n                      /*\n                       |--------------------------------------------------------------------------\n                       | Fix to cast column to text to avoid issues with non-text columns\n                       | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                       |--------------------------------------------------------------------------\n                       */\n                      sub.whereRaw(\"COALESCE(??::text, '') ILIKE ?\", [column, String(value)])\n                    },\n                    () => {\n                      query.if(\n                        ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                        () => {\n                          /*\n                           |--------------------------------------------------------------------------\n                           | MySQL: Use LOWER() for case-insensitive comparison\n                           |--------------------------------------------------------------------------\n                           */\n                          sub.whereRaw('LOWER(??) LIKE LOWER(?)', [column, String(value)])\n                        },\n                        () => {\n                          sub.whereLike(column, value)\n                        }\n                      )\n                    }\n                  )\n                }\n              })\n            } else {\n              query.where(column, '=', value)\n            }\n            break\n          case ':<':\n            query.where(column, '<', value)\n            break\n          case ':<=':\n            query.where(column, '<=', value)\n            break\n          case ':>':\n            query.where(column, '>', value)\n            break\n          case ':>=':\n            query.where(column, '>=', value)\n            break\n        }\n        break\n      case 'boolean':\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            query.where(column, '=', value)\n            break\n          case ':<':\n            query.where(column, '<', value)\n            break\n          case ':<=':\n            query.where(column, '<=', value)\n            break\n          case ':>':\n            query.where(column, '>', value)\n            break\n          case ':>=':\n            query.where(column, '>=', value)\n            break\n        }\n        break\n    }\n  }\n\n  applyLuceneRangeExpression(\n    column: string,\n    expression: RangeExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    const comparableMin = expression.range.minInclusive\n      ? expression.range.min\n      : expression.range.min + 1\n    const comparableMax = expression.range.maxInclusive\n      ? expression.range.max\n      : expression.range.max - 1\n    switch (operator.operator) {\n      case ':':\n      case ':=':\n        query.whereBetween(column, [comparableMin, comparableMax])\n        break\n    }\n  }\n\n  applyLuceneRegexExpression(\n    column: string,\n    expression: RegexExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    let value = expression.value\n    switch (this.#dialect) {\n      case 'mysql':\n      case 'mariadb':\n        // MySQL uses REGEXP for regex matching\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            query.whereRaw(`?? REGEXP ?`, [column, value.replace(/\\/(.*)\\/.*/, '$1')])\n            break\n        }\n        break\n\n      case 'pg':\n      case 'postgres':\n        // PostgreSQL uses ~ for case-sensitive regex matching and ~* for case-insensitive regex matching\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            {\n              const op = value.endsWith('i') ? '~*' : '~'\n              const cleanedValue = value.replace(/\\/(.*)\\/.*/, '$1')\n              query.whereRaw(`?? ${op} ?`, [column, cleanedValue])\n            }\n            break\n        }\n        break\n\n      case 'oracle':\n      case 'oracledb':\n      case 'tedious':\n      case 'mssql':\n        // Oracle uses REGEXP_LIKE for regex matching\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            query.whereRaw(`REGEXP_LIKE(??, ?)`, [column, value])\n            break\n        }\n        break\n\n      case 'sqlite3':\n      case 'better-sqlite3':\n        throw new E_LUCENE_REGEX_NOT_SUPPORTED()\n\n      default:\n        // Default case for other dialects, using LIKE as a fallback\n        // Note: This is not a true regex match, but a LIKE pattern match\n        // Escape any instances of `%` and `_` in the regex value\n        value = value.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_')\n        // Replace \"*\" with \"%\" and \"?\" with \"_\"\n        value = value.replace(/\\*/g, '%').replace(/\\?/g, '_')\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            query.whereLike(column, value)\n            break\n        }\n        break\n    }\n  }\n\n  static get(\n    luceneQuery: string,\n    connection: QueryClientContract,\n    attributesToColumns: ModelKeysContract,\n    primaryKey: string,\n    tableName: string,\n    allowedColumns?: string[] | undefined,\n    model?: LucidModel | undefined\n  ): LuceneFilteredDatabaseQueryBuilderContract {\n    let parsed: LiqeQuery\n    try {\n      parsed = parse(luceneQuery)\n    } catch (error) {\n      if (error instanceof SyntaxError) {\n        throw new E_LUCENE_SYNTAX_EXCEPTION(luceneQuery, error)\n      }\n      throw new E_LUCENE_UNEXPECTED_EXCEPTION(error)\n    }\n    const query: LuceneFilteredDatabaseQueryBuilderContract = connection.query().from(tableName)\n    const builder = new LuceneLucidQueryBuilder(\n      connection,\n      query,\n      attributesToColumns,\n      primaryKey,\n      tableName,\n      allowedColumns,\n      model\n    )\n    builder.applyLuceneAst(parsed, query, true)\n    return query\n  }\n}\n\n/**\n * Converts a Lucene query string to a Lucid database query builder.\n * Parses the Lucene syntax and applies the resulting AST to generate SQL conditions.\n *\n * @template T - The result type for the query builder\n * @param luceneQuery - The Lucene query string to parse and convert\n * @param connection - The database connection client for creating queries\n * @param attributesToColumns - Mapping of model attributes to database columns\n * @param primaryKey - The primary key column name for implicit field queries\n * @param tableName - The database table name to query\n * @param allowedColumns - Optional array of allowed column names for security filtering\n * @param model - Optional The lucid model which the query is being built for. When passed, allows relationship-based filtration.\n * @returns A database query builder with the Lucene conditions applied\n * @throws {E_LUCENE_SYNTAX_EXCEPTION} When the Lucene query has syntax errors\n * @throws {E_LUCENE_UNEXPECTED_EXCEPTION} When an unexpected error occurs during parsing\n * @throws {E_LUCENE_INVALID_TYPE} When an unrecognized AST node type is encountered\n */\nexport const luceneToLucid = (\n  luceneQuery: string,\n  connection: QueryClientContract,\n  attributesToColumns: ModelKeysContract,\n  primaryKey: string,\n  tableName: string,\n  allowedColumns?: string[] | undefined,\n  model?: LucidModel | undefined\n): LuceneFilteredDatabaseQueryBuilderContract => {\n  const query = LuceneLucidQueryBuilder.get(\n    luceneQuery,\n    connection,\n    attributesToColumns,\n    primaryKey,\n    tableName,\n    allowedColumns,\n    model\n  )\n  query.whereNotNull(primaryKey)\n  return query\n}\n","function once(scope, callback) {\n  function next() {\n    if (next.called) {\n      return;\n    }\n    next.called = true;\n    return callback(scope);\n  }\n  next.called = false;\n  return next;\n}\nconst DEFAULT_FINAL_HANDLER = () => Promise.resolve();\nclass Runner {\n  /**\n   * The array of middleware handlers to execute in sequence.\n   */\n  #middleware;\n  /**\n   * The current index position in the middleware pipeline.\n   */\n  #currentIndex = 0;\n  /**\n   * The executor function responsible for invoking each middleware handler.\n   */\n  #executor;\n  /**\n   * The final handler to execute when the middleware chain completes successfully.\n   */\n  #finalHandler = DEFAULT_FINAL_HANDLER;\n  /**\n   * Optional error handler to catch and handle exceptions in the middleware pipeline.\n   */\n  #errorHandler;\n  constructor(middleware) {\n    this.#middleware = middleware;\n  }\n  /**\n   * Invokes middleware handlers one at a time.\n   *\n   * Middleware functions are executed recursively until `next` is called.\n   * If a middleware doesn't call `next`, the chain will finish automatically\n   * without executing remaining handlers.\n   *\n   * @param self - The Runner instance scope\n   * @returns A Promise that resolves when the middleware chain completes\n   * @internal\n   */\n  #invoke(self) {\n    const middleware = self.#middleware[self.#currentIndex++];\n    if (!middleware) {\n      return self.#finalHandler();\n    }\n    return self.#executor(middleware, once(self, self.#invoke));\n  }\n  /**\n   * Invokes middleware handlers with error handling.\n   *\n   * Similar to `#invoke`, but catches exceptions and passes them to the error handler.\n   * When an exception is raised, the middleware downstream logic will not run unless\n   * the error handler allows the chain to continue.\n   *\n   * @param self - The Runner instance scope\n   * @returns A Promise that resolves when the middleware chain completes\n   * @internal\n   */\n  #invokeWithErrorManagement(self) {\n    const middleware = self.#middleware[self.#currentIndex++];\n    if (!middleware) {\n      return self.#finalHandler().catch(self.#errorHandler);\n    }\n    return self.#executor(middleware, once(self, self.#invokeWithErrorManagement)).catch(self.#errorHandler);\n  }\n  /**\n   * Sets a custom final handler to execute when the middleware chain completes successfully.\n   *\n   * The final handler is called when the entire middleware pipeline reaches the end\n   * by calling `next` through all handlers. This makes it easier to execute custom\n   * logic that is not part of the chain but must run when the chain ends.\n   *\n   * @param finalHandler - The function to execute when the chain completes\n   * @returns The Runner instance for method chaining\n   *\n   * @example\n   * ```ts\n   * await middleware\n   *   .runner()\n   *   .finalHandler(() => {\n   *     console.log('All middleware completed')\n   *   })\n   *   .run((fn, next) => fn(context, next))\n   * ```\n   */\n  finalHandler(finalHandler) {\n    this.#finalHandler = finalHandler;\n    return this;\n  }\n  /**\n   * Sets a custom error handler to catch exceptions in the middleware pipeline.\n   *\n   * By default, exceptions raised in the middleware pipeline bubble up to the `run`\n   * method and can be captured using a try/catch block. When an exception is raised,\n   * the middleware downstream logic will not run.\n   *\n   * Defining an error handler changes this behavior:\n   * - The `run` method will not throw exceptions\n   * - Errors are caught and passed to the error handler\n   * - Middleware upstream logic (after `next`) can still execute\n   *\n   * @param errorHandler - The function to handle errors\n   * @returns The Runner instance for method chaining\n   *\n   * @example\n   * ```ts\n   * await middleware\n   *   .runner()\n   *   .errorHandler((error) => {\n   *     console.error('Middleware error:', error)\n   *   })\n   *   .run((fn, next) => fn(context, next))\n   * ```\n   */\n  errorHandler(errorHandler) {\n    this.#errorHandler = errorHandler;\n    return this;\n  }\n  /**\n   * Executes the middleware pipeline using the provided executor function.\n   *\n   * The executor function is responsible for invoking each middleware handler with\n   * the appropriate context and the `next` callback. Since you control the executor,\n   * you can pass any data you want to the middleware.\n   *\n   * @param cb - The executor function that invokes each middleware handler\n   * @returns A Promise that resolves when the middleware pipeline completes\n   *\n   * @example\n   * ```ts\n   * const context = { user: null }\n   * type MiddlewareFn = (ctx: typeof context, next: NextFn) => void | Promise<void>\n   *\n   * const middleware = new Middleware<MiddlewareFn>()\n   * middleware.add(async (ctx, next) => {\n   *   ctx.user = await authenticate()\n   *   await next()\n   * })\n   *\n   * await middleware\n   *   .runner()\n   *   .run((fn, next) => fn(context, next))\n   * ```\n   */\n  async run(cb) {\n    this.#executor = cb;\n    if (this.#errorHandler) {\n      return this.#invokeWithErrorManagement(this);\n    }\n    return this.#invoke(this);\n  }\n}\nclass Middleware {\n  #middleware = /* @__PURE__ */ new Set();\n  #middlewareArray;\n  #isFrozen = false;\n  /**\n   * Returns all registered middleware handlers.\n   *\n   * @returns A Set containing all registered middleware handlers\n   */\n  all() {\n    return this.#middleware;\n  }\n  /**\n   * Checks if a specific handler has already been registered as middleware.\n   *\n   * @param handler - The middleware handler to check for\n   * @returns `true` if the handler is registered, `false` otherwise\n   */\n  has(handler) {\n    return this.#middleware.has(handler);\n  }\n  /**\n   * Registers a new middleware handler to the pipeline.\n   *\n   * Adding the same middleware handler multiple times will result in a no-op,\n   * as handlers are stored in a Set to prevent duplicates.\n   *\n   * @param handler - The middleware handler to register\n   * @returns The Middleware instance for method chaining\n   * @throws {Error} If the middleware stack is frozen\n   */\n  add(handler) {\n    if (this.#isFrozen) {\n      throw new Error(\"Middleware stack is frozen. Cannot add new middleware\");\n    }\n    this.#middleware.add(handler);\n    return this;\n  }\n  /**\n   * Removes a specific middleware handler from the pipeline.\n   *\n   * @param handler - The middleware handler to remove\n   * @returns `true` if the handler was removed, `false` if it was not found\n   * @throws {Error} If the middleware stack is frozen\n   */\n  remove(handler) {\n    if (this.#isFrozen) {\n      throw new Error(\"Middleware stack is frozen. Cannot remove middleware\");\n    }\n    return this.#middleware.delete(handler);\n  }\n  /**\n   * Removes all registered middleware handlers from the pipeline.\n   *\n   * @throws {Error} If the middleware stack is frozen\n   */\n  clear() {\n    if (this.#isFrozen) {\n      throw new Error(\"Middleware stack is frozen. Cannot clear middleware\");\n    }\n    this.#middleware.clear();\n  }\n  /**\n   * Merges middleware handlers from another Middleware instance.\n   *\n   * The middleware from the source instance are appended to the current instance.\n   *\n   * @param hooks - The source Middleware instance to merge from\n   * @throws {Error} If the middleware stack is frozen\n   */\n  merge(hooks) {\n    if (this.#isFrozen) {\n      throw new Error(\"Middleware stack is frozen. Cannot merge middleware\");\n    }\n    hooks.all().forEach((handler) => {\n      this.add(handler);\n    });\n  }\n  /**\n   * Freezes the middleware stack to prevent further modifications.\n   *\n   * Once frozen, the middleware array is cached and no new handlers can be added,\n   * removed, or modified. This method is automatically called when creating a runner.\n   */\n  freeze() {\n    if (this.#isFrozen) {\n      return;\n    }\n    this.#isFrozen = true;\n    this.#middlewareArray = [...this.all()];\n  }\n  /**\n   * Creates and returns a Runner instance to execute the middleware pipeline.\n   *\n   * This method automatically freezes the middleware stack to prevent modifications\n   * during execution.\n   *\n   * @returns A new Runner instance configured with the current middleware handlers\n   */\n  runner() {\n    this.freeze();\n    return new Runner(this.#middlewareArray);\n  }\n}\nconst version = \"1.20251213.1\";\nexport {\n  Middleware,\n  Runner,\n  version\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * Per-model relation-cache middleware (ADR-012).\n *\n * A model may declare `cacheMiddlewarePrepare` / `cacheMiddlewareConsume` on its\n * `withResourceful` options. Whenever an instance of that model is cached as a 1:1\n * relation, the `prepare` pipeline runs over the snapshot just before it is encoded\n * and written, and the `consume` pipeline runs over the decoded snapshot just before\n * it is rehydrated — the symmetric inverse. Each is built into an `@nhtio/middleware`\n * chain-of-responsibility pipeline whose handlers mutate `context.value`.\n *\n * The middleware belongs to the related (cached) model, so whoever loads that model\n * through a cached relation transparently runs its middleware (e.g. field encryption).\n *\n * `@nhtio/middleware` is imported as a VALUE only; the public types below are local\n * (structural) so the package's bundled `.d.ts` surface does not pull in\n * `@nhtio/middleware`'s declarations.\n *\n * @module\n */\n\nimport { Middleware } from '@nhtio/middleware'\nimport type { LucidModel } from '@adonisjs/lucid/types/model'\n\n/** Advances the cache-middleware chain to the next handler. */\nexport type CacheMiddlewareNext = () => Promise<unknown> | unknown\n\n/** The phase a cache-middleware pipeline runs in. */\nexport type CacheMiddlewarePhase = 'prepare' | 'consume'\n\n/**\n * Mutable context threaded through a model's cache-middleware pipeline. Handlers\n * read the metadata and transform `value` in place (or reassign it).\n */\nexport interface CacheMiddlewareContext {\n  /** `'prepare'` before writing to the cache, `'consume'` after reading from it. */\n  readonly phase: CacheMiddlewarePhase\n  /** The (related) model whose snapshot is being cached. */\n  readonly model: LucidModel\n  /** The relation name the snapshot is being cached under. */\n  readonly relation: string\n  /** The canonical cache key. */\n  readonly key: string\n  /** The snapshot under transformation; handlers mutate or replace this. */\n  value: Record<string, unknown>\n}\n\n/** A single cache-middleware handler (chain-of-responsibility; must call `next`). */\nexport type CacheMiddlewareHandler = (\n  context: CacheMiddlewareContext,\n  next: CacheMiddlewareNext\n) => void | Promise<void>\n\n/** User-supplied cache middleware: one handler or an ordered list of handlers. */\nexport type CacheMiddlewareInput = CacheMiddlewareHandler | CacheMiddlewareHandler[]\n\n/** The runner returned by a {@link CacheMiddlewarePipeline}. */\nexport interface CacheMiddlewareRunner {\n  run(\n    executor: (handler: CacheMiddlewareHandler, next: CacheMiddlewareNext) => Promise<unknown>\n  ): Promise<void>\n}\n\n/**\n * A built, reusable cache-middleware pipeline. Structurally a `@nhtio/middleware`\n * `Middleware`, but typed via this local interface so the package's public types do\n * NOT pull `@nhtio/middleware`'s declarations into the bundled `.d.ts` surface.\n */\nexport interface CacheMiddlewarePipeline {\n  runner(): CacheMiddlewareRunner\n}\n\n/**\n * Builds a reusable `@nhtio/middleware` pipeline from user-supplied handler(s).\n * Returns `null` when nothing is configured so callers can skip the run entirely.\n *\n * @param input - A single handler, an array of handlers, or undefined.\n * @returns The built pipeline, or `null` when there are no handlers.\n */\nexport const buildCacheMiddleware = (\n  input?: CacheMiddlewareInput\n): CacheMiddlewarePipeline | null => {\n  if (!input) {\n    return null\n  }\n  const handlers = Array.isArray(input) ? input : [input]\n  if (handlers.length === 0) {\n    return null\n  }\n  const pipeline = new Middleware<CacheMiddlewareHandler>()\n  for (const handler of handlers) {\n    pipeline.add(handler)\n  }\n  return pipeline as unknown as CacheMiddlewarePipeline\n}\n\n/**\n * Runs a model's cache-middleware pipeline over a snapshot and returns the\n * (possibly transformed) value. A `null` pipeline is a no-op passthrough.\n *\n * @param pipeline - The pre-built pipeline (or `null` when the model declares none).\n * @param context - The mutable context handed to each handler.\n * @returns The transformed snapshot (`context.value`).\n */\nexport const runCacheMiddleware = async (\n  pipeline: CacheMiddlewarePipeline | null,\n  context: CacheMiddlewareContext\n): Promise<Record<string, unknown>> => {\n  if (!pipeline) {\n    return context.value\n  }\n  // Defer each handler into a microtask so a synchronous throw becomes a promise\n  // rejection the runner propagates (which the preloader's ADR-009 try-blocks catch).\n  await pipeline\n    .runner()\n    .run((handler, next) => Promise.resolve().then(() => handler(context, next)))\n  return context.value\n}\n","/**\n * Type-preserving deep clone for relation-cache snapshots (ADR-012).\n *\n * `#store` hands the consumed-`$attributes` snapshot to the prepare-middleware\n * pipeline, but `setRelated` has already handed the live related instance to the\n * caller. A shallow copy shares every nested object by reference, so a prepare\n * handler that mutates a nested value in place (`context.value.meta.secret = …`)\n * writes straight through into the live model the caller is holding. Deep-cloning\n * the snapshot before middleware runs makes the copy's depth the isolation\n * boundary, so no handler — however it mutates — can reach the live row.\n *\n * `structuredClone` is deliberately NOT used: it silently flattens a Luxon\n * `DateTime` into a method-less plain object (the `isLuxonDateTime` flag survives,\n * so it still passes `DateTime.isDateTime`), which then crashes `encodeCacheValue`\n * when it calls `dateTime.toMillis()`. This clone instead recurses the in-place\n * mutation vectors (plain objects, arrays, `Map`, `Set`, `Date`) and keeps the\n * encoder's immutable rich leaves (Luxon `DateTime`, typed arrays, `bigint`, and\n * any other class instance) by reference — those are never mutated in place and\n * are not safely structurally cloneable.\n *\n * @module\n */\n\n/**\n * Recursively clones a single snapshot value, isolating the in-place mutation\n * vectors while preserving the encoder's rich leaf types by reference.\n *\n * @param value - The value to clone.\n * @returns A mutation-isolated copy, or the original for an immutable leaf.\n */\nconst cloneValue = (value: unknown): unknown => {\n  if (value === null || typeof value !== 'object') {\n    return value\n  }\n  if (value instanceof Date) {\n    return new Date(value.getTime())\n  }\n  if (value instanceof Map) {\n    const clone = new Map<unknown, unknown>()\n    for (const [key, entry] of value) {\n      clone.set(key, cloneValue(entry))\n    }\n    return clone\n  }\n  if (value instanceof Set) {\n    const clone = new Set<unknown>()\n    for (const entry of value) {\n      clone.add(cloneValue(entry))\n    }\n    return clone\n  }\n  if (Array.isArray(value)) {\n    return value.map(cloneValue)\n  }\n  const prototype = Object.getPrototypeOf(value) as object | null\n  if (prototype !== Object.prototype && prototype !== null) {\n    // Class instance (Luxon DateTime, typed array, …): an immutable encoder leaf\n    // kept by reference — structural cloning would corrupt it.\n    return value\n  }\n  const clone: Record<string, unknown> = {}\n  for (const key of Object.keys(value as Record<string, unknown>)) {\n    clone[key] = cloneValue((value as Record<string, unknown>)[key])\n  }\n  return clone\n}\n\n/**\n * Deep-clones a consumed-`$attributes` snapshot so the prepare-middleware pipeline\n * can never mutate the live related instance the caller already holds (ADR-012).\n *\n * @param snapshot - The post-`consume` attribute snapshot to isolate.\n * @returns A deep copy safe to hand to user-supplied middleware.\n */\nexport const deepCloneSnapshot = (snapshot: Record<string, unknown>): Record<string, unknown> =>\n  cloneValue(snapshot) as Record<string, unknown>\n","/**\n * Portable, type-preserving codec for relation-cache values (ADR-011).\n *\n * Every cached 1:1 relation snapshot is run through `@nhtio/encoder` before it is\n * handed to the cache service, and decoded again on read. The encoder round-trips\n * the rich types Lucid columns produce post-`consume` (Luxon `DateTime`, `bigint`,\n * `Date`, `Map`/`Set`, typed arrays, …), so cache-value fidelity no longer depends\n * on the host's BentoCache serializer preserving those types — the cache only ever\n * sees an opaque encoded string.\n *\n * @module\n */\n\nimport { decode, encode } from '@nhtio/encoder'\nimport type { Encodable } from '@nhtio/encoder'\n\n/**\n * Encodes a consumed-`$attributes` snapshot into a portable string for the cache.\n *\n * @param snapshot - The property-keyed, post-`consume` attribute snapshot.\n * @returns The encoded cache value.\n */\nexport const encodeCacheValue = (snapshot: Record<string, unknown>): string =>\n  encode(snapshot as Encodable)\n\n/**\n * Decodes a cache value produced by {@link encodeCacheValue} back into a snapshot.\n *\n * @param encoded - The encoded cache value read from the cache service.\n * @returns The decoded `$attributes` snapshot.\n */\nexport const decodeCacheValue = (encoded: string): Record<string, unknown> =>\n  decode<Encodable>(encoded) as Record<string, unknown>\n","/**\n * A {@link Preloader} subclass that transparently caches 1:1 (`belongsTo`/`hasOne`)\n * relation loads through an externally-supplied cache service, keyed canonically\n * by the related row's identity and tagged for write-through invalidation.\n *\n * Both relation-loading paths funnel through Lucid's `Preloader`\n * (`processRelation` for a single parent, `processRelationForMany` for eager\n * loads across many parents), so overriding them here covers `model.load()` and\n * `Model.query().preload()` alike (ADR-001).\n */\n\nimport { Preloader } from '@adonisjs/lucid/orm'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { runCacheMiddleware } from './cache_middleware'\nimport { deepCloneSnapshot } from './deep_clone_snapshot'\nimport { reportRelationCacheError } from './cache_error_handler'\nimport { reportRelationCacheEvent } from './cache_event_handler'\nimport { decodeCacheValue, encodeCacheValue } from './cache_codec'\nimport { resolveRelationsCacheService, registerRelationCacheTarget } from './cache_service_resolver'\nimport {\n  E_RELATION_CACHE_KEY_DIVERGENCE,\n  E_INVALID_RESOURCEFUL_MIXIN_OPTIONS,\n  E_RELATION_CACHE_READ_FAILED,\n  E_RELATION_CACHE_WRITE_FAILED,\n  E_RELATION_CACHE_RESOLUTION_FAILED,\n  E_RELATION_CACHE_REHYDRATION_FAILED,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { CacheMiddlewarePipeline } from './cache_middleware'\nimport type { LucidModel, LucidRow } from '@adonisjs/lucid/types/model'\nimport type { RelationCacheEvent, RelationCacheEventContext } from './cache_event_handler'\nimport type { CacheServiceLike, RelationCacheEntryOptions } from './cache_service_resolver'\n\n/**\n * Per-call cache controls recorded by `preloadCached(name, options, cb?)`.\n * @internal\n */\nexport interface RelationCacheCallOptions extends RelationCacheEntryOptions {\n  /** Bypass the cache read but still write the fresh result back. */\n  forceLoad?: boolean\n}\n\n/**\n * The eager query builder returned by `relation.eagerQuery(...)`, narrowed to the\n * chained methods the cache invokes at the chokepoint.\n * @internal\n */\ninterface EagerQueryLike {\n  debug: (enabled: boolean) => EagerQueryLike\n  sideload: (values: Record<string, unknown>) => EagerQueryLike\n  selectRelationKeys: () => EagerQueryLike\n  exec: () => Promise<LucidRow[]>\n}\n\n/**\n * A relation booted by Lucid, narrowed to the metadata the cache reads.\n * @internal\n */\ninterface BootedRelationLike {\n  type: string\n  relationName: string\n  foreignKey: string\n  localKey: string\n  /** Whether Lucid has booted this relation (keys populated). */\n  booted?: boolean\n  /** Boots the relation, populating `foreignKey`/`localKey`. Idempotent in Lucid. */\n  boot?: () => void\n  relatedModel: () => LucidModel\n  eagerQuery: (parent: LucidRow | LucidRow[], client: unknown) => EagerQueryLike\n  setRelated: (parent: LucidRow, related: LucidRow | null) => void\n  setRelatedForMany: (parent: LucidRow[], related: LucidRow[]) => void\n}\n\n/**\n * A `preload(name, callback?)` call captured from a relation-load callback while\n * classifying it as nesting-only (see {@link CachingPreloader.#classifyCallback}).\n * @internal\n */\ninterface CapturedNestedPreload {\n  name: string\n  callback?: (query: unknown) => void\n}\n\n/**\n * The narrow slice of a sibling {@link CachingPreloader} the cascade driver uses\n * to load nested relations onto already-resolved related rows (typed loosely to\n * avoid Lucid's generic relation-name machinery for a dynamic relation name).\n * @internal\n */\ninterface NestedCascadeDriver {\n  preload: (name: string, callback?: (query: unknown) => void) => unknown\n  sideload: (values: Record<string, unknown>) => unknown\n  processAllForMany: (rows: LucidRow[], client: unknown) => Promise<void>\n}\n\n/**\n * The runtime shape of the base {@link Preloader}'s state and chokepoint methods.\n *\n * Lucid declares `model`/`preloads`/`sideloaded`/`debugQueries` and the\n * `processRelation*` methods as `private` in its `.d.ts`, but they exist as\n * ordinary public members at runtime. This view exposes them in a type-safe way\n * so the subclass can read base state and delegate the uncached fallback to the\n * base implementations without `any`.\n * @internal\n */\ninterface BasePreloaderInternals {\n  model: LucidModel\n  preloads: Record<string, { relation: unknown; callback?: unknown }>\n  sideloaded: Record<string, unknown>\n  debugQueries: boolean\n  processRelation: (name: string, parent: LucidRow, client: unknown) => Promise<void>\n  processRelationForMany: (name: string, parents: LucidRow[], client: unknown) => Promise<void>\n}\n\n/**\n * Models whose `relationsCache` keys have already passed relation-name\n * validation. Keyed by the model constructor so a misconfigured model is never\n * recorded (it throws before reaching the `add`) and so entries are GC'd with\n * the model. Exists to keep the per-query hot path cheap: `registerCacheTargets`\n * runs on every `new CachingPreloader`, but the Joi key check runs at most once\n * per model.\n * @internal\n */\nconst relationKeysValidatedModels = new WeakSet<LucidModel>()\n\n/**\n * Caching extension of Lucid's `Preloader`.\n * @internal\n */\nexport class CachingPreloader extends Preloader {\n  /** Pre-merged per-relation entry options (relation name → merged options). */\n  #relationsCache: Map<string, RelationCacheEntryOptions>\n  /** Per-call overrides recorded via `preloadCached`, cleared as they are consumed. */\n  #callOptions: Map<string, RelationCacheCallOptions>\n\n  constructor(\n    model: LucidModel,\n    relationsCache: Map<string, RelationCacheEntryOptions>,\n    callOptions: Map<string, RelationCacheCallOptions> = new Map()\n  ) {\n    super(model)\n    this.#relationsCache = relationsCache\n    this.#callOptions = callOptions\n    CachingPreloader.registerCacheTargets(model)\n\n    // Lucid declares `processRelation`/`processRelationForMany` as `private` in\n    // its types (so a TS-level `override` is rejected) but invokes them\n    // polymorphically at runtime via `this.processRelation(...)`. We install our\n    // caching implementations as own instance properties, shadowing the base\n    // prototype methods at the runtime chokepoint without a forbidden override.\n    const internals = this as unknown as BasePreloaderInternals\n    internals.processRelation = (name, parent, client) =>\n      this.#cachedProcessRelation(name, parent, client)\n    internals.processRelationForMany = (name, parents, client) =>\n      this.#cachedProcessRelationForMany(name, parents, client)\n  }\n\n  /*\n  |--------------------------------------------------------------------------\n  | Static properties\n  |--------------------------------------------------------------------------\n  */\n\n  /**\n   * Reads the resourceful name of a model, falling back to its class name when\n   * the model is not resourceful (cache keys/tags must still be deterministic).\n   *\n   * @param model - The model whose identity name is needed.\n   * @returns The canonical model name used in cache keys and tags.\n   */\n  static #modelName(model: LucidModel): string {\n    const resourcefulName = (model as LucidModel & { $resourcefulName?: string }).$resourcefulName\n    return resourcefulName ?? model.name\n  }\n\n  /**\n   * Determines whether a relation is a cacheable 1:1 inline-loadable type.\n   *\n   * @param relation - The booted relation to classify.\n   * @returns `true` for `belongsTo`/`hasOne`, `false` otherwise.\n   */\n  static #isCacheable(relation: BootedRelationLike): boolean {\n    return relation.type === 'belongsTo' || relation.type === 'hasOne'\n  }\n\n  /**\n   * Ensures a relation is booted so its `localKey`/`foreignKey` are populated.\n   * Lucid populates these only in `boot()`, and reading them on an unbooted\n   * relation yields `undefined`. `boot()` is idempotent in Lucid.\n   *\n   * @param relation - The relation to boot.\n   */\n  static #ensureBooted(relation: BootedRelationLike): void {\n    if (relation.booted === false && typeof relation.boot === 'function') {\n      relation.boot()\n    }\n  }\n\n  /**\n   * Fails loud when a `belongsTo` relation's `localKey` differs from the related\n   * model's `primaryKey`. The cache keys a `belongsTo` lookup by the parent FK\n   * value (the related row's `localKey`) but tags the stored entry by the related\n   * row's `primaryKey`; when these diverge, lookup key and eviction tag describe\n   * different rows and a cached entry could serve the wrong row — so we refuse to\n   * cache it rather than risk incorrect data.\n   *\n   * @param relation - The booted relation to validate.\n   * @throws {E_RELATION_CACHE_KEY_DIVERGENCE} When a belongsTo `localKey !== primaryKey`.\n   */\n  static #assertBelongsToKeyConsistency(relation: BootedRelationLike): void {\n    if (relation.type !== 'belongsTo') {\n      return\n    }\n    CachingPreloader.#ensureBooted(relation)\n    const relatedModel = relation.relatedModel()\n    if (relation.localKey === relatedModel.primaryKey) {\n      return\n    }\n    throw new E_RELATION_CACHE_KEY_DIVERGENCE(\n      relation.relationName,\n      CachingPreloader.#modelName(relatedModel),\n      relation.localKey,\n      relatedModel.primaryKey\n    )\n  }\n\n  /**\n   * Builds the canonical lookup key for a single parent's 1:1 relation.\n   *\n   * `belongsTo` keys by the related PK held on the parent FK (known pre-load);\n   * `hasOne` keys by its defining FK against the parent local-key value.\n   *\n   * @param relation - The booted 1:1 relation.\n   * @param parent - The parent row the relation hangs off.\n   * @returns The lookup key, or `null` when the parent lacks the needed identity value.\n   */\n  static #lookupKeyForParent(relation: BootedRelationLike, parent: LucidRow): string | null {\n    const relatedName = CachingPreloader.#modelName(relation.relatedModel())\n\n    if (relation.type === 'belongsTo') {\n      CachingPreloader.#assertBelongsToKeyConsistency(relation)\n      const relatedPrimaryKeyValue = (parent as unknown as Record<string, unknown>)[\n        relation.foreignKey\n      ]\n      if (relatedPrimaryKeyValue === null || relatedPrimaryKeyValue === undefined) {\n        return null\n      }\n      return `${relatedName}:${String(relatedPrimaryKeyValue)}`\n    }\n\n    const parentLocalKeyValue = (parent as unknown as Record<string, unknown>)[relation.localKey]\n    if (parentLocalKeyValue === null || parentLocalKeyValue === undefined) {\n      return null\n    }\n    return `${relatedName}:${relation.foreignKey}=${String(parentLocalKeyValue)}`\n  }\n\n  /**\n   * Builds the canonical eviction tag for a loaded related row — its own\n   * identity `{RelatedModelName}:{relatedPk}`, used by write-through eviction.\n   *\n   * @param relation - The booted 1:1 relation.\n   * @param relatedRow - The loaded related row.\n   * @returns The identity tag, or `null` when the row's PK is unavailable.\n   */\n  static #identityTagForRow(relation: BootedRelationLike, relatedRow: LucidRow): string | null {\n    const relatedModel = relation.relatedModel()\n    const relatedName = CachingPreloader.#modelName(relatedModel)\n    const primaryKeyValue = (relatedRow as unknown as Record<string, unknown>)[\n      relatedModel.primaryKey\n    ]\n    if (primaryKeyValue === null || primaryKeyValue === undefined) {\n      return null\n    }\n    return `${relatedName}:${String(primaryKeyValue)}`\n  }\n\n  /**\n   * Rebuilds a related model instance from a cached, consumed-`$attributes`\n   * snapshot, mirroring Lucid's own post-fetch construction (`$setAttribute`\n   * per field + `$hydrateOriginals` + `$isPersisted`/`$isLocal`) so the result\n   * is a clean (`$isDirty === false`), persisted, fully-operating instance\n   * (ADR-008).\n   *\n   * @param relatedModel - The model constructor to instantiate.\n   * @param snapshot - The cached `$attributes` snapshot.\n   * @param sideloaded - The sideloaded attributes to re-apply.\n   * @returns The rehydrated related row.\n   */\n  static #rehydrate(\n    relatedModel: LucidModel,\n    snapshot: Record<string, unknown>,\n    sideloaded: Record<string, unknown>\n  ): LucidRow {\n    const row = new relatedModel() as LucidRow\n    for (const [attribute, value] of Object.entries(snapshot)) {\n      row.$setAttribute(attribute, value)\n    }\n    row.$sideloaded = { ...sideloaded }\n    row.$hydrateOriginals()\n    row.$isPersisted = true\n    row.$isLocal = false\n    return row\n  }\n\n  /**\n   * Runs the related model's `cacheMiddlewarePrepare` pipeline over a snapshot and\n   * encodes the result for storage (ADR-011/012). Throws on a middleware or encoder\n   * failure so the caller routes it to `E_RELATION_CACHE_WRITE_FAILED` and skips the\n   * write — the row was already set on the parent, so the read still succeeds (ADR-009).\n   *\n   * @param relatedModel - The model whose instance is being cached.\n   * @param name - The relation name (for the middleware context).\n   * @param lookupKey - The canonical cache key (for the middleware context).\n   * @param snapshot - The consumed-`$attributes` snapshot to prepare and encode.\n   * @returns The encoded cache value to store.\n   */\n  static async #prepareForStore(\n    relatedModel: LucidModel,\n    name: string,\n    lookupKey: string,\n    snapshot: Record<string, unknown>\n  ): Promise<string> {\n    const pipeline = (\n      relatedModel as LucidModel & {\n        $resourcefulCacheMiddlewarePrepare?: CacheMiddlewarePipeline | null\n      }\n    ).$resourcefulCacheMiddlewarePrepare\n    const prepared = await runCacheMiddleware(pipeline ?? null, {\n      phase: 'prepare',\n      model: relatedModel,\n      relation: name,\n      key: lookupKey,\n      value: snapshot,\n    })\n    return encodeCacheValue(prepared)\n  }\n\n  /**\n   * Decodes a cached entry and runs the related model's `cacheMiddlewareConsume`\n   * pipeline over it (ADR-011/012), yielding a snapshot ready for `#rehydrate`.\n   * Throws on a decode or middleware failure so the caller treats the entry as\n   * poisoned — reported as `E_RELATION_CACHE_REHYDRATION_FAILED` and served as a\n   * miss (ADR-009).\n   *\n   * @param relatedModel - The model the cached snapshot belongs to.\n   * @param name - The relation name (for the middleware context).\n   * @param lookupKey - The canonical cache key (for the middleware context).\n   * @param encoded - The encoded cache value read from the cache service.\n   * @returns The decoded, consumed snapshot.\n   */\n  static async #consumeFromCache(\n    relatedModel: LucidModel,\n    name: string,\n    lookupKey: string,\n    encoded: string\n  ): Promise<Record<string, unknown>> {\n    const snapshot = decodeCacheValue(encoded)\n    const pipeline = (\n      relatedModel as LucidModel & {\n        $resourcefulCacheMiddlewareConsume?: CacheMiddlewarePipeline | null\n      }\n    ).$resourcefulCacheMiddlewareConsume\n    return runCacheMiddleware(pipeline ?? null, {\n      phase: 'consume',\n      model: relatedModel,\n      relation: name,\n      key: lookupKey,\n      value: snapshot,\n    })\n  }\n\n  /**\n   * Classifies a relation-load callback as **nesting-only** (it calls only\n   * `preload`/`load`, which add child relations without changing which parent rows\n   * match) versus **filtering** (it touches anything else — `where`, `select`,\n   * `limit`, …, which shapes the matched set).\n   *\n   * A filtering callback means the canonical cached row can't be trusted to satisfy\n   * the predicate, so the caller must bypass the cache. A nesting-only callback is\n   * safe to serve from cache, and its captured child preloads are cascaded onto the\n   * resolved rows — each caching at its own identity (AC line 33 / ADR-002).\n   *\n   * Runs the callback against a recording Proxy and is **default-deny**: ANY access\n   * other than `preload`/`load` (or a throw) marks it filtering. A filtering\n   * callback therefore can NEVER be misclassified as cacheable; the only failure\n   * mode is a nesting-only callback conservatively treated as filtering — i.e. the\n   * pre-existing bypass, a perf (not correctness) outcome.\n   *\n   * @param callback - The relation-load callback to classify.\n   * @returns `nestingOnly` plus the captured child preloads (name + optional nested callback).\n   */\n  static #classifyCallback(callback: (query: unknown) => void): {\n    nestingOnly: boolean\n    preloads: CapturedNestedPreload[]\n  } {\n    const preloads: CapturedNestedPreload[] = []\n    let filtering = false\n    const recorder: unknown = new Proxy(\n      {},\n      {\n        get(_target, property) {\n          if (property === 'preload' || property === 'load') {\n            return (name: string, nestedCallback?: (query: unknown) => void) => {\n              preloads.push({ name, callback: nestedCallback })\n              return recorder\n            }\n          }\n          // Any other string-keyed interaction shapes the result set → not safe to\n          // serve from the canonical cache. Return a chaining no-op so the callback\n          // can keep calling without throwing (symbol/protocol reads are ignored).\n          if (typeof property === 'string') {\n            filtering = true\n          }\n          return () => recorder\n        },\n      }\n    )\n    try {\n      callback(recorder)\n    } catch {\n      // A callback that throws against the recorder is treated as unsafe to cache.\n      filtering = true\n    }\n    return { nestingOnly: !filtering, preloads }\n  }\n\n  /**\n   * Validates — once per model — that every key in the model's `relationsCache`\n   * names a relation that actually exists on the model, rejecting typos and stale\n   * names that would otherwise be silently skipped (and never cached). Mirrors the\n   * mixin's Joi approach: a strict object schema whose only permitted keys are the\n   * model's registered relation names; any other configured key fails validation.\n   *\n   * The relation VALUES (BentoCache entry options) are validated separately at\n   * mixin declare time. KEY validation has to happen here instead, because a\n   * model's relations are only registered by its decorators AFTER the mixin's\n   * option schema runs — so at declare time there are no relations to check the\n   * keys against. By the time `registerCacheTargets` runs (host boot, or the first\n   * `.query()`/`.load()`), the decorators have populated `$relationsDefinitions`.\n   * Memoized via {@link relationKeysValidatedModels} so the per-query hot path\n   * pays the Joi cost at most once per model.\n   *\n   * @param model - The model declaring the relations.\n   * @param relationsCache - The model's pre-merged relation cache config.\n   * @throws {E_INVALID_RESOURCEFUL_MIXIN_OPTIONS} When a key is not a known relation name.\n   */\n  static #assertRelationsCacheKeysAreRelations(\n    model: LucidModel,\n    relationsCache: Map<string, RelationCacheEntryOptions>\n  ): void {\n    if (relationKeysValidatedModels.has(model)) {\n      return\n    }\n    const allowedRelationKeys: Record<string, ReturnType<typeof joi.any>> = {}\n    for (const relationName of model.$relationsDefinitions.keys()) {\n      allowedRelationKeys[relationName] = joi.any()\n    }\n    const configuredKeys: Record<string, true> = {}\n    for (const relationName of relationsCache.keys()) {\n      configuredKeys[relationName] = true\n    }\n    const { error } = joi.object(allowedRelationKeys).validate(configuredKeys, {\n      abortEarly: false,\n    })\n    if (error) {\n      throw new E_INVALID_RESOURCEFUL_MIXIN_OPTIONS(CachingPreloader.#modelName(model), error)\n    }\n    relationKeysValidatedModels.add(model)\n  }\n\n  /**\n   * Eagerly registers every configured cacheable 1:1 relation's related-model\n   * identity name as a relation-cache TARGET (and validates `belongsTo` key\n   * consistency up front). Registering from the DECLARED config ensures the\n   * write-through eviction gate knows the full target set. Before registering, it\n   * validates (once per model) that every `relationsCache` key is a real relation\n   * name (see {@link CachingPreloader.#assertRelationsCacheKeysAreRelations}).\n   *\n   * IMPORTANT: this is also invoked process-globally at host boot (via the\n   * exported `registerRelationCacheTargetsForModel`), NOT only from a constructed\n   * preloader — a preloader is built lazily on first `.query()`/`.load()` of the\n   * declaring parent, which a credential/rate worker process may never call. Boot\n   * registration makes the target set process-global so a \"cold\" writer (e.g. a\n   * rates-sync command that only ever updates `Currency`) still evicts shared L2\n   * entries another process cached.\n   *\n   * @param model - The model declaring the relations (reads `$resourcefulRelationsCache`).\n   */\n  static registerCacheTargets(model: LucidModel): void {\n    const relationsCache = (\n      model as LucidModel & { $resourcefulRelationsCache?: Map<string, RelationCacheEntryOptions> }\n    ).$resourcefulRelationsCache\n    if (!relationsCache || relationsCache.size === 0) {\n      return\n    }\n    CachingPreloader.#assertRelationsCacheKeysAreRelations(model, relationsCache)\n    for (const relationName of relationsCache.keys()) {\n      // `$getRelation` throws on an unknown relation name; a misconfigured entry\n      // must not break registration, so resolve it defensively.\n      let relation: BootedRelationLike | undefined\n      try {\n        relation = model.$getRelation(relationName) as unknown as BootedRelationLike | undefined\n      } catch {\n        relation = undefined\n      }\n      if (!relation || !CachingPreloader.#isCacheable(relation)) {\n        continue\n      }\n      // `localKey`/`foreignKey` are only populated after the relation is booted;\n      // boot it so the belongsTo key-consistency guard reads real keys, not undefined.\n      CachingPreloader.#ensureBooted(relation)\n      CachingPreloader.#assertBelongsToKeyConsistency(relation)\n      registerRelationCacheTarget(CachingPreloader.#modelName(relation.relatedModel()))\n    }\n  }\n\n  /*\n  |--------------------------------------------------------------------------\n  | Instance properties\n  |--------------------------------------------------------------------------\n  */\n\n  /**\n   * Type-safe view of the base preloader's runtime state and chokepoint methods\n   * (declared `private` in Lucid's types but public at runtime).\n   *\n   * @returns This instance viewed as {@link BasePreloaderInternals}.\n   */\n  get #internals(): BasePreloaderInternals {\n    return this as unknown as BasePreloaderInternals\n  }\n\n  /**\n   * Emits a relation-cache lifecycle event to the host's `onRelationsCacheEvent`\n   * hook (per-model → process-wide default → no-op). Synchronous, guarded, and\n   * never throws into a load — observability is the host's concern, so the\n   * package imports no logger of its own.\n   *\n   * @param event - The cache lifecycle event that occurred.\n   * @param context - Structured context for the event.\n   */\n  #emit(event: RelationCacheEvent, context: RelationCacheEventContext): void {\n    reportRelationCacheEvent(this.#internals.model, event, context)\n  }\n\n  /**\n   * Delegates a single-parent load to the base (uncached) implementation.\n   *\n   * @param name - The relation name.\n   * @param parent - The parent row.\n   * @param client - The query client.\n   */\n  #superProcessRelation(name: string, parent: LucidRow, client: unknown): Promise<void> {\n    const base = Preloader.prototype as unknown as BasePreloaderInternals\n    return base.processRelation.call(this, name, parent, client)\n  }\n\n  /**\n   * Delegates a many-parent eager load to the base (uncached) implementation.\n   *\n   * @param name - The relation name.\n   * @param parents - The parent rows.\n   * @param client - The query client.\n   */\n  #superProcessRelationForMany(name: string, parents: LucidRow[], client: unknown): Promise<void> {\n    const base = Preloader.prototype as unknown as BasePreloaderInternals\n    return base.processRelationForMany.call(this, name, parents, client)\n  }\n\n  /**\n   * Resolves the merged entry options for a relation by layering any recorded\n   * per-call overrides over the pre-merged model-level options.\n   *\n   * @param name - The relation name.\n   * @returns The effective entry options for this load.\n   */\n  #entryOptions(name: string): RelationCacheEntryOptions {\n    const base = this.#relationsCache.get(name) ?? {}\n    const call = this.#callOptions.get(name)\n    if (!call) {\n      return base\n    }\n    // `forceLoad` is a read-time control, not a cache entry option, so strip it\n    // before merging the per-call overrides over the model-level defaults.\n    const overrides: RelationCacheEntryOptions = {\n      ttl: call.ttl,\n      grace: call.grace,\n      graceBackoff: call.graceBackoff,\n      suppressL2Errors: call.suppressL2Errors,\n      timeout: call.timeout,\n      hardTimeout: call.hardTimeout,\n      lockTimeout: call.lockTimeout,\n    }\n    const merged: RelationCacheEntryOptions = { ...base }\n    for (const [optionKey, optionValue] of Object.entries(overrides)) {\n      if (optionValue !== undefined) {\n        ;(merged as Record<string, unknown>)[optionKey] = optionValue\n      }\n    }\n    return merged\n  }\n\n  /**\n   * Resolves the cache service for this preloader's model. Reads fail loud: a\n   * resolver that throws propagates (ADR-007).\n   *\n   * @returns The resolved cache service, or `null` when caching is opted out.\n   */\n  #resolveCache(): Promise<CacheServiceLike | null> {\n    const model = this.#internals.model\n    const resolver = (\n      model as LucidModel & {\n        $resourcefulRelationsCacheService?: () =>\n          | CacheServiceLike\n          | null\n          | Promise<CacheServiceLike | null>\n      }\n    ).$resourcefulRelationsCacheService\n    return resolveRelationsCacheService(model, resolver)\n  }\n\n  /**\n   * Processes a single-parent relation load, serving from cache when the\n   * relation is a configured 1:1 type and falling back to `super` otherwise.\n   *\n   * @param name - The relation name being loaded.\n   * @param parent - The parent row.\n   * @param client - The query client to use for the eager query.\n   */\n  async #cachedProcessRelation(name: string, parent: LucidRow, client: unknown): Promise<void> {\n    // The recorded per-call options are read once up front and cleared on EVERY\n    // exit path via `finally`, so a bypass/early return can't leak a stale\n    // forceLoad/ttl into a later same-name load on this preloader.\n\n    try {\n      const internals = this.#internals\n      const model = internals.model\n      const relation = model.$getRelation(name) as unknown as BootedRelationLike | undefined\n      const callOptions = this.#callOptions.get(name)\n      const hasCallback = typeof internals.preloads[name]?.callback === 'function'\n\n      // A relation that is not configured, not a cacheable 1:1 type, or is being\n      // filtered by a callback bypasses the cache entirely (calls super unchanged).\n      if (\n        !relation ||\n        !this.#relationsCache.has(name) ||\n        !CachingPreloader.#isCacheable(relation)\n      ) {\n        await this.#superProcessRelation(name, parent, client)\n        return\n      }\n      // A callback is classified: a *filtering* callback (`q => q.where(...)`) can't\n      // be served from the canonical cache and bypasses; a *nesting-only* callback\n      // (`q => q.preload('tenant')`) is safe — we cache the outer row and cascade the\n      // captured child preloads, each caching at its own identity (AC line 33 /\n      // ADR-002). Classification is default-deny (see `#classifyCallback`).\n      let nestedPreloads: CapturedNestedPreload[] | null = null\n      if (hasCallback) {\n        const callback = internals.preloads[name].callback as (query: unknown) => void\n        const classification = CachingPreloader.#classifyCallback(callback)\n        if (!classification.nestingOnly) {\n          this.#emit('bypass', {\n            model: CachingPreloader.#modelName(model),\n            relation: name,\n          })\n          await this.#superProcessRelation(name, parent, client)\n          return\n        }\n        nestedPreloads = classification.preloads\n      }\n\n      // Resolving the cache is an operational site (ADR-009): a resolver throw /\n      // unreachable app no longer fails the read — it is reported and the load\n      // degrades to an uncached DB load (was fail-loud under ADR-007).\n      let cache: CacheServiceLike | null\n      try {\n        cache = await this.#resolveCache()\n      } catch (cause) {\n        reportRelationCacheError(\n          model,\n          new E_RELATION_CACHE_RESOLUTION_FAILED(\n            { model: CachingPreloader.#modelName(model), relation: name },\n            cause\n          )\n        )\n        await this.#superProcessRelation(name, parent, client)\n        return\n      }\n\n      if (!cache) {\n        await this.#superProcessRelation(name, parent, client)\n        return\n      }\n\n      const lookupKey = CachingPreloader.#lookupKeyForParent(relation, parent)\n      if (!lookupKey) {\n        // No identity to key by (e.g. null FK) — load normally, nothing to cache.\n        await this.#superProcessRelation(name, parent, client)\n        return\n      }\n\n      const relatedModel = relation.relatedModel()\n      const modelName = CachingPreloader.#modelName(model)\n      const forceLoad = callOptions?.forceLoad === true\n\n      if (!forceLoad) {\n        // Cache read is an operational site (ADR-009): a `get` failure is reported\n        // and the load degrades to an uncached DB load.\n        let cachedEntry: string | undefined | null\n        try {\n          cachedEntry = await cache.get<string | undefined | null>({\n            key: lookupKey,\n          })\n        } catch (cause) {\n          reportRelationCacheError(\n            model,\n            new E_RELATION_CACHE_READ_FAILED(\n              { model: modelName, relation: name, key: lookupKey },\n              cause\n            )\n          )\n          await this.#superProcessRelation(name, parent, client)\n          return\n        }\n\n        if (cachedEntry) {\n          // Decode + consume + rehydration is an operational site (ADR-009): a\n          // poisoned/incompatible entry is reported and treated as a miss (fall\n          // through to the eager query, which overwrites the bad entry) rather than\n          // failing the load.\n          let row: LucidRow | null = null\n          try {\n            const snapshot = await CachingPreloader.#consumeFromCache(\n              relatedModel,\n              name,\n              lookupKey,\n              cachedEntry\n            )\n            row = CachingPreloader.#rehydrate(relatedModel, snapshot, internals.sideloaded)\n          } catch (cause) {\n            reportRelationCacheError(\n              model,\n              new E_RELATION_CACHE_REHYDRATION_FAILED(\n                { model: modelName, relation: name, key: lookupKey, value: cachedEntry },\n                cause\n              )\n            )\n            row = null\n          }\n\n          if (row) {\n            relation.setRelated(parent, row)\n            this.#emit('hit', { model: modelName, relation: name, key: lookupKey })\n            // The outer row came from cache (no eager query ran), so load any nested\n            // preloads onto it explicitly — each cascades through the cache.\n            if (nestedPreloads) {\n              await this.#cascadeNested(relatedModel, [row], nestedPreloads, client)\n            }\n            return\n          }\n          // Poisoned entry → fall through to the miss path below (refetch + overwrite).\n        }\n      } else {\n        this.#emit('force', { model: modelName, relation: name, key: lookupKey })\n      }\n\n      // Miss (or forced): run the normal eager query, set the result, and write back.\n      // A nesting callback is NOT applied to this query — its children cascade\n      // separately (below) so each caches at its own identity rather than baking\n      // into the parent snapshot.\n      const query = relation\n        .eagerQuery(parent, client)\n        .debug(internals.debugQueries)\n        .sideload(internals.sideloaded)\n      const result = await query.selectRelationKeys().exec()\n      const relatedRow = result[0] ?? null\n      relation.setRelated(parent, relatedRow)\n\n      if (relatedRow) {\n        await this.#store(\n          cache,\n          name,\n          lookupKey,\n          relation,\n          relatedRow,\n          forceLoad ? 'force' : 'miss'\n        )\n        if (nestedPreloads) {\n          await this.#cascadeNested(relatedModel, [relatedRow], nestedPreloads, client)\n        }\n      }\n    } finally {\n      this.#callOptions.delete(name)\n    }\n  }\n\n  /**\n   * Processes an eager relation load across many parents: serves cache hits per\n   * parent, batches misses into a single `whereIn` query, then writes each\n   * fetched row back under its identity key.\n   *\n   * @param name - The relation name being loaded.\n   * @param parents - The parent rows.\n   * @param client - The query client to use for the eager query.\n   */\n  async #cachedProcessRelationForMany(\n    name: string,\n    parents: LucidRow[],\n    client: unknown\n  ): Promise<void> {\n    // Per-call options are cleared on EVERY exit path via `finally` (see\n    // #cachedProcessRelation) so a bypass/early return can't leak stale options.\n    try {\n      const internals = this.#internals\n      const model = internals.model\n      const relation = model.$getRelation(name) as unknown as BootedRelationLike | undefined\n      const callOptions = this.#callOptions.get(name)\n      const hasCallback = typeof internals.preloads[name]?.callback === 'function'\n\n      if (\n        !relation ||\n        !this.#relationsCache.has(name) ||\n        !CachingPreloader.#isCacheable(relation)\n      ) {\n        await this.#superProcessRelationForMany(name, parents, client)\n        return\n      }\n      // See `#cachedProcessRelation`: a filtering callback bypasses; a nesting-only\n      // callback caches the outer rows and cascades its captured child preloads.\n      let nestedPreloads: CapturedNestedPreload[] | null = null\n      if (hasCallback) {\n        const callback = internals.preloads[name].callback as (query: unknown) => void\n        const classification = CachingPreloader.#classifyCallback(callback)\n        if (!classification.nestingOnly) {\n          this.#emit('bypass', {\n            model: CachingPreloader.#modelName(model),\n            relation: name,\n          })\n          await this.#superProcessRelationForMany(name, parents, client)\n          return\n        }\n        nestedPreloads = classification.preloads\n      }\n\n      // Resolution is an operational site (ADR-009): report + degrade to the\n      // uncached batched DB load instead of failing.\n      let cache: CacheServiceLike | null\n      try {\n        cache = await this.#resolveCache()\n      } catch (cause) {\n        reportRelationCacheError(\n          model,\n          new E_RELATION_CACHE_RESOLUTION_FAILED(\n            { model: CachingPreloader.#modelName(model), relation: name },\n            cause\n          )\n        )\n        await this.#superProcessRelationForMany(name, parents, client)\n        return\n      }\n      if (!cache) {\n        await this.#superProcessRelationForMany(name, parents, client)\n        return\n      }\n\n      const relatedModel = relation.relatedModel()\n      const modelName = CachingPreloader.#modelName(model)\n      const forceLoad = callOptions?.forceLoad === true\n      // Outer related rows resolved this pass (cache-rehydrated and/or freshly\n      // loaded), collected so a nesting callback can cascade onto all of them at once.\n      const outerRelatedRows: LucidRow[] = []\n\n      // Build the per-parent lookup-key list once, then issue all cache reads\n      // in parallel via Promise.all so L1/L2 round-trips overlap instead of\n      // serializing one per parent (which on a partially-cold cache was slower\n      // than the uncached `whereIn` path it replaces).\n      const parentLookupKeys: Array<{ parent: LucidRow; lookupKey: string | null }> = parents.map(\n        (parent) => ({\n          parent,\n          lookupKey: CachingPreloader.#lookupKeyForParent(relation, parent),\n        })\n      )\n\n      const cacheReads: Array<string | undefined | null> = forceLoad\n        ? new Array(parentLookupKeys.length).fill(null)\n        : await Promise.all(\n            parentLookupKeys.map(({ lookupKey }) =>\n              lookupKey\n                ? // Cache read is an operational site (ADR-009): a per-parent `get`\n                  // failure is reported and degraded to a miss (that parent then\n                  // loads from the DB), so one bad key can't fail the whole batch.\n                  cache\n                    .get<string | undefined | null>({ key: lookupKey })\n                    .catch((cause: unknown) => {\n                      reportRelationCacheError(\n                        model,\n                        new E_RELATION_CACHE_READ_FAILED(\n                          { model: modelName, relation: name, key: lookupKey },\n                          cause\n                        )\n                      )\n                      return null\n                    })\n                : Promise.resolve(null)\n            )\n          )\n\n      const parentsNeedingLoad: LucidRow[] = []\n      for (const [parentIndex, { parent, lookupKey }] of parentLookupKeys.entries()) {\n        if (!lookupKey || forceLoad) {\n          // No identity for this parent, or a forced refresh — load it.\n          parentsNeedingLoad.push(parent)\n          continue\n        }\n        const cachedEntry = cacheReads[parentIndex]\n        if (cachedEntry) {\n          // Decode + consume + rehydration is an operational site (ADR-009): a\n          // poisoned entry is reported and degraded to a miss for this parent\n          // (refetched + overwritten).\n          let row: LucidRow | null = null\n          try {\n            const snapshot = await CachingPreloader.#consumeFromCache(\n              relatedModel,\n              name,\n              lookupKey,\n              cachedEntry\n            )\n            row = CachingPreloader.#rehydrate(relatedModel, snapshot, internals.sideloaded)\n          } catch (cause) {\n            reportRelationCacheError(\n              model,\n              new E_RELATION_CACHE_REHYDRATION_FAILED(\n                { model: modelName, relation: name, key: lookupKey, value: cachedEntry },\n                cause\n              )\n            )\n            row = null\n          }\n          if (row) {\n            relation.setRelated(parent, row)\n            outerRelatedRows.push(row)\n            // Fire-and-forget the hit log so the load path does not block on\n            // logger resolution per parent.\n            this.#emit('hit', { model: modelName, relation: name, key: lookupKey })\n            continue\n          }\n          // Poisoned entry → fall through to load this parent from the DB.\n        }\n        parentsNeedingLoad.push(parent)\n      }\n\n      if (forceLoad) {\n        this.#emit('force', { model: modelName, relation: name })\n      }\n\n      if (parentsNeedingLoad.length > 0) {\n        const query = relation\n          .eagerQuery(parentsNeedingLoad, client)\n          .debug(internals.debugQueries)\n          .sideload(internals.sideloaded)\n        const result = await query.selectRelationKeys().exec()\n        relation.setRelatedForMany(parentsNeedingLoad, result)\n\n        for (const parent of parentsNeedingLoad) {\n          const relatedRow = (parent.$preloaded as Record<string, LucidRow | null>)[\n            relation.relationName\n          ]\n          if (relatedRow) {\n            outerRelatedRows.push(relatedRow)\n          }\n          const lookupKey = CachingPreloader.#lookupKeyForParent(relation, parent)\n          if (!lookupKey || !relatedRow) {\n            continue\n          }\n          await this.#store(\n            cache,\n            name,\n            lookupKey,\n            relation,\n            relatedRow,\n            forceLoad ? 'force' : 'miss'\n          )\n        }\n      }\n\n      // Cascade the nesting callback's child preloads onto every resolved outer row\n      // (hits + misses) in one batched pass, each caching at its own identity.\n      if (nestedPreloads) {\n        await this.#cascadeNested(relatedModel, outerRelatedRows, nestedPreloads, client)\n      }\n    } finally {\n      this.#callOptions.delete(name)\n    }\n  }\n\n  /**\n   * Stores a related row's consumed-`$attributes` snapshot under its lookup key,\n   * tagged with the row's canonical identity for write-through eviction.\n   *\n   * @param cache - The resolved cache service.\n   * @param name - The relation name (for logging).\n   * @param lookupKey - The canonical lookup key.\n   * @param relation - The booted 1:1 relation.\n   * @param relatedRow - The loaded related row.\n   * @param origin - Whether the store originated from a normal miss or a forced load.\n   */\n  async #store(\n    cache: CacheServiceLike,\n    name: string,\n    lookupKey: string,\n    relation: BootedRelationLike,\n    relatedRow: LucidRow,\n    origin: 'miss' | 'force'\n  ): Promise<void> {\n    const tag = CachingPreloader.#identityTagForRow(relation, relatedRow)\n    // Deep clone (NOT shallow): `setRelated` already handed the live related row to\n    // the caller, so the snapshot must not share any nested object with it — else a\n    // prepare handler mutating a nested value in place would leak into the live model\n    // (ADR-012). `deepCloneSnapshot` preserves the encoder's rich leaf types.\n    const snapshot = deepCloneSnapshot(relatedRow.$attributes as Record<string, unknown>)\n    const entryOptions = this.#entryOptions(name)\n    const modelName = CachingPreloader.#modelName(this.#internals.model)\n    // Write-back is an operational site (ADR-009): a `set` failure (e.g. a\n    // serialization error) is reported and SKIPPED — the row was already fetched\n    // and set on the parent, so the read still succeeds; it is just not cached.\n    try {\n      const value = await CachingPreloader.#prepareForStore(\n        relation.relatedModel(),\n        name,\n        lookupKey,\n        snapshot\n      )\n      await cache.set({\n        key: lookupKey,\n        value,\n        tags: tag ? [tag] : undefined,\n        ttl: entryOptions.ttl,\n        grace: entryOptions.grace,\n        graceBackoff: entryOptions.graceBackoff,\n        suppressL2Errors: entryOptions.suppressL2Errors,\n        timeout: entryOptions.timeout,\n        hardTimeout: entryOptions.hardTimeout,\n        lockTimeout: entryOptions.lockTimeout,\n      })\n    } catch (cause) {\n      reportRelationCacheError(\n        this.#internals.model,\n        new E_RELATION_CACHE_WRITE_FAILED(\n          { model: modelName, relation: name, key: lookupKey, tag, value: snapshot },\n          cause\n        )\n      )\n      return\n    }\n    this.#emit('store', {\n      model: modelName,\n      relation: name,\n      key: lookupKey,\n      tag,\n      ttl: entryOptions.ttl,\n    })\n    if (origin === 'miss') {\n      this.#emit('miss', {\n        model: modelName,\n        relation: name,\n        key: lookupKey,\n      })\n    }\n  }\n\n  /**\n   * Cascades captured nested preloads onto already-resolved related rows so each\n   * nested 1:1 level caches at its own identity (AC line 33 / ADR-002). Drives a\n   * sibling {@link CachingPreloader} for the related model, which dispatches each\n   * nested relation through the SAME cache logic (recursing for deeper nesting)\n   * while batching the load across all rows via `processAllForMany`.\n   *\n   * Nested relations that are not cache-configured (or not a cacheable 1:1) simply\n   * load normally through that preloader's own bypass — identical to native Lucid.\n   * A nested *filtering* callback is re-classified and bypassed by the sibling\n   * preloader in turn, so each level decides independently.\n   *\n   * @param relatedModel - The model of the resolved related rows.\n   * @param rows - The resolved related rows (cache-rehydrated and/or freshly loaded).\n   * @param nested - The child preloads captured from the (nesting-only) callback.\n   * @param client - The query client to use for nested eager queries.\n   */\n  async #cascadeNested(\n    relatedModel: LucidModel,\n    rows: LucidRow[],\n    nested: CapturedNestedPreload[],\n    client: unknown\n  ): Promise<void> {\n    if (rows.length === 0 || nested.length === 0) {\n      return\n    }\n    const relationsCache =\n      (\n        relatedModel as LucidModel & {\n          $resourcefulRelationsCache?: Map<string, RelationCacheEntryOptions>\n        }\n      ).$resourcefulRelationsCache ?? new Map<string, RelationCacheEntryOptions>()\n    const driver = new CachingPreloader(\n      relatedModel,\n      relationsCache\n    ) as unknown as NestedCascadeDriver\n    driver.sideload({ ...this.#internals.sideloaded })\n    for (const { name, callback } of nested) {\n      driver.preload(name, callback)\n    }\n    await driver.processAllForMany(rows, client)\n  }\n\n  /**\n   * Records per-call cache controls for a relation (used by the builder method\n   * `preloadCached`) so the next `processRelation`/`processRelationForMany`\n   * applies them.\n   *\n   * @param name - The relation name.\n   * @param options - The per-call cache controls.\n   */\n  recordCallOptions(name: string, options: RelationCacheCallOptions): void {\n    this.#callOptions.set(name, options)\n  }\n\n  /**\n   * Clones the preloader, preserving its concrete type and cache configuration\n   * so cloned queries (e.g. pagination's count clone) keep caching by\n   * construction (ADR-001). Uses `this.constructor` so further subclasses clone\n   * to their own type rather than silently degrading to the base.\n   *\n   * @returns A new preloader of the same concrete type carrying the same state.\n   */\n  clone(): Preloader {\n    const internals = this.#internals\n    const Ctor = this.constructor as new (\n      model: LucidModel,\n      relationsCache: Map<string, RelationCacheEntryOptions>,\n      callOptions?: Map<string, RelationCacheCallOptions>\n    ) => CachingPreloader\n    const cloned = new Ctor(internals.model, this.#relationsCache, new Map(this.#callOptions))\n    const clonedInternals = cloned as unknown as BasePreloaderInternals\n    clonedInternals.preloads = Object.assign({}, internals.preloads)\n    clonedInternals.sideloaded = Object.assign({}, internals.sideloaded)\n    clonedInternals.debugQueries = internals.debugQueries\n    return cloned\n  }\n}\n\n/**\n * Registers a model's configured cacheable 1:1 relations as process-global cache\n * TARGETS, independent of ever constructing a {@link CachingPreloader} for it.\n *\n * The host application calls this at boot for every model that declares a\n * `relationsCache`, so the write-through eviction gate\n * (`isRelationCacheTarget`) is correct in EVERY process — including a \"cold\"\n * worker (e.g. a rates-sync command) that only writes a target row (`Currency`)\n * and never queries the declaring parent (`PaymentIntentTicket`). Without this,\n * such a process would skip `deleteByTag` and leave stale entries in a shared L2\n * for other processes until the TTL elapsed.\n *\n * Booting the model's relations + validating belongsTo key consistency happens\n * here too, so a misconfiguration fails loud at boot rather than at first load.\n *\n * @param model - A model that may declare a `relationsCache`.\n * @public\n */\nexport const registerRelationCacheTargetsForModel = (model: LucidModel): void => {\n  CachingPreloader.registerCacheTargets(model)\n}\n","/**\n * Cache service using WeakRef to allow garbage collection of values\n * when they're no longer referenced elsewhere and memory pressure occurs.\n * Uses string keys with weakly-referenced values.\n */\nexport class WeakCacheService {\n  #cache: Map<string, WeakRef<any>>\n\n  constructor() {\n    this.#cache = new Map()\n  }\n\n  /**\n   * Get a cached value by key\n   * @param {string} key - String key to lookup\n   * @returns {*} The cached value or undefined if not found or garbage collected\n   */\n  get(key: string) {\n    const weakRef = this.#cache.get(key)\n\n    if (!weakRef) {\n      return null\n    }\n\n    const value = weakRef.deref()\n\n    // If value was garbage collected, clean up the entry\n    if (value === undefined) {\n      this.#cache.delete(key)\n      return null\n    }\n\n    return value\n  }\n\n  /**\n   * Create/store a value in the cache with weak reference\n   * @param {string} key - String key for the cache entry\n   * @param {Object} value - Value to cache (must be an object, not a primitive)\n   * @returns {Object} The cached value\n   */\n  create(key: string, value: unknown) {\n    if (typeof value !== 'object' || value === null) {\n      throw new Error('Cached values must be objects for WeakRef to work')\n    }\n\n    const weakRef = new WeakRef(value)\n    this.#cache.set(key, weakRef)\n\n    return value\n  }\n\n  /**\n   * Check if a key exists and its value is still alive\n   * @param {string} key - String key to check\n   * @returns {boolean} True if key exists and value hasn't been garbage collected\n   */\n  has(key: string) {\n    const weakRef = this.#cache.get(key)\n    if (!weakRef) {\n      return false\n    }\n\n    const value = weakRef.deref()\n\n    if (value === undefined) {\n      this.#cache.delete(key)\n      return false\n    }\n\n    return true\n  }\n\n  /**\n   * Manually delete a cache entry\n   * @param {string} key - String key to delete\n   * @returns {boolean} True if deletion was successful\n   */\n  delete(key: string) {\n    return this.#cache.delete(key)\n  }\n\n  /**\n   * Get the number of cache entries (including potentially garbage collected ones)\n   * @returns {number} Cache size\n   */\n  size() {\n    return this.#cache.size\n  }\n\n  /**\n   * Clear all cache entries\n   */\n  clear() {\n    this.#cache.clear()\n  }\n}\n\nexport const weakCacheService = new WeakCacheService()\n","import { default as string } from '@poppinss/string'\nimport type { ModelColumnOptions } from '@adonisjs/lucid/types/model'\nimport type { ResourcefulModel } from '@nhtio/lucid-resourceful/types'\n\nexport const resolveModelDisplayColumn = (model: ResourcefulModel): string => {\n  /*\n     |--------------------------------------------------------------------------\n     | If the model has a defined display column, use that\n     |--------------------------------------------------------------------------\n     */\n  if (\n    'string' === typeof model.$resourcefulTitleColumn &&\n    model.$resourcefulTitleColumn.trim().length > 0\n  ) {\n    const found = model.$columnsDefinitions.get(model.$resourcefulTitleColumn)\n    if (found) {\n      return found.columnName\n    }\n    return model.$resourcefulTitleColumn\n  }\n  /*\n     |--------------------------------------------------------------------------\n     | Check for common display fields in the properties which are matched to\n     | database columns\n     |--------------------------------------------------------------------------\n     */\n  const candidates = ['name', 'title', 'label', 'display', 'displayName', 'fullName', 'userName']\n  const potentials = new Map<string, ModelColumnOptions>()\n  model.$columnsDefinitions.forEach((columnOptions, attribute) => {\n    potentials.set(attribute, columnOptions)\n    potentials.set(string.camelCase(attribute), columnOptions)\n    potentials.set(columnOptions.columnName, columnOptions)\n    potentials.set(string.camelCase(columnOptions.columnName), columnOptions)\n  })\n  for (const candidate of candidates) {\n    let found = potentials.get(candidate)\n    if (found) {\n      return found.columnName\n    }\n    found = potentials.get(candidate.toLowerCase())\n    if (found) {\n      return found.columnName\n    }\n    found = potentials.get(string.snakeCase(candidate))\n    if (found) {\n      return found.columnName\n    }\n  }\n  /*\n     |--------------------------------------------------------------------------\n     | Fallback to the primary key\n     |--------------------------------------------------------------------------\n     */\n  return model.primaryKey\n}\n","/*\n|--------------------------------------------------------------------------\n| OpenAPI Schema Service\n|--------------------------------------------------------------------------\n|\n| Service class responsible for generating OpenAPI schema objects from\n| resourceful model metadata. Extracts OpenAPI-related logic from the\n| mixin to improve code organization and maintainability.\n|\n| This service handles:\n| - Data type extraction from resourceful data types\n| - Column schema generation\n| - Computed accessor schema generation  \n| - Relationship schema generation\n| - Complete model schema generation\n*/\n\nimport { deepmerge } from 'deepmerge-ts'\nimport { isResourcefulModel } from './type_guards'\nimport { encode } from '@nhtio/lucid-resourceful/encoding'\nimport { isString, isObject, stripUndefinedValuesFromObject } from './utils'\nimport { resolveModelDisplayColumn } from './router_macro/utils/relationships'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { ResourcefulModel } from './mixin'\nimport type { ResourcefulEnumObject, ResourcefulEnum } from './data_types'\nimport type {\n  ApplicationService,\n  HttpContext,\n  ResourcefulDataType,\n} from '@nhtio/lucid-resourceful/types'\nimport type {\n  RelationshipsContract,\n  HasOneRelationContract,\n  BelongsToRelationContract,\n  HasManyRelationContract,\n  HasManyThroughRelationContract,\n  ManyToManyRelationContract,\n} from '@adonisjs/lucid/types/relations'\nimport type {\n  ResourcefulModelColumnMetaSchema,\n  ResourcefulModelComputedAccessorMetaSchema,\n  ResourcefulModelRelationshipMetaSchema,\n  ResourcefulModelMetaSchema,\n  ResourcefulModelOpenApiSchema,\n  ResourcefulModelOpenApiRelatedSchema,\n  ResourcefulModelRelationshipMeta,\n  ResourcefulModelFieldRelationshipMeta,\n} from './types'\n\nexport interface GenerateModelSchemaOptions {\n  includeRelations?: boolean\n  relationsDeepLevel?: number | null\n  ctx?: HttpContext\n  app?: ApplicationService\n}\n\nexport interface NormalizedGenerateModelSchemaOptions extends GenerateModelSchemaOptions {\n  includeRelations: boolean\n  relationsDeepLevel: number | null\n  ctx?: HttpContext\n  app?: ApplicationService\n}\n\n/**\n * Interface for data type information extracted from resourceful data types.\n * Contains the OpenAPI type and optional format information.\n */\ninterface DataTypeInfo {\n  /** The OpenAPI data type (string, number, integer, boolean, object, array) */\n  type: 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array'\n  /** Optional format specification (date, date-time, binary, int32, int64, float, double) */\n  format?: string\n}\n\n/**\n * Interface for Lucid model definitions that may have serializeAs property.\n */\ninterface LucidDefinitionWithSerializeAs {\n  serializeAs?: string | null\n  autoCreate?: boolean\n}\n\n/**\n * Interface for data type instances with validation constraints.\n */\ninterface DataTypeWithConstraints {\n  type: string\n  format?: string\n  items?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  multipleOf?: number\n  maximum?: number\n  exclusiveMaximum?: boolean\n  minimum?: number\n  exclusiveMinimum?: boolean\n  maxLength?: number\n  minLength?: number\n  pattern?: string\n  additionalProperties?: boolean | OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  maxProperties?: number\n  minProperties?: number\n  properties?: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>\n  maxItems?: number\n  minItems?: number\n  uniqueItems?: boolean\n  allOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  oneOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  anyOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  not?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  required?: string[]\n  enum?: unknown[]\n  nullable?: boolean\n}\n\n/**\n * Interface for property definitions with validation constraints.\n */\ninterface PropertyDefinitionWithConstraints {\n  type: ResourcefulDataType\n  description?: string\n  nullable?: boolean\n  externalDocs?: OpenAPIV3.ExternalDocumentationObject\n  example?: unknown\n  items?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  multipleOf?: number\n  maximum?: number\n  exclusiveMaximum?: boolean\n  minimum?: number\n  exclusiveMinimum?: boolean\n  maxLength?: number\n  minLength?: number\n  pattern?: string\n  additionalProperties?: boolean | OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  maxProperties?: number\n  minProperties?: number\n  properties?: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>\n  maxItems?: number\n  minItems?: number\n  uniqueItems?: boolean\n  allOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  oneOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  anyOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  not?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  required?: string[]\n  enum?: unknown[]\n}\n\n/**\n * Service class for generating OpenAPI schema objects from resourceful model metadata.\n *\n * This service encapsulates all OpenAPI-related functionality that was previously\n * embedded in the resourceful mixin, providing better code organization and\n * easier testing. It handles the extraction of data type information from\n * resourceful data types and generates proper OpenAPI schema objects with\n * vendor extensions for field capabilities (filterable, sortable, aggregatable).\n *\n * @example\n * ```typescript\n * const service = new OpenApiSchemaService()\n * const schema = await service.generateModelSchema('read', metaSchema, model)\n * ```\n */\nexport class OpenApiSchemaService {\n  /**\n   * Gets the field key for a property, handling serializeAs transformation.\n   *\n   * This private method extracts the appropriate field name for a property,\n   * taking into account the serializeAs option from Lucid model definitions.\n   * Returns null if the field cannot be read (following Lucid's serializeAs behavior).\n   *\n   * @param key - The original property key\n   * @param definition - The Lucid model definition (column, computed, or relation)\n   * @returns The field key to use, the original key if no transformation is needed, or null if field cannot be read\n   */\n  #getFieldKey(key: string, definition: LucidDefinitionWithSerializeAs): string | null {\n    if (definition.serializeAs === null) {\n      return null\n    }\n    /* istanbul ignore if -- @preserve */\n    if (isString(definition.serializeAs)) {\n      return definition.serializeAs\n    }\n    /* istanbul ignore next -- @preserve */\n    return key\n  }\n\n  /**\n   * Extracts OpenAPI type and format information from resourceful data types.\n   *\n   * This private method handles the mapping from resourceful data type instances\n   * to their corresponding OpenAPI type and format specifications. It properly\n   * handles all supported resourceful data types and provides appropriate\n   * fallback behavior for unknown types.\n   *\n   * @param dataType - The resourceful data type instance to extract information from\n   * @returns Object containing the OpenAPI type and optional format\n   *\n   * @example\n   * ```typescript\n   * const info = this.#extractDataTypeInfo(ResourcefulStringType())\n   * // Returns: { type: 'string' }\n   *\n   * const info = this.#extractDataTypeInfo(ResourcefulDateTimeType())\n   * // Returns: { type: 'string', format: 'date-time' }\n   * ```\n   */\n  #extractDataTypeInfo(dataType: ResourcefulDataType): DataTypeInfo {\n    // Extract the base type from the data type instance with error handling\n    let baseType: string\n    try {\n      baseType = dataType.type\n    } catch (error) {\n      // Fallback to string type if type extraction fails\n      /* istanbul ignore next -- @preserve */\n      return { type: 'string' }\n    }\n\n    // Extract format information if available\n    const format =\n      'format' in dataType && typeof dataType.format === 'string' ? dataType.format : undefined\n\n    // Handle specific data type mappings based on the type and format\n    /* istanbul ignore next -- @preserve */\n    switch (baseType) {\n      case 'string': {\n        // String types may have specific formats\n        if (format) {\n          return { type: 'string', format }\n        }\n        return { type: 'string' }\n      }\n\n      case 'number': {\n        // Number types may have float/double format\n        if (format === 'float' || format === 'double') {\n          return { type: 'number', format }\n        }\n        return { type: 'number' }\n      }\n\n      case 'integer': {\n        // Integer types may have int32/int64 format\n        if (format === 'int32' || format === 'int64') {\n          return { type: 'integer', format }\n        }\n        return { type: 'integer' }\n      }\n\n      case 'boolean': {\n        return { type: 'boolean' }\n      }\n\n      case 'object': {\n        return { type: 'object' }\n      }\n\n      case 'array': {\n        return { type: 'array' }\n      }\n\n      default: {\n        /* istanbul ignore next -- @preserve */\n        return { type: 'string' }\n      }\n    }\n  }\n\n  #resolveEnums<A = any>(\n    fromDefinition?: ResourcefulEnum<A>,\n    fromDataType?: ResourcefulEnum<A>\n  ): A[] | undefined {\n    if (Array.isArray(fromDefinition)) {\n      return fromDefinition.map((v) => (isObject(v) ? v.value : v))\n    } else if (Array.isArray(fromDataType)) {\n      return fromDataType.map((v) => (isObject(v) ? v.value : v))\n    }\n    return undefined\n  }\n\n  #resolveChoices<A = any>(\n    fromDefinition?: ResourcefulEnum<A>,\n    fromDataType?: ResourcefulEnum<A>\n  ): ResourcefulEnumObject<A>[] | undefined {\n    if (Array.isArray(fromDefinition)) {\n      return fromDefinition.map((v) =>\n        isObject(v)\n          ? ({\n              title: v.title || String(v.value),\n              value: v.value,\n              i18n: v.i18n || false,\n            } satisfies ResourcefulEnumObject<A>)\n          : ({\n              title: String(v),\n              value: v,\n              i18n: false,\n            } satisfies ResourcefulEnumObject<A>)\n      )\n    } else if (Array.isArray(fromDataType)) {\n      return fromDataType.map((v) =>\n        isObject(v)\n          ? ({\n              title: v.title || String(v.value),\n              value: v.value,\n              i18n: v.i18n || false,\n            } satisfies ResourcefulEnumObject<A>)\n          : ({\n              title: String(v),\n              value: v,\n              i18n: false,\n            } satisfies ResourcefulEnumObject<A>)\n      )\n    }\n    return undefined\n  }\n\n  /**\n   * Generates a complete OpenAPI schema object for a resourceful model.\n   *\n   * This method creates a comprehensive OpenAPI v3 schema representation of the model\n   * by processing the provided metadata schema. The metadata should already have\n   * field-level access control permissions evaluated for the given request context.\n   * The generated schema includes vendor extensions that provide metadata about field\n   * capabilities for API consumers:\n   * - `x-resourceful-filterable`: Array of field names that can be used in filter operations\n   * - `x-resourceful-sortable`: Array of field names that can be used in sort operations\n   * - `x-resourceful-aggregatable`: Array of field names that can be used in aggregation operations\n   *\n   * @param operation - The operation type ('read' or 'write') to determine which fields to include\n   * @param resourcefulModelMetaSchema - The resourceful model metadata with ACL filtering applied\n   * @param model - Optional model class for additional context\n   * @returns Complete OpenAPI schema object with field capability metadata\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const schema = service.generateModelSchema('read', metaSchema, UserModel)\n   * // Returns OpenAPI schema with vendor extensions:\n   * // {\n   * //   type: 'object',\n   * //   properties: { ... },\n   * //   'x-resourceful-filterable': ['name', 'email', 'user.name'],\n   * //   'x-resourceful-sortable': ['name', 'createdAt'],\n   * //   'x-resourceful-aggregatable': ['totalSales', 'orderCount']\n   * // }\n   * ```\n   */\n  /* istanbul ignore next -- @preserve */\n  async generateModelSchema(\n    /* istanbul ignore next -- @preserve */\n    operation: 'read' | 'write' = 'read',\n    resourcefulModelMetaSchema: ResourcefulModelMetaSchema,\n    options: NormalizedGenerateModelSchemaOptions,\n    model?: ResourcefulModel\n  ): Promise<ResourcefulModelOpenApiSchema> {\n    if (\n      !isObject(resourcefulModelMetaSchema) ||\n      !resourcefulModelMetaSchema.name ||\n      !isResourcefulModel(model)\n    ) {\n      return {\n        type: 'object',\n        properties: {},\n        required: [],\n      }\n    }\n    // Initialize the base schema structure\n    const schema: ResourcefulModelOpenApiSchema = {\n      'type': 'object',\n      'title': resourcefulModelMetaSchema.name,\n      'description': resourcefulModelMetaSchema.description,\n      'externalDocs': resourcefulModelMetaSchema.externalDocs,\n      'example': resourcefulModelMetaSchema.example,\n      'properties': {},\n      'x-resourceful-filterable': {},\n      'x-resourceful-sortable': [],\n      'x-resourceful-aggregatable': [],\n      'x-resourceful-auto-create': [],\n    }\n\n    // Process each property in the metadata schema\n    /* istanbul ignore next -- @preserve */\n    Object.entries(resourcefulModelMetaSchema.properties).forEach(\n      async ([propertyKey, propertyMeta]) => {\n        // Get the field key (handles serializeAs transformation)\n        let resolvedColumnName = this.#getFieldKey(\n          propertyKey,\n          propertyMeta.lucidDefinitions as LucidDefinitionWithSerializeAs\n        )\n\n        if (null === resolvedColumnName && 'read' === operation) {\n          // If the field key is null, that means that the field cannot be \"read\"\n          // This is part of the baseline lucid decorator API, so we need to honor the\n          // expected behavior\n          return\n        } else if (null === resolvedColumnName && 'write' === operation) {\n          resolvedColumnName = propertyKey\n        }\n\n        // Skip properties that cannot be accessed for the given operation\n        if (\n          ('read' === operation && propertyMeta.canRead === false) ||\n          ('write' === operation && propertyMeta.canWrite === false)\n        )\n          return\n\n        // Generate schema based on property type\n        switch (propertyMeta.kind) {\n          case 'column': {\n            schema.properties![propertyKey] = this.generateColumnSchema(\n              model,\n              propertyKey,\n              propertyMeta as ResourcefulModelColumnMetaSchema\n            )\n            if (propertyMeta.filterable) {\n              schema['x-resourceful-filterable']![propertyKey] = schema.properties![propertyKey]\n            }\n            if (propertyMeta.sortable && Array.isArray(schema['x-resourceful-sortable'])) {\n              schema['x-resourceful-sortable'].push(propertyKey)\n            }\n            if (propertyMeta.aggregatable && Array.isArray(schema['x-resourceful-aggregatable'])) {\n              schema['x-resourceful-aggregatable'].push(propertyKey)\n            }\n            if (\n              propertyMeta.definition &&\n              'autoCreate' in propertyMeta.definition &&\n              true === propertyMeta.definition.autoCreate &&\n              Array.isArray(schema['x-resourceful-auto-create'])\n            ) {\n              schema['x-resourceful-auto-create'].push(propertyKey)\n            }\n            return\n          }\n\n          case 'computedAccessor': {\n            schema.properties![propertyKey] = this.generateComputedAccessorSchema(\n              propertyKey,\n              propertyMeta as ResourcefulModelComputedAccessorMetaSchema\n            )\n            return\n          }\n\n          case 'relationship': {\n            const relatedSchema = await this.generateRelationshipSchema(\n              propertyKey,\n              propertyMeta as ResourcefulModelRelationshipMetaSchema,\n              operation,\n              options\n            )\n            if (relatedSchema) {\n              const lucidDefinition = model.$relationsDefinitions.get(propertyKey)\n              if (lucidDefinition && 'read' === operation) {\n                switch (lucidDefinition.type) {\n                  case 'hasOne':\n                  case 'belongsTo':\n                    schema.properties![propertyKey] = relatedSchema\n                    break\n                }\n              }\n            }\n            if (isObject(propertyMeta.filterable)) {\n              const fixedFilterable: { [key: string]: any } = {}\n              Object.entries(propertyMeta.filterable).forEach(([key, value]) => {\n                // Use dot notation for related fields\n                fixedFilterable[`${resolvedColumnName}.${key}`] = value\n              })\n              schema['x-resourceful-filterable'] = deepmerge(\n                schema['x-resourceful-filterable'],\n                fixedFilterable\n              )\n            }\n            return\n          }\n        }\n      }\n    )\n\n    // Build the required fields array based on non-nullable properties\n    const requiredPropSet: Set<string> = new Set()\n    Object.entries(schema.properties!).forEach(([propertyKey, propertySchema]) => {\n      // Skip reference objects (relationships)\n      if (!isObject(propertySchema) || '$ref' in propertySchema) {\n        return\n      }\n\n      // Check if the property is nullable\n      // Properties are required if:\n      // 1. nullable is false (explicitly set)\n      // 2. nullable is undefined (not specified, defaults to non-nullable)\n      // Properties are NOT required if:\n      // 1. nullable is true (explicitly nullable)\n      const isNullable = propertySchema.nullable === true\n      // If not explicitly nullable, it should be required\n      if (\n        !isNullable &&\n        ('read' === operation ||\n          (!model.$resourcefulComputedAccessors.has(propertyKey) &&\n            !model.$resourcefulRelationships.has(propertyKey) &&\n            (!schema['x-resourceful-auto-create'] ||\n              !schema['x-resourceful-auto-create'].includes(propertyKey))))\n      ) {\n        requiredPropSet.add(propertyKey)\n      }\n    })\n    schema.required = Array.from(requiredPropSet)\n\n    return schema\n  }\n\n  #makeRelationshipChoicesUrl(model: ResourcefulModel, relationship: string): string {\n    const encodable = {\n      ResourcefulModel: model.name,\n      relationship,\n    }\n    return `#/$meta.choices/${encodeURIComponent(encode(encodable))}`\n  }\n\n  #extractSingleRelationshipMeta(\n    model: ResourcefulModel,\n    propertyKey: string,\n    _propertyMeta: ResourcefulModelColumnMetaSchema,\n    relationshipKey: string,\n    relationship: HasOneRelationContract<any, any> | BelongsToRelationContract<any, any>\n  ): ResourcefulModelFieldRelationshipMeta {\n    if (relationship.foreignKey === propertyKey) {\n      const resourcefulModelRelationshipMeta = model.$resourcefulRelationships.get(relationshipKey)\n      if (!resourcefulModelRelationshipMeta) {\n        return false\n      }\n      const relatedModel = resourcefulModelRelationshipMeta.relatedModel()\n      if (!isResourcefulModel(relatedModel)) {\n        return false\n      }\n      const fieldKey = this.#getFieldKey(\n        relationshipKey,\n        resourcefulModelRelationshipMeta as LucidDefinitionWithSerializeAs\n      )\n      return {\n        title: fieldKey || relationshipKey,\n        multiple: false,\n        choices: this.#makeRelationshipChoicesUrl(model, relationshipKey),\n      }\n    }\n    return false\n  }\n\n  /*\n  |--------------------------------------------------------------------------\n  | Functionally useless\n  |--------------------------------------------------------------------------\n  |\n  | This method has been deactivated because it is functionally useless. It is\n  | not possible for a form to render the choices for a many relationship\n  | in a way which is will be processed by the API. HasMany and HasManyThrough\n  | relationships need to be managed via a separate form which specifically\n  | handles syncronizing relationships.\n  |\n  | The code is being left as a reference for if and when it does have a use\n  | case.\n  | \n  */\n  // @ts-ignore\n  #extractManyRelationshipMeta(\n    model: ResourcefulModel,\n    propertyKey: string,\n    _propertyMeta: ResourcefulModelColumnMetaSchema,\n    relationshipKey: string,\n    relationship: HasManyRelationContract<any, any> | HasManyThroughRelationContract<any, any>\n  ): ResourcefulModelFieldRelationshipMeta {\n    if (\n      ('hasMany' === relationship.type && relationship.foreignKey === propertyKey) ||\n      ('hasManyThrough' === relationship.type && relationship.throughForeignKey === propertyKey)\n    ) {\n      const resourcefulModelRelationshipMeta = model.$resourcefulRelationships.get(relationshipKey)\n      if (!resourcefulModelRelationshipMeta) {\n        return false\n      }\n      const relatedModel = resourcefulModelRelationshipMeta.relatedModel()\n      if (!isResourcefulModel(relatedModel)) {\n        return false\n      }\n      const fieldKey = this.#getFieldKey(\n        relationshipKey,\n        resourcefulModelRelationshipMeta as LucidDefinitionWithSerializeAs\n      )\n      return {\n        title: fieldKey || relationshipKey,\n        multiple: true,\n        choices: this.#makeRelationshipChoicesUrl(model, relationshipKey),\n      }\n    }\n    return false\n  }\n\n  /*\n  |--------------------------------------------------------------------------\n  | Functionally useless\n  |--------------------------------------------------------------------------\n  |\n  | This method has been deactivated because it is functionally useless. It is\n  | not possible for a form to render the choices for a many to many \n  | relationship in a way which is will be processed by the API. ManyToMany\n  | relationships need to be managed via a separate form which specifically\n  | handles syncronizing relationships.\n  |\n  | The code is being left as a reference for if and when it does have a use\n  | case.\n  | \n  */\n  // @ts-ignore\n  #extractManyToManyRelationshipMeta(\n    model: ResourcefulModel,\n    propertyKey: string,\n    _propertyMeta: ResourcefulModelColumnMetaSchema,\n    relationshipKey: string,\n    relationship: ManyToManyRelationContract<any, any>\n  ): ResourcefulModelFieldRelationshipMeta {\n    if (relationship.pivotForeignKey === propertyKey) {\n      const resourcefulModelRelationshipMeta = model.$resourcefulRelationships.get(relationshipKey)\n      if (!resourcefulModelRelationshipMeta) {\n        return false\n      }\n      const relatedModel = resourcefulModelRelationshipMeta.relatedModel()\n      if (!isResourcefulModel(relatedModel)) {\n        return false\n      }\n      const fieldKey = this.#getFieldKey(\n        relationshipKey,\n        resourcefulModelRelationshipMeta as LucidDefinitionWithSerializeAs\n      )\n      return {\n        title: fieldKey || relationshipKey,\n        multiple: true,\n        choices: this.#makeRelationshipChoicesUrl(model, relationshipKey),\n      }\n    }\n    return false\n  }\n\n  #extractColumnRelationshipMeta(\n    model: ResourcefulModel,\n    propertyKey: string,\n    propertyMeta: ResourcefulModelColumnMetaSchema\n  ): ResourcefulModelFieldRelationshipMeta {\n    // iterate through model relations to find if this column is a key to any relation\n    const possible: Map<string, ResourcefulModelRelationshipMeta> = new Map()\n    const processRelationship = (relation: RelationshipsContract, relationshipKey: string) => {\n      relation.boot()\n      switch (relation.type) {\n        case 'hasOne':\n        case 'belongsTo': {\n          const metaOrFalse = this.#extractSingleRelationshipMeta(\n            model,\n            propertyKey,\n            propertyMeta,\n            relationshipKey,\n            relation\n          )\n          if (metaOrFalse) {\n            possible.set(relationshipKey, metaOrFalse)\n          }\n          break\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Functionality Deactivated\n        |--------------------------------------------------------------------------\n        |\n        | @see comments on the #extractManyRelationshipMeta method\n        | \n        */\n        // case 'hasMany':\n        // case 'hasManyThrough': {\n        //   const metaOrFalse = this.#extractManyRelationshipMeta(\n        //     model,\n        //     propertyKey,\n        //     propertyMeta,\n        //     relationshipKey,\n        //     relation\n        //   )\n        //   if (metaOrFalse) {\n        //     possible.set(relationshipKey, metaOrFalse)\n        //   }\n        //   break\n        // }\n        /*\n        |--------------------------------------------------------------------------\n        | Functionality Deactivated\n        |--------------------------------------------------------------------------\n        |\n        | @see comments on the #extractManyToManyRelationshipMeta method\n        | \n        */\n        // case 'manyToMany': {\n        //   const metaOrFalse = this.#extractManyToManyRelationshipMeta(\n        //     model,\n        //     propertyKey,\n        //     propertyMeta,\n        //     relationshipKey,\n        //     relation\n        //   )\n        //   if (metaOrFalse) {\n        //     possible.set(relationshipKey, metaOrFalse)\n        //   }\n        //   break\n        // }\n      }\n    }\n    if (\n      propertyMeta.definition &&\n      'relationshipKey' in propertyMeta.definition &&\n      'string' === typeof propertyMeta.definition.relationshipKey &&\n      propertyMeta.definition.relationshipKey.trim().length > 0\n    ) {\n      const relation = model.$relationsDefinitions.get(propertyMeta.definition.relationshipKey)\n      if (relation) {\n        processRelationship(relation, propertyMeta.definition.relationshipKey)\n      }\n    } else {\n      model.$relationsDefinitions.forEach(processRelationship)\n    }\n    if (possible.size > 0) {\n      // Always return the first found relationship if multiple are found\n      if (possible.size > 1) {\n        // TODO: provide a warning for the developer that multiple relationships were found\n        // for the same column key and that they should specifically define `relationshipKey` in\n        // the column definition to avoid ambiguity\n      }\n      return Array.from(possible.values())[0]\n    }\n    return false\n  }\n\n  /**\n   * Generates OpenAPI schema for a column property.\n   *\n   * This method converts resourceful column metadata into an OpenAPI schema object,\n   * properly extracting data type information and preserving all existing schema\n   * properties such as validation constraints, nullability, and access modifiers.\n   *\n   * @param propertyKey - The name of the column property\n   * @param propertyMeta - The resourceful metadata for the column\n   * @returns OpenAPI schema object for the column\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const schema = service.generateColumnSchema('name', columnMeta)\n   * // Returns: { type: 'string', minLength: 1, maxLength: 100, ... }\n   * ```\n   */\n  generateColumnSchema(\n    model: ResourcefulModel,\n    propertyKey: string,\n    propertyMeta: ResourcefulModelColumnMetaSchema\n  ): ResourcefulModelOpenApiSchema {\n    // Extract data type information from the resourceful data type\n    if (!isObject(propertyMeta) || !propertyMeta.definition || !propertyMeta.lucidDefinitions) {\n      return {}\n    }\n    const dataTypeInfo = this.#extractDataTypeInfo(propertyMeta.definition.type)\n    const relationshipMeta = this.#extractColumnRelationshipMeta(model, propertyKey, propertyMeta)\n    // Get the field key (handles serializeAs)\n    const fieldKey = this.#getFieldKey(\n      propertyKey,\n      propertyMeta.lucidDefinitions as LucidDefinitionWithSerializeAs\n    )\n\n    // Extract validation constraints from the data type instance and definition\n    const dataType = propertyMeta.definition.type as DataTypeWithConstraints\n    const definition = propertyMeta.definition as PropertyDefinitionWithConstraints\n\n    // Build the schema object with proper type information and all existing properties\n    /* istanbul ignore next -- @preserve */\n    const schemaProperties = stripUndefinedValuesFromObject({\n      // Core OpenAPI type information (properly extracted)\n      type: dataTypeInfo.type,\n      format: dataTypeInfo.format,\n\n      // Schema metadata\n      items: definition.items || dataType.items,\n      title: fieldKey || propertyKey,\n      description: definition.description,\n      default:\n        'default' in definition\n          ? definition.default\n          : this.getDefaultValueFromPropertyMeta(propertyMeta),\n\n      // Numeric constraints (from data type or definition)\n      multipleOf: definition.multipleOf || dataType.multipleOf,\n      maximum: definition.maximum || dataType.maximum,\n      exclusiveMaximum: definition.exclusiveMaximum || dataType.exclusiveMaximum,\n      minimum: definition.minimum || dataType.minimum,\n      exclusiveMinimum: definition.exclusiveMinimum || dataType.exclusiveMinimum,\n\n      // String constraints (from data type or definition)\n      maxLength: definition.maxLength || dataType.maxLength,\n      minLength: definition.minLength || dataType.minLength,\n      pattern: definition.pattern || dataType.pattern,\n\n      // Object constraints (from data type or definition)\n      additionalProperties: definition.additionalProperties || dataType.additionalProperties,\n      maxProperties: definition.maxProperties || dataType.maxProperties,\n      minProperties: definition.minProperties || dataType.minProperties,\n      properties: definition.properties || dataType.properties,\n\n      // Array constraints (from data type or definition)\n      maxItems: definition.maxItems || dataType.maxItems,\n      minItems: definition.minItems || dataType.minItems,\n      uniqueItems: definition.uniqueItems || dataType.uniqueItems,\n\n      // Schema composition (from data type or definition)\n      allOf: definition.allOf || dataType.allOf,\n      oneOf: definition.oneOf || dataType.oneOf,\n      anyOf: definition.anyOf || dataType.anyOf,\n      not: definition.not || dataType.not,\n\n      // Validation and constraints (from data type or definition)\n      required: definition.required || dataType.required,\n      enum: this.#resolveEnums(definition.enum, dataType.enum),\n      nullable:\n        definition.nullable !== undefined ? definition.nullable : dataType.nullable || false,\n\n      // Access control\n      readOnly: propertyMeta.canRead && !propertyMeta.canWrite,\n      writeOnly: !propertyMeta.canRead && propertyMeta.canWrite,\n\n      // Documentation\n      externalDocs: definition.externalDocs,\n      example: definition.example,\n\n      // Form Rendering\n      ...{\n        'x-resourceful-autocreated':\n          ('autoCreate' in definition && definition.autoCreate === true) ||\n          ('autoCreate' in dataType && dataType.autoCreate === true) ||\n          ('isPrimary' in definition && definition.isPrimary === true) ||\n          false,\n        'x-resourceful-autoupdated':\n          ('autoUpdate' in definition && definition.autoUpdate === true) ||\n          ('autoUpdate' in dataType && dataType.autoUpdate === true) ||\n          false,\n        'x-resourceful-immutable':\n          ('immutable' in definition && definition.immutable === true) || false,\n        'x-resourceful-primary-key':\n          ('isPrimary' in definition && definition.isPrimary === true) || false,\n        'x-resourceful-relationship': relationshipMeta,\n      },\n      ...stripUndefinedValuesFromObject({\n        'x-resourceful-choices': this.#resolveChoices(definition.enum, dataType.enum),\n      }),\n    })\n\n    return schemaProperties as ResourcefulModelOpenApiSchema\n  }\n\n  /**\n   * Generates OpenAPI schema for a computed accessor property.\n   *\n   * This method converts resourceful computed accessor metadata into an OpenAPI\n   * schema object, applying the same data type extraction improvements as column\n   * schema generation while maintaining all existing functionality.\n   *\n   * @param propertyKey - The name of the computed accessor property\n   * @param propertyMeta - The resourceful metadata for the computed accessor\n   * @returns OpenAPI schema object for the computed accessor\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const schema = service.generateComputedAccessorSchema('fullName', accessorMeta)\n   * // Returns: { type: 'string', readOnly: true, ... }\n   * ```\n   */\n  generateComputedAccessorSchema(\n    propertyKey: string,\n    propertyMeta: ResourcefulModelComputedAccessorMetaSchema\n  ): ResourcefulModelOpenApiSchema {\n    if (!isObject(propertyMeta) || !propertyMeta.definition || !propertyMeta.lucidDefinitions) {\n      return {}\n    }\n    // Extract data type information from the resourceful data type\n    const dataTypeInfo = this.#extractDataTypeInfo(propertyMeta.definition.type)\n\n    // Get the field key (handles serializeAs)\n    const fieldKey = this.#getFieldKey(\n      propertyKey,\n      propertyMeta.lucidDefinitions as LucidDefinitionWithSerializeAs\n    )\n\n    // Extract validation constraints from the data type instance and definition\n    const dataType = propertyMeta.definition.type as DataTypeWithConstraints\n    const definition = propertyMeta.definition as PropertyDefinitionWithConstraints\n\n    // Build the schema object with proper type information and all existing properties\n    /* istanbul ignore next -- @preserve */\n    const schemaProperties = stripUndefinedValuesFromObject({\n      // Core OpenAPI type information (properly extracted)\n      type: dataTypeInfo.type,\n      format: dataTypeInfo.format,\n\n      // Schema metadata\n      items: definition.items || dataType.items,\n      title: fieldKey || propertyKey,\n      description: definition.description,\n      default:\n        'default' in definition\n          ? definition.default\n          : this.getDefaultValueFromPropertyMeta(propertyMeta),\n\n      // Numeric constraints (from data type or definition)\n      multipleOf: definition.multipleOf || dataType.multipleOf,\n      maximum: definition.maximum || dataType.maximum,\n      exclusiveMaximum: definition.exclusiveMaximum || dataType.exclusiveMaximum,\n      minimum: definition.minimum || dataType.minimum,\n      exclusiveMinimum: definition.exclusiveMinimum || dataType.exclusiveMinimum,\n\n      // String constraints (from data type or definition)\n      maxLength: definition.maxLength || dataType.maxLength,\n      minLength: definition.minLength || dataType.minLength,\n      pattern: definition.pattern || dataType.pattern,\n\n      // Object constraints (from data type or definition)\n      additionalProperties: definition.additionalProperties || dataType.additionalProperties,\n      maxProperties: definition.maxProperties || dataType.maxProperties,\n      minProperties: definition.minProperties || dataType.minProperties,\n      properties: definition.properties || dataType.properties,\n\n      // Array constraints (from data type or definition)\n      maxItems: definition.maxItems || dataType.maxItems,\n      minItems: definition.minItems || dataType.minItems,\n      uniqueItems: definition.uniqueItems || dataType.uniqueItems,\n\n      // Schema composition (from data type or definition)\n      allOf: definition.allOf || dataType.allOf,\n      oneOf: definition.oneOf || dataType.oneOf,\n      anyOf: definition.anyOf || dataType.anyOf,\n      not: definition.not || dataType.not,\n\n      // Validation and constraints (from data type or definition)\n      required: definition.required || dataType.required,\n      enum: this.#resolveEnums(definition.enum, dataType.enum),\n      nullable:\n        definition.nullable !== undefined ? definition.nullable : dataType.nullable || false,\n\n      // Access control\n      readOnly: propertyMeta.canRead && !propertyMeta.canWrite,\n      writeOnly: !propertyMeta.canRead && propertyMeta.canWrite,\n\n      // Documentation\n      externalDocs: definition.externalDocs,\n      example: definition.example,\n\n      // Form Rendering\n      ...{\n        'x-resourceful-autocreated': !propertyMeta.canWrite,\n        'x-resourceful-autoupdated': !propertyMeta.canWrite,\n        'x-resourceful-immutable': !propertyMeta.canWrite,\n        'x-resourceful-primary-key': false,\n        'x-resourceful-relationship': false,\n      },\n      ...stripUndefinedValuesFromObject({\n        'x-resourceful-choices': this.#resolveChoices(definition.enum, dataType.enum),\n      }),\n    })\n\n    return schemaProperties as ResourcefulModelOpenApiSchema\n  }\n\n  /**\n   * Generates OpenAPI schema for a relationship property.\n   *\n   * This method converts resourceful relationship metadata into an OpenAPI\n   * reference object, preserving existing relationship reference generation\n   * logic and ensuring proper handling of related model references.\n   *\n   * @param propertyKey - The name of the relationship property\n   * @param propertyMeta - The resourceful metadata for the relationship\n   * @returns OpenAPI reference object for the relationship, or undefined if not applicable\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const schema = service.generateRelationshipSchema('user', relationshipMeta)\n   * // Returns: { $ref: '#/components/schemas/User' }\n   * ```\n   */\n  async generateRelationshipSchema(\n    _propertyKey: string,\n    propertyMeta: ResourcefulModelRelationshipMetaSchema,\n    operation: 'read' | 'write',\n    options: NormalizedGenerateModelSchemaOptions\n  ): Promise<ResourcefulModelOpenApiRelatedSchema | ResourcefulModelOpenApiSchema | undefined> {\n    if (\n      !isObject(propertyMeta) ||\n      !propertyMeta.definition ||\n      !propertyMeta.lucidDefinitions ||\n      !propertyMeta.relatedModel\n    ) {\n      return undefined\n    }\n    const relatedModel = propertyMeta.relatedModel()\n    /* istanbul ignore if -- @preserve */\n    if (!relatedModel) {\n      // If the related model is not defined, we cannot generate a schema for it\n      return undefined\n    }\n    /* istanbul ignore if -- @preserve */\n    if (!isResourcefulModel(relatedModel)) {\n      // If the related model is not a ResourcefulModel, we cannot generate a schema for it\n      return undefined\n    }\n\n    if (options.includeRelations && options.relationsDeepLevel === 0) {\n      return undefined\n    }\n\n    if (options.includeRelations) {\n      if (!options.app || !options.ctx) {\n        //TODO: In expected environment, this should never happen. Should be tested and removed later.\n        return undefined\n      }\n\n      const updatedOptions = {\n        ...options,\n        relationsDeepLevel:\n          options.relationsDeepLevel === null ? null : options.relationsDeepLevel - 1,\n      }\n\n      return relatedModel.$asOpenApiSchemaObject(\n        options.ctx,\n        options.app,\n        operation,\n        updatedOptions\n      )\n    }\n\n    const ref: string = `#/components/schemas/${relatedModel.$resourcefulName}`\n    return {\n      '$ref': ref,\n      'x-resourceful-display-key': resolveModelDisplayColumn(relatedModel),\n    }\n  }\n\n  /**\n   * Extracts default value from property metadata using Joi description.\n   *\n   * This protected method provides access to the default value extraction logic\n   * that was previously part of the mixin. It examines the Joi validator\n   * description to find default values specified in the schema.\n   *\n   * @param propertyMeta - The resourceful metadata containing the validator\n   * @returns The default value if found, undefined otherwise\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const defaultValue = service.getDefaultValueFromPropertyMeta(propertyMeta)\n   * ```\n   */\n  protected getDefaultValueFromPropertyMeta(\n    propertyMeta: ResourcefulModelColumnMetaSchema | ResourcefulModelComputedAccessorMetaSchema\n  ): unknown | undefined {\n    const joiDescription = propertyMeta.validator.describe()\n    /* istanbul ignore if -- @preserve */\n    if (\n      isObject(joiDescription) &&\n      'flags' in joiDescription &&\n      isObject(joiDescription.flags) &&\n      'default' in joiDescription.flags\n    ) {\n      return joiDescription.flags.default\n    }\n    /* istanbul ignore next -- @preserve */\n    return undefined\n  }\n}\n","/*\n|--------------------------------------------------------------------------\n| Mixin for Lucid Models\n|--------------------------------------------------------------------------\n|\n| Adds the required metadata and functionality to Lucid models\n| which will be utilized by the resourceful controller & factory\n*/\nimport './lucid_augmentations'\nimport { default as pMap } from 'p-map'\nimport * as guards from './type_guards'\nimport { Exception } from '@poppinss/utils'\nimport { HttpContext } from '@adonisjs/core/http'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { ValidationError } from '@nhtio/validation'\nimport { SimplePaginator } from '@adonisjs/lucid/database'\nimport { luceneToLucid } from './lucene_to_lucid_translator'\nimport { CachingPreloader } from './utils/caching_preloader'\nimport { TypedEventEmitter } from '@nhtio/tiny-typed-emitter'\nimport { WeakCacheService } from './utils/weak_cache_service'\nimport { buildCacheMiddleware } from './utils/cache_middleware'\nimport { HttpContextFactory } from '@adonisjs/core/factories/http'\nimport { ACLOperationsEnum, CRUDOperationsEnum } from './constants'\nimport { reportRelationCacheError } from './utils/cache_error_handler'\nimport { reportRelationCacheEvent } from './utils/cache_event_handler'\nimport { GenerateModelSchemaOptions, OpenApiSchemaService } from './open_api_schema_service'\nimport { resolveRelationsCacheService, isRelationCacheTarget } from './utils/cache_service_resolver'\nimport {\n  beforeCreate,\n  beforeUpdate,\n  afterUpdate,\n  afterDelete,\n  type BaseModel,\n} from '@adonisjs/lucid/orm'\nimport {\n  operationCRUDToACL,\n  isString,\n  stripUndefinedValuesFromObject,\n  prepareFields,\n  isObject,\n} from './utils'\nimport {\n  ResourcefulArrayType,\n  ResourcefulBigintType,\n  ResourcefulBinaryType,\n  ResourcefulIntegerType,\n  ResourcefulNumberType,\n  ResourcefulObjectType,\n  ResourcefulStringType,\n  ResourcefulUnsignedIntegerType,\n} from '@nhtio/lucid-resourceful/definitions'\nimport {\n  E_FORBIDDEN,\n  E_INVALID_COLUMN_ACCESS,\n  E_INVALID_RESOURCEFUL_MIXIN_OPTIONS,\n  E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION,\n  E_INVALID_RESOUREFUL_READ_RELATIONSHIP_REQUEST_EXCEPTION,\n  E_MISSING_PRIMARY_KEY_EXCEPTION,\n  E_RECORD_NOT_FOUND_EXCEPTION,\n  E_INVALID_PAYLOAD_EXCEPTION,\n  E_FORBIDDEN_PAYLOAD_EXCEPTION,\n  E_INVALID_RELATIONSHIP_EXCEPTION,\n  E_BULK_UPDATE_SEARCH_UNKNOWN_EXCEPTION,\n  E_INVALID_AGGREGATION_FIELD,\n  E_INVALID_AGGREGATION_OPERATION,\n  E_RELATION_CACHE_EVICTION_FAILED,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { EventMap, Key, Listener } from '@nhtio/tiny-typed-emitter'\nimport type { NormalizeConstructor } from '@adonisjs/core/types/helpers'\nimport type { Schema, AnySchema, ObjectSchema } from '@nhtio/validation'\nimport type { RelationCacheCallOptions } from './utils/caching_preloader'\nimport type { RelationshipsContract } from '@adonisjs/lucid/types/relations'\nimport type { RelationsCacheErrorHandler } from './utils/cache_error_handler'\nimport type { RelationsCacheEventHandler } from './utils/cache_event_handler'\nimport type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder'\nimport type { CacheMiddlewareInput, CacheMiddlewarePipeline } from './utils/cache_middleware'\nimport type {\n  RelationCacheEntryOptions,\n  RelationsCacheServiceResolver,\n} from './utils/cache_service_resolver'\nimport type {\n  ComputedOptions,\n  LucidModel,\n  ModelColumnOptions,\n  ModelAdapterOptions,\n  ModelQueryBuilderContract,\n} from '@adonisjs/lucid/types/model'\nimport type {\n  ExternalDocumentationObject,\n  PromiseAble,\n  ResourcefulAccessControlFilter,\n  ResourcefulColumnDefinition,\n  ResourcefulComputedAccessorDefinition,\n  ResourcefulDataType,\n  ResourcefulGeneralAccessControlFilter,\n  ResourcefulModelColumnMetaSchema,\n  ResourcefulModelComputedAccessorMetaSchema,\n  ResourcefulModelMetaSchema,\n  ResourcefulModelOpenApiSchema,\n  ResourcefulModelRelationshipMetaSchema,\n  ResourcefulPropertySchema,\n  ResourcefulRelationshipDefinition,\n  ResourcefulResourceAccessControlFilter,\n  ValidationScoper,\n  ResourcefulModelSerializableAttributes,\n} from '@nhtio/lucid-resourceful/types'\n\n/**\n * Result object returned by the resourceful index/list operation.\n *\n * Contains paginated records along with metadata about the query execution\n * and pagination state. The records are filtered according to field-level\n * access control and only contain the requested fields.\n *\n * @template ReturnType - The shape of records after field selection and ACL filtering\n */\nexport interface ResourcefulIndexResult<ReturnType = any> {\n  /** Array of records with only the requested and accessible fields */\n  records: Array<Partial<ReturnType>>\n  /** Total number of records matching the filter (before pagination) */\n  total: number\n  /** The current page number (1-based) */\n  page: number\n  /** Number of records per page */\n  perPage: number\n  /** Aggregation results organized by field name and operation type */\n  aggregations: ResourcefulIndexAggregateResults\n  /** SQL query string used for counting total records */\n  countQuery: string\n  /** SQL query string used for fetching the paginated records */\n  recordsQuery: string\n}\n\nexport interface ServableResourcefulIndexResult<ReturnType = any> extends Omit<\n  ResourcefulIndexResult<ReturnType>,\n  'countQuery' | 'recordsQuery'\n> {}\n\n/**\n * Function type for generating payload validation schemas based on request context.\n *\n * These functions are called during create and update operations to generate\n * context-specific validation schemas using Joi. They provide the core model-level\n * validation that applies regardless of request-specific hooks.\n *\n * @param ctx - HTTP context containing request information and authentication\n * @param app - Application service instance for accessing app-level services\n * @returns Promise resolving to a Joi schema for validating the request payload\n */\nexport interface ResourcefulPayloadValidatorGetter {\n  (ctx: HttpContext, app: ApplicationService): PromiseAble<AnySchema>\n}\n\n/**\n * Function type for generating request-specific payload validation schemas.\n *\n * These functions are provided via hooks during create and update operations\n * to add additional validation constraints beyond the base model validation.\n * They enable request-specific validation logic based on context.\n *\n * @param ctx - HTTP context containing request information and authentication\n * @param app - Application service instance for accessing app-level services\n * @returns Promise resolving to a Joi ObjectSchema for additional validation, or null to skip\n */\nexport interface ResourcefulPayloadSchemaGetter {\n  (ctx: HttpContext, app: ApplicationService): PromiseAble<ObjectSchema | null>\n}\n\n/**\n * Function type for applying query-level scoping to database queries.\n *\n * These callbacks are applied to queries during CRUD operations to enforce\n * data access boundaries based on request context. They modify the query\n * in-place by adding WHERE clauses, JOINs, or other constraints.\n *\n * @param ctx - HTTP context containing request information and authentication\n * @param app - Application service instance for accessing app-level services\n * @param query - Database query builder to modify with scoping constraints\n * @param model - The resourceful model class the query is being built for\n * @returns Promise that resolves when the query has been modified\n */\nexport interface ResourcefulQueryScopeCallback {\n  (\n    ctx: HttpContext,\n    app: ApplicationService,\n    query: DatabaseQueryBuilderContract,\n    model: ResourcefulModel\n  ): PromiseAble<void>\n}\n\ninterface BoundResourcefulQueryScopeCallback {\n  (\n    uid: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    query: DatabaseQueryBuilderContract,\n    model: ResourcefulModel\n  ): PromiseAble<void>\n}\n\n/**\n * Array of query scope callback functions.\n *\n * Used for operations that need to apply query-level scoping (index, read, delete).\n * Callbacks are applied in sequence to build up the complete set of access constraints.\n */\nexport type ResourcefulScopeHooks = ResourcefulQueryScopeCallback[]\n\n/**\n * Array of payload validation schema getter functions.\n *\n * Used for operations that accept request payloads (create, update).\n * Each function can return additional validation constraints based on request context.\n */\nexport type ResourcefulValidationHooks = ResourcefulPayloadSchemaGetter[]\n\n/**\n * Combined hook interface providing both query scoping and payload validation.\n *\n * Used by the update operation which needs both query scoping (to find the record)\n * and payload validation (to validate the update data).\n */\nexport interface ResourcefulHooks {\n  /** Query scope callbacks for constraining database queries */\n  queryScopeCallbacks: ResourcefulScopeHooks\n  /** Payload validation schema getters for additional validation */\n  payloadValidationSchemas: ResourcefulValidationHooks\n}\n\nexport type ResourcefulMixinEventMap<\n  Model extends LucidModel = LucidModel,\n  ModelInstance = InstanceType<Model>,\n> = EventMap<{\n  'acl:error': [unknown, HttpContext, ApplicationService, ModelInstance | undefined]\n  'validation:scope:error': [unknown, HttpContext, ApplicationService, string, ResourcefulDataType]\n}>\n\n/**\n * Enhanced Lucid model interface providing resourceful CRUD functionality.\n *\n * This interface extends the base LucidModel with metadata-driven CRUD operations,\n * field-level access control, query scoping, OpenAPI schema generation, and event\n * handling capabilities. Models implementing this interface gain static methods\n * for handling HTTP requests with built-in validation, pagination, filtering,\n * and comprehensive security features.\n *\n * The interface defines both metadata storage properties and operational methods\n * that work together to provide a complete resourceful API layer on top of\n * AdonisJS Lucid ORM models.\n *\n * @extends LucidModel\n *\n * @example\n * ```typescript\n * import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'\n * import { withResourceful, resourceful } from 'lucid-resourceful'\n *\n * class User extends withResourceful()(BaseModel) implements ResourcefulModel {\n *   @column({ isPrimary: true })\n *   @resourceful({ type: 'number', nullable: false })\n *   public id: number\n *\n *   @column()\n *   @resourceful({ type: 'string', nullable: false })\n *   public name: string\n *\n *   // Automatically gains all ResourcefulModel methods\n *   // User.$onResourcefulIndex, User.$onResourcefulRead, etc.\n * }\n * ```\n */\nexport interface ResourcefulModel extends LucidModel {\n  /** The display name for this model used in API documentation and error messages */\n  $resourcefulName: string\n\n  /** The column used as the title of the model instance when displayed in a list */\n  $resourcefulTitleColumn?: string\n\n  /** Optional description for OpenAPI schema documentation */\n  $resourcefulMetaDescription?: string\n\n  /** Optional external documentation reference for OpenAPI schema */\n  $resourcefulMetaExternalDocs?: ExternalDocumentationObject\n\n  /** Optional example value for OpenAPI schema documentation */\n  $resourcefulMetaExample?: string\n\n  /** Map of column property names to their resourceful metadata definitions */\n  $resourcefulColumns: Map<string, ResourcefulColumnDefinition<ResourcefulPropertySchema>>\n\n  /** Map of relationship property names to their resourceful metadata definitions */\n  $resourcefulRelationships: Map<string, ResourcefulRelationshipDefinition>\n\n  /** Map of computed accessor property names to their resourceful metadata definitions */\n  $resourcefulComputedAccessors: Map<\n    string,\n    ResourcefulComputedAccessorDefinition<ResourcefulPropertySchema>\n  >\n\n  /** Set of enforced preloads for the model */\n  $resourcefulEnforcedPreloads: Set<string>\n\n  /** Pre-merged per-relation cache entry options for cacheable 1:1 relations */\n  $resourcefulRelationsCache: Map<string, RelationCacheEntryOptions>\n\n  /** Model-level cache entry defaults applied when a relation cache config is `true` */\n  $resourcefulRelationsCacheDefaults: RelationCacheEntryOptions\n\n  /** Optional per-model cache resolver overriding the package-level default */\n  $resourcefulRelationsCacheService?: RelationsCacheServiceResolver\n\n  /** Optional per-model relation-cache error handler overriding the package-level default (ADR-009) */\n  $resourcefulOnRelationsCacheError?: RelationsCacheErrorHandler\n\n  /** Optional per-model relation-cache event hook overriding the package-level default */\n  $resourcefulOnRelationsCacheEvent?: RelationsCacheEventHandler\n\n  /** Pre-built per-model cache-write middleware pipeline run before encode (ADR-012) */\n  $resourcefulCacheMiddlewarePrepare?: CacheMiddlewarePipeline | null\n\n  /** Pre-built per-model cache-read middleware pipeline run after decode (ADR-012) */\n  $resourcefulCacheMiddlewareConsume?: CacheMiddlewarePipeline | null\n\n  /** Access control filter functions organized by CRUD operation type */\n  $resourcefulAccessControlFilters: ResourcefulMixinOptions['accessControlFilters']\n\n  /** Error handling strategy when ACL evaluation fails */\n  $resourcefulOnACLError: ResourcefulMixinOptions['onACLError']\n\n  /** Query scope callback functions for constraining database queries */\n  $resourcefulQueryScopeCallbacks: ResourcefulMixinOptions['queryScopeCallbacks']\n\n  /** Payload validation schema builder functions for create and update operations */\n  $resourcefulPayloadValidationSchemaBuilders: ResourcefulMixinOptions['payloadValidationSchemaBuilders']\n\n  /**\n   * Registers an event listener for resourceful model events.\n   *\n   * This method provides a way to listen for events emitted during resourceful\n   * operations such as ACL errors or validation scope errors. Useful for logging,\n   * monitoring, or implementing custom error handling logic.\n   *\n   * @template K - The event key type from the resourceful event map\n   * @param event - The name of the event to listen for ('acl:error', 'validation:scope:error')\n   * @param listener - Function to call when the event is emitted\n   * @returns The model class for method chaining\n   *\n   * @example\n   * ```typescript\n   * User.$onResourcefulEvent('acl:error', (error, ctx, app, instance) => {\n   *   console.error('ACL error occurred:', error);\n   * });\n   * ```\n   */\n  $onResourcefulEvent<K>(\n    event: Key<K, ResourcefulMixinEventMap<ResourcefulModel>>,\n    listener: Listener<K, ResourcefulMixinEventMap<ResourcefulModel>>\n  ): this\n\n  /**\n   * Registers a one-time event listener for resourceful model events.\n   *\n   * Similar to $onResourcefulEvent but the listener is automatically removed\n   * after being called once. Useful for handling events that should only\n   * trigger a single response.\n   *\n   * @template K - The event key type from the resourceful event map\n   * @param event - The name of the event to listen for\n   * @param listener - Function to call when the event is emitted\n   * @returns The model class for method chaining\n   *\n   * @example\n   * ```typescript\n   * User.$onceResourcefulEvent('validation:scope:error', (error, ctx, app, key, datatype) => {\n   *   console.warn('Validation scope error (one-time):', error);\n   * });\n   * ```\n   */\n  $onceResourcefulEvent<K>(\n    event: Key<K, ResourcefulMixinEventMap<ResourcefulModel>>,\n    listener: Listener<K, ResourcefulMixinEventMap<ResourcefulModel>>\n  ): this\n\n  /**\n   * Removes an event listener for resourceful model events.\n   *\n   * Unregisters a previously registered event listener. If no listener is\n   * provided, all listeners for the specified event are removed.\n   *\n   * @template K - The event key type from the resourceful event map\n   * @param event - The name of the event to stop listening for\n   * @param listener - Optional specific listener function to remove\n   * @returns The model class for method chaining\n   *\n   * @example\n   * ```typescript\n   * // Remove specific listener\n   * User.$offResourcefulEvent('acl:error', myErrorHandler);\n   *\n   * // Remove all listeners for an event\n   * User.$offResourcefulEvent('acl:error');\n   * ```\n   */\n  $offResourcefulEvent<K>(\n    event: Key<K, ResourcefulMixinEventMap<ResourcefulModel>>,\n    listener?: Listener<K, ResourcefulMixinEventMap<ResourcefulModel>>\n  ): this\n\n  $getAsResourcefulForContext(\n    ctx: HttpContext,\n    app: ApplicationService\n  ): Promise<ResourcefulModelMetaSchema>\n\n  $getResourcefulWriteValidationSchema(\n    ctx: HttpContext,\n    app: ApplicationService,\n    forUpdate?: boolean\n  ): Promise<{\n    schema: ResourcefulModelOpenApiSchema\n    validator: ObjectSchema<any>\n  }>\n\n  /**\n   * Performs paginated listing and searching of model records with comprehensive filtering and aggregations.\n   *\n   * This method provides the core implementation for resourceful index/list operations,\n   * supporting pagination, field selection, access control, aggregations, and Lucene query syntax for\n   * filtering. It validates all inputs, applies ACL filters, executes the query with\n   * proper field mapping between serialized names and database columns, and returns\n   * structured results with query metadata and computed aggregations.\n   *\n   * @template SelectedFields - Array of field names that can be selected from the model's serializable attributes\n   * @template ReturnType - The resulting type after picking the selected fields from the model's serializable attributes\n   *\n   * @param filter - Lucene-style query string for filtering records (e.g., \"name:john AND email:*.com\").\n   *                 If null or undefined, defaults to empty string (no filtering).\n   * @param page - The page number for pagination (must be ≥ 1). Used with perPage to calculate offset.\n   * @param perPage - Number of records per page (must be ≥ 1 and ≤ 100 by default).\n   * @param fields - Array of field names to include in the response. If null, undefined, or empty,\n   *                 defaults to just the primary key field. Field names should use serialized names\n   *                 (as they appear in API responses), not database column names.\n   * @param sort - Array of sort specifications as [fieldName, direction] tuples. Field names must be\n   *               marked as sortable in their column definitions.\n   * @param ctx - HTTP context containing request information, authentication, and other request-scoped data.\n   * @param app - Application service instance providing access to application-level services and configuration.\n   * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints.\n   * @param aggregations - Optional object specifying aggregations to compute. Maps field names to arrays\n   *                       of aggregation methods. Only fields marked as aggregatable can be aggregated.\n   *\n   * @returns Promise resolving to ResourcefulIndexResult containing:\n   *   - `records`: Array of partial record objects with only the requested fields\n   *   - `total`: Total number of records matching the filter (before pagination)\n   *   - `page`: The requested page number (echoed back)\n   *   - `perPage`: The requested per-page limit (echoed back)\n   *   - `aggregations`: Computed aggregation results organized by field and method\n   *   - `countQuery`: SQL query string used for counting total records\n   *   - `recordsQuery`: SQL query string used for fetching the actual records\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   * @throws {E_INVALID_COLUMN_ACCESS} When no fields are available for access after ACL filtering\n   * @throws {E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION} When input validation fails\n   * @throws {E_INVALID_AGGREGATION_FIELD} When attempting to aggregate on non-aggregatable fields\n   * @throws {E_INVALID_AGGREGATION_OPERATION} When using invalid aggregation methods\n   *\n   * @example\n   * ```typescript\n   * // Basic usage with pagination\n   * const result = await User.$onResourcefulIndex(\n   *   'name:john',\n   *   1,\n   *   10,\n   *   ['id', 'name', 'email'],\n   *   null,\n   *   ctx,\n   *   app\n   * );\n   *\n   * // Complex filtering with date ranges and aggregations\n   * const result = await User.$onResourcefulIndex(\n   *   'status:active AND createdAt:[2021-01-01T00:00:00Z TO 2021-12-31T23:59:59Z]',\n   *   2,\n   *   25,\n   *   ['id', 'name', 'totalSales'],\n   *   [['createdAt', 'desc']],\n   *   ctx,\n   *   app,\n   *   [],\n   *   {\n   *     totalSales: ['sum', 'avg', 'max'],\n   *     orderCount: ['sum'],\n   *     customerId: ['countDistinct']\n   *   }\n   * );\n   * ```\n   */\n  $onResourcefulIndex(\n    filter: string | null | undefined,\n    page: number,\n    perPage: number,\n    fields: string | string[] | null | undefined,\n    sort: Array<[string, 'asc' | 'desc']> | null | undefined,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulScopeHooks,\n    aggregations?: ResourcefulIndexAggregateOptions\n  ): Promise<ResourcefulIndexResult<{ [key: string]: any }>>\n\n  /**\n   * Retrieves a single model record by its unique identifier with access control.\n   *\n   * This method implements secure record retrieval by first applying query scope callbacks\n   * to verify the record exists within the user's access scope, then fetching the full\n   * model instance for field-level ACL evaluation. Only fields that pass ACL checks\n   * are included in the response.\n   *\n   * @param uid - The unique identifier of the record to retrieve\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints\n   *\n   * @returns Promise resolving to the record object with only accessible fields\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   *\n   * @example\n   * ```typescript\n   * // Retrieve a user by ID\n   * const user = await User.$onResourcefulRead(123, ctx, app);\n   *\n   * // With additional query scoping\n   * const user = await User.$onResourcefulRead(123, ctx, app, [\n   *   (ctx, app, query) => query.where('tenant_id', ctx.auth.user.tenantId)\n   * ]);\n   * ```\n   */\n  $onResourcefulRead(\n    uid: number,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulScopeHooks\n  ): Promise<any>\n\n  /**\n   * Loads a specific relationship for a model record with pagination, filtering, and access control.\n   *\n   * This method provides paginated relationship loading by leveraging the related model's\n   * $onResourcefulIndex method with automatically generated relationship constraints.\n   * It supports full filtering, sorting, and pagination capabilities while maintaining\n   * proper access control and scoping.\n   *\n   * @param uid - The unique identifier of the parent record\n   * @param relationshipKey - The name of the relationship property to load\n   * @param filter - Lucene-style query string for filtering related records\n   * @param page - The page number for pagination (must be ≥ 1)\n   * @param perPage - Number of records per page (must be ≥ 1 and ≤ 100)\n   * @param fields - Array of field names to include in the response from the related model\n   * @param sort - Array of sort criteria as [field, direction] tuples\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional array of additional query scope callbacks\n   *\n   * @returns Promise resolving to paginated relationship results\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_INVALID_RELATIONSHIP_EXCEPTION} When the specified relationship doesn't exist\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   * @throws {E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION} When input validation fails\n   *\n   * @example\n   * ```typescript\n   * // Load user's posts with filtering and pagination\n   * const userPosts = await Post.$onResourcefulReadRelationship(\n   *   123,                    // user ID\n   *   'posts',               // relationship name\n   *   'status:published',    // filter\n   *   1,                     // page\n   *   10,                    // perPage\n   *   ['id', 'title'],       // fields\n   *   [['createdAt', 'desc']], // sort\n   *   ctx,\n   *   app\n   * );\n   *\n   * // Load user's skills (many-to-many)\n   * const userSkills = await Skill.$onResourcefulReadRelationship(\n   *   123,\n   *   'skills',\n   *   null,  // no filter\n   *   1,\n   *   50,\n   *   null,  // all fields\n   *   null,  // default sort\n   *   ctx,\n   *   app\n   * );\n   * ```\n   */\n  $onResourcefulReadRelationship(\n    uid: any,\n    relationshipKey: string,\n    filter: string | null | undefined,\n    page: number,\n    perPage: number,\n    fields: string | string[] | null | undefined,\n    sort: Array<[string, 'asc' | 'desc']> | null | undefined,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulScopeHooks,\n    aggregations?: ResourcefulIndexAggregateOptions\n  ): Promise<ResourcefulIndexResult<{ [key: string]: any }>>\n\n  /**\n   * Creates a new model record with payload validation and access control.\n   *\n   * This method handles secure record creation by validating the request payload\n   * against both model-level and request-specific validation schemas, checking\n   * field-level write permissions, and returning the created record with appropriate\n   * field filtering applied.\n   *\n   * @param payload - The data object containing field values for the new record\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional array of validation schema getters for additional payload validation\n   *\n   * @returns Promise resolving to the created record with only accessible fields\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_INVALID_PAYLOAD_EXCEPTION} When core model validation fails\n   * @throws {E_FORBIDDEN_PAYLOAD_EXCEPTION} When request-specific validation fails\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   *\n   * @example\n   * ```typescript\n   * // Create a new user\n   * const user = await User.$onResourcefulCreate({\n   *   name: 'John Doe',\n   *   email: 'john@example.com'\n   * }, ctx, app);\n   *\n   * // With additional validation\n   * const user = await User.$onResourcefulCreate(payload, ctx, app, [\n   *   (ctx, app) => joi.object({ email: joi.string().domain('company.com') })\n   * ]);\n   * ```\n   */\n  $onResourcefulCreate(\n    payload: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulValidationHooks\n  ): Promise<any>\n\n  /**\n   * Updates an existing model record with payload validation and access control.\n   *\n   * This method implements secure record updates by first verifying the record exists\n   * and is accessible via the read operation, validating the update payload, checking\n   * field-level write permissions, and returning the updated record with appropriate\n   * field filtering applied.\n   *\n   * @param uid - The unique identifier of the record to update\n   * @param payload - The data object containing field values to update\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional object containing query scope callbacks and validation schema getters\n   *\n   * @returns Promise resolving to the updated record with only accessible fields\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n   * @throws {E_INVALID_PAYLOAD_EXCEPTION} When core model validation fails\n   * @throws {E_FORBIDDEN_PAYLOAD_EXCEPTION} When request-specific validation fails\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   *\n   * @example\n   * ```typescript\n   * // Update a user\n   * const user = await User.$onResourcefulUpdate(123, {\n   *   name: 'Jane Doe'\n   * }, ctx, app);\n   *\n   * // With additional scoping and validation\n   * const user = await User.$onResourcefulUpdate(123, payload, ctx, app, {\n   *   queryScopeCallbacks: [(ctx, app, query) => query.where('active', true)],\n   *   payloadValidationSchemas: [(ctx, app) => customValidationSchema]\n   * });\n   * ```\n   */\n  $onResourcefulUpdate(\n    uid: number,\n    payload: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: Partial<ResourcefulHooks>\n  ): Promise<any>\n\n  /**\n   * Deletes an existing model record with access control.\n   *\n   * This method implements secure record deletion by applying query scope callbacks\n   * to verify the record exists within the user's access scope, checking delete\n   * permissions via ACL filters, and then removing the record from the database.\n   *\n   * @param uid - The unique identifier of the record to delete\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints\n   *\n   * @returns Promise that resolves when the record has been successfully deleted\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n   * @throws {E_FORBIDDEN} When access is denied by model-level ACL filters\n   *\n   * @example\n   * ```typescript\n   * // Delete a user\n   * await User.$onResourcefulDelete(123, ctx, app);\n   *\n   * // With additional query scoping\n   * await User.$onResourcefulDelete(123, ctx, app, [\n   *   (ctx, app, query) => query.where('tenant_id', ctx.auth.user.tenantId)\n   * ]);\n   * ```\n   */\n  $onResourcefulDelete(\n    uid: number,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulScopeHooks\n  ): Promise<void>\n\n  $onResourcefulBulkUpdate(\n    filter: string | null | undefined,\n    payload: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: Partial<ResourcefulHooks>\n  ): Promise<\n    | {\n        [key: string]: any | Error\n      }\n    | Error\n  >\n\n  $onResourcefulBulkUpdateByUid(\n    uids: (number | string)[],\n    payload: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: Partial<ResourcefulHooks>\n  ): Promise<{\n    [key: string]: any | Error\n  }>\n\n  /**\n   * Generates an OpenAPI schema object for this model with context-aware field filtering.\n   *\n   * This method creates a complete OpenAPI v3 schema representation of the model\n   * by evaluating field-level access control permissions for the given request context.\n   * Only fields that pass ACL checks are included in the generated schema, ensuring\n   * that API documentation accurately reflects what data is accessible to the current user.\n   *\n   * The method processes all resourceful properties (columns, computed accessors, and\n   * relationships) and converts them to their OpenAPI schema equivalents while respecting\n   * access control constraints and applying proper type mappings.\n   *\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param operation - The type of operation. To honor field-level ACL\n   *\n   * @returns Promise resolving to a complete OpenAPI schema object with:\n   *   - `type`: Always 'object' for model schemas\n   *   - `title`: The model's resourceful name\n   *   - `description`: Optional model description from metadata\n   *   - `properties`: Object containing schema definitions for accessible fields\n   *   - `required`: Array of required field names (non-nullable fields)\n   *   - `externalDocs`: Optional external documentation reference\n   *   - `example`: Optional example value for the schema\n   *\n   * @example\n   * ```typescript\n   * // Generate OpenAPI schema for current user context\n   * const schema = await User.$asOpenApiSchemaObject(ctx, app, 'read');\n   *\n   * // Result structure:\n   * {\n   *   type: 'object',\n   *   title: 'User',\n   *   properties: {\n   *     id: { type: 'number', readOnly: true },\n   *     name: { type: 'string' },\n   *     email: { type: 'string', format: 'email' }\n   *   },\n   *   required: ['id', 'name', 'email']\n   * }\n   * ```\n   *\n   * @see {@link ResourcefulModelOpenApiSchema} for the complete schema structure\n   */\n  $asOpenApiSchemaObject(\n    ctx: HttpContext,\n    app: ApplicationService,\n    operation?: 'read' | 'write',\n    methodOptions?: GenerateModelSchemaOptions\n  ): Promise<ResourcefulModelOpenApiSchema>\n\n  /**\n   * Creates a new model instance from HTTP context data.\n   *\n   * @param ctx - The HTTP context containing the request data\n   * @returns A Promise that resolves to a new model instance\n   */\n  $createFromHttpContext(ctx: HttpContext): Promise<InstanceType<this>>\n}\n\nexport const ResourcefulErrorHandlerMethod = [\n  'bubble' as 'bubble',\n  'pass' as 'pass',\n  'fail' as 'fail',\n]\nexport type ResourcefulErrorHandlerMethod = (typeof ResourcefulErrorHandlerMethod)[number]\nexport const ResourcefulACLOperationType = ['read' as 'read', 'write' as 'write']\nexport type ResourcefulACLOperationType = (typeof ResourcefulACLOperationType)[number]\n\n/**\n * Supported aggregation methods for numeric fields in resourceful queries.\n *\n * These methods can be applied to fields marked as `aggregatable: true` in their\n * column definitions to compute statistical values across filtered datasets.\n *\n * @example\n * ```typescript\n * // Request aggregations on sales data\n * const result = await Order.$onResourcefulIndex('status:completed', 1, 10, ['id'], null, ctx, app, [], {\n *   totalAmount: ['sum', 'avg', 'max'],\n *   quantity: ['sum', 'countDistinct']\n * })\n * ```\n */\nexport const ResourcefulAggregateMethods = [\n  'avg' as 'avg',\n  'min' as 'min',\n  'max' as 'max',\n  'sum' as 'sum',\n  'countDistinct' as 'countDistinct',\n  'sumDistinct' as 'sumDistinct',\n  'avgDistinct' as 'avgDistinct',\n]\nexport type ResourcefulAggregateMethods = (typeof ResourcefulAggregateMethods)[number]\n\n/**\n * Configuration object for specifying aggregations to perform on index operations.\n *\n * Maps field names to arrays of aggregation methods to compute. Only fields marked\n * as `aggregatable: true` in their column definitions can be aggregated.\n *\n * @example\n * ```typescript\n * const aggregations: ResourcefulIndexAggregateOptions = {\n *   totalSales: ['sum', 'avg', 'max', 'min'],\n *   orderCount: ['sum'],\n *   customerId: ['countDistinct']\n * }\n * ```\n */\nexport interface ResourcefulIndexAggregateOptions {\n  [key: string]: ResourcefulAggregateMethods[]\n}\n\n/**\n * Results object containing computed aggregation values organized by field and method.\n *\n * The structure mirrors the requested aggregations, with each field containing\n * the computed values for the requested aggregation methods.\n *\n * @example\n * ```typescript\n * const results: ResourcefulIndexAggregateResults = {\n *   totalSales: { sum: 50000, avg: 125.5, max: 999.99, min: 10.00 },\n *   orderCount: { sum: 400 },\n *   customerId: { countDistinct: 150 }\n * }\n * ```\n */\nexport interface ResourcefulIndexAggregateResults {\n  [key: string]: Partial<Record<ResourcefulAggregateMethods, number>>\n}\n\ntype ResourcefulCheckAccessOptions<\n  Model extends LucidModel = LucidModel,\n  ResourcefulModelInstance = InstanceType<Model>,\n> = { ctx: HttpContext; app: ApplicationService } & (\n  | { operation: CRUDOperationsEnum.LIST | CRUDOperationsEnum.CREATE; instance?: undefined }\n  | {\n      operation: CRUDOperationsEnum.READ | CRUDOperationsEnum.UPDATE | CRUDOperationsEnum.DELETE\n      instance: ResourcefulModelInstance\n    }\n)\n\nexport interface AdvancedResourcefulMixinOptions {\n  propertyEvaluationConcurrency: number\n  aclEvaluationConcurrency: number\n}\n\nexport interface ResourcefulMixinOptions<\n  Model extends LucidModel = LucidModel,\n  ModelInstance = InstanceType<Model>,\n> {\n  name: string\n  resourcefulTitleColumn?: string\n  readRequiredForWrite: boolean\n  accessControlFilters: {\n    list: ResourcefulGeneralAccessControlFilter[]\n    create: ResourcefulGeneralAccessControlFilter[]\n    read: ResourcefulResourceAccessControlFilter<Model, ModelInstance>[]\n    update: ResourcefulResourceAccessControlFilter<Model, ModelInstance>[]\n    delete: ResourcefulResourceAccessControlFilter<Model, ModelInstance>[]\n  }\n  payloadValidationSchemaBuilders: {\n    create: ResourcefulPayloadValidatorGetter[]\n    update: ResourcefulPayloadValidatorGetter[]\n  }\n  onACLError: ResourcefulErrorHandlerMethod\n  onValidationScopeError: ResourcefulErrorHandlerMethod\n  queryScopeCallbacks: {\n    list: ResourcefulQueryScopeCallback[]\n    access: ResourcefulQueryScopeCallback[]\n  }\n  description?: string\n  externalDocs?: ExternalDocumentationObject\n  example?: string\n  advanced: AdvancedResourcefulMixinOptions\n  // allows for forcing a relationship to be preloaded even if it wouldn't normally\n  // due to it being the wrong kind (i.e. many to many)\n  enforcedPreloads?: string[]\n  // Per-relation caching of 1:1 (belongsTo/hasOne) relations. `true` uses\n  // `relationsCacheDefaults`; an object is per-relation entry options merged over\n  // the defaults. Collection relations listed here are a no-op.\n  relationsCache?: Record<string, boolean | RelationCacheEntryOptions>\n  // Model-level cache entry defaults applied when a relation is `true` (default { ttl: '1m' }).\n  relationsCacheDefaults?: RelationCacheEntryOptions\n  // Optional per-model cache resolver that overrides the package-level default\n  // registered via `setDefaultRelationsCacheService`. Usually omitted.\n  relationsCacheService?: RelationsCacheServiceResolver\n  // Optional per-model observer for runtime relation-cache failures (read/write/\n  // eviction/resolution/rehydration), overriding the package-level default\n  // registered via `setDefaultOnRelationsCacheError`. Observe-only (ADR-009).\n  onRelationsCacheError?: RelationsCacheErrorHandler\n  // Optional per-model observer for relation-cache lifecycle events (hit/miss/\n  // store/force/bypass/evict), overriding the package-level default registered\n  // via `setDefaultOnRelationsCacheEvent`. Lets the host route cache telemetry to\n  // its own logger / metrics; the package itself imports no logger. Observe-only.\n  onRelationsCacheEvent?: RelationsCacheEventHandler\n  // Optional per-model cache middleware run over a relation snapshot just before it\n  // is encoded and written to the cache (ADR-012). A single handler or an ordered\n  // list; handlers mutate `context.value`. Applies whenever THIS model is loaded as a\n  // cached 1:1 relation — e.g. encrypting sensitive fields before they reach the cache.\n  cacheMiddlewarePrepare?: CacheMiddlewareInput\n  // Optional per-model cache middleware run over a decoded snapshot just before it is\n  // rehydrated on a cache hit (ADR-012) — the symmetric inverse of `cacheMiddlewarePrepare`.\n  cacheMiddlewareConsume?: CacheMiddlewareInput\n}\n\ntype ResourcefulCheckAccessReturn =\n  | {\n      isForbidden: true\n      message: string\n      allowedSerializedMap?: undefined\n      allowedColumnsMap?: undefined\n    }\n  | {\n      isForbidden: false\n      message?: undefined\n      allowedSerializedMap: Map<string, boolean>\n      allowedColumnsMap: Map<string, boolean>\n    }\n\nconst getFieldKey = (\n  key: string,\n  definition: ModelColumnOptions | ComputedOptions | ReturnType<LucidModel['$getRelation']>\n) => {\n  if (isString(definition.serializeAs)) {\n    return definition.serializeAs as string | null\n  }\n  return key\n}\n\nfunction StaticImplements<T>() {\n  return (_t: T) => {}\n}\n\n// Keyed as `ModelName:depth` so a partial depth=1 result (no grandchild\n// relationships due to the `depth > 1` guard) never poisons the depth=0\n// full result for the same model when two different callers encounter it\n// in different traversal orders.\nconst filterablePropertiesForModelCache = new Map<string, string[]>()\n\nconst filterableLocalPropertiesForModelCache = new Map<\n  LucidModel | (LucidModel & ResourcefulModel),\n  string[]\n>()\n\nconst getFilterableLocalPropertiesFromModel = (\n  model: LucidModel | (LucidModel & ResourcefulModel)\n) => {\n  const cached = filterableLocalPropertiesForModelCache.get(model)\n  if (cached) {\n    return cached\n  }\n  const filterableLocalProperties: string[] = []\n  if (guards.isResourcefulModel(model)) {\n    model.$resourcefulColumns.forEach((definition, key) => {\n      if (definition.filterable) {\n        const lucidOptions = model.$getColumn(key)\n        if (lucidOptions) {\n          const filterableKey = getFieldKey(key, lucidOptions)\n          if (filterableKey) {\n            filterableLocalProperties.push(filterableKey)\n          }\n        }\n      }\n    })\n  }\n  const returnable = Array.from(new Set(filterableLocalProperties)) // Ensure uniqueness\n  filterableLocalPropertiesForModelCache.set(model, returnable)\n  return returnable\n}\n\nconst getFilterablePropertiesFromModel = (\n  model: LucidModel | (LucidModel & ResourcefulModel),\n  depth: number = 0\n): { [key: string]: any } => {\n  if (depth > 1) {\n    // Prevent infinite recursion in case of circular relationships\n    return []\n  }\n  const cacheKey = `${(model as any).name}:${depth}`\n  const cached = filterablePropertiesForModelCache.get(cacheKey)\n  if (cached) {\n    return cached\n  }\n  const definitions: Map<\n    string,\n    | ResourcefulColumnDefinition<any>\n    | ResourcefulComputedAccessorDefinition<any>\n    | ResourcefulRelationshipDefinition<LucidModel>\n  > = new Map()\n  const filterablePropertiesRaw: string[] = []\n  filterablePropertiesRaw.push(...getFilterableLocalPropertiesFromModel(model))\n  if (guards.isResourcefulModel(model)) {\n    filterablePropertiesRaw.forEach((field) => {\n      const definition =\n        model.$resourcefulColumns.get(field) || model.$resourcefulComputedAccessors.get(field)\n      if (definition) {\n        definitions.set(field, definition)\n      }\n    })\n    model.$resourcefulRelationships.forEach((_definition, key) => {\n      const lucidOptions = model.$getRelation(key)\n      if (lucidOptions) {\n        const relationshipKey = getFieldKey(key, lucidOptions)\n        const relatedModel = lucidOptions.relatedModel()\n        if (relationshipKey && guards.isResourcefulModel(relatedModel)) {\n          const relatedFilterableFields = Object.entries(\n            getFilterablePropertiesFromModel(relatedModel, depth + 1)\n          )\n          relatedFilterableFields.forEach(([relatedField, relatedFieldDefinitionType]) => {\n            const relatedFilterableField = [relationshipKey, relatedField].join('.')\n            filterablePropertiesRaw.push(relatedFilterableField)\n            definitions.set(relatedFilterableField, { type: relatedFieldDefinitionType } as any)\n          })\n        }\n      }\n    })\n  }\n  const returnable = Object.assign(\n    {},\n    ...Array.from(new Set(filterablePropertiesRaw)).map((k) => {\n      const def = definitions.get(k)\n      if (!def) {\n        return { [k]: { type: 'unknown' } }\n      }\n      if ('type' in def) {\n        return { [k]: def.type }\n      }\n      return { [k]: { type: 'unknown' } }\n    })\n  )\n  filterablePropertiesForModelCache.set(cacheKey, returnable)\n  return returnable\n}\n\nconst capitalizeFirstLetterOfString = (str: string): string => {\n  if (typeof str !== 'string' || str.length === 0) {\n    return str\n  }\n  return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\nconst getAggregationResults = (\n  desired: ResourcefulIndexAggregateOptions,\n  results: { total: number; [key: string]: number }\n): ResourcefulIndexAggregateResults => {\n  const ret: ResourcefulIndexAggregateResults = {}\n  Object.keys(desired).forEach((key) => {\n    const methods = desired[key]\n    if (methods.length > 0) {\n      ret[key] = {}\n      methods.forEach((method) => {\n        const desiredForMethodKey = [key, capitalizeFirstLetterOfString(method)].join('')\n        if (results[desiredForMethodKey] !== undefined && results[desiredForMethodKey] !== null) {\n          switch (method) {\n            default:\n              ret[key][method] = Number(results[desiredForMethodKey])\n              break\n          }\n        }\n      })\n    }\n  })\n  return ret\n}\n\n// A BentoCache `Duration` is `number | string | null`. Validating each cache\n// option explicitly (instead of `.object().unknown(true)`) rejects typos like\n// `tts` and mistyped values at model-definition time. These fields mirror the\n// `RelationCacheEntryOptions` subset of BentoCache's `RawCommonOptions`.\nconst cacheDurationSchema = joi.alternatives().try(joi.number(), joi.string(), joi.valid(null))\nconst relationCacheEntryOptionsSchema = joi.object({\n  ttl: cacheDurationSchema.optional(),\n  grace: joi\n    .alternatives()\n    .try(joi.boolean().valid(false), joi.number(), joi.string(), joi.valid(null))\n    .optional(),\n  graceBackoff: cacheDurationSchema.optional(),\n  suppressL2Errors: joi.boolean().optional(),\n  timeout: cacheDurationSchema.optional(),\n  hardTimeout: cacheDurationSchema.optional(),\n  lockTimeout: cacheDurationSchema.optional(),\n})\n\n// `cacheMiddlewarePrepare` / `cacheMiddlewareConsume` accept a single middleware\n// handler or an ordered list of handlers (ADR-012); each is a `(context, next)`\n// function. They are built into an `@nhtio/middleware` pipeline after validation.\nconst cacheMiddlewareSchema = joi\n  .alternatives()\n  .try(joi.function(), joi.array().items(joi.function()))\n\n/**\n * Creates a mixin that adds resourceful CRUD functionality to Lucid models.\n *\n * This function implements the mixin pattern to enhance AdonisJS Lucid models with\n * metadata-driven CRUD operations, field-level access control, query scoping,\n * and OpenAPI schema generation capabilities. The resulting model gains static\n * methods for handling HTTP requests with built-in validation, pagination,\n * filtering, and security features.\n *\n * The mixin validates and normalizes configuration options, creates isolated\n * metadata maps for each model class to prevent inheritance conflicts, and\n * establishes an event emitter for monitoring ACL and validation operations.\n *\n * @param options - Configuration object for customizing mixin behavior\n * @param options.name - Display name for the model (defaults to class name)\n * @param options.readRequiredForWrite - Whether read access is required before write operations\n * @param options.accessControlFilters - Object containing arrays of ACL filter functions for different operations\n * @param options.accessControlFilters.list - Filters applied during listing/search operations\n * @param options.accessControlFilters.create - Filters applied during record creation\n * @param options.accessControlFilters.read - Filters applied during record reading\n * @param options.accessControlFilters.update - Filters applied during record updates\n * @param options.accessControlFilters.delete - Filters applied during record deletion\n * @param options.onACLError - Error handling strategy when ACL evaluation fails ('throw', 'pass', 'fail')\n * @param options.onValidationScopeError - Error handling strategy when validation scope functions fail\n * @param options.queryScopeCallbacks - Object containing query scope callback functions\n * @param options.queryScopeCallbacks.list - Callbacks applied to listing/search queries\n * @param options.queryScopeCallbacks.access - Callbacks applied to individual record access queries\n * @param options.description - Optional description for OpenAPI documentation\n * @param options.externalDocs - Optional external documentation reference for OpenAPI\n * @param options.example - Optional example value for OpenAPI documentation\n * @param options.advanced - Advanced configuration options for performance tuning\n * @param options.advanced.propertyEvaluationConcurrency - Concurrency limit for property ACL evaluation\n * @param options.advanced.aclEvaluationConcurrency - Concurrency limit for ACL filter evaluation\n *\n * @returns A mixin function that accepts a Lucid model class and returns the enhanced model\n *\n * @throws {E_INVALID_RESOURCEFUL_MIXIN_OPTIONS} When the provided options fail validation\n *\n * @example\n * ```typescript\n * import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'\n * import { withResourceful, resourceful } from 'lucid-resourceful'\n *\n * class User extends withResourceful({\n *   name: 'User',\n *   readRequiredForWrite: true,\n *   accessControlFilters: {\n *     read: [(ctx) => ctx.auth.user?.id === ctx.params.id],\n *     update: [(ctx) => ctx.auth.user?.isAdmin]\n *   }\n * })(BaseModel) {\n *   @column({ isPrimary: true })\n *   @resourceful({ type: 'number', nullable: false })\n *   public id: number\n *\n *   @column()\n *   @resourceful({ type: 'string', nullable: false })\n *   public name: string\n * }\n *\n * // Generated controller with CRUD operations\n * const UserController = User.generateController()\n * ```\n *\n * @see {@link ResourcefulMixinOptions} for detailed configuration options\n * @see {@link ResourcefulModel} for the enhanced model interface\n */\nexport function withResourceful(\n  options: Partial<ResourcefulMixinOptions> = {}\n): <Model extends NormalizeConstructor<typeof BaseModel>>(\n  superclass: Model\n) => Model & ResourcefulModel {\n  return <Model extends NormalizeConstructor<typeof BaseModel>>(\n    superclass: Model\n  ): Model & ResourcefulModel => {\n    const optionsSchema = joi.object<ResourcefulMixinOptions>({\n      name: joi.string().default(superclass.name),\n      resourcefulTitleColumn: joi.string().optional(),\n      readRequiredForWrite: joi.boolean().default(false),\n      accessControlFilters: joi\n        .object({\n          list: joi.array().items(joi.function()).default([]),\n          create: joi.array().items(joi.function()).default([]),\n          read: joi.array().items(joi.function()).default([]),\n          update: joi.array().items(joi.function()).default([]),\n          delete: joi.array().items(joi.function()).default([]),\n        })\n        .default({}),\n      onACLError: joi\n        .string()\n        .valid(...ResourcefulErrorHandlerMethod)\n        .default('throw'),\n      onValidationScopeError: joi\n        .string()\n        .valid(...ResourcefulErrorHandlerMethod)\n        .default('throw'),\n      queryScopeCallbacks: joi\n        .object({\n          list: joi.array().items(joi.function()).default([]),\n          access: joi.array().items(joi.function()).default([]),\n        })\n        .default({}),\n      payloadValidationSchemaBuilders: joi\n        .object({\n          create: joi.array().items(joi.function()).default([]),\n          update: joi.array().items(joi.function()).default([]),\n        })\n        .default({ create: [], update: [] }),\n      description: joi.string().optional(),\n      externalDocs: joi\n        .object<ExternalDocumentationObject>({\n          description: joi.string().optional(),\n          url: joi.string().uri().required(),\n        })\n        .optional(),\n      example: joi.string().optional(),\n      advanced: joi\n        .object<AdvancedResourcefulMixinOptions>({\n          propertyEvaluationConcurrency: joi.number().integer().min(1).default(10),\n          aclEvaluationConcurrency: joi.number().integer().min(1).default(2),\n        })\n        .default({\n          propertyEvaluationConcurrency: 10,\n          aclEvaluationConcurrency: 2,\n        }),\n      enforcedPreloads: joi.array().items(joi.string()).optional(),\n      relationsCache: joi\n        .object()\n        .pattern(\n          joi.string(),\n          joi.alternatives().try(joi.boolean(), relationCacheEntryOptionsSchema)\n        )\n        .optional(),\n      relationsCacheDefaults: relationCacheEntryOptionsSchema.optional(),\n      relationsCacheService: joi.function().optional(),\n      onRelationsCacheError: joi.function().optional(),\n      onRelationsCacheEvent: joi.function().optional(),\n      cacheMiddlewarePrepare: cacheMiddlewareSchema.optional(),\n      cacheMiddlewareConsume: cacheMiddlewareSchema.optional(),\n    })\n\n    const { error, value: validatedOptions } = optionsSchema.validate(options, {\n      abortEarly: true,\n    }) as { error?: ValidationError; value: ResourcefulMixinOptions<Model> }\n\n    if (error) {\n      throw new E_INVALID_RESOURCEFUL_MIXIN_OPTIONS(options.name || superclass.name, error)\n    }\n\n    // Ensure each class gets its own non-inherited static Maps\n    const ensureOwnResourcefulMap = <T>(cls: any, key: string): Map<string, T> => {\n      if (!Object.prototype.hasOwnProperty.call(cls, key) || !(cls[key] instanceof Map)) {\n        return new Map()\n      }\n      return cls[key]\n    }\n\n    const resourcefulColumns = ensureOwnResourcefulMap<\n      ResourcefulColumnDefinition<ResourcefulPropertySchema>\n    >(superclass, '$resourcefulColumns')\n    const resourcefulRelationships = ensureOwnResourcefulMap<ResourcefulRelationshipDefinition>(\n      superclass,\n      '$resourcefulRelationships'\n    )\n    const resourcefulComputedAccessors = ensureOwnResourcefulMap<\n      ResourcefulComputedAccessorDefinition<ResourcefulPropertySchema>\n    >(superclass, '$resourcefulComputedAccessors')\n\n    // Pre-merge the per-relation cache config: each enabled relation resolves to\n    // `relation === true ? defaults : { ...defaults, ...perRelation }`. The\n    // CachingPreloader and the write-through hooks read this off the model.\n    const relationsCacheDefaults: RelationCacheEntryOptions =\n      validatedOptions.relationsCacheDefaults\n        ? { ttl: '1m', ...validatedOptions.relationsCacheDefaults }\n        : { ttl: '1m' }\n    const resourcefulRelationsCache = new Map<string, RelationCacheEntryOptions>()\n    if (validatedOptions.relationsCache) {\n      for (const [relationName, relationCacheConfig] of Object.entries(\n        validatedOptions.relationsCache\n      )) {\n        if (relationCacheConfig === false) {\n          continue\n        }\n        if (relationCacheConfig === true) {\n          resourcefulRelationsCache.set(relationName, { ...relationsCacheDefaults })\n          continue\n        }\n        resourcefulRelationsCache.set(relationName, {\n          ...relationsCacheDefaults,\n          ...relationCacheConfig,\n        })\n      }\n    }\n    const resourcefulRelationsCacheService = validatedOptions.relationsCacheService\n    const resourcefulOnRelationsCacheError = validatedOptions.onRelationsCacheError\n    const resourcefulOnRelationsCacheEvent = validatedOptions.onRelationsCacheEvent\n    const resourcefulCacheMiddlewarePrepare = buildCacheMiddleware(\n      validatedOptions.cacheMiddlewarePrepare\n    )\n    const resourcefulCacheMiddlewareConsume = buildCacheMiddleware(\n      validatedOptions.cacheMiddlewareConsume\n    )\n\n    const resourcefulModelEventEmitter = new TypedEventEmitter<\n      ResourcefulMixinEventMap<Model & ResourcefulModel>\n    >()\n\n    /**\n     * Separates payload fields into regular fields and setter fields based on resourceful metadata.\n     *\n     * @param payload - The payload object to separate\n     * @param resourcefulCols - Map of column definitions from the model\n     * @param resourcefulAccessors - Map of computed accessor definitions from the model\n     * @returns Object with regularFields and setterFields\n     */\n    const separatePayloadFields = (\n      payload: Record<string, any>,\n      resourcefulCols: Map<string, any>,\n      resourcefulAccessors: Map<string, any>\n    ): {\n      regularFields: Record<string, any>\n      setterFields: Record<string, any>\n    } => {\n      const regularFields: Record<string, any> = {}\n      const setterFields: Record<string, any> = {}\n\n      for (const [key, value] of Object.entries(payload)) {\n        // Check if it's a writable computed accessor (setter)\n        const computedAccessor = resourcefulAccessors?.get(key)\n        if (computedAccessor) {\n          setterFields[key] = value\n          continue\n        }\n\n        // Check if it's a regular column\n        const column = resourcefulCols?.get(key)\n        if (column) {\n          regularFields[key] = value\n        }\n\n        // If not in either map, skip the field\n      }\n\n      return { regularFields, setterFields }\n    }\n\n    StaticImplements<ResourcefulModel>()\n    class ResourcefulModel extends superclass {\n      declare static readonly $resourcefulName: string\n      declare static readonly $resourcefulTitleColumn?: string\n      declare static $resourcefulMetaDescription?: string\n      declare static $resourcefulMetaExternalDocs?: ExternalDocumentationObject\n      declare static $resourcefulMetaExample?: string\n      static $resourcefulColumns: Map<\n        string,\n        ResourcefulColumnDefinition<ResourcefulPropertySchema>\n      > = resourcefulColumns\n      static $resourcefulRelationships: Map<string, ResourcefulRelationshipDefinition> =\n        resourcefulRelationships\n      static $resourcefulComputedAccessors: Map<\n        string,\n        ResourcefulComputedAccessorDefinition<ResourcefulPropertySchema>\n      > = resourcefulComputedAccessors\n      declare static $resourcefulEnforcedPreloads: Set<string>\n      declare static $resourcefulAccessControlFilters: ResourcefulMixinOptions['accessControlFilters']\n      declare static $resourcefulOnACLError: ResourcefulMixinOptions['onACLError']\n      declare static $resourcefulQueryScopeCallbacks: ResourcefulMixinOptions['queryScopeCallbacks']\n      declare static $resourcefulPayloadValidationSchemaBuilders: ResourcefulMixinOptions['payloadValidationSchemaBuilders']\n      static weakCacheService = new WeakCacheService()\n      /** Pre-merged per-relation cache entry options for cacheable 1:1 relations. */\n      static $resourcefulRelationsCache: Map<string, RelationCacheEntryOptions> =\n        resourcefulRelationsCache\n      /** Model-level cache entry defaults applied when a relation is `true`. */\n      static $resourcefulRelationsCacheDefaults: RelationCacheEntryOptions = relationsCacheDefaults\n      /** Optional per-model cache resolver overriding the package-level default. */\n      static $resourcefulRelationsCacheService?: RelationsCacheServiceResolver =\n        resourcefulRelationsCacheService\n      /** Optional per-model relation-cache error handler overriding the package-level default (ADR-009). */\n      static $resourcefulOnRelationsCacheError?: RelationsCacheErrorHandler =\n        resourcefulOnRelationsCacheError\n      /** Optional per-model relation-cache event hook overriding the package-level default. */\n      static $resourcefulOnRelationsCacheEvent?: RelationsCacheEventHandler =\n        resourcefulOnRelationsCacheEvent\n      /** Pre-built per-model cache-write middleware pipeline run before encode (ADR-012). */\n      static $resourcefulCacheMiddlewarePrepare?: CacheMiddlewarePipeline | null =\n        resourcefulCacheMiddlewarePrepare\n      /** Pre-built per-model cache-read middleware pipeline run after decode (ADR-012). */\n      static $resourcefulCacheMiddlewareConsume?: CacheMiddlewarePipeline | null =\n        resourcefulCacheMiddlewareConsume\n\n      /**\n       * Hook that runs before creating a new record.\n       * Validates the payload using the configured payloadValidationSchemaBuilders.\n       */\n      @beforeCreate()\n      static async $resourcefulValidateBeforeCreate(model: InstanceType<Model & ResourcefulModel>) {\n        if (!(model instanceof ResourcefulModel)) {\n          return null\n        }\n\n        // @ts-expect-error\n        await model.constructor.$resourcefulValidatePayload(model, 'create')\n      }\n\n      /**\n       * Hook that runs before updating an existing record.\n       * Validates the payload using the configured payloadValidationSchemaBuilders.\n       */\n      @beforeUpdate()\n      static async $resourcefulValidateBeforeUpdate(model: InstanceType<Model & ResourcefulModel>) {\n        if (!(model instanceof ResourcefulModel)) {\n          return null\n        }\n\n        // @ts-expect-error\n        await model.constructor.$resourcefulValidatePayload(model, 'update')\n      }\n\n      /**\n       * Hook that runs after a record is updated. Evicts the row's own cached\n       * relation copy by its canonical identity tag. Best-effort.\n       */\n      @afterUpdate()\n      static async $resourcefulEvictAfterUpdate(model: InstanceType<Model & ResourcefulModel>) {\n        if (!(model instanceof ResourcefulModel)) {\n          return null\n        }\n        await ResourcefulModel.$resourcefulEvictOwnIdentity(model)\n      }\n\n      /**\n       * Hook that runs after a record is deleted. Evicts the row's own cached\n       * relation copy by its canonical identity tag. Best-effort.\n       */\n      @afterDelete()\n      static async $resourcefulEvictAfterDelete(model: InstanceType<Model & ResourcefulModel>) {\n        if (!(model instanceof ResourcefulModel)) {\n          return null\n        }\n        await ResourcefulModel.$resourcefulEvictOwnIdentity(model)\n      }\n\n      /**\n       * Evicts the cached relation entry tagged with this row's canonical identity\n       * (`{$resourcefulName}:{primaryKeyValue}`) via `deleteByTag`.\n       *\n       * Gated to cache TARGETS only: once core registers the default resolver,\n       * EVERY resourceful write would otherwise resolve a cache and fire\n       * `deleteByTag` — including hot models (e.g. `PaymentIntentTicket`) that are\n       * never the related-row of any cached 1:1 relation. We early-return unless\n       * this model's identity name is a registered relation-cache target (a name\n       * referenced by some model's `relationsCache`, populated eagerly at preloader\n       * construction), avoiding pointless L1/L2/bus writes on hot paths.\n       *\n       * The remaining body — cache resolution and the `deleteByTag` call — is\n       * guarded: eviction is best-effort, so a resolver throw, an unreachable cache,\n       * or a transient L2 error is caught and logged at `warn`, never rethrown into\n       * the business write. TTL bounds the staleness window (ADR-007).\n       *\n       * @param model - The row that was updated or deleted.\n       */\n      private static async $resourcefulEvictOwnIdentity(\n        model: InstanceType<Model & ResourcefulModel>\n      ) {\n        // Skip models that can never be a cached relation target — avoids a\n        // tag-invalidation write to L1 + L2 + the cache bus on every hot write.\n        if (!isRelationCacheTarget(this.$resourcefulName)) {\n          return\n        }\n        // Hoisted so the catch can report the tag it was evicting (when known).\n        let tag: string | undefined\n        try {\n          const cache = await resolveRelationsCacheService(\n            this as unknown as LucidModel,\n            this.$resourcefulRelationsCacheService\n          )\n          if (!cache) {\n            return\n          }\n          const primaryKeyValue = (model as unknown as { $primaryKeyValue?: number | string })\n            .$primaryKeyValue\n          if (primaryKeyValue === null || primaryKeyValue === undefined) {\n            return\n          }\n          tag = `${this.$resourcefulName}:${String(primaryKeyValue)}`\n          await cache.deleteByTag({ tags: [tag] })\n          reportRelationCacheEvent(this as unknown as LucidModel, 'evict', {\n            model: this.$resourcefulName,\n            tag,\n          })\n        } catch (evictionError) {\n          // Eviction is an operational site (ADR-009): a resolver throw, an\n          // unreachable cache, or a transient L2 error is reported through the\n          // relation-cache error handler and the business write still commits.\n          // TTL bounds the staleness window. (Was a bespoke best-effort `warn`.)\n          reportRelationCacheError(\n            this as unknown as LucidModel,\n            new E_RELATION_CACHE_EVICTION_FAILED(\n              { model: this.$resourcefulName, tag },\n              evictionError\n            )\n          )\n        }\n      }\n\n      /**\n       * Internal method to validate payload using payloadValidationSchemaBuilders.\n       * Attempts to get HttpContext, or creates a dummy context if not available.\n       */\n      protected static async $resourcefulValidatePayload(\n        model: InstanceType<Model & ResourcefulModel>,\n        operation: 'create' | 'update'\n      ) {\n        const validationGetters = validatedOptions.payloadValidationSchemaBuilders?.[operation]\n        if (!validationGetters || validationGetters.length === 0) {\n          return\n        }\n\n        // Try to get the HttpContext and app\n        let ctx: HttpContext\n        let app: ApplicationService\n        try {\n          const { default: appInstance } = await import('@adonisjs/core/services/app')\n          app = appInstance\n\n          const context = HttpContext.get()\n          if (context) {\n            ctx = context\n          } else {\n            // Create a dummy context when real context is not available\n            ctx = new HttpContextFactory().create()\n          }\n        } catch {\n          // If we can't get the app instance, skip validation\n          // This allows the model to be used in environments where AdonisJS is not fully initialized\n          return\n        }\n\n        // Extract the payload from the model's dirty attributes\n        const payload = model.$dirty\n\n        // Validate the payload\n        const validationError = await this.$validatePayloadWithValidationGetters(\n          ctx,\n          app,\n          payload,\n          { isUpdate: operation === 'update' }\n        )\n\n        if (validationError) {\n          throw new E_INVALID_PAYLOAD_EXCEPTION(validationError)\n        }\n      }\n\n      /**\n       * Creates a new model instance from HTTP context data with validation.\n       *\n       * @param ctx - The HTTP context containing the request data\n       * @returns A Promise that resolves to a new validated model instance\n       * @throws {ValidationError} When validation fails for any of the matching schemas\n       */\n      static async $createFromHttpContext(ctx: HttpContext): Promise<InstanceType<Model>> {\n        const payload = ctx.request.all()\n        const instance = new this()\n\n        const { regularFields, setterFields } = separatePayloadFields(\n          payload || {},\n          this.$resourcefulColumns,\n          this.$resourcefulComputedAccessors\n        )\n\n        // Use native .fill() for regular fields\n        instance.fill(regularFields)\n\n        // Use Object.assign for setter fields to trigger setters\n        Object.assign(instance, setterFields)\n\n        return instance as unknown as InstanceType<Model>\n      }\n\n      /**\n       * Returns a query builder for this model. When the model configures\n       * `relationsCache`, the builder is wired with a {@link CachingPreloader}\n       * (so native `preload` caches transparently) and gains a `preloadCached`\n       * method for explicit cache control (`forceLoad`, per-call overrides).\n       * Models without relation caching get the unchanged builder (ADR-006).\n       *\n       * @param queryOptions - Optional model adapter options.\n       * @returns The model query builder, cache-wired when applicable.\n       */\n      static query<QueryModel extends LucidModel, Result = InstanceType<QueryModel>>(\n        this: QueryModel,\n        queryOptions?: ModelAdapterOptions\n      ): ModelQueryBuilderContract<QueryModel, Result> {\n        const builder = (\n          superclass as unknown as {\n            query: (\n              this: QueryModel,\n              queryOptions?: ModelAdapterOptions\n            ) => ModelQueryBuilderContract<QueryModel, Result>\n          }\n        ).query.call(this, queryOptions)\n\n        const cacheConfig = (this as unknown as typeof ResourcefulModel).$resourcefulRelationsCache\n        if (!cacheConfig || cacheConfig.size === 0) {\n          return builder\n        }\n\n        const cachingPreloader = new CachingPreloader(this as unknown as LucidModel, cacheConfig)\n        const cacheWiredBuilder = builder as unknown as {\n          usePreloader: (preloader: unknown) => unknown\n          constructor: { prototype: Record<string, unknown> }\n        }\n        cacheWiredBuilder.usePreloader(cachingPreloader)\n        // Install `preloadCached` on the builder's PROTOTYPE (not as an own\n        // property): Lucid's `clone()` builds a fresh `ModelQueryBuilder` and copies\n        // only the preloader (`usePreloader(this.preloader.clone())`), never\n        // instance-patched methods — so an own-property method would be lost on\n        // `Model.query().clone().preloadCached(...)`. Reading `this.preloader`\n        // dynamically lands the per-call options on the builder's OWN (possibly\n        // cloned) CachingPreloader, then delegates to native `preload(name, cb)`\n        // (ADR-006).\n        const builderPrototype = cacheWiredBuilder.constructor.prototype\n        if (typeof builderPrototype.preloadCached !== 'function') {\n          builderPrototype.preloadCached = function preloadCached(\n            this: {\n              preloader: unknown\n              preload: (name: string, cb?: (query: unknown) => void) => unknown\n            },\n            name: string,\n            preloadCachedOptions: RelationCacheCallOptions = {},\n            cb?: (query: unknown) => void\n          ) {\n            const preloader = this.preloader as {\n              recordCallOptions?: (name: string, options: RelationCacheCallOptions) => void\n            }\n            if (typeof preloader?.recordCallOptions === 'function') {\n              preloader.recordCallOptions(name, preloadCachedOptions)\n            }\n            this.preload(name, cb)\n            return this\n          }\n        }\n\n        return builder\n      }\n\n      /**\n       * Lazily loads relationships onto the instance, mirroring Lucid's native\n       * `load` but instantiating a {@link CachingPreloader} so configured 1:1\n       * relations are served/refreshed through the cache. The second argument is\n       * disambiguated: a function is the Lucid callback, a plain object is our\n       * `{ forceLoad }` options. Both `load(name, { forceLoad })` and\n       * `load(name, cb, { forceLoad })` are supported.\n       *\n       * NOTE: passing a callback makes the relation a plain cache BYPASS in the\n       * underlying {@link CachingPreloader} (a filtering callback can't be\n       * guaranteed to match the canonical cached row), so when a callback is\n       * supplied any `forceLoad`/per-call cache options on that same relation are\n       * effectively ignored — the relation simply loads uncached. This matches the\n       * plan's deferred nested-cache scope; caching a callback-filtered 1:1 is\n       * future work.\n       *\n       * @param relationName - The relation name, or a preloader callback.\n       * @param callbackOrOptions - The Lucid callback or the cache call options.\n       * @param maybeOptions - The cache call options when a callback was passed.\n       */\n      load = async (\n        relationName: string | ((preloader: CachingPreloader) => void),\n        callbackOrOptions?: ((query: unknown) => void) | RelationCacheCallOptions,\n        maybeOptions?: RelationCacheCallOptions\n      ): Promise<void> => {\n        const ModelCtor = this.constructor as unknown as typeof ResourcefulModel & {\n          $adapter: { modelClient: (instance: unknown) => { debug: boolean } }\n        }\n        const cacheConfig = ModelCtor.$resourcefulRelationsCache\n\n        // No relation caching configured → defer to native lazy loading unchanged.\n        if (!cacheConfig || cacheConfig.size === 0) {\n          return (\n            superclass.prototype as unknown as {\n              load: (\n                rel: string | ((preloader: unknown) => void),\n                cb?: (query: unknown) => void\n              ) => Promise<void>\n            }\n          ).load.call(\n            this,\n            relationName as string,\n            typeof callbackOrOptions === 'function' ? callbackOrOptions : undefined\n          )\n        }\n\n        const selfRow = this as unknown as {\n          $isPersisted: boolean\n          $sideloaded: Record<string, unknown>\n          ensureIsntDeleted: () => void\n        }\n        selfRow.ensureIsntDeleted()\n        if (!selfRow.$isPersisted) {\n          throw new Exception('Cannot lazy load relationship for an unpersisted model instance')\n        }\n\n        let callback: ((query: unknown) => void) | undefined\n        let callOptions: RelationCacheCallOptions | undefined\n        if (typeof callbackOrOptions === 'function') {\n          callback = callbackOrOptions\n          callOptions = maybeOptions\n        } else {\n          callOptions = callbackOrOptions\n        }\n\n        const preloader = new CachingPreloader(ModelCtor as unknown as LucidModel, cacheConfig)\n        if (typeof relationName === 'function') {\n          relationName(preloader)\n        } else {\n          if (callOptions) {\n            preloader.recordCallOptions(relationName, callOptions)\n          }\n          preloader.preload(relationName, callback)\n        }\n\n        const queryClient = ModelCtor.$adapter.modelClient(this)\n        await preloader\n          .sideload(selfRow.$sideloaded)\n          .debug(queryClient.debug)\n          .processAllForOne(this as unknown as never, queryClient as unknown as never)\n      }\n\n      /**\n       * Merges HTTP context data into the current model instance.\n       *\n       * @param ctx - The HTTP context containing the request data to merge\n       * @returns A Promise that resolves to the current model instance after merging and validation\n       * @throws {ValidationError} When validation fails for any of the matching schemas\n       */\n      $mergeFromHttpContext(ctx: HttpContext): this {\n        const payload = ctx.request.all()\n\n        const { regularFields, setterFields } = separatePayloadFields(\n          payload || {},\n          // @ts-expect-error\n          this.constructor.$resourcefulColumns,\n          // @ts-expect-error\n          this.constructor.$resourcefulComputedAccessors\n        )\n\n        // Use native .merge() for regular fields\n        this.merge(regularFields as any)\n\n        // Use Object.assign for setter fields to trigger setters\n        Object.assign(this, setterFields)\n\n        return this\n      }\n\n      static $onResourcefulEvent<K>(\n        event: Key<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>,\n        listener: Listener<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>\n      ) {\n        resourcefulModelEventEmitter.on(event, listener)\n        return this\n      }\n\n      static $onceResourcefulEvent<K>(\n        event: Key<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>,\n        listener: Listener<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>\n      ) {\n        resourcefulModelEventEmitter.once(event, listener)\n        return this\n      }\n\n      static $offResourcefulEvent<K>(\n        event: Key<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>,\n        listener?: Listener<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>\n      ) {\n        resourcefulModelEventEmitter.off(event, listener)\n        return this\n      }\n\n      static async $getAsResourcefulForContext(\n        ctx: HttpContext,\n        app: ApplicationService\n      ): Promise<ResourcefulModelMetaSchema> {\n        const resourcefulModelMetaSchema: ResourcefulModelMetaSchema = {\n          name: validatedOptions.name,\n          properties: {},\n          description: this.$resourcefulMetaDescription,\n          externalDocs: this.$resourcefulMetaExternalDocs,\n          example: this.$resourcefulMetaExample,\n        }\n        await pMap(\n          Array.from(this.$resourcefulColumns.entries()),\n          async ([propertyKey, columnDefinition]) => {\n            const lucidDefinitions = this.$getColumn(propertyKey)\n            /* istanbul ignore if -- @preserve */\n            if (!lucidDefinitions) return\n            const resourcefulModelColumnMetaSchema: ResourcefulModelColumnMetaSchema = {\n              propertyKey,\n              definition: columnDefinition,\n              lucidDefinitions,\n              ...(await this.$getPropertyCanReadWrite(\n                ctx,\n                app,\n                propertyKey,\n                lucidDefinitions,\n                columnDefinition.readAccessControlFilters,\n                columnDefinition.writeAccessControlFilters,\n                'column'\n              )),\n              kind: 'column',\n              validator: this.$getPropertyValidator(\n                ctx,\n                app,\n                propertyKey,\n                columnDefinition.type,\n                columnDefinition.nullable,\n                columnDefinition.validationScopes as any,\n                'column'\n              ),\n              filterable: columnDefinition.filterable,\n              sortable: columnDefinition.sortable,\n              aggregatable: columnDefinition.aggregatable,\n            }\n            if (\n              !resourcefulModelColumnMetaSchema.canRead &&\n              !resourcefulModelColumnMetaSchema.canWrite\n            )\n              return\n            resourcefulModelMetaSchema.properties[propertyKey] = resourcefulModelColumnMetaSchema\n          },\n          {\n            concurrency: validatedOptions.advanced.propertyEvaluationConcurrency,\n          }\n        )\n        await pMap(\n          Array.from(this.$resourcefulComputedAccessors.entries()),\n          async ([propertyKey, computedAccessorDefinition]) => {\n            const lucidDefinitions = this.$getComputed(propertyKey)\n            /* istanbul ignore if -- @preserve */\n            if (!lucidDefinitions) return\n            const resourcefulModelComputedAccessorMetaSchema: ResourcefulModelComputedAccessorMetaSchema =\n              {\n                propertyKey,\n                definition: computedAccessorDefinition,\n                lucidDefinitions,\n                ...(await this.$getPropertyCanReadWrite(\n                  ctx,\n                  app,\n                  propertyKey,\n                  lucidDefinitions,\n                  computedAccessorDefinition.readAccessControlFilters,\n                  computedAccessorDefinition.writeAccessControlFilters,\n                  'computedAccessor',\n                  computedAccessorDefinition.writable\n                )),\n                kind: 'computedAccessor',\n                validator: this.$getPropertyValidator(\n                  ctx,\n                  app,\n                  propertyKey,\n                  computedAccessorDefinition.type,\n                  computedAccessorDefinition.nullable,\n                  computedAccessorDefinition.validationScopes as any,\n                  'computedAccessor',\n                  computedAccessorDefinition.writable\n                ),\n              }\n            /* istanbul ignore if -- @preserve */\n            if (\n              !resourcefulModelComputedAccessorMetaSchema.canRead &&\n              !resourcefulModelComputedAccessorMetaSchema.canWrite\n            )\n              return\n            resourcefulModelMetaSchema.properties[propertyKey] =\n              resourcefulModelComputedAccessorMetaSchema\n          },\n          {\n            concurrency: validatedOptions.advanced.propertyEvaluationConcurrency,\n          }\n        )\n        await pMap(\n          Array.from(this.$resourcefulRelationships.entries()),\n          async ([propertyKey, relationshipDefinition]) => {\n            const lucidDefinitions = this.$getRelation(propertyKey)\n            /* istanbul ignore if -- @preserve */\n            if (!lucidDefinitions) return\n            const resourcefulModelRelationshipMetaSchema: ResourcefulModelRelationshipMetaSchema = {\n              propertyKey,\n              definition: relationshipDefinition,\n              lucidDefinitions,\n              ...(await this.$getPropertyCanReadWrite(\n                ctx,\n                app,\n                propertyKey,\n                lucidDefinitions,\n                relationshipDefinition.readAccessControlFilters,\n                relationshipDefinition.writeAccessControlFilters,\n                'relationship'\n              )),\n              kind: 'relationship',\n              validator: joi.forbidden(),\n              relatedModel: relationshipDefinition.relatedModel,\n              filterable: getFilterablePropertiesFromModel(relationshipDefinition.relatedModel()),\n            }\n            /* istanbul ignore if -- @preserve */\n            if (\n              !resourcefulModelRelationshipMetaSchema.canRead &&\n              !resourcefulModelRelationshipMetaSchema.canWrite\n            )\n              return\n            resourcefulModelMetaSchema.properties[propertyKey] =\n              resourcefulModelRelationshipMetaSchema\n          },\n          {\n            concurrency: validatedOptions.advanced.propertyEvaluationConcurrency,\n          }\n        )\n        return resourcefulModelMetaSchema\n      }\n\n      static $getPropertyValidator(\n        ctx: HttpContext,\n        app: ApplicationService,\n        key: string,\n        datatype: ResourcefulDataType,\n        nullable: boolean,\n        validationScopes: ValidationScoper<AnySchema>[] | undefined,\n        kind: 'column' | 'computedAccessor' | 'relationship',\n        writable: boolean = false\n      ): AnySchema {\n        const cacheKey = `${key}-${datatype.type}-${(<any>datatype).format}-${nullable}-${validationScopes?.length}-${kind}-${writable}`\n        const cachedValue = this.weakCacheService.get(cacheKey)\n\n        if (cachedValue) {\n          return cachedValue\n        }\n\n        if ('relationship' === kind || ('computedAccessor' === kind && !writable)) {\n          // relationships and read-only computed accessors are not acceptable in a payload\n          return joi.any().forbidden()\n        }\n        const baseValidator = this.$getPropertyBaseValidator(datatype, nullable, kind, writable)\n        let retValidator = baseValidator\n        if (Array.isArray(validationScopes) && validationScopes.length > 0) {\n          validationScopes.forEach((validationScope) => {\n            /* istanbul ignore if -- @preserve */\n            if (retValidator !== baseValidator) return\n            try {\n              validationScope(baseValidator)\n            } catch (err) {\n              resourcefulModelEventEmitter.emit(\n                'validation:scope:error',\n                err,\n                ctx,\n                app,\n                key,\n                datatype\n              )\n              switch (validatedOptions.onValidationScopeError) {\n                case 'bubble':\n                  throw err\n                case 'pass':\n                  // do nothing, just pass the validation scope\n                  break\n                case 'fail':\n                  retValidator = joi.any().forbidden()\n                  break\n              }\n            }\n          })\n        }\n\n        this.weakCacheService.create(cacheKey, retValidator)\n\n        return retValidator\n      }\n\n      protected static $getPropertyBaseValidator(\n        datatype: ResourcefulDataType,\n        nullable: boolean,\n        kind: 'column' | 'computedAccessor' | 'relationship',\n        writable: boolean = false\n      ): AnySchema {\n        if ('relationship' === kind || ('computedAccessor' === kind && !writable)) {\n          // relationships and read-only computed accessors are not acceptable in a payload\n          return joi.any().forbidden()\n        }\n        nullable = nullable || ('boolean' === typeof datatype.nullable && datatype.nullable)\n        switch (true) {\n          case guards.isResourcefulDateType(datatype): {\n            /*\n            |--------------------------------------------------------------------------\n            | Dates are a subset of the 'string' type and thus the OpenAPI validator\n            | does not have any specific options for them.\n            |--------------------------------------------------------------------------\n            |\n            | const d: ResourcefulDateType = datatype as unknown as ResourcefulDateType\n            |\n            */\n            let r = joi.datetime()\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulDateTimeType(datatype): {\n            /*\n            |--------------------------------------------------------------------------\n            | DateTimes are a subset of the 'string' type and thus the OpenAPI validator\n            | does not have any specific options for them.\n            |--------------------------------------------------------------------------\n            |\n            | const d: ResourcefulDateTimeType = datatype as unknown as ResourcefulDateTimeType\n            |\n            */\n            let r = joi.datetime()\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulBinaryType(datatype): {\n            const d: ResourcefulBinaryType = datatype as unknown as ResourcefulBinaryType\n            const min = 'number' === typeof d.minLength ? Math.abs(d.minLength) : 0\n            const max =\n              'number' === typeof d.maxLength ? Math.abs(d.maxLength) : Number.MAX_SAFE_INTEGER\n            let r = joi.string().min(min).max(max)\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulStringType(datatype): {\n            const d: ResourcefulStringType = datatype as unknown as ResourcefulStringType\n            let r = joi.string().min(d.minLength).max(d.maxLength)\n            if (d.pattern) {\n              r = r.concat(r.pattern(new RegExp(d.pattern)))\n            }\n            if (d.enum) {\n              const enumStrings = d.enum\n                .map((v) => {\n                  if (isObject(v)) {\n                    return v.value\n                  }\n                  return v\n                })\n                .filter((v) => 'string' === typeof v) as string[]\n              r = r.concat(joi.string().valid(...enumStrings))\n            }\n            if (d.format) {\n              switch (d.format) {\n                case 'alphanum':\n                  r = r.concat(joi.string().alphanum())\n                  break\n                case 'email':\n                  r = r.concat(joi.string().email())\n                  break\n                case 'uppercase':\n                  r = r.concat(joi.string().case('upper'))\n                  break\n                case 'lowercase':\n                  r = r.concat(joi.string().case('lower'))\n                  break\n                case 'creditCard':\n                  r = r.concat(joi.string().creditCard())\n                  break\n                case 'dataUri':\n                  r = r.concat(joi.string().dataUri())\n                  break\n                case 'domain':\n                  r = r.concat(joi.string().domain())\n                  break\n                case 'uuid':\n                case 'guid':\n                  r = r.concat(joi.string().guid())\n                  break\n                case 'hex':\n                  r = r.concat(joi.string().hex())\n                  break\n                case 'hostname':\n                  r = r.concat(joi.string().hostname())\n                  break\n                case 'ip':\n                  r = r.concat(joi.string().ip({ version: ['ipv4', 'ipv6', 'ipvfuture'] }))\n                  break\n                case 'duration':\n                  r = r.concat(joi.string().isoDuration())\n                  break\n                case 'uri':\n                  r = r.concat(joi.string().uri())\n                  break\n                case 'fqdn':\n                  r = r.concat(joi.string().fqdn())\n                  break\n              }\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulIntegerType(datatype): {\n            const d: ResourcefulIntegerType = datatype as unknown as ResourcefulIntegerType\n            let r = joi.number()\n            r = r.concat(joi.number().integer().multiple(d.multipleOf))\n            if (d.exclusiveMaximum) {\n              r = r.concat(joi.number().less(d.maximum))\n            } else {\n              r = r.concat(joi.number().max(d.maximum))\n            }\n            if (d.exclusiveMinimum) {\n              r = r.concat(joi.number().greater(d.minimum))\n            } else {\n              r = r.concat(joi.number().min(d.minimum))\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulBigintType(datatype): {\n            const d: ResourcefulBigintType = datatype as unknown as ResourcefulBigintType\n            if ('undefined' === typeof d.minimum) {\n              d.minimum = 0n\n            }\n            if ('undefined' === typeof d.maximum) {\n              d.maximum = BigInt(Number.MAX_SAFE_INTEGER)\n            }\n            if ('undefined' === typeof d.multipleOf) {\n              d.multipleOf = 1n\n            }\n            let b = joi.bigint()\n            let i = joi.number().integer()\n            // @ts-ignore\n            b = b.concat(\n              joi\n                .bigint()\n                .multiple('number' === typeof d.multipleOf ? BigInt(d.multipleOf) : d.multipleOf)\n            )\n            // @ts-ignore\n            i = i.concat(\n              joi\n                .number()\n                .multiple(\n                  'bigint' === typeof d.multipleOf\n                    ? Number.parseInt(d.multipleOf.toString())\n                    : d.multipleOf\n                )\n            )\n            if (d.exclusiveMaximum) {\n              if (['number', 'bigint'].includes(typeof d.maximum)) {\n                // @ts-ignore\n                b = b.concat(\n                  joi.bigint().less('number' === typeof d.maximum ? BigInt(d.maximum) : d.maximum)\n                )\n              }\n              i = i.concat(\n                joi\n                  .number()\n                  .less(\n                    'bigint' === typeof d.maximum\n                      ? Number.parseInt(d.maximum.toString())\n                      : d.maximum\n                  )\n              )\n            } else {\n              if (['number', 'bigint'].includes(typeof d.maximum)) {\n                // @ts-ignore\n                b = b.concat(\n                  joi.bigint().max('number' === typeof d.maximum ? BigInt(d.maximum) : d.maximum)\n                )\n              }\n              i = i.concat(\n                joi\n                  .number()\n                  .max(\n                    'bigint' === typeof d.maximum\n                      ? Number.parseInt(d.maximum.toString())\n                      : d.maximum\n                  )\n              )\n            }\n            if (d.exclusiveMinimum) {\n              // @ts-ignore\n              b = b.concat(\n                joi.bigint().greater('number' === typeof d.minimum ? BigInt(d.minimum) : d.minimum)\n              )\n              i = i.concat(\n                joi\n                  .number()\n                  .greater(\n                    'bigint' === typeof d.minimum\n                      ? Number.parseInt(d.minimum.toString())\n                      : d.minimum\n                  )\n              )\n            } else {\n              // @ts-ignore\n              b = b.concat(\n                joi.bigint().min('number' === typeof d.minimum ? BigInt(d.minimum) : d.minimum)\n              )\n              i = i.concat(\n                joi\n                  .number()\n                  .min(\n                    'bigint' === typeof d.minimum\n                      ? Number.parseInt(d.minimum.toString())\n                      : d.minimum\n                  )\n              )\n            }\n            let r = joi.alternatives(b, i)\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulUnsignedIntegerType(datatype): {\n            const d: ResourcefulUnsignedIntegerType =\n              datatype as unknown as ResourcefulUnsignedIntegerType\n            let r = joi.number().unsafe()\n            r = r.concat(joi.number().integer().multiple(d.multipleOf))\n            if (d.exclusiveMaximum) {\n              r = r.concat(joi.number().less(d.maximum))\n            } else {\n              r = r.concat(joi.number().max(d.maximum))\n            }\n            if (d.exclusiveMinimum) {\n              r = r.concat(joi.number().greater(d.minimum))\n            } else {\n              r = r.concat(joi.number().min(d.minimum))\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulNumberType(datatype): {\n            const d: ResourcefulNumberType = datatype as unknown as ResourcefulNumberType\n            let r = joi.number()\n            r = r.concat(joi.number().multiple(d.multipleOf))\n            if (d.exclusiveMaximum) {\n              r = r.concat(joi.number().less(d.maximum))\n            } else {\n              r = r.concat(joi.number().max(d.maximum))\n            }\n            if (d.exclusiveMinimum) {\n              r = r.concat(joi.number().greater(d.minimum))\n            } else {\n              r = r.concat(joi.number().min(d.minimum))\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulBooleanType(datatype): {\n            let r = joi.boolean()\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulObjectType(datatype): {\n            const d: ResourcefulObjectType = datatype as unknown as ResourcefulObjectType\n\n            // Add property validation based on the new structure with composition patterns\n            const objectSchema: { [key: string]: AnySchema } = {}\n\n            Object.entries(d.properties).forEach(([propKey, propDef]) => {\n              let propValidator: AnySchema\n\n              if ('oneOf' in propDef) {\n                // oneOf composition\n                const alternatives = propDef.oneOf.map((item) =>\n                  this.$getPropertyBaseValidator(\n                    item,\n                    item.nullable || false,\n                    kind,\n                    !(item.readOnly || false)\n                  )\n                )\n                propValidator = joi.alternatives(...alternatives)\n              } else if ('allOf' in propDef) {\n                // allOf composition\n                const schemas = propDef.allOf.map((item) =>\n                  this.$getPropertyBaseValidator(\n                    item,\n                    item.nullable || false,\n                    kind,\n                    !(item.readOnly || false)\n                  )\n                )\n                propValidator = schemas.reduce((acc, schema) => acc.concat(schema), joi.any())\n              } else if ('anyOf' in propDef) {\n                // anyOf composition\n                const alternatives = propDef.anyOf.map((item) =>\n                  this.$getPropertyBaseValidator(\n                    item,\n                    item.nullable || false,\n                    kind,\n                    !(item.readOnly || false)\n                  )\n                )\n                propValidator = joi.alternatives(...alternatives)\n              } else if ('not' in propDef) {\n                // not composition\n                const notSchemas = propDef.not.map((item) =>\n                  this.$getPropertyBaseValidator(\n                    item,\n                    item.nullable || false,\n                    kind,\n                    !(item.readOnly || false)\n                  )\n                )\n                propValidator = joi.any()\n                notSchemas.forEach((notSchema) => {\n                  propValidator = propValidator.concat(\n                    joi.when(notSchema, { then: joi.forbidden() })\n                  )\n                })\n              } else {\n                // Direct ResourcefulDataType\n                propValidator = this.$getPropertyBaseValidator(\n                  propDef,\n                  propDef.nullable || false,\n                  kind,\n                  !(propDef.readOnly || false)\n                )\n                if (Array.isArray(d.required) && d.required.includes(propKey)) {\n                  // If the property is required, we need to ensure it is not nullable\n                  propValidator = propValidator.concat(joi.any().required())\n                }\n              }\n\n              // Check if this field should be required\n              if (d.required && d.required.includes(propKey)) {\n                propValidator.required()\n              }\n\n              objectSchema[propKey] = propValidator\n            })\n            let r = joi.object(objectSchema)\n\n            if (d.minProperties !== undefined) {\n              r = r.concat(joi.object().min(d.minProperties))\n            }\n\n            if (d.maxProperties !== undefined) {\n              r = r.concat(joi.object().max(d.maxProperties))\n            }\n\n            if (guards.isObject(d.additionalProperties)) {\n              const additionalPropertiesType = d.additionalProperties as ResourcefulDataType\n              r = r.concat(\n                joi\n                  .object()\n                  .pattern(\n                    joi.string(),\n                    this.$getPropertyBaseValidator(\n                      additionalPropertiesType,\n                      additionalPropertiesType.nullable || false,\n                      kind,\n                      !(additionalPropertiesType.readOnly || false)\n                    )\n                  )\n              )\n            } else {\n              r = r.concat(joi.object().unknown(true === d.additionalProperties))\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n\n            return r\n          }\n          case guards.isResourcefulArrayType(datatype): {\n            const d: ResourcefulArrayType = datatype as unknown as ResourcefulArrayType\n            let r = joi.array()\n            // Handle different item type structures\n            let itemValidator: AnySchema\n            if ('oneOf' in d.items) {\n              // oneOf composition\n              const alternatives = d.items.oneOf.map((item) =>\n                this.$getPropertyBaseValidator(\n                  item,\n                  item.nullable || false,\n                  kind,\n                  !(item.readOnly || false)\n                )\n              )\n              itemValidator = joi.alternatives(...alternatives)\n            } else if ('allOf' in d.items) {\n              // allOf composition\n              const schemas = d.items.allOf.map((item) =>\n                this.$getPropertyBaseValidator(\n                  item,\n                  item.nullable || false,\n                  kind,\n                  !(item.readOnly || false)\n                )\n              )\n              itemValidator = schemas.reduce((acc, schema) => acc.concat(schema), joi.any())\n            } else if ('anyOf' in d.items) {\n              // anyOf composition\n              const alternatives = d.items.anyOf.map((item) =>\n                this.$getPropertyBaseValidator(\n                  item,\n                  item.nullable || false,\n                  kind,\n                  !(item.readOnly || false)\n                )\n              )\n              itemValidator = joi.alternatives(...alternatives)\n            } else if ('not' in d.items) {\n              // not composition\n              const notSchemas = d.items.not.map((item) =>\n                this.$getPropertyBaseValidator(\n                  item,\n                  item.nullable || false,\n                  kind,\n                  !(item.readOnly || false)\n                )\n              )\n              itemValidator = joi.any()\n              notSchemas.forEach((notSchema) => {\n                itemValidator = itemValidator.concat(joi.when(notSchema, { then: joi.forbidden() }))\n              })\n            } else {\n              // Direct ResourcefulDataType\n              itemValidator = this.$getPropertyBaseValidator(\n                d.items,\n                d.items.nullable || false,\n                kind,\n                !(d.items.readOnly || false)\n              )\n            }\n            r = r.concat(joi.array().items(itemValidator))\n            if (d.minItems !== undefined) {\n              r = r.concat(joi.array().min(d.minItems))\n            }\n            if (d.maxItems !== undefined) {\n              r = r.concat(joi.array().max(d.maxItems))\n            }\n            if (d.uniqueItems) {\n              r = r.concat(joi.array().unique())\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          default:\n            return joi.any().forbidden()\n        }\n      }\n\n      protected static async $getPropertyCanReadWrite(\n        ctx: HttpContext,\n        app: ApplicationService,\n        key: string,\n        lucidDefinition:\n          | ModelColumnOptions\n          | ComputedOptions\n          | ReturnType<LucidModel['$getRelation']>,\n        readAclFilters: ResourcefulAccessControlFilter[] = [],\n        writeAclFilters: ResourcefulAccessControlFilter[] = [],\n        kind: 'column' | 'computedAccessor' | 'relationship',\n        writable: boolean = false\n      ): Promise<{ canRead: boolean; canWrite: boolean }> {\n        const fieldKey = getFieldKey(key, lucidDefinition)\n        if (null === fieldKey) {\n          // if the field key is null, that means that the field cannot be \"read\"\n          // this is part of the baseline lucid decorator API, so we need to honor the\n          // expected behavior\n          if (validatedOptions.readRequiredForWrite) {\n            return { canRead: false, canWrite: false }\n          }\n        }\n        const canRead =\n          null === fieldKey ? false : await this.$evaluatePropertyAccess(ctx, app, readAclFilters)\n        const canWrite =\n          'relationship' === kind || ('computedAccessor' === kind && !writable)\n            ? false\n            : await this.$evaluatePropertyAccess(\n                ctx,\n                app,\n                writeAclFilters.length > 0 ? writeAclFilters : readAclFilters\n              )\n        return { canRead, canWrite }\n      }\n\n      protected static async $evaluatePropertyAccess(\n        ctx: HttpContext,\n        app: ApplicationService,\n        acls: ResourcefulAccessControlFilter[] = []\n      ): Promise<boolean> {\n        if (acls.length === 0) {\n          return true\n        }\n        const results = await pMap(\n          acls,\n          async (acl) => {\n            try {\n              return await acl(ctx, app)\n            } catch (err) {\n              resourcefulModelEventEmitter.emit('acl:error', err, ctx, app, undefined)\n              switch (validatedOptions.onACLError) {\n                case 'pass':\n                  return true\n                case 'fail':\n                  return false\n                default:\n                  throw err\n              }\n            }\n          },\n          {\n            concurrency: validatedOptions.advanced.aclEvaluationConcurrency,\n          }\n        )\n        return results.every((result) => result === true)\n      }\n\n      static async $asOpenApiSchemaObject(\n        ctx: HttpContext,\n        app: ApplicationService,\n        operation: 'read' | 'write' = 'read',\n        methodOptions: GenerateModelSchemaOptions = {},\n        asResourceful?: ResourcefulModelMetaSchema\n      ): Promise<ResourcefulModelOpenApiSchema> {\n        const normalizedMethodOptions = {\n          includeRelations: methodOptions.includeRelations ?? false,\n          relationsDeepLevel: methodOptions.relationsDeepLevel ?? null,\n          ctx,\n          app,\n        }\n        // Get the resourceful model metadata with ACL filtering applied\n        const resourcefulModelMetaSchema =\n          asResourceful || (await this.$getAsResourcefulForContext(ctx, app))\n        // Create service instance and delegate to it\n        const service = new OpenApiSchemaService()\n\n        return await service.generateModelSchema(\n          operation,\n          resourcefulModelMetaSchema,\n          normalizedMethodOptions,\n          this\n        )\n      }\n\n      static async $getWritePayloadValidationSchema(\n        ctx: HttpContext,\n        app: ApplicationService,\n        forUpdate: boolean = false\n      ) {\n        const schemas: AnySchema[] = []\n        await pMap(\n          forUpdate\n            ? validatedOptions.payloadValidationSchemaBuilders?.update || []\n            : validatedOptions.payloadValidationSchemaBuilders?.create || [],\n          async (builder) => {\n            const schema = await builder(ctx, app)\n            if (schema) {\n              schemas.push(schema)\n            }\n          },\n          { concurrency: 1 }\n        )\n        let ret = joi.any()\n        schemas.forEach((schema) => {\n          ret = ret.concat(schema)\n        })\n        return ret\n      }\n\n      static async $getResourcefulWriteValidationSchema(\n        ctx: HttpContext,\n        app: ApplicationService,\n        forUpdate: boolean = false\n      ) {\n        const asResourceful = await this.$getAsResourcefulForContext(ctx, app)\n        const schema = await this.$asOpenApiSchemaObject(ctx, app, 'write', {}, asResourceful)\n        const modelJoiSchema = await this.$getWritePayloadValidationSchema(ctx, app, forUpdate)\n\n        let validatorSchema = joi.object(\n          Object.assign(\n            {},\n            ...Object.keys(schema.properties!)\n              .filter((p) => {\n                if (p === this.primaryKey) return false\n                const propSchema: Record<string, any> = schema.properties![p]\n                if (isObject(propSchema)) {\n                  if (\n                    forUpdate &&\n                    (propSchema['x-resourceful-autoupdated'] === true ||\n                      propSchema['x-resourceful-immutable'] === true)\n                  ) {\n                    return false\n                  }\n                  if (\n                    !forUpdate &&\n                    (propSchema['x-resourceful-autocreated'] === true ||\n                      propSchema['x-resourceful-primary-key'] === true)\n                  ) {\n                    return false\n                  }\n                }\n                return true\n              })\n              .map((creatablePropertyKey) => {\n                let validationSchema: Schema = joi.any()\n\n                const prop = asResourceful.properties[creatablePropertyKey]\n                const schemaProp = schema.properties![creatablePropertyKey]\n                if (prop) {\n                  const propValidator = prop.validator\n                  if (propValidator) {\n                    validationSchema = validationSchema.concat(propValidator)\n                  }\n                }\n\n                try {\n                  const extracted = modelJoiSchema.extract(creatablePropertyKey)\n                  if (extracted) {\n                    validationSchema = validationSchema.concat(extracted)\n                  }\n                } catch {\n                  // noop\n                }\n\n                const required =\n                  !forUpdate &&\n                  Array.isArray(schema.required) &&\n                  schema.required.includes(creatablePropertyKey)\n                const nullable = prop && prop.definition && prop.definition.nullable === true\n\n                if (required) {\n                  validationSchema = validationSchema.required()\n                } else {\n                  validationSchema = validationSchema.optional()\n                }\n                // Ensure that nullable is handled\n                if (nullable) {\n                  if (schemaProp && 'type' in schemaProp && schemaProp.type === 'string') {\n                    validationSchema = validationSchema.allow(null)\n                  } else {\n                    validationSchema = joi.alternatives(validationSchema, joi.valid(null))\n                  }\n                }\n\n                return {\n                  [creatablePropertyKey]: validationSchema,\n                }\n              })\n          )\n        )\n\n        // Add custom rules from the Model Schema\n        if (\n          // @ts-expect-error\n          modelJoiSchema._rules &&\n          // @ts-expect-error\n          Array.isArray(modelJoiSchema._rules) &&\n          // @ts-expect-error\n          modelJoiSchema._rules.length\n        ) {\n          // Add .custom() rules\n          // @ts-expect-error\n          modelJoiSchema._rules.forEach((rule: any) => {\n            if (\n              rule.name === 'custom' &&\n              rule.method === 'custom' &&\n              typeof rule.args.method === 'function'\n            ) {\n              validatorSchema = validatorSchema.custom(rule.args.method)\n              return\n            }\n          })\n        }\n\n        // Add dependency rules from the Model Schema\n        if (modelJoiSchema.$_terms?.dependencies?.length) {\n          modelJoiSchema.$_terms?.dependencies.forEach((dep: any) => {\n            // Add .or() rule\n            if (\n              dep.rel === 'or' &&\n              Array.isArray(dep.paths) &&\n              dep.paths.every((path: unknown): path is string => typeof path === 'string')\n            ) {\n              validatorSchema = validatorSchema.or(...dep.paths)\n              return\n            }\n          })\n        }\n\n        return {\n          schema,\n          validator: validatorSchema,\n        }\n      }\n\n      protected static async $resourcefulCheckAccess(\n        config: ResourcefulCheckAccessOptions\n      ): Promise<ResourcefulCheckAccessReturn> {\n        const { ctx, app, operation, instance } = config\n        const allowedSerializedMap = new Map<string, boolean>()\n        const allowedColumnsMap = new Map<string, boolean>()\n        const mixinAccessControlFilters = validatedOptions.accessControlFilters[operation]\n\n        if (mixinAccessControlFilters) {\n          const mixinAccessControlResult = await Promise.all(\n            mixinAccessControlFilters.map((func) => func(ctx, app, instance as any))\n          )\n          const isAllowedByMixinFilters = mixinAccessControlResult.every(Boolean)\n\n          if (!isAllowedByMixinFilters) {\n            return {\n              isForbidden: true,\n              message: 'Access denied by Mixin ACLs.',\n              allowedSerializedMap: undefined,\n            }\n          }\n        }\n\n        // If the operation is DELETE, we don't check the field-level access\n        if (operation === CRUDOperationsEnum.DELETE) {\n          return {\n            isForbidden: false,\n            allowedSerializedMap: allowedSerializedMap,\n            allowedColumnsMap,\n          }\n        }\n\n        const columnsOptions = this.$resourcefulColumns.values()\n        const aclOperation = operationCRUDToACL(operation)\n        const addColumnOptionToallowedSerializedMap = (propertyKey: string) => {\n          const serializedName = this.$keys.attributesToSerialized.resolve(propertyKey)\n          const columnName = this.$keys.serializedToColumns.resolve(serializedName)\n\n          // For write operations, we need to allow fields even if serializeAs is null\n          // In this case, use the column name as the key for the allowed map\n          if (aclOperation === ACLOperationsEnum.WRITE && serializedName === null) {\n            // For write operations with serializeAs: null, use the column name\n            if (columnName) {\n              allowedSerializedMap.set(columnName, true)\n              allowedColumnsMap.set(columnName, true)\n            }\n          } else if ('string' === typeof serializedName) {\n            allowedSerializedMap.set(serializedName, true)\n            if (columnName) {\n              allowedColumnsMap.set(columnName, true)\n            }\n          }\n        }\n\n        for (const columnOptions of columnsOptions) {\n          const propertyACLFilters =\n            aclOperation === ACLOperationsEnum.READ\n              ? columnOptions.readAccessControlFilters\n              : columnOptions.writeAccessControlFilters\n\n          // If a column has no ACLs - it allowed to everyone\n          if (!propertyACLFilters) {\n            addColumnOptionToallowedSerializedMap(columnOptions.propertyKey)\n\n            continue\n          }\n\n          const isAllowed = await this.$evaluatePropertyAccess(ctx, app, propertyACLFilters)\n\n          if (isAllowed) {\n            addColumnOptionToallowedSerializedMap(columnOptions.propertyKey)\n          }\n        }\n\n        // Process computed properties for READ operations\n        if (aclOperation === ACLOperationsEnum.READ) {\n          const computedAccessorsOptions = this.$resourcefulComputedAccessors.values()\n\n          for (const computedAccessorOptions of computedAccessorsOptions) {\n            const propertyACLFilters = computedAccessorOptions.readAccessControlFilters\n\n            // If a computed accessor has no ACLs - it's allowed to everyone\n            if (!propertyACLFilters) {\n              // For computed properties, use the property key directly as the serialized name\n              allowedSerializedMap.set(computedAccessorOptions.propertyKey, true)\n              continue\n            }\n\n            const isAllowed = await this.$evaluatePropertyAccess(ctx, app, propertyACLFilters)\n\n            if (isAllowed) {\n              allowedSerializedMap.set(computedAccessorOptions.propertyKey, true)\n            }\n          }\n\n          // Process relationships for READ operations\n          const relationshipOptions = this.$resourcefulRelationships.values()\n\n          for (const relationshipOption of relationshipOptions) {\n            const propertyACLFilters = relationshipOption.readAccessControlFilters\n\n            // If a relationship has no ACLs - it's allowed to everyone\n            if (!propertyACLFilters) {\n              // For relationships, use the property key directly as the serialized name\n              allowedSerializedMap.set(relationshipOption.propertyKey, true)\n              continue\n            }\n\n            const isAllowed = await this.$evaluatePropertyAccess(ctx, app, propertyACLFilters)\n\n            if (isAllowed) {\n              allowedSerializedMap.set(relationshipOption.propertyKey, true)\n            }\n          }\n        }\n\n        const hasNoAllowedFields = !allowedSerializedMap.size\n\n        if (hasNoAllowedFields) {\n          return {\n            isForbidden: true,\n            message: 'Access denied since user does not has access to at least 1 column.',\n          }\n        }\n\n        return {\n          isForbidden: false,\n          allowedSerializedMap,\n          allowedColumnsMap,\n        }\n      }\n\n      private static $getPrivateKeyAttribute() {\n        let ret: string | undefined\n        this.$columnsDefinitions.forEach((columnOptions, attribute) => {\n          if (\n            columnOptions.serializeAs !== null &&\n            (columnOptions.isPrimary || columnOptions.columnName === this.primaryKey)\n          ) {\n            ret = columnOptions.serializeAs || attribute\n          }\n        })\n        return ret\n      }\n\n      static $loadPossibilitiesForResourcefulRecord() {\n        const allRelationships = Array.from(this.$resourcefulRelationships.entries())\n          .filter(([propertyKey]) => {\n            // Only load relationships that are allowed by ACL for ALL records\n            const relation = this.$getRelation(propertyKey)\n            return !relation ? false : true\n          })\n          .map(([propertyKey]) => propertyKey)\n        const possibleRelationships = Array.from(this.$resourcefulRelationships.entries())\n          .filter(([propertyKey]) => {\n            // Only load relationships that are allowed by ACL for ALL records\n            const relation = this.$getRelation(propertyKey)\n            if (!relation) return false\n            if (relation.serializeAs === null) return false\n            // Check if it's a 1:1 relationship type\n            return relation.type === 'belongsTo' || relation.type === 'hasOne'\n          })\n          .map(([propertyKey]) => propertyKey)\n        const possibleColumns = Array.from(this.$resourcefulColumns.entries())\n          .map(([propertyKey]) => propertyKey)\n          .filter((propertyKey) => {\n            const lucidColumnOptions = this.$getColumn(propertyKey)\n            if (!lucidColumnOptions) return false\n            if (lucidColumnOptions.serializeAs === null) return false\n            return lucidColumnOptions.serializeAs !== null\n          })\n        const possibleComputed = Array.from(this.$resourcefulComputedAccessors.entries())\n          .map(([propertyKey]) => propertyKey)\n          .filter((propertyKey) => {\n            const lucidComputedOptions = this.$getComputed(propertyKey)\n            if (!lucidComputedOptions) return false\n            if (lucidComputedOptions.serializeAs === null) return false\n            return lucidComputedOptions.serializeAs !== null\n          })\n        const possibleFields = Array.from(\n          new Set([...possibleColumns, ...possibleComputed, ...possibleRelationships])\n        )\n          .map((prop) => this.$keys.attributesToSerialized.get(prop) || prop)\n          .filter((s) => 'string' === typeof s)\n        return {\n          allRelationships,\n          possibleRelationships,\n          possibleColumns,\n          possibleComputed,\n          possibleFields,\n        }\n      }\n\n      /**\n       * Performs paginated listing and searching of model records with comprehensive filtering.\n       *\n       * This method provides the core implementation for resourceful index/list operations,\n       * supporting pagination, field selection, access control, and Lucene query syntax for\n       * filtering. It validates all inputs, applies ACL filters, executes the query with\n       * proper field mapping between serialized names and database columns, and returns\n       * structured results with query metadata.\n       *\n       * @template SelectedFields - Array of field names that can be selected from the model's serializable attributes\n       * @template ReturnType - The resulting type after picking the selected fields from the model's serializable attributes\n       *\n       * @param filter - Lucene-style query string for filtering records (e.g., \"name:john AND email:*.com\").\n       *                 If null or undefined, defaults to empty string (no filtering).\n       * @param page - The page number for pagination (must be ≥ 1). Used with perPage to calculate offset.\n       * @param perPage - Number of records per page (must be ≥ 1 and ≤ 100 by default).\n       * @param fields - Array of field names to include in the response. If null, undefined, or empty,\n       *                 defaults to just the primary key field. Field names should use serialized names\n       *                 (as they appear in API responses), not database column names.\n       * @param ctx - HTTP context containing request information, authentication, and other request-scoped data.\n       * @param app - Application service instance providing access to application-level services and configuration.\n       * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints.\n       *\n       * @returns Promise resolving to ResourcefulIndexResult containing:\n       *   - `records`: Array of partial record objects with only the requested fields\n       *   - `total`: Total number of records matching the filter (before pagination)\n       *   - `page`: The requested page number (echoed back)\n       *   - `perPage`: The requested per-page limit (echoed back)\n       *   - `countQuery`: SQL query string used for counting total records\n       *   - `recordsQuery`: SQL query string used for fetching the actual records\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       * @throws {E_INVALID_COLUMN_ACCESS} When no fields are available for access after ACL filtering\n       * @throws {E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION} When input validation fails\n       *\n       * @example\n       * ```typescript\n       * // Basic usage with pagination\n       * const result = await User.$onResourcefulIndex(\n       *   'name:john',\n       *   1,\n       *   10,\n       *   ['id', 'name', 'email'],\n       *   ctx,\n       *   app\n       * );\n       *\n       * // Complex filtering with date ranges\n       * const result = await User.$onResourcefulIndex(\n       *   'name:john AND createdAt:[2021-01-01T00:00:00Z TO 2021-12-31T23:59:59Z]',\n       *   2,\n       *   25,\n       *   ['id', 'name', 'createdAt'],\n       *   ctx,\n       *   app\n       * );\n       * ```\n       */\n      protected static $formatResourcefulRecord(\n        record: Model & ResourcefulModel,\n        possibleFields: string[],\n        enforcedPossibleFields: string[] = [],\n        deepRelatedFieldsMap?: Map<string, string[]>\n      ): Partial<ResourcefulModelSerializableAttributes<InstanceType<Model & ResourcefulModel>>> {\n        if (null === record || undefined === record) {\n          return record\n        }\n        const result: Partial<\n          ResourcefulModelSerializableAttributes<InstanceType<Model & ResourcefulModel>>\n        > = {}\n        const { possibleFields: allPossibleFields } = this.$loadPossibilitiesForResourcefulRecord()\n        possibleFields = possibleFields.filter(\n          (field) => allPossibleFields.includes(field) || enforcedPossibleFields.includes(field)\n        )\n        possibleFields.forEach((field) => {\n          const attribute = this.$keys.serializedToAttributes.get(field) || field\n          if (!attribute) return\n          const value = record[attribute as keyof typeof record] as any\n          if (value !== undefined) {\n            const resourcefulRelationshipOptions = this.$resourcefulRelationships.get(attribute)\n            if (resourcefulRelationshipOptions) {\n              // if the resulting value is a relationship, we need to use the related model's $formatResourcefulRecord\n              const relatedModel = resourcefulRelationshipOptions.relatedModel() as any\n              if (\n                'function' === typeof relatedModel.$formatResourcefulRecord &&\n                'function' === typeof relatedModel.$loadPossibilitiesForResourcefulRecord\n              ) {\n                const {\n                  possibleFields: relatedPossibleFields,\n                  possibleRelationships: relatedPossibleRelationships,\n                } = relatedModel.$loadPossibilitiesForResourcefulRecord()\n                // Deep serialization is opt-in per relationship key.\n                //\n                // If dot-notation was used for this relationship (e.g. 'user.country'):\n                //   - Only serialize scalars + the explicitly requested nested relationships.\n                //   - Pass a depth-capping map into the recursive call so those nested\n                //     relationships serialize only their own scalars (no further recursion).\n                //\n                // If no dot-notation was used for this relationship (legacy path):\n                //   - Use all relatedPossibleFields and pass no map, preserving the\n                //     original recursive serialization behavior.\n                const requestedNestedRelations = deepRelatedFieldsMap?.get(field)\n                let fieldsForRelated: string[]\n                let nestedDeepRelatedFieldsMap: Map<string, string[]> | undefined\n                if (requestedNestedRelations) {\n                  // Constrain to scalars + explicitly requested nested relationships\n                  fieldsForRelated = relatedPossibleFields.filter(\n                    (f: string) =>\n                      !relatedPossibleRelationships.includes(f) ||\n                      requestedNestedRelations.includes(f)\n                  )\n                  // Cap recursion: each requested nested relationship serializes scalars only\n                  nestedDeepRelatedFieldsMap = new Map(\n                    requestedNestedRelations.map((r: string) => [r, []])\n                  )\n                } else {\n                  // Legacy behavior: serialize all possible fields, no map\n                  fieldsForRelated = relatedPossibleFields\n                  nestedDeepRelatedFieldsMap = undefined\n                }\n                result[\n                  field as keyof ResourcefulModelSerializableAttributes<\n                    InstanceType<Model & ResourcefulModel>\n                  >\n                ] = relatedModel.$formatResourcefulRecord(\n                  value,\n                  fieldsForRelated,\n                  [],\n                  nestedDeepRelatedFieldsMap\n                )\n              } else if ('function' === typeof value.serialize) {\n                result[\n                  field as keyof ResourcefulModelSerializableAttributes<\n                    InstanceType<Model & ResourcefulModel>\n                  >\n                ] = value.serialize()\n              }\n            } else {\n              result[\n                field as keyof ResourcefulModelSerializableAttributes<\n                  InstanceType<Model & ResourcefulModel>\n                >\n              ] = value\n            }\n          }\n        })\n\n        return stripUndefinedValuesFromObject(result) as ResourcefulModelSerializableAttributes<\n          InstanceType<Model & ResourcefulModel>\n        >\n      }\n\n      protected static async $validatePayloadWithValidationGetters(\n        ctx: HttpContext,\n        app: ApplicationService,\n        payload: unknown,\n        methodOptions?: { isUpdate: boolean }\n      ): Promise<ValidationError | null> {\n        const { isUpdate } = methodOptions || {}\n        const { validator } = await this.$getResourcefulWriteValidationSchema(ctx, app, isUpdate)\n\n        const safeValidate = async (): Promise<null | ValidationError> => {\n          try {\n            await validator\n              .db(this.$adapter.modelConstructorClient(this) as any)\n              .validateAsync(payload, { abortEarly: false })\n\n            return null\n          } catch (err) {\n            return err as unknown as ValidationError\n          }\n        }\n\n        const validationError = await safeValidate()\n\n        if (validationError) {\n          // If it's alternatives.all error, it doesn't have relevant error message and details. So we extract them manually.\n          if (\n            validationError.details?.length === 1 &&\n            validationError.details[0].type === 'alternatives.all'\n          ) {\n            const alternativesError = validationError.details[0]\n\n            if (alternativesError.context?.details.length) {\n              validationError.details = alternativesError.context.details\n              validationError.message = alternativesError.context.details[0].message\n            }\n          }\n\n          return validationError\n        }\n\n        return null\n      }\n\n      protected static async $validatePayloadWithPayloadSchemaGetters(\n        ctx: HttpContext,\n        app: ApplicationService,\n        payload: unknown,\n        payloadSchemaGetters: ResourcefulPayloadSchemaGetter[]\n      ) {\n        const resolved = await Promise.all(payloadSchemaGetters.map((getter) => getter(ctx, app)))\n        const schemas = resolved.filter((schema) => schema !== null && schema !== undefined)\n\n        for (const schema of schemas) {\n          const { error: schemaError } = schema.validate(payload)\n\n          if (schemaError) {\n            return schemaError\n          }\n        }\n\n        return null\n      }\n\n      protected static async $resolveStorablePayload(\n        ctx: HttpContext,\n        app: ApplicationService,\n        payload: unknown,\n        validationGetters: ResourcefulPayloadValidatorGetter[],\n        payloadSchemaGetters: ResourcefulPayloadSchemaGetter[]\n      ) {\n        const schemas: Schema[] = []\n        const [schemasFromValidationGetters, schemasFromPayloadSchemaGetters] = await Promise.all([\n          pMap(validationGetters, async (getter) => await getter(ctx, app), { concurrency: 5 }),\n          pMap(payloadSchemaGetters, async (getter) => await getter(ctx, app), { concurrency: 5 }),\n        ])\n        schemasFromValidationGetters\n          .filter((s) => s !== null && s !== undefined)\n          .forEach((s) => {\n            schemas.push(s)\n          })\n        schemasFromPayloadSchemaGetters\n          .filter((s) => s !== null && s !== undefined)\n          .forEach((s) => {\n            schemas.push(s)\n          })\n        const mergables = await pMap(\n          schemas,\n          async (schema) => {\n            try {\n              return await schema.validateAsync(payload, { abortEarly: true, convert: true })\n            } catch {\n              return {}\n            }\n          },\n          { concurrency: 5 }\n        )\n        return Object.assign({}, payload as Record<string, any>, ...mergables) as Record<\n          string,\n          any\n        >\n      }\n\n      protected static $resourcefulGetQueryBuilder() {\n        return this.$adapter.modelConstructorClient(this).query().from(this.table)\n      }\n\n      static async $onResourcefulIndex(\n        filter: string | null | undefined,\n        page: number,\n        perPage: number,\n        fields: string | string[] | null | undefined,\n        sort: Array<[string, 'asc' | 'desc']> | null | undefined,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulScopeHooks = [],\n        aggregations: ResourcefulIndexAggregateOptions = {}\n      ): Promise<ResourcefulIndexResult<{ [key: string]: any }>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        if (!isString(filter)) {\n          filter = ''\n        }\n\n        fields = prepareFields(fields, primaryKey)\n\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access\n        |--------------------------------------------------------------------------\n        */\n        const { isForbidden, allowedSerializedMap, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          operation: CRUDOperationsEnum.LIST,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Validate Request Details\n        |--------------------------------------------------------------------------\n        */\n        const { allRelationships, possibleRelationships, possibleColumns, possibleComputed } =\n          this.$loadPossibilitiesForResourcefulRecord()\n        // filter out 1:many and many:many relationships since they are not loadable in this context\n        const possibleFields = Array.from(allowedSerializedMap.keys()).filter(\n          (f) =>\n            possibleColumns.includes(f) ||\n            possibleComputed.includes(f) ||\n            !allRelationships.includes(f) ||\n            possibleRelationships.includes(f)\n        )\n        if (possibleFields.length === 0) {\n          throw new E_INVALID_COLUMN_ACCESS('No fields available for access')\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Deep related fields (dot-notation) support\n        |--------------------------------------------------------------------------\n        |\n        | Fields like \"tenantPaymentServiceProvider.tenant\" request nested\n        | relationship preloading. We separate them from flat fields before\n        | Joi validation, validate them independently, and merge the root\n        | relationships back into the flat field list so the existing\n        | preload/serialization logic picks them up.\n        |\n        */\n        /**\n         * Deep related fields (dot-notation) support.\n         *\n         * Requesting `['id', 'user.country']` will:\n         * 1. Validate that `user` is a loadable resourceful relationship\n         * 2. Validate that `country` is a loadable relationship on the related model\n         * 3. Preload `country` as a nested sub-query on `user`\n         *\n         * Only one level of dot-notation is supported (e.g. `user.country`).\n         * Multi-level nesting (e.g. `user.country.regions`) is explicitly rejected.\n         *\n         * Note: When a root relationship is included (either explicitly or\n         * auto-included via dot-notation), the related model is serialized with\n         * **all** its possible fields — not just the nested fields requested via\n         * dot-notation. This is consistent with flat relationship serialization\n         * behavior in `$formatResourcefulRecord`.\n         */\n        const deepRelatedFields: Map<string, string[]> = new Map()\n        const flatFieldSet: Set<string> = new Set()\n        if (Array.isArray(fields)) {\n          for (const f of fields) {\n            const dotIndex = f.indexOf('.')\n            if (dotIndex > 0) {\n              const root = f.substring(0, dotIndex)\n              const nested = f.substring(dotIndex + 1)\n              // Reject multi-level nesting (e.g. 'user.country.regions')\n              if (nested.includes('.')) {\n                throw new E_INVALID_COLUMN_ACCESS(\n                  `Only one level of dot-notation deep fields is supported (e.g. \"${root}.${nested.split('.')[0]}\"); deeper nesting like \"${f}\" is not supported`\n                )\n              }\n              // Validate root is a loadable relationship\n              if (!possibleRelationships.includes(root)) {\n                throw new E_INVALID_COLUMN_ACCESS(\n                  `Deep field \"${f}\" references \"${root}\" which is not a valid loadable relationship`\n                )\n              }\n              // Validate nested field is valid on the related model\n              const relDef = this.$resourcefulRelationships.get(root)\n              if (relDef) {\n                const relatedModel = relDef.relatedModel() as any\n                if ('function' === typeof relatedModel.$loadPossibilitiesForResourcefulRecord) {\n                  const { possibleRelationships: relPossibleRelationships } =\n                    relatedModel.$loadPossibilitiesForResourcefulRecord()\n                  if (!relPossibleRelationships.includes(nested)) {\n                    throw new E_INVALID_COLUMN_ACCESS(\n                      `Deep field \"${f}\" references \"${nested}\" which is not a valid loadable relationship on \"${root}\"`\n                    )\n                  }\n                } else {\n                  // Related model is not resourceful — we cannot validate nested\n                  // fields, so fail closed rather than allowing unvalidated preloads\n                  throw new E_INVALID_COLUMN_ACCESS(\n                    `Deep field \"${f}\" cannot be validated: \"${root}\" does not reference a resourceful model`\n                  )\n                }\n              }\n              if (!deepRelatedFields.has(root)) {\n                deepRelatedFields.set(root, [])\n              }\n              deepRelatedFields.get(root)!.push(nested)\n              // Ensure the root relationship is included in flat fields\n              flatFieldSet.add(root)\n            } else {\n              flatFieldSet.add(f)\n            }\n          }\n          fields = Array.from(flatFieldSet)\n        }\n        const schema = joi.object({\n          filter: joi.string().allow('').required(),\n          page: joi.number().integer().min(1).required(),\n          perPage: joi.number().integer().min(1).max(100).required(),\n          fields: joi\n            .array()\n            .items(joi.string().valid(...possibleFields))\n            .required(),\n        })\n        const { error: methodValidationError, value: validatedMethodOptions } = schema.validate(\n          {\n            filter,\n            page,\n            perPage,\n            fields,\n          },\n          {\n            abortEarly: false,\n          }\n        )\n        if (methodValidationError) {\n          throw new E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION(methodValidationError)\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Create the baseline query\n        |--------------------------------------------------------------------------\n        */\n        let query = luceneToLucid(\n          validatedMethodOptions.filter,\n          this.$adapter.modelConstructorClient(this),\n          this.$keys.serializedToColumns,\n          primaryKey,\n          this.table,\n          possibleFields,\n          this\n        )\n        /*\n        |--------------------------------------------------------------------------\n        | Apply Resourceful Query Scope Callbacks\n        |--------------------------------------------------------------------------\n        */\n        for (const scopeCallback of [\n          ...(this.$resourcefulQueryScopeCallbacks.list || []),\n          ...hooks,\n        ]) {\n          await scopeCallback(ctx, app, query, this)\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Split into separate queries for count and results\n        |--------------------------------------------------------------------------\n        */\n        const countQuery = query.clone<{ total: number; [key: string]: number }>()\n        const recordsQuery = query.clone()\n        const privateKeyColumn = this.$keys.attributesToColumns.get(primaryKey)!\n        countQuery.count('*', 'total')\n        Object.keys(aggregations).forEach((aggKey) => {\n          const desired = aggregations[aggKey]\n          const fieldColumn = this.$keys.serializedToColumns.get(aggKey)\n          const resourcefulDefinition = this.$resourcefulColumns.get(aggKey)\n          if (!fieldColumn || !resourcefulDefinition || !resourcefulDefinition.aggregatable) {\n            throw new E_INVALID_AGGREGATION_FIELD(aggKey, this.$resourcefulName)\n          }\n          const uniqueDesired = new Set(desired)\n          uniqueDesired.forEach((desiredAggregation) => {\n            switch (desiredAggregation) {\n              case 'avg':\n                countQuery.avg(fieldColumn, [aggKey, 'Avg'].join(''))\n                break\n              case 'min':\n                countQuery.min(fieldColumn, [aggKey, 'Min'].join(''))\n                break\n              case 'max':\n                countQuery.max(fieldColumn, [aggKey, 'Max'].join(''))\n                break\n              case 'sum':\n                countQuery.sum(fieldColumn, [aggKey, 'Sum'].join(''))\n                break\n              case 'countDistinct':\n                countQuery.countDistinct(fieldColumn, [aggKey, 'CountDistinct'].join(''))\n                break\n              case 'sumDistinct':\n                countQuery.sumDistinct(fieldColumn, [aggKey, 'SumDistinct'].join(''))\n                break\n              case 'avgDistinct':\n                countQuery.avgDistinct(fieldColumn, [aggKey, 'AvgDistinct'].join(''))\n                break\n              default:\n                throw new E_INVALID_AGGREGATION_OPERATION(\n                  desiredAggregation,\n                  this.$resourcefulName,\n                  aggKey\n                )\n            }\n          })\n        })\n        recordsQuery\n          .select(privateKeyColumn)\n          .forPage(validatedMethodOptions.page, validatedMethodOptions.perPage)\n\n        if (Array.isArray(sort) && sort.length > 0) {\n          sort.forEach(([field, direction]) => {\n            const columnName = this.$keys.serializedToColumns.get(field)\n            if (allowedSerializedMap.has(field) && columnName) {\n              recordsQuery.orderBy(columnName, direction)\n            }\n          })\n        }\n\n        const countQueryQuery = countQuery.toQuery()\n        const recordsQueryQuery = recordsQuery.toQuery()\n        /*\n        |--------------------------------------------------------------------------\n        | Retrieve raw results\n        |--------------------------------------------------------------------------\n        */\n        await this.$hooks.runner('before:paginate').run([countQuery, this])\n        const [countResults, rawRecordIds] = await Promise.all([countQuery, recordsQuery])\n        const totalRaw = Number(countResults?.[0]?.total)\n        const rawRecordsUnsortedQuery = this.query().whereIn(\n          privateKeyColumn,\n          rawRecordIds.map((r) => r[privateKeyColumn])\n        )\n        const relationsToSelect = validatedMethodOptions.fields.filter(\n          (field: string) =>\n            allowedSerializedMap.has(field) && possibleRelationships.includes(field)\n        )\n        // Native `preload` is used here intentionally (not `preloadCached`):\n        // `rawRecordsUnsortedQuery` comes from `this.query()`, which already injects the\n        // CachingPreloader, so configured 1:1 relations cache transparently on this path.\n        // These inline loads never need `forceLoad`, so the extra `preloadCached` channel\n        // would add nothing. (A nested/deep preload passes a callback, which the\n        // CachingPreloader treats as a cache bypass — that level loads uncached.)\n        relationsToSelect.forEach((prop: any) => {\n          const nestedRelations = deepRelatedFields.get(prop)\n          if (nestedRelations && nestedRelations.length > 0) {\n            // Deep preload: preload the root relationship and its nested relationships\n            rawRecordsUnsortedQuery.preload(prop, (subQuery: any) => {\n              for (const nested of nestedRelations) {\n                subQuery.preload(nested)\n              }\n            })\n          } else {\n            rawRecordsUnsortedQuery.preload(prop)\n          }\n        })\n        this.$resourcefulEnforcedPreloads.forEach((prop: string) => {\n          if (!possibleRelationships.includes(prop)) {\n            const rel = this.$getRelation(prop)\n            if (rel) {\n              rawRecordsUnsortedQuery.preload(prop as any)\n            }\n          }\n        })\n        const rawRecordsUnsorted = await rawRecordsUnsortedQuery\n        const rawRecords = rawRecordsUnsorted.sort((a, b) => {\n          const aId = a.$getAttribute(primaryKey)\n          const bId = b.$getAttribute(primaryKey)\n          const rawRecordIdResultsIndexA = rawRecordIds.findIndex(\n            (r) => r[primaryKey].toString() === aId.toString()\n          )\n          const rawRecordIdResultsIndexB = rawRecordIds.findIndex(\n            (r) => r[primaryKey].toString() === bId.toString()\n          )\n          return rawRecordIdResultsIndexA - rawRecordIdResultsIndexB\n        })\n        /*\n        |--------------------------------------------------------------------------\n        | Return results\n        |--------------------------------------------------------------------------\n        */\n        const returnableFields = possibleFields.filter((f) =>\n          !Array.isArray(fields)\n            ? f === primaryKey\n            : fields.length === 0\n              ? f === primaryKey\n              : fields.includes(f)\n        )\n        if (!returnableFields.includes(primaryKey)) {\n          returnableFields.unshift(primaryKey)\n        }\n        const ret = {\n          total: Number.isNaN(totalRaw) ? 0 : totalRaw,\n          page: validatedMethodOptions.page,\n          perPage: validatedMethodOptions.perPage,\n          records: rawRecords.map((record) =>\n            this.$formatResourcefulRecord(record as any, returnableFields, [], deepRelatedFields)\n          ) as Partial<{\n            [key: string]: any\n          }>[],\n          aggregations: getAggregationResults(aggregations, countResults![0]),\n          countQuery: countQueryQuery,\n          recordsQuery: recordsQueryQuery,\n        }\n        const paginator = new SimplePaginator(ret.total, ret.perPage, ret.page, ...ret.records)\n        await this.$hooks.runner('after:paginate').run(paginator)\n        return ret\n      }\n\n      /**\n       * Retrieves a single model record by its unique identifier with access control.\n       *\n       * This method implements secure record retrieval by first applying query scope callbacks\n       * to verify the record exists within the user's access scope, then fetching the full\n       * model instance for field-level ACL evaluation. Only fields that pass ACL checks\n       * are included in the response.\n       *\n       * The dual-fetch pattern ensures security: the first query applies scoping constraints\n       * to verify access, while the second query retrieves the full model for ACL evaluation.\n       *\n       * @param uid - The unique identifier of the record to retrieve\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints\n       *\n       * @returns Promise resolving to the record object with only accessible fields\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       */\n      static async $onResourcefulRead(\n        uid: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulScopeHooks = []\n      ): Promise<ResourcefulModelSerializableAttributes<Model & ResourcefulModel>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access\n        |--------------------------------------------------------------------------\n        */\n        const query = this.$resourcefulGetQueryBuilder()\n\n        const allScopeCallbacks = [...(this.$resourcefulQueryScopeCallbacks.list || []), ...hooks]\n\n        for (const scopeCallback of allScopeCallbacks) {\n          await scopeCallback(ctx, app, query, this)\n        }\n\n        const recordRaw = await query.where(this.primaryKey, uid).select(this.primaryKey).first()\n\n        if (!recordRaw) {\n          throw new E_RECORD_NOT_FOUND_EXCEPTION()\n        }\n\n        const rid = recordRaw[this.primaryKey]\n\n        const recordQuery = this.query().where(this.primaryKey, rid)\n        const { possibleRelationships, possibleFields } =\n          this.$loadPossibilitiesForResourcefulRecord()\n        // Native `preload` (not `preloadCached`): `recordQuery` comes from\n        // `this.query()`, which injects the CachingPreloader, so configured 1:1\n        // relations cache transparently here; this inline path never needs `forceLoad`.\n        possibleRelationships.forEach((prop: any) => {\n          recordQuery.preload(prop)\n        })\n        this.$resourcefulEnforcedPreloads.forEach((prop: string) => {\n          if (!possibleRelationships.includes(prop)) {\n            const rel = this.$getRelation(prop)\n            if (rel) {\n              recordQuery.preload(prop as any)\n            }\n          }\n        })\n        const record = await recordQuery.first()\n        if (!record) {\n          throw new E_RECORD_NOT_FOUND_EXCEPTION()\n        }\n\n        const { isForbidden, allowedSerializedMap, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          instance: record,\n          operation: CRUDOperationsEnum.READ,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Format and return the result\n        |--------------------------------------------------------------------------\n        */\n        const enforcedPossibleFields: string[] = []\n        if (ctx.request.header('x-resourceful-for') === 'resourceful-ui') {\n          /*\n          |--------------------------------------------------------------------------\n          | Special condition: Resourceful UI Components\n          |--------------------------------------------------------------------------\n          | Resourceful UI components requires that the same fields as the \"write\"\n          | schema be utilized in addition to the fields for the \"read\" schema\n          | in order to allow forms to show the current values correctly, especially\n          | enum and relationship-bound fields.\n          */\n          this.$resourcefulColumns.forEach((opts, col) => {\n            // Map<relationship, title>\n            const possible: Map<string, string> = new Map()\n            const processRelationship = (\n              relation: RelationshipsContract,\n              relationshipKey: string\n            ) => {\n              relation.boot()\n              switch (relation.type) {\n                case 'hasOne':\n                case 'belongsTo': {\n                  if (relation.foreignKey === col) {\n                    const relationship = this.$resourcefulRelationships.get(relationshipKey)\n                    const lucidRelationship = this.$relationsDefinitions.get(relationshipKey)\n                    if (!relationship || !lucidRelationship) return\n                    const relatedModel = relationship.relatedModel()\n                    if (!guards.isResourcefulModel(relatedModel)) return\n                    const title = guards.isString(lucidRelationship.serializeAs)\n                      ? lucidRelationship.serializeAs || relationshipKey\n                      : relationshipKey\n                    possible.set(col, title || col)\n                  }\n                  break\n                }\n              }\n            }\n            if (\n              'relationshipKey' in opts &&\n              'string' === typeof opts.relationshipKey &&\n              opts.relationshipKey.trim().length > 0\n            ) {\n              const lucidRelationship = this.$relationsDefinitions.get(opts.relationshipKey)\n              if (this.$resourcefulRelationships.has(opts.relationshipKey) && lucidRelationship) {\n                processRelationship(lucidRelationship, opts.relationshipKey)\n              }\n            } else {\n              this.$relationsDefinitions.forEach(processRelationship)\n            }\n            if (possible.size > 0) {\n              if (possible.size > 1) {\n                // TODO: provide a warning for the developer that multiple relationships were found\n                // for the same column key and that they should specifically define `relationshipKey` in\n                // the column definition to avoid ambiguity\n              }\n              const key = Array.from(possible.keys())[0]\n              allowedSerializedMap.set(key, true)\n              if (!possibleFields.includes(key)) {\n                possibleFields.push(key)\n              }\n              if (!enforcedPossibleFields.includes(key)) {\n                enforcedPossibleFields.push(key)\n              }\n            }\n          })\n        }\n        return this.$formatResourcefulRecord(\n          record as any,\n          possibleFields.filter((f) => allowedSerializedMap.get(f) === true),\n          enforcedPossibleFields\n        ) as ResourcefulModelSerializableAttributes<Model & ResourcefulModel>\n      }\n\n      /**\n       * Loads a specific relationship for a model record with pagination, filtering, and access control.\n       *\n       * This method provides paginated relationship loading by leveraging the related model's\n       * $onResourcefulIndex method with automatically generated relationship constraints.\n       * It supports full filtering, sorting, and pagination capabilities while maintaining\n       * proper access control and scoping.\n       *\n       * The method automatically generates query scope hooks to constrain results to only\n       * records related to the specified parent record, preventing unauthorized data access\n       * and ensuring proper relationship boundaries are maintained.\n       *\n       * @param uid - The unique identifier of the parent record\n       * @param relationshipKey - The name of the relationship property to load\n       * @param filter - Lucene-style query string for filtering related records\n       * @param page - The page number for pagination (must be ≥ 1)\n       * @param perPage - Number of records per page (must be ≥ 1 and ≤ 100)\n       * @param fields - Array of field names to include in the response from the related model\n       * @param sort - Array of sort criteria as [field, direction] tuples\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional array of additional query scope callbacks\n       *\n       * @returns Promise resolving to paginated relationship results with the same structure as $onResourcefulIndex\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_INVALID_RELATIONSHIP_EXCEPTION} When the specified relationship doesn't exist or isn't resourceful\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       * @throws {E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION} When input validation fails\n       *\n       * @example\n       * ```typescript\n       * // Load user's posts with filtering and pagination\n       * const userPosts = await Post.$onResourcefulReadRelationship(\n       *   123,                    // user ID\n       *   'posts',               // relationship name\n       *   'status:published',    // filter\n       *   1,                     // page\n       *   10,                    // perPage\n       *   ['id', 'title'],       // fields\n       *   [['createdAt', 'desc']], // sort\n       *   ctx,\n       *   app\n       * );\n       *\n       * // Load user's skills (many-to-many)\n       * const userSkills = await Skill.$onResourcefulReadRelationship(\n       *   123,\n       *   'skills',\n       *   null,  // no filter\n       *   1,\n       *   50,\n       *   null,  // all fields\n       *   null,  // default sort\n       *   ctx,\n       *   app\n       * );\n       * ```\n       */\n      static async $onResourcefulReadRelationship(\n        uid: any,\n        relationshipKey: string,\n        filter: string | null | undefined,\n        page: number,\n        perPage: number,\n        fields: string | string[] | null | undefined,\n        sort: Array<[string, 'asc' | 'desc']> | null | undefined,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulScopeHooks = [],\n        aggregations: ResourcefulIndexAggregateOptions = {}\n      ): Promise<ResourcefulIndexResult<{ [key: string]: any }>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Validate relationship exists and is accessible\n        |--------------------------------------------------------------------------\n        */\n        const relationshipDefinition = this.$resourcefulRelationships.get(relationshipKey)\n        if (!relationshipDefinition) {\n          throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n            `Relationship '${relationshipKey}' not found on model '${this.$resourcefulName}'`\n          )\n        }\n\n        const lucidRelationshipDefinition = this.$getRelation(relationshipKey)\n        if (!lucidRelationshipDefinition) {\n          throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n            `Lucid relationship '${relationshipKey}' not found on model '${this.$resourcefulName}'`\n          )\n        }\n\n        const RelatedModel = relationshipDefinition.relatedModel()\n        if (typeof (RelatedModel as any).$onResourcefulIndex !== 'function') {\n          throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n            `Related model for '${relationshipKey}' does not implement resourceful operations`\n          )\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Generate relationship constraint hook\n        |--------------------------------------------------------------------------\n        */\n        const relationshipHook: BoundResourcefulQueryScopeCallback = async (\n          uuid: any,\n          _hookCtx,\n          _hookApp,\n          query\n        ) => {\n          const relationshipType = (lucidRelationshipDefinition as any).type\n\n          switch (relationshipType) {\n            case 'hasMany':\n              {\n                // For hasMany: WHERE foreign_key = uid\n                const foreignKey = (lucidRelationshipDefinition as any).options.foreignKey\n                if (!foreignKey) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `HasMany relationship '${relationshipKey}' missing foreignKey`\n                  )\n                }\n                const foreignColumn = RelatedModel.$keys.attributesToColumns.get(foreignKey)\n                if (!foreignColumn) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `Foreign key '${foreignKey}' not found in related model columns`\n                  )\n                }\n                query.where(foreignColumn, uuid)\n              }\n              break\n\n            case 'manyToMany':\n              {\n                // For manyToMany: WHERE EXISTS (SELECT 1 FROM pivot_table WHERE ...)\n                const pivotTable = (lucidRelationshipDefinition as any).options.pivotTable\n                const localKey = (lucidRelationshipDefinition as any).options.localKey\n                const relatedKey = (lucidRelationshipDefinition as any).options.relatedKey\n                const pivotForeignKey = (lucidRelationshipDefinition as any).options.pivotForeignKey\n                const pivotRelatedForeignKey = (lucidRelationshipDefinition as any).options\n                  .pivotRelatedForeignKey\n\n                if (\n                  !pivotTable ||\n                  !localKey ||\n                  !relatedKey ||\n                  !pivotForeignKey ||\n                  !pivotRelatedForeignKey\n                ) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `ManyToMany relationship '${relationshipKey}' missing required pivot configuration`\n                  )\n                }\n\n                const relatedColumn = RelatedModel.$keys.attributesToColumns.get(relatedKey)\n                if (!relatedColumn) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `Related key '${relatedKey}' not found in related model columns`\n                  )\n                }\n\n                query.whereExists((subQuery) => {\n                  subQuery\n                    .from(pivotTable)\n                    .select(1)\n                    .whereColumn(\n                      `${pivotTable}.${pivotRelatedForeignKey}`,\n                      `${RelatedModel.table}.${relatedColumn}`\n                    )\n                    .where(`${pivotTable}.${pivotForeignKey}`, uid)\n                })\n              }\n              break\n\n            case 'hasManyThrough':\n              {\n                // For hasManyThrough: WHERE EXISTS (SELECT 1 FROM through_table JOIN related_table ...)\n                const throughModel = (lucidRelationshipDefinition as any).options.throughModel\n                  ? (lucidRelationshipDefinition as any).options.throughModel()\n                  : undefined\n                const foreignKey =\n                  (lucidRelationshipDefinition as any).options.foreignKey || RelatedModel.primaryKey\n                const localKey =\n                  (lucidRelationshipDefinition as any).options.localKey || this.primaryKey\n                const throughForeignKey = (lucidRelationshipDefinition as any).options\n                  .throughForeignKey\n                const throughLocalKey =\n                  (lucidRelationshipDefinition as any).options.throughLocalKey ||\n                  throughModel?.primaryKey\n\n                if (\n                  !throughModel ||\n                  !foreignKey ||\n                  !localKey ||\n                  !throughForeignKey ||\n                  !throughLocalKey\n                ) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `HasManyThrough relationship '${relationshipKey}' missing required through configuration`\n                  )\n                }\n\n                // Map attribute names to database columns\n                // foreignKey: through table's column that matches parent's localKey (e.g., tenantId -> tenant_id)\n                const throughForeignKeyColumn =\n                  throughModel.$keys.attributesToColumns.get(foreignKey) || foreignKey\n                // throughLocalKey: through table's primary key (e.g., id)\n                const throughLocalKeyColumn =\n                  throughModel.$keys.attributesToColumns.get(throughLocalKey) || throughLocalKey\n                // throughForeignKey: related table's column that references through table (e.g., tenantPaymentServiceProviderId -> tenant_payment_service_provider_id)\n                const relatedThroughForeignKeyColumn =\n                  RelatedModel.$keys.attributesToColumns.get(throughForeignKey) || throughForeignKey\n\n                if (\n                  !throughForeignKeyColumn ||\n                  !throughLocalKeyColumn ||\n                  !relatedThroughForeignKeyColumn\n                ) {\n                  const missing = [\n                    !throughForeignKeyColumn ? 'throughForeignKeyColumn' : undefined,\n                    !throughLocalKeyColumn ? 'throughLocalKeyColumn' : undefined,\n                    !relatedThroughForeignKeyColumn ? 'relatedThroughForeignKeyColumn' : undefined,\n                  ].filter((x) => x !== undefined)\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `HasManyThrough relationship '${relationshipKey}' has invalid key mappings. Missing: ${missing.join(', ')}`\n                  )\n                }\n\n                query.whereExists((subQuery) => {\n                  subQuery\n                    .from(throughModel.table)\n                    .select(1)\n                    .where(`${throughModel.table}.${throughForeignKeyColumn}`, uid)\n                    .whereColumn(\n                      `${throughModel.table}.${throughLocalKeyColumn}`,\n                      `${RelatedModel.table}.${relatedThroughForeignKeyColumn}`\n                    )\n                    .limit(1)\n                })\n              }\n              break\n\n            default:\n              throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                `Relationship type '${relationshipType}' is not supported for paginated loading`\n              )\n          }\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Call the related model's index method with the relationship constraint\n        |--------------------------------------------------------------------------\n        */\n        const allHooks = [relationshipHook.bind(null, uid), ...hooks]\n\n        try {\n          return (RelatedModel as any).$onResourcefulIndex(\n            filter,\n            page,\n            perPage,\n            fields,\n            sort,\n            ctx,\n            app,\n            allHooks,\n            aggregations\n          )\n        } catch (err) {\n          if (err instanceof E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION) {\n            throw new E_INVALID_RESOUREFUL_READ_RELATIONSHIP_REQUEST_EXCEPTION(err)\n          } else {\n            throw err\n          }\n        }\n      }\n\n      /**\n       * Creates a new model record with payload validation and access control.\n       *\n       * This method handles secure record creation by validating the request payload\n       * against both model-level and request-specific validation schemas, checking\n       * field-level write permissions, and returning the created record with appropriate\n       * field filtering applied via the read operation.\n       *\n       * @param payload - The data object containing field values for the new record\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional array of validation schema getters for additional payload validation\n       *\n       * @returns Promise resolving to the created record with only accessible fields\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_INVALID_PAYLOAD_EXCEPTION} When core model validation fails\n       * @throws {E_FORBIDDEN_PAYLOAD_EXCEPTION} When request-specific validation fails\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       */\n      static async $onResourcefulCreate(\n        payload: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulValidationHooks = []\n      ): Promise<ResourcefulModelSerializableAttributes<Model & ResourcefulModel>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access\n        |--------------------------------------------------------------------------\n        */\n        const payloadValidatorGetters = [...(options.payloadValidationSchemaBuilders?.create || [])]\n        const payloadSchemaGettersError = await this.$validatePayloadWithPayloadSchemaGetters(\n          ctx,\n          app,\n          payload,\n          hooks\n        )\n\n        if (payloadSchemaGettersError) {\n          throw new E_FORBIDDEN_PAYLOAD_EXCEPTION(payloadSchemaGettersError)\n        }\n\n        const { isForbidden, allowedSerializedMap, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          operation: CRUDOperationsEnum.CREATE,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Validate and prepare payload\n        |--------------------------------------------------------------------------\n        */\n        const preparedPayload: Record<string, any> = {}\n        const resolvedPayload = await this.$resolveStorablePayload(\n          ctx,\n          app,\n          payload,\n          payloadValidatorGetters,\n          hooks\n        )\n\n        // Only process fields that are allowed by ACL\n        for (const [key, value] of Object.entries(resolvedPayload)) {\n          let attribute = this.$keys.serializedToAttributes.get(key)\n          const isValueNull = value === null || value === undefined\n\n          // If attribute is not found, the key might already be the column name\n          // for fields with serializeAs: null\n          if (!attribute) {\n            // Check if this key corresponds to a column that has serializeAs: null\n            const columnExists = typeof this.$keys.attributesToColumns.get(key) !== 'undefined'\n            if (columnExists) {\n              attribute = key // The key is already the attribute/column name\n            } else {\n              continue // Skip unknown fields\n            }\n          }\n\n          // Check if this field is allowed - either by serialized name or column name\n          const isAllowedBySerializedName = allowedSerializedMap.has(key)\n          const isAllowedByColumnName = allowedSerializedMap.has(attribute)\n          const isAllowed = isAllowedBySerializedName || isAllowedByColumnName\n\n          if (!isValueNull && !isAllowed) {\n            throw new E_FORBIDDEN(`User does not has write access to field ${key}.`)\n          }\n\n          preparedPayload[attribute] = value\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Create the record\n        |--------------------------------------------------------------------------\n        */\n        const newRecord = await this.create(preparedPayload as InstanceType<Model>)\n\n        /*\n        |--------------------------------------------------------------------------\n        | Format and return the result\n        |--------------------------------------------------------------------------\n        */\n\n        // Call inner Read method to honor Read ACL\n        return await this.$onResourcefulRead(newRecord.$getAttribute(primaryKey), ctx, app)\n      }\n\n      /**\n       * Updates an existing model record with payload validation and access control.\n       *\n       * This method implements secure record updates by first verifying the record exists\n       * and is accessible via the read operation, validating the update payload against both\n       * model-level and request-specific schemas, checking field-level write permissions,\n       * and returning the updated record with appropriate field filtering applied.\n       *\n       * The method reuses $onResourcefulRead for consistent access control and scoping logic.\n       *\n       * @param uid - The unique identifier of the record to update\n       * @param payload - The data object containing field values to update\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional object containing query scope callbacks and validation schema getters\n       *\n       * @returns Promise resolving to the updated record with only accessible fields\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n       * @throws {E_INVALID_PAYLOAD_EXCEPTION} When core model validation fails\n       * @throws {E_FORBIDDEN_PAYLOAD_EXCEPTION} When request-specific validation fails\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       */\n      static async $onResourcefulUpdate(\n        uid: any,\n        payload: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: Partial<ResourcefulHooks> = {}\n      ): Promise<ResourcefulModelSerializableAttributes<Model & ResourcefulModel>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access & Find the existing record\n        |--------------------------------------------------------------------------\n        */\n        const payloadValidatorGetters = [...(options.payloadValidationSchemaBuilders?.update || [])]\n        const payloadSchemaGettersError = await this.$validatePayloadWithPayloadSchemaGetters(\n          ctx,\n          app,\n          payload,\n          hooks.payloadValidationSchemas || []\n        )\n\n        if (payloadSchemaGettersError) {\n          throw new E_FORBIDDEN_PAYLOAD_EXCEPTION(payloadSchemaGettersError)\n        }\n\n        // Attempt to load the existing record via $onResourcefulRead in order to\n        // prevent duplicating the scoping logic\n        await this.$onResourcefulRead(uid, ctx, app, hooks.queryScopeCallbacks || [])\n\n        // Refetching record using model to update with it later\n        const record = await this.query().where(primaryKey, uid).first()\n        if (!record) {\n          throw new E_RECORD_NOT_FOUND_EXCEPTION()\n        }\n\n        const { isForbidden, allowedSerializedMap, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          instance: record,\n          operation: CRUDOperationsEnum.UPDATE,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Prepare payload\n        |--------------------------------------------------------------------------\n        */\n        const preparedPayload: Record<string, any> = {}\n        const resolvedPayload = await this.$resolveStorablePayload(\n          ctx,\n          app,\n          payload,\n          payloadValidatorGetters,\n          hooks.payloadValidationSchemas || []\n        )\n\n        // Only process fields that are allowed by ACL\n        for (const [serializedKey, value] of Object.entries(resolvedPayload)) {\n          let attribute = this.$keys.serializedToAttributes.get(serializedKey)\n          const isValueNull = value === null || value === undefined\n\n          // If attribute is not found, the key might already be the column name\n          // for fields with serializeAs: null\n          if (!attribute) {\n            // Check if this key corresponds to a column that has serializeAs: null\n            const columnExists =\n              typeof this.$keys.attributesToColumns.get(serializedKey) !== 'undefined'\n            if (columnExists) {\n              attribute = serializedKey // The key is already the attribute/column name\n            } else {\n              continue // Skip unknown fields\n            }\n          }\n\n          // Check if this field is allowed - either by serialized name or column name\n          const isAllowedBySerializedName = allowedSerializedMap.has(serializedKey)\n          const isAllowedByColumnName = allowedSerializedMap.has(attribute)\n          const isAllowed = isAllowedBySerializedName || isAllowedByColumnName\n\n          if (!isValueNull && !isAllowed) {\n            throw new E_FORBIDDEN(`User does not has write access to field ${attribute}.`)\n          }\n\n          preparedPayload[attribute] = value\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Update the record\n        |--------------------------------------------------------------------------\n        */\n\n        record.merge(preparedPayload as Partial<InstanceType<Model>>)\n\n        await record.save()\n\n        /*\n        |--------------------------------------------------------------------------\n        | Format and return the result\n        |--------------------------------------------------------------------------\n        */\n\n        // Call inner Read method to honor Read ACL\n        return this.$onResourcefulRead(uid, ctx, app)\n      }\n\n      /**\n       * Deletes an existing model record with verification and access control.\n       *\n       * This method securely deletes records by first verifying the record exists\n       * and is accessible via the read operation, then checking model-level deletion\n       * permissions before executing the deletion. Returns the record as it existed\n       * before deletion with appropriate field filtering applied.\n       *\n       * The method reuses $onResourcefulRead for consistent access control and scoping logic.\n       *\n       * @param uid - The unique identifier of the record to delete\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional object containing query scope callbacks\n       *\n       * @returns Promise resolving to the deleted record as it existed before deletion\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n       * @throws {E_FORBIDDEN} When access is denied by model-level access control filters\n       */\n      static async $onResourcefulDelete(\n        uid: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulScopeHooks = []\n      ): Promise<void> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Find the existing record for access check\n        |--------------------------------------------------------------------------\n        */\n        const query = this.$resourcefulGetQueryBuilder()\n\n        for (const scopeCallback of [\n          ...(this.$resourcefulQueryScopeCallbacks.access || []),\n          ...hooks,\n        ]) {\n          await scopeCallback(ctx, app, query, this)\n        }\n\n        const rawRecord = await query.where(primaryKey, uid).first()\n\n        if (!rawRecord) {\n          throw new E_RECORD_NOT_FOUND_EXCEPTION()\n        }\n        const { possibleFields } = this.$loadPossibilitiesForResourcefulRecord()\n        const record = new this().merge(this.$formatResourcefulRecord(rawRecord, possibleFields))\n\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access\n        |--------------------------------------------------------------------------\n        */\n        const { isForbidden, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          instance: record,\n          operation: CRUDOperationsEnum.DELETE,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Delete the record\n        |--------------------------------------------------------------------------\n        */\n\n        await record.delete()\n      }\n\n      static async $onResourcefulBulkUpdate(\n        filter: string | null | undefined,\n        payload: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: Partial<ResourcefulHooks> = {}\n      ): Promise<\n        | {\n            [key: string]: ResourcefulModelSerializableAttributes<Model & ResourcefulModel> | Error\n          }\n        | Error\n      > {\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Turn $onResourcefulIndex into an async iterator for bulk updates\n        |--------------------------------------------------------------------------\n        */\n        const ctor = this\n        async function* resourcefulIndexIteratorForUpdate(f: string | null | undefined) {\n          let page = 1\n          let pages = 0\n          const pk = ctor.$getPrivateKeyAttribute()\n          if (!pk) return\n          const whileAbortController = new AbortController()\n          while ((pages === 0 || page <= pages) && whileAbortController.signal.aborted === false) {\n            try {\n              const result = await ctor.$onResourcefulIndex(\n                f,\n                page,\n                100,\n                [pk],\n                [[pk, 'asc']],\n                ctx,\n                app,\n                hooks.queryScopeCallbacks || []\n              )\n              if (result.total === 0) {\n                // No records found, break the loop\n                whileAbortController.abort()\n                break\n              }\n              pages = Math.ceil(result.total / result.perPage)\n              page++\n              yield result.records\n            } catch (err) {\n              // break early on error\n              whileAbortController.abort()\n              if (err instanceof Error) {\n                throw err\n              } else {\n                throw new E_BULK_UPDATE_SEARCH_UNKNOWN_EXCEPTION()\n              }\n            }\n          }\n        }\n        const uids: Set<number | string> = new Set()\n        for await (const records of resourcefulIndexIteratorForUpdate(filter)) {\n          for (const record of records) {\n            const uid = record[primaryKey]\n            if (uid !== undefined && uid !== null) {\n              uids.add(uid)\n            }\n          }\n        }\n        return await this.$onResourcefulBulkUpdateByUid(Array.from(uids), payload, ctx, app, hooks)\n      }\n\n      static async $onResourcefulBulkUpdateByUid(\n        uids: (number | string)[],\n        payload: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks?: Partial<ResourcefulHooks>,\n        concurrency = 5\n      ): Promise<{\n        [key: string]: ResourcefulModelSerializableAttributes<Model & ResourcefulModel> | Error\n      }> {\n        const results: {\n          [key: string]: ResourcefulModelSerializableAttributes<Model & ResourcefulModel> | Error\n        } = {}\n        /*\n        |--------------------------------------------------------------------------\n        | Iterate through records for bulk update using pMap\n        | to balance concurrency and performance\n        |--------------------------------------------------------------------------\n        */\n        /* istanbul ignore next -- @preserve */\n        await pMap(\n          uids,\n          async (uid) => {\n            try {\n              results[uid] = await this.$onResourcefulUpdate(uid, payload, ctx, app, hooks)\n            } catch (err) {\n              const e = err instanceof Error ? err : new Error('Unknown error during update')\n              results[uid] = e\n            }\n          },\n          { concurrency }\n        )\n        return results\n      }\n    }\n    Object.defineProperty(ResourcefulModel, '$resourcefulName', {\n      value: validatedOptions.name,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulTitleColumn', {\n      value: validatedOptions.resourcefulTitleColumn,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulMetaDescription', {\n      value: validatedOptions.description,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulMetaExternalDocs', {\n      value: validatedOptions.externalDocs,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulMetaExample', {\n      value: validatedOptions.example,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulAccessControlFilters', {\n      value: validatedOptions.accessControlFilters,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulOnACLError', {\n      value: validatedOptions.onACLError,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulQueryScopeCallbacks', {\n      value: validatedOptions.queryScopeCallbacks || { list: [], access: [] },\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulPayloadValidationSchemaBuilders', {\n      value: validatedOptions.payloadValidationSchemaBuilders || { create: [], update: [] },\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulEnforcedPreloads', {\n      value: new Set(validatedOptions.enforcedPreloads || []),\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    return ResourcefulModel\n  }\n}\n","/*\n|--------------------------------------------------------------------------\n| Prepare/Consume Chain Builder\n|--------------------------------------------------------------------------\n|\n| Utility for chaining prepare and consume functions in resourceful decorators.\n| This allows combining default decorator behavior with custom logic in a\n| predictable order while maintaining proper error handling.\n|\n*/\n\n/**\n * Function types for prepare and consume operations\n */\nexport type CustomPrepareFunction = (value: unknown) => unknown\nexport type CustomConsumeFunction = (value: unknown) => unknown\nexport type DefaultPrepareFunction<T = unknown> = (\n  key: string,\n  value: unknown,\n  nullable?: boolean\n) => T\nexport type DefaultConsumeFunction<T = unknown> = (\n  key: string,\n  value: unknown,\n  nullable?: boolean\n) => T\n\n/**\n * Utility class for building chained prepare and consume functions.\n *\n * The chaining order reflects the data flow:\n * - Prepare chain: Default → Custom (data flows TO database)\n * - Consume chain: Custom → Default (data flows FROM database)\n */\nexport class PrepareConsumeChainBuilder {\n  /**\n   * Creates a chained prepare function that calls default first, then custom.\n   *\n   * @param propertyKey - The property name for error context\n   * @param nullable - Whether the field accepts null values\n   * @param defaultPrepare - The default prepare function from decorator\n   * @param customPrepare - The custom prepare function from options\n   * @returns A chained prepare function or undefined if no functions provided\n   */\n  static chainPrepare<T>(\n    propertyKey: string,\n    nullable: boolean,\n    defaultPrepare?: DefaultPrepareFunction<T> | undefined,\n    customPrepare?: CustomPrepareFunction | undefined\n  ): CustomPrepareFunction | undefined {\n    // If neither function is provided, return undefined\n    if (!defaultPrepare && !customPrepare) {\n      return undefined\n    }\n\n    // If only custom function is provided, return it directly\n    if (!defaultPrepare && customPrepare) {\n      return customPrepare\n    }\n\n    // If only default function is provided, wrap it to match signature\n    if (defaultPrepare && !customPrepare) {\n      return (value: unknown) => defaultPrepare(propertyKey, value, nullable)\n    }\n\n    // Both functions provided - chain them: default → custom\n    return (value: unknown) => {\n      const defaultResult = defaultPrepare!(propertyKey, value, nullable)\n\n      return customPrepare!(defaultResult)\n    }\n  }\n\n  /**\n   * Creates a chained consume function that calls custom first, then default.\n   *\n   * @param propertyKey - The property name for error context\n   * @param nullable - Whether the field accepts null values\n   * @param defaultConsume - The default consume function from decorator\n   * @param customConsume - The custom consume function from options\n   * @returns A chained consume function or undefined if no functions provided\n   */\n  static chainConsume<T>(\n    propertyKey: string,\n    nullable: boolean,\n    defaultConsume?: DefaultConsumeFunction<T>,\n    customConsume?: CustomConsumeFunction\n  ): CustomConsumeFunction | undefined {\n    // If neither function is provided, return undefined\n    if (!defaultConsume && !customConsume) {\n      return undefined\n    }\n\n    // If only custom function is provided, return it directly\n    if (!defaultConsume && customConsume) {\n      return customConsume\n    }\n\n    // If only default function is provided, wrap it to match signature\n    if (defaultConsume && !customConsume) {\n      return (value: unknown) => defaultConsume(propertyKey, value, nullable)\n    }\n\n    // Both functions provided - chain them: custom → default\n    return (value: unknown) => {\n      const customResult = customConsume!(value)\n\n      return defaultConsume!(propertyKey, customResult, nullable)\n    }\n  }\n}\n","/*\n|--------------------------------------------------------------------------\n| Decorator Schemas\n|--------------------------------------------------------------------------\n|\n| Joi validation schemas for Resourceful decorators. These schemas ensure\n| that decorator options to the expected shapes during runtime.\n|\n*/\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { guards } from '@nhtio/lucid-resourceful/utils'\nimport { E_INVALID_RESOURCEFUL_DECORATOR_OPTIONS } from '@nhtio/lucid-resourceful/errors'\nimport {\n  ResourcefulStringType,\n  ResourcefulDateType,\n  ResourcefulDateTimeType,\n  ResourcefulBinaryType,\n  ResourcefulNumberType,\n  ResourcefulIntegerType,\n  ResourcefulBigintType,\n  ResourcefulUnsignedIntegerType,\n  ResourcefulBooleanType,\n  ResourcefulObjectType,\n  ResourcefulArrayType,\n} from '@nhtio/lucid-resourceful/definitions'\nimport type { ObjectSchema } from '@nhtio/validation'\n\n/*\n|--------------------------------------------------------------------------\n| Validate, Normalize and Cast\n|--------------------------------------------------------------------------\n|\n| Internal utility for validating decorator options using Joi schemas.\n| Applies defaults, performs type conversions, and provides meaningful\n| error messages with context about which decorator and field failed.\n|\n*/\n\nconst joiInstanceCheckerAlternativesFactory = (Ctor: any, CtorName: string) => {\n  return [\n    joi.object().instance(Ctor),\n    joi.function().instance(Ctor),\n    joi.custom((value, helpers) => {\n      if (guards.isObject(value) && value.constructor.name === CtorName) {\n        return value\n      }\n      return helpers.error('any.invalid', { value, type: CtorName })\n    }),\n  ]\n}\n\nexport const validateNormalizeAndCastDecoratorOptions = <InputType, OutputType>(\n  fieldName: string,\n  decoratorName: string,\n  schema: ObjectSchema,\n  input: InputType\n): OutputType => {\n  const { error, value } = schema.validate(input, {\n    convert: true,\n    abortEarly: false,\n  })\n  if (error) {\n    throw new E_INVALID_RESOURCEFUL_DECORATOR_OPTIONS(decoratorName, fieldName, error)\n  }\n  return value as OutputType\n}\n\n/*\n|--------------------------------------------------------------------------\n| Base Schemas\n|--------------------------------------------------------------------------\n*/\n\nconst resourcefulPropertyDefinitionSchema = joi.object({\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n})\n\nconst resourcefulDataTypeSchema = joi.alternatives(\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulStringType, 'ResourcefulStringType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulDateType, 'ResourcefulDateType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulDateTimeType, 'ResourcefulDateTimeType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulBinaryType, 'ResourcefulBinaryType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulNumberType, 'ResourcefulNumberType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulIntegerType, 'ResourcefulIntegerType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulBigintType, 'ResourcefulBigintType'),\n  ...joiInstanceCheckerAlternativesFactory(\n    ResourcefulUnsignedIntegerType,\n    'ResourcefulUnsignedIntegerType'\n  ),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulBooleanType, 'ResourcefulBooleanType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulObjectType, 'ResourcefulObjectType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulArrayType, 'ResourcefulArrayType')\n)\n\nconst localResourcefulPropertyDefinitionSchema = resourcefulPropertyDefinitionSchema.keys({\n  type: resourcefulDataTypeSchema.required(),\n  /** Whether this column can be used in filter operations. Defaults to true. */\n  filterable: joi.boolean().default(true),\n  /** Whether this column can be used in sort operations. Defaults to true. */\n  sortable: joi.boolean().default(true),\n  /** Whether this column can be used in aggregation operations. Defaults to false. */\n  aggregatable: joi.boolean().default(false),\n  /** Whether this column is immutable. Defaults to false. */\n  immutable: joi.boolean().default(false),\n  /** The property name of the relationship which this column acts as a key for */\n  relationshipKey: joi.string().optional().allow('', null),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const resourcefulColumnDefinitionSchema = localResourcefulPropertyDefinitionSchema\n\nexport const resourcefulColumnOptionsSchema = joi.object({\n  // Lucid ColumnOptions (partial)\n  columnName: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  consume: joi.function().optional(),\n  prepare: joi.function().optional(),\n  meta: joi.object().optional(),\n  isPrimary: joi.boolean().default(false),\n  hasDefaultValue: joi.boolean().default(false),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: resourcefulDataTypeSchema.required(),\n  /** Whether this column can be used in filter operations. Defaults to true. */\n  filterable: joi.boolean().default(true),\n  /** Whether this column can be used in sort operations. Defaults to true. */\n  sortable: joi.boolean().default(true),\n  /** Whether this column can be used in aggregation operations. Defaults to false. */\n  aggregatable: joi.boolean().default(false),\n  /** Whether this column is immutable. Defaults to false. */\n  immutable: joi.boolean().default(false),\n  /** The property name of the relationship which this column acts as a key for */\n  relationshipKey: joi.string().optional().allow('', null),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Data Type Specific Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const dataTypeColumnOptionsSchema = joi.object({\n  // Lucid ColumnOptions (full) - now including 'prepare' and 'consume'\n  columnName: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  consume: joi.function().optional(),\n  prepare: joi.function().optional(),\n  meta: joi.object().optional(),\n  isPrimary: joi.boolean().default(false),\n  hasDefaultValue: joi.boolean().default(false),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: resourcefulDataTypeSchema.optional(),\n  /** Whether this column can be used in filter operations. Defaults to true. */\n  filterable: joi.boolean().default(true),\n  /** Whether this column can be used in sort operations. Defaults to true. */\n  sortable: joi.boolean().default(true),\n  /** Whether this column can be used in aggregation operations. Defaults to false. */\n  aggregatable: joi.boolean().default(false),\n  /** Whether this column is immutable. Defaults to false. */\n  immutable: joi.boolean().default(false),\n  /** The property name of the relationship which this column acts as a key for */\n  relationshipKey: joi.string().optional().allow('', null),\n})\n\nconst baseDateColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  autoCreate: joi.boolean().default(false),\n  autoUpdate: joi.boolean().default(false),\n})\n\n/*\n|--------------------------------------------------------------------------\n| String Column Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const stringColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulStringType, 'ResourcefulStringType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulStringType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Date Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const dateColumnOptionsSchema = baseDateColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulDateType, 'ResourcefulDateType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulDateType({\n          nullable: parent.nullable,\n          autoCreate: parent.autoCreate,\n          autoUpdate: parent.autoUpdate,\n        })\n    ),\n})\n\nexport const dateTimeColumnOptionsSchema = baseDateColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulDateTimeType, 'ResourcefulDateTimeType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulDateTimeType({\n          nullable: parent.nullable,\n          autoCreate: parent.autoCreate,\n          autoUpdate: parent.autoUpdate,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Binary Column Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const binaryColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBinaryType, 'ResourcefulBinaryType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBinaryType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Number Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const numberColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulNumberType, 'ResourcefulNumberType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulNumberType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const integerColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulIntegerType, 'ResourcefulIntegerType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulIntegerType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const bigintColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBigintType, 'ResourcefulBigintType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBigintType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const unsignedIntegerColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(\n        ResourcefulUnsignedIntegerType,\n        'ResourcefulUnsignedIntegerType'\n      )\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulUnsignedIntegerType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Boolean Column Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const booleanColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBooleanType, 'ResourcefulBooleanType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBooleanType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Object/Array Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const objectColumnOptionsSchema = joi.object({\n  // Lucid ColumnOptions (full)\n  columnName: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  consume: joi.function().optional(),\n  prepare: joi.function().optional(),\n  meta: joi.object().optional(),\n  isPrimary: joi.boolean().default(false),\n  hasDefaultValue: joi.boolean().default(false),\n\n  // Immutability options\n  immutable: joi.boolean().default(false),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  relationshipKey: joi.string().optional().allow('', null),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulObjectType, 'ResourcefulObjectType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulObjectType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const arrayColumnOptionsSchema = joi.object({\n  // Lucid ColumnOptions (full)\n  columnName: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  consume: joi.function().optional(),\n  prepare: joi.function().optional(),\n  meta: joi.object().optional(),\n  isPrimary: joi.boolean().default(false),\n  hasDefaultValue: joi.boolean().default(false),\n\n  // Immutability options\n  immutable: joi.boolean().default(false),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  relationshipKey: joi.string().optional().allow('', null),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulArrayType, 'ResourcefulArrayType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulArrayType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const resourcefulComputedDefinitionSchema = localResourcefulPropertyDefinitionSchema.append({\n  writable: joi.boolean().default(false),\n})\n\nexport const resourcefulComputedOptionsSchema = joi.object({\n  // Lucid ComputedOptions (partial)\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  meta: joi.object().optional(),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: resourcefulDataTypeSchema.required(),\n  writable: joi.boolean().default(false),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Data Type Specific Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const dataTypeComputedOptionsSchema = joi.object({\n  // Lucid ComputedOptions (partial) - excluding 'prepare' and 'consume'\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  meta: joi.object().optional(),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: resourcefulDataTypeSchema.optional(),\n  writeable: joi.boolean().default(false),\n})\n\nconst baseDateComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  autoCreate: joi.boolean().default(false),\n  autoUpdate: joi.boolean().default(false),\n})\n\n/*\n|--------------------------------------------------------------------------\n| String Computed Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const stringComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulStringType, 'ResourcefulStringType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulStringType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Date Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const dateComputedOptionsSchema = baseDateComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulDateType, 'ResourcefulDateType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulDateType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const dateTimeComputedOptionsSchema = baseDateComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulDateTimeType, 'ResourcefulDateTimeType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulDateTimeType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Binary Computed Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const binaryComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBinaryType, 'ResourcefulBinaryType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBinaryType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Number Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const numberComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulNumberType, 'ResourcefulNumberType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulNumberType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const integerComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulIntegerType, 'ResourcefulIntegerType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulIntegerType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const bigintComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBigintType, 'ResourcefulBigintType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBigintType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const unsignedIntegerComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(\n        ResourcefulUnsignedIntegerType,\n        'ResourcefulUnsignedIntegerType'\n      )\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulUnsignedIntegerType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Boolean Computed Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const booleanComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBooleanType, 'ResourcefulBooleanType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBooleanType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Object/Array Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const objectComputedOptionsSchema = joi.object({\n  // Lucid ComputedOptions (full)\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  meta: joi.object().optional(),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulObjectType, 'ResourcefulObjectType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulObjectType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const arrayComputedOptionsSchema = joi.object({\n  // Lucid ComputedOptions (full)\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  meta: joi.object().optional(),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulArrayType, 'ResourcefulArrayType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulArrayType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Relationship Schemas\n|--------------------------------------------------------------------------\n|\n| Joi validation schemas for relationship decorator options. These schemas\n| combine Lucid relationship options with resourceful relationship options.\n|\n*/\n\n// Base schema for resourceful relationship options\nexport const resourcefulRelationshipOptionsSchema = joi.object({\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n})\n\n// Schema for belongsTo, hasOne, hasMany relationships\nexport const relationOptionsSchema = resourcefulRelationshipOptionsSchema.keys({\n  // Lucid RelationOptions\n  localKey: joi.string().optional(),\n  foreignKey: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  onQuery: joi.function().optional(),\n  relatedModel: joi.function(),\n})\n\n// Schema for manyToMany relationships\nexport const manyToManyRelationOptionsSchema = resourcefulRelationshipOptionsSchema.keys({\n  // Lucid ManyToManyRelationOptions\n  localKey: joi.string().optional(),\n  relatedKey: joi.string().optional(),\n  pivotForeignKey: joi.string().optional(),\n  pivotRelatedForeignKey: joi.string().optional(),\n  pivotTable: joi.string().optional(),\n  pivotTimestamps: joi.boolean().optional(),\n  pivotColumns: joi.array().items(joi.string()).optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  onQuery: joi.function().optional(),\n  relatedModel: joi.function(),\n})\n\n// Schema for hasManyThrough relationships\nexport const hasManyThroughRelationOptionsSchema = resourcefulRelationshipOptionsSchema.keys({\n  // Lucid HasManyThroughRelationOptions (ThroughRelationOptions without throughModel)\n  localKey: joi.string().optional(),\n  foreignKey: joi.string().optional(),\n  throughLocalKey: joi.string().optional(),\n  throughForeignKey: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  onQuery: joi.function().optional(),\n  relatedModel: joi.function(),\n})\n","/*\n|--------------------------------------------------------------------------\n| Decorators for Resourceful Lucid Models\n|--------------------------------------------------------------------------\n|\n| Decorators which are used to add the required metadata to Lucid models\n| which have been extended with the Resourceful mixin.\n|\n*/\n\n/*\n|--------------------------------------------------------------------------\n| NOTE FOR FUTURE MAINTAINERS\n|--------------------------------------------------------------------------\n|\n| The `type` property for resourceful decorators (e.g., resourcefulColumn, resourcefulComputed)\n| must always be a ResourcefulDataType instance (e.g., ResourcefulStringType(), ResourcefulNumberType(), etc.),\n| not a string literal like 'string' or 'number'.\n| This is required because the system expects a structured data type definition with validation,\n| format, and other metadata, not just a primitive string. See src/private/data_types.ts for details.\n|\n*/\n\nimport { guards } from '@nhtio/lucid-resourceful/utils'\nimport {\n  PrepareConsumeChainBuilder,\n  DefaultPrepareFunction,\n  DefaultConsumeFunction,\n} from './prepare_consume_chain_builder'\nimport {\n  LucidModel,\n  ColumnOptions,\n  ComputedOptions,\n  DateColumnDecorator,\n  DateTimeColumnDecorator,\n} from '@adonisjs/lucid/types/model'\nimport {\n  column as lucidColumn,\n  computed as lucidComputed,\n  belongsTo as lucidBelongsTo,\n  hasOne as lucidHasOne,\n  hasMany as lucidHasMany,\n  manyToMany as lucidManyToMany,\n  hasManyThrough as lucidHasManyThrough,\n} from '@adonisjs/lucid/orm'\nimport {\n  prepareString,\n  prepareDate,\n  prepareDateTime,\n  prepareBinary,\n  prepareNumber,\n  prepareInteger,\n  prepareBigint,\n  prepareUnsignedint,\n  prepareBoolean,\n  prepareObject,\n  prepareArray,\n  consumeString,\n  consumeDate,\n  consumeDateTime,\n  consumeBinary,\n  consumeNumber,\n  consumeInteger,\n  consumeBigint,\n  consumeUnsignedint,\n  consumeBoolean,\n  consumeObject,\n  consumeArray,\n} from './decorator_utils'\nimport {\n  validateNormalizeAndCastDecoratorOptions,\n  resourcefulColumnOptionsSchema,\n  stringColumnOptionsSchema,\n  dateColumnOptionsSchema,\n  dateTimeColumnOptionsSchema,\n  binaryColumnOptionsSchema,\n  numberColumnOptionsSchema,\n  integerColumnOptionsSchema,\n  bigintColumnOptionsSchema,\n  unsignedIntegerColumnOptionsSchema,\n  booleanColumnOptionsSchema,\n  objectColumnOptionsSchema,\n  arrayColumnOptionsSchema,\n  resourcefulComputedOptionsSchema,\n  stringComputedOptionsSchema,\n  dateComputedOptionsSchema,\n  dateTimeComputedOptionsSchema,\n  binaryComputedOptionsSchema,\n  numberComputedOptionsSchema,\n  integerComputedOptionsSchema,\n  bigintComputedOptionsSchema,\n  unsignedIntegerComputedOptionsSchema,\n  booleanComputedOptionsSchema,\n  objectComputedOptionsSchema,\n  arrayComputedOptionsSchema,\n  relationOptionsSchema,\n  manyToManyRelationOptionsSchema,\n  hasManyThroughRelationOptionsSchema,\n} from './decorator_schemas'\nimport type {\n  HasOne,\n  ManyToMany,\n  HasManyThrough,\n  ManyToManyRelationOptions,\n  RelationOptions,\n  ThroughRelationOptions,\n} from '@adonisjs/lucid/types/relations'\nimport type {\n  ResourcefulColumnDefinition,\n  ResourcefulComputedAccessorDefinition,\n  ResourcefulRelationshipDefinition,\n  AnySchema,\n  StringSchema,\n  DateSchema,\n  BinarySchema,\n  NumberSchema,\n  BooleanSchema,\n  ObjectSchema,\n  ArraySchema,\n  ResourcefulPropertySchema,\n} from '@nhtio/lucid-resourceful/types'\n\n/**\n * Options for date columns including autoCreate and autoUpdate flags.\n *\n * @example\n * ```ts\n * {\n *   autoCreate: true,\n *   autoUpdate: false,\n *   nullable: false,\n * }\n * ```\n */\nexport type DateColumnOptions = DataTypeColumnOptions & {\n  autoCreate: boolean\n  autoUpdate: boolean\n}\n\n/**\n * Options for relation decorators on related models.\n *\n * @example\n * ```ts\n * import { resourcefulBelongsTo } from '@nhtio/lucid-resourceful'\n *\n * class Post {\n *   @resourcefulBelongsTo(() => User, { foreignKey: 'user_id' })\n *   public user: User\n * }\n * ```\n */\nexport type RelatedModelRelationOptions<RelatedModel extends LucidModel> =\n  | RelationOptions<RelatedModel, LucidModel, HasOne<RelatedModel, LucidModel>>\n  | ManyToManyRelationOptions<ManyToMany<RelatedModel>>\n  | Omit<\n      ThroughRelationOptions<RelatedModel, LucidModel, HasManyThrough<RelatedModel>>,\n      'throughModel'\n    >\n\n/**\n * Options for hasManyThrough relation decorators.\n *\n * @example\n * ```ts\n * import { resourcefulHasManyThrough } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulHasManyThrough([\n *     () => Role,\n *     () => UserRolePivot\n *   ], { foreignKey: 'user_id' })\n *   public roles: HasManyThrough<typeof Role>\n * }\n * ```\n */\nexport type HasManyThroughRelationOptions<RelatedModel extends LucidModel> = Omit<\n  ThroughRelationOptions<RelatedModel, LucidModel, HasManyThrough<RelatedModel>>,\n  'throughModel'\n>\n\ntype ValidatorInput<Schema extends AnySchema = AnySchema> = Partial<DataTypeColumnOptions> &\n  Partial<ResourcefulColumnDefinition<Schema>>\ntype ValidatorOutnput<Schema extends AnySchema = AnySchema> = DataTypeColumnOptions &\n  ResourcefulColumnDefinition<Schema>\n\ninterface ColumnOptionsWithDate extends ColumnOptions {\n  autoCreate: boolean\n  autoUpdate: boolean\n}\n\nconst extractLucidOptionsForLucidDecorator = <\n  LucidDecoratorOptionsType,\n  InputOptionsType extends LucidDecoratorOptionsType = LucidDecoratorOptionsType,\n>(\n  options: InputOptionsType,\n  keys: Array<keyof LucidDecoratorOptionsType>,\n  overrides?: Partial<LucidDecoratorOptionsType>\n): Partial<LucidDecoratorOptionsType> => {\n  const extracted: Partial<LucidDecoratorOptionsType> = {}\n  Object.entries(options as {}).forEach((entry) => {\n    const [key, value] = entry as [keyof InputOptionsType, InputOptionsType[keyof InputOptionsType]]\n    if (keys.includes(key as keyof LucidDecoratorOptionsType)) {\n      const k = key as keyof LucidDecoratorOptionsType\n      const v = value as unknown as LucidDecoratorOptionsType[keyof LucidDecoratorOptionsType]\n      extracted[k] = v\n    }\n  })\n  if (guards.isObject(overrides)) {\n    Object.assign(extracted, overrides)\n  }\n  return extracted\n}\n\nconst extractLucidOptionsForLucidColumnDecorator = (\n  options: Partial<ColumnOptionsWithDate>,\n  overrides?: Partial<ColumnOptionsWithDate>\n) => {\n  return extractLucidOptionsForLucidDecorator<Partial<ColumnOptionsWithDate>>(\n    options,\n    [\n      'columnName',\n      'serializeAs',\n      'isPrimary',\n      'meta',\n      'serialize',\n      'prepare',\n      'consume',\n      'autoCreate',\n      'autoUpdate',\n    ],\n    overrides\n  )\n}\n\nconst extractLucidOptionsForLucidComputedDecorator = (\n  options: Partial<ComputedOptions>,\n  overrides?: Partial<ComputedOptions>\n) => {\n  return extractLucidOptionsForLucidDecorator<Partial<ComputedOptions>>(\n    options,\n    ['serializeAs', 'meta'],\n    overrides\n  )\n}\n\nconst extractLucidOptionsForLucidRelatedModelDecorator = <RelatedModel extends LucidModel>(\n  options: Partial<RelatedModelRelationOptions<RelatedModel>>,\n  overrides?: Partial<RelatedModelRelationOptions<RelatedModel>>\n) => {\n  return extractLucidOptionsForLucidDecorator<Partial<RelatedModelRelationOptions<RelatedModel>>>(\n    options,\n    [\n      'localKey',\n      'foreignKey',\n      'serializeAs',\n      'onQuery',\n      'meta',\n      'pivotTable',\n      'localKey',\n      'pivotForeignKey',\n      'relatedKey',\n      'pivotRelatedForeignKey',\n      'pivotColumns',\n      'pivotTimestamps',\n      'throughLocalKey',\n      'throughForeignKey',\n    ] as any,\n    overrides\n  )\n}\n\nconst extractLucidOptionsForLucidHasManyThroughDecorator = <RelatedModel extends LucidModel>(\n  options: Partial<HasManyThroughRelationOptions<RelatedModel>>,\n  overrides?: Partial<HasManyThroughRelationOptions<RelatedModel>>\n) => {\n  return extractLucidOptionsForLucidDecorator<Partial<HasManyThroughRelationOptions<RelatedModel>>>(\n    options,\n    [\n      'localKey',\n      'foreignKey',\n      'serializeAs',\n      'onQuery',\n      'meta',\n      'pivotTable',\n      'localKey',\n      'pivotForeignKey',\n      'relatedKey',\n      'pivotRelatedForeignKey',\n      'pivotColumns',\n      'pivotTimestamps',\n      'throughLocalKey',\n      'throughForeignKey',\n    ] as any,\n    overrides\n  )\n}\n\nconst handleResourcefulColumn = <Schema extends AnySchema = ResourcefulPropertySchema>(config: {\n  decoratorName: string\n  target: any\n  propertyKey: string\n  decoratorOption: Partial<ResourcefulColumnDefinition<Schema>>\n  decoratorOptionsValidationSchema: ObjectSchema\n  lucidDecoratorFunction: typeof lucidColumn | DateColumnDecorator | DateTimeColumnDecorator\n  overrides?: Partial<ColumnOptions>\n  defaultPrepare?: DefaultPrepareFunction\n  defaultConsume?: DefaultConsumeFunction\n}) => {\n  const {\n    decoratorName,\n    target,\n    propertyKey,\n    decoratorOption,\n    decoratorOptionsValidationSchema,\n    overrides = {},\n    lucidDecoratorFunction,\n    defaultPrepare,\n    defaultConsume,\n  } = config\n  /*\n    |--------------------------------------------------------------------------\n    | Fields which are auto created/updated are always nullable\n    |--------------------------------------------------------------------------\n    */\n  decoratorOption.nullable =\n    decoratorOption.nullable === true ||\n    ('autoCreate' in decoratorOption && decoratorOption.autoCreate === true) ||\n    ('autoUpdate' in decoratorOption && decoratorOption.autoUpdate === true) ||\n    false\n  /*\n    |--------------------------------------------------------------------------\n    | - If the name of the field is `createdAt` or `created_at` and `immutable`\n    | is not explicitly set, set `immutable` to true\n    | - If the field is autoCreated. but not autoUpdated and `immutable` is \n    | not explicitly set, set `immutable` to true\n    | - If the property key is the model's primary key and `immutable` is not\n    | explicitly set, set `immutable` to true\n    |--------------------------------------------------------------------------\n    | This is a helper to reduce boilerplate code and make it less likely that\n    | fields which developers commonly intend to be immutable are accidentally\n    | made mutable.\n    */\n  if (\n    !('immutable' in decoratorOption) &&\n    (propertyKey === 'createdAt' ||\n      propertyKey === 'created_at' ||\n      ('autoCreate' in decoratorOption &&\n        decoratorOption.autoCreate === true &&\n        (!('autoUpdate' in decoratorOption) || decoratorOption.autoUpdate === false)) ||\n      ('isPrimary' in decoratorOption && decoratorOption.isPrimary === true))\n  ) {\n    decoratorOption.immutable = true\n  } else {\n    /*\n    |--------------------------------------------------------------------------\n    | Ensure that immutability is explicitly set to false if not true\n    |--------------------------------------------------------------------------\n    */\n    decoratorOption.immutable = decoratorOption.immutable || false\n  }\n  const opts = validateNormalizeAndCastDecoratorOptions<\n    Partial<ResourcefulColumnDefinition<Schema>>,\n    ResourcefulColumnDefinition<Schema>\n  >(propertyKey, decoratorName, decoratorOptionsValidationSchema, {\n    ...decoratorOption,\n    propertyKey,\n  })\n  const customPrepare = opts.prepare\n  const customConsume = opts.consume\n  const nullable = opts.nullable || false\n\n  // Create chained functions using PrepareConsumeChainBuilder\n  const chainedPrepare = PrepareConsumeChainBuilder.chainPrepare(\n    propertyKey,\n    nullable,\n    defaultPrepare,\n    customPrepare\n  )\n  const chainedConsume = PrepareConsumeChainBuilder.chainConsume(\n    propertyKey,\n    nullable,\n    defaultConsume,\n    customConsume\n  )\n\n  // Merge DataTypeColumnOptions for Lucid, excluding prepare/consume from opts\n  const lucidOptions = extractLucidOptionsForLucidColumnDecorator(\n    opts as unknown as Partial<ColumnOptions>,\n    {\n      ...overrides,\n      ...(chainedPrepare && { prepare: chainedPrepare }),\n      ...(chainedConsume && { consume: chainedConsume }),\n    }\n  )\n\n  lucidDecoratorFunction(lucidOptions)(target, propertyKey)\n\n  const map = ensureOwnResourcefulMap(target, '$resourcefulColumns')\n  map.set(propertyKey, opts)\n}\n\nconst handleResourcefulComputed = <Schema extends AnySchema = ResourcefulPropertySchema>(config: {\n  decoratorName: string\n  target: any\n  propertyKey: string\n  decoratorOption: Partial<ResourcefulComputedAccessorDefinition<Schema>>\n  decoratorOptionsValidationSchema: ObjectSchema\n}) => {\n  const { decoratorName, target, propertyKey, decoratorOption, decoratorOptionsValidationSchema } =\n    config\n  const opts = validateNormalizeAndCastDecoratorOptions<\n    Partial<ResourcefulComputedAccessorDefinition<Schema>>,\n    ResourcefulComputedAccessorDefinition<Schema>\n  >(propertyKey, decoratorName, decoratorOptionsValidationSchema, {\n    ...decoratorOption,\n    propertyKey,\n  })\n  // Merge DataTypeComputedOptions for Lucid\n  const lucidOptions = extractLucidOptionsForLucidComputedDecorator(\n    opts as unknown as Partial<ComputedOptions>\n  )\n\n  lucidComputed(lucidOptions)(target, propertyKey)\n\n  const map = ensureOwnResourcefulMap(target, '$resourcefulComputedAccessors')\n  map.set(propertyKey, opts)\n}\n\nfunction ensureOwnResourcefulMap(target: any, mapKey: string) {\n  const ctor = target.constructor\n  if (!Object.prototype.hasOwnProperty.call(ctor, mapKey)) {\n    ctor[mapKey] = new Map()\n  }\n  return ctor[mapKey]\n}\n\nexport type DataTypeColumnOptions = ColumnOptions\n\nexport type DataTypeComputedOptions = Omit<ComputedOptions, 'prepare' | 'consume'>\n\n/**\n * Decorator to define a resourceful column on a Lucid model property.\n * Applies validation, metadata, and Lucid column options.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulStringType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn({ type: ResourcefulStringType({ minLength: 1, maxLength: 100 }), nullable: false })\n *   public name: string\n * }\n * ```\n *\n * @param options - Resourceful column options and Lucid column options.\n * @returns Property decorator function.\n */\nexport function resourcefulColumn<Schema extends AnySchema = ResourcefulPropertySchema>(\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<Schema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn'\n  const decoratorOptionsValidationSchema = resourcefulColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<\n      ValidatorInput<Schema>,\n      ValidatorOutnput<Schema>\n    >(propertyKey, decoratorName, decoratorOptionsValidationSchema, { ...options, propertyKey })\n    const lucidOptions = extractLucidOptionsForLucidColumnDecorator(opts)\n\n    lucidColumn(lucidOptions)(target, propertyKey)\n\n    const map = ensureOwnResourcefulMap(target, '$resourcefulColumns')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful string column on a Lucid model property.\n * Includes prepare and consume functions for string type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulStringType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.string({ type: ResourcefulStringType({ minLength: 3 }), nullable: false })\n *   public email: string\n * }\n * ```\n *\n * @param options - Resourceful string column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.string = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<StringSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.string'\n  const decoratorOptionsValidationSchema = stringColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareString as DefaultPrepareFunction,\n      defaultConsume: consumeString as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful date column on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulDateType } from '@nhtio/lucid-resourceful'\n *\n * class Event {\n *   @resourcefulColumn.date({ type: ResourcefulDateType(), autoCreate: true, autoUpdate: false })\n *   public startDate: Date\n * }\n * ```\n *\n * @param options - Resourceful date column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.date = function (\n  options: Partial<DateColumnOptions> & Partial<ResourcefulColumnDefinition<DateSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.date'\n  const decoratorOptionsValidationSchema = dateColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn.date,\n      defaultPrepare: prepareDate as DefaultPrepareFunction,\n      defaultConsume: consumeDate as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful dateTime column on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulDateTimeType } from '@nhtio/lucid-resourceful'\n *\n * class Event {\n *   @resourcefulColumn.dateTime({ type: ResourcefulDateTimeType(), autoCreate: true, autoUpdate: true })\n *   public updatedAt: Date\n * }\n * ```\n *\n * @param options - Resourceful dateTime column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.dateTime = function (\n  options: Partial<DateColumnOptions> & Partial<ResourcefulColumnDefinition<DateSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.dateTime'\n  const decoratorOptionsValidationSchema = dateTimeColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn.dateTime,\n      defaultPrepare: prepareDateTime as DefaultPrepareFunction,\n      defaultConsume: consumeDateTime as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful binary column on a Lucid model property.\n * Includes prepare and consume functions for binary type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulBinaryType } from '@nhtio/lucid-resourceful'\n *\n * class File {\n *   @resourcefulColumn.binary({ type: ResourcefulBinaryType(), nullable: true })\n *   public data: Buffer\n * }\n * ```\n *\n * @param options - Resourceful binary column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.binary = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<BinarySchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.binary'\n  const decoratorOptionsValidationSchema = binaryColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareBinary as DefaultPrepareFunction,\n      defaultConsume: consumeBinary as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful number column on a Lucid model property.\n * Includes prepare and consume functions for number type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulNumberType } from '@nhtio/lucid-resourceful'\n *\n * class Product {\n *   @resourcefulColumn.number({ type: ResourcefulNumberType(), nullable: false })\n *   public price: number\n * }\n * ```\n *\n * @param options - Resourceful number column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.number = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.number'\n  const decoratorOptionsValidationSchema = numberColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareNumber as DefaultPrepareFunction,\n      defaultConsume: consumeNumber as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful integer column on a Lucid model property.\n * Includes prepare and consume functions for integer type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulIntegerType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.integer({ type: ResourcefulIntegerType(), nullable: false })\n *   public age: number\n * }\n * ```\n *\n * @param options - Resourceful integer column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.integer = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.integer'\n  const decoratorOptionsValidationSchema = integerColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareInteger as DefaultPrepareFunction,\n      defaultConsume: consumeInteger as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful bigint column on a Lucid model property.\n * Includes prepare and consume functions for bigint type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulBigintType } from '@nhtio/lucid-resourceful'\n *\n * class Transaction {\n *   @resourcefulColumn.bigint({ type: ResourcefulBigintType(), nullable: false })\n *   public bigValue: bigint\n * }\n * ```\n *\n * @param options - Resourceful bigint column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.bigint = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.bigint'\n  const decoratorOptionsValidationSchema = bigintColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareBigint as DefaultPrepareFunction,\n      defaultConsume: consumeBigint as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful unsigned integer column on a Lucid model property.\n * Includes prepare and consume functions for unsigned integer type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulUnsignedIntegerType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.unsignedint({ type: ResourcefulUnsignedIntegerType(), nullable: false })\n *   public positiveCount: number\n * }\n * ```\n *\n * @param options - Resourceful unsigned integer column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.unsignedint = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.unsignedint'\n  const decoratorOptionsValidationSchema = unsignedIntegerColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareUnsignedint as DefaultPrepareFunction,\n      defaultConsume: consumeUnsignedint as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful boolean column on a Lucid model property.\n * Includes prepare and consume functions for boolean type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulBooleanType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.boolean({ type: ResourcefulBooleanType(), nullable: false })\n *   public isActive: boolean\n * }\n * ```\n *\n * @param options - Resourceful boolean column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.boolean = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<BooleanSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.boolean'\n  const decoratorOptionsValidationSchema = booleanColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareBoolean as DefaultPrepareFunction,\n      defaultConsume: consumeBoolean as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful object column on a Lucid model property.\n * Includes prepare and consume functions for object type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulObjectType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.object({ type: ResourcefulObjectType(), nullable: true })\n *   public metadata: object\n * }\n * ```\n *\n * @param options - Resourceful object column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.object = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<ObjectSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.object'\n  const decoratorOptionsValidationSchema = objectColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareObject as DefaultPrepareFunction,\n      defaultConsume: consumeObject as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful array column on a Lucid model property.\n * Includes prepare and consume functions for array type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulArrayType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.array({ type: ResourcefulArrayType({ items: { type: 'string' } }), nullable: true })\n *   public tags: any[]\n * }\n * ```\n *\n * @param options - Resourceful array column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.array = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<ArraySchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.array'\n  const decoratorOptionsValidationSchema = arrayColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareArray as DefaultPrepareFunction,\n      defaultConsume: consumeArray as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful computed accessor on a Lucid model property.\n * Applies validation, metadata, and Lucid computed options.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulStringType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed({ type: ResourcefulStringType({ minLength: 1, maxLength: 100 }) })\n *   public get fullName() {\n *     return `${this.firstName} ${this.lastName}`\n *   }\n * }\n * ```\n *\n * @param options - Resourceful computed accessor options and Lucid computed options.\n * @returns Property decorator function.\n */\nexport function resourcefulComputed<Schema extends AnySchema = ResourcefulPropertySchema>(\n  options: Partial<ComputedOptions> & Partial<ResourcefulComputedAccessorDefinition<Schema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed'\n  const decoratorOptionsValidationSchema = resourcefulComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<\n      ValidatorInput<Schema>,\n      ValidatorOutnput<Schema>\n    >(propertyKey, decoratorName, decoratorOptionsValidationSchema, { ...options, propertyKey })\n    const lucidOptions = extractLucidOptionsForLucidComputedDecorator(opts)\n\n    lucidComputed(lucidOptions)(target, propertyKey)\n\n    const map = ensureOwnResourcefulMap(target, '$resourcefulComputedAccessors')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful string computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulStringType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.string({ type: ResourcefulStringType({ minLength: 3 }) })\n *   public get displayName() {\n *     return this.name.toUpperCase()\n *   }\n * }\n * ```\n *\n * @param options - Resourceful string computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.string = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<StringSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.string'\n  const decoratorOptionsValidationSchema = stringComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful date computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulDateType } from '@nhtio/lucid-resourceful'\n *\n * class Event {\n *   @resourcefulComputed.date({ type: ResourcefulDateType() })\n *   public get eventDate() {\n *     return this._eventDate\n *   }\n * }\n * ```\n *\n * @param options - Resourceful date computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.date = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<DateSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.date'\n  const decoratorOptionsValidationSchema = dateComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful dateTime computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulDateTimeType } from '@nhtio/lucid-resourceful'\n *\n * class Event {\n *   @resourcefulComputed.dateTime({ type: ResourcefulDateTimeType() })\n *   public get updatedAt() {\n *     return this._updatedAt\n *   }\n * }\n * ```\n *\n * @param options - Resourceful dateTime computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.dateTime = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<DateSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.dateTime'\n  const decoratorOptionsValidationSchema = dateTimeComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful binary computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulBinaryType } from '@nhtio/lucid-resourceful'\n *\n * class File {\n *   @resourcefulComputed.binary({ type: ResourcefulBinaryType() })\n *   public get fileData() {\n *     return this._fileData\n *   }\n * }\n * ```\n *\n * @param options - Resourceful binary computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.binary = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<BinarySchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.binary'\n  const decoratorOptionsValidationSchema = binaryComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful number computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulNumberType } from '@nhtio/lucid-resourceful'\n *\n * class Product {\n *   @resourcefulComputed.number({ type: ResourcefulNumberType() })\n *   public get discountedPrice() {\n *     return this.price * 0.9\n *   }\n * }\n * ```\n *\n * @param options - Resourceful number computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.number = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.number'\n  const decoratorOptionsValidationSchema = numberComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful integer computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulIntegerType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.integer({ type: ResourcefulIntegerType() })\n *   public get roundedAge() {\n *     return Math.floor(this.age)\n *   }\n * }\n * ```\n *\n * @param options - Resourceful integer computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.integer = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.integer'\n  const decoratorOptionsValidationSchema = integerComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful bigint computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulBigintType } from '@nhtio/lucid-resourceful'\n *\n * class Transaction {\n *   @resourcefulComputed.bigint({ type: ResourcefulBigintType() })\n *   public get bigValue() {\n *     return this._bigValue\n *   }\n * }\n * ```\n *\n * @param options - Resourceful bigint computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.bigint = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.bigint'\n  const decoratorOptionsValidationSchema = bigintComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful unsigned integer computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulUnsignedIntegerType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.unsignedint({ type: ResourcefulUnsignedIntegerType() })\n *   public get positiveCount() {\n *     return this._positiveCount\n *   }\n * }\n * ```\n *\n * @param options - Resourceful unsigned integer computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.unsignedint = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.unsignedint'\n  const decoratorOptionsValidationSchema = unsignedIntegerComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful boolean computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulBooleanType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.boolean({ type: ResourcefulBooleanType() })\n *   public get isActive() {\n *     return this._isActive\n *   }\n * }\n * ```\n *\n * @param options - Resourceful boolean computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.boolean = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<BooleanSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.boolean'\n  const decoratorOptionsValidationSchema = booleanComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful object computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulObjectType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.object({ type: ResourcefulObjectType() })\n *   public get metadata() {\n *     return this._metadata\n *   }\n * }\n * ```\n *\n * @param options - Resourceful object computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.object = function (\n  options: Partial<ComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<ObjectSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.object'\n  const decoratorOptionsValidationSchema = objectComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful array computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulArrayType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.array({ type: ResourcefulArrayType({ items: { type: 'string' } }) })\n *   public get tags() {\n *     return this._tags\n *   }\n * }\n * ```\n *\n * @param options - Resourceful array computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.array = function (\n  options: Partial<ComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<ArraySchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.array'\n  const decoratorOptionsValidationSchema = arrayComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful belongsTo relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulBelongsTo } from '@nhtio/lucid-resourceful'\n *\n * class Post {\n *   @resourcefulBelongsTo(() => User, { foreignKey: 'user_id' })\n *   public user: User\n * }\n * ```\n *\n * @param model - Function returning the related model class.\n * @param options - Relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulBelongsTo<RelatedModel extends LucidModel>(\n  model: () => RelatedModel,\n  options: Partial<RelationOptions<RelatedModel, LucidModel, HasOne<RelatedModel, LucidModel>>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulBelongsTo',\n      relationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model }\n    )\n    const lucidOptions = extractLucidOptionsForLucidRelatedModelDecorator(opts)\n    lucidBelongsTo(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful hasOne relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulHasOne } from '@nhtio/lucid-resourceful'\n *\n * class UserProfile {\n *   @resourcefulHasOne(() => User, { foreignKey: 'user_id' })\n *   public user: UserProfile\n * }\n * ```\n *\n * @param model - Function returning the related model class.\n * @param options - Relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulHasOne<RelatedModel extends LucidModel>(\n  model: () => RelatedModel,\n  options: Partial<RelationOptions<RelatedModel, LucidModel, HasOne<RelatedModel, LucidModel>>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulHasOne',\n      relationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model }\n    )\n    const lucidOptions = extractLucidOptionsForLucidRelatedModelDecorator(opts)\n    lucidHasOne(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful hasMany relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulHasMany } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulHasMany(() => Post, { foreignKey: 'user_id' })\n *   public posts: HasMany<typeof Post>\n * }\n * ```\n *\n * @param model - Function returning the related model class.\n * @param options - Relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulHasMany<RelatedModel extends LucidModel>(\n  model: () => RelatedModel,\n  options: Partial<RelationOptions<RelatedModel, LucidModel, HasOne<RelatedModel, LucidModel>>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulHasMany',\n      relationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model }\n    )\n    const lucidOptions = extractLucidOptionsForLucidRelatedModelDecorator(opts)\n    lucidHasMany(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful manyToMany relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulManyToMany } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulManyToMany(() => Role, { pivotTable: 'role_user' })\n *   public roles: ManyToMany<typeof Role>\n * }\n * ```\n *\n * @param model - Function returning the related model class.\n * @param options - ManyToMany relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulManyToMany<RelatedModel extends LucidModel>(\n  model: () => RelatedModel,\n  options: Partial<ManyToManyRelationOptions<ManyToMany<RelatedModel>>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulManyToMany',\n      manyToManyRelationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model }\n    )\n    const lucidOptions = extractLucidOptionsForLucidRelatedModelDecorator(opts)\n    lucidManyToMany(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful hasManyThrough relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulHasManyThrough } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulHasManyThrough([\n *     () => Role,\n *     () => UserRolePivot\n *   ], { foreignKey: 'user_id' })\n *   public roles: HasManyThrough<typeof Role>\n * }\n * ```\n *\n * @param model - Tuple of functions returning the related model and through model classes.\n * @param options - HasManyThrough relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulHasManyThrough<RelatedModel extends LucidModel>(\n  model: [() => RelatedModel, () => LucidModel],\n  options: Partial<HasManyThroughRelationOptions<RelatedModel>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulHasManyThrough',\n      hasManyThroughRelationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model[0] }\n    )\n    const lucidOptions = extractLucidOptionsForLucidHasManyThroughDecorator(opts)\n    lucidHasManyThrough(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n","import { OpenAPIV3 } from 'openapi-types'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport type { AlternativesSchema, ObjectSchema } from '@nhtio/lucid-resourceful/joi'\n\n// Helper schemas for reusable components\nconst ReferenceObjectSchema = joi.object<OpenAPIV3.ReferenceObject>({\n  $ref: joi.string().required(),\n})\n\nconst ExternalDocumentationObjectSchema = joi.object<OpenAPIV3.ExternalDocumentationObject>({\n  description: joi.string().optional(),\n  url: joi.string().uri().required(),\n})\n\nconst ContactObjectSchema = joi.object<OpenAPIV3.ContactObject>({\n  name: joi.string().optional(),\n  url: joi.string().uri().optional(),\n  email: joi.string().email().optional(),\n})\n\nconst LicenseObjectSchema = joi.object<OpenAPIV3.LicenseObject>({\n  name: joi.string().required(),\n  url: joi.string().uri().optional(),\n})\n\nconst InfoObjectSchema = joi.object<OpenAPIV3.InfoObject>({\n  title: joi.string().required(),\n  description: joi.string().optional(),\n  termsOfService: joi.string().optional(),\n  contact: ContactObjectSchema.optional(),\n  license: LicenseObjectSchema.optional(),\n  version: joi.string().required(),\n})\n\nconst ServerVariableObjectSchema = joi.object<OpenAPIV3.ServerVariableObject>({\n  enum: joi.array().items(joi.string()).optional(),\n  default: joi.string().required(),\n  description: joi.string().optional(),\n})\n\nconst ServerObjectSchema = joi.object<OpenAPIV3.ServerObject>({\n  url: joi.string().required(),\n  description: joi.string().optional(),\n  variables: joi.object().pattern(joi.string(), ServerVariableObjectSchema).optional(),\n})\n\nconst XMLObjectSchema = joi.object<OpenAPIV3.XMLObject>({\n  name: joi.string().optional(),\n  namespace: joi.string().optional(),\n  prefix: joi.string().optional(),\n  attribute: joi.boolean().optional(),\n  wrapped: joi.boolean().optional(),\n})\n\nconst DiscriminatorObjectSchema = joi.object<OpenAPIV3.DiscriminatorObject>({\n  propertyName: joi.string().required(),\n  mapping: joi.object().pattern(joi.string(), joi.string()).optional(),\n})\n\nconst ExampleObjectSchema = joi.object<OpenAPIV3.ExampleObject>({\n  summary: joi.string().optional(),\n  description: joi.string().optional(),\n  value: joi.any().optional(),\n  externalValue: joi.string().optional(),\n})\n\n// Forward declare schemas that will be defined later for circular references\nlet SchemaObjectSchema: AlternativesSchema<OpenAPIV3.SchemaObject>\nlet MediaTypeObjectSchema: ObjectSchema<OpenAPIV3.MediaTypeObject>\nlet PathItemObjectSchema: ObjectSchema<OpenAPIV3.PathItemObject>\nlet CallbackObjectSchema: ObjectSchema<OpenAPIV3.CallbackObject>\n\n// Define base schema object without recursive references first\nconst BaseSchemaObjectProperties = {\n  title: joi.string().optional(),\n  description: joi.string().optional(),\n  format: joi.string().optional(),\n  default: joi.any().optional(),\n  multipleOf: joi.number().optional(),\n  maximum: joi.number().optional(),\n  exclusiveMaximum: joi.boolean().optional(),\n  minimum: joi.number().optional(),\n  exclusiveMinimum: joi.boolean().optional(),\n  maxLength: joi.number().integer().min(0).optional(),\n  minLength: joi.number().integer().min(0).optional(),\n  pattern: joi.string().optional(),\n  maxItems: joi.number().integer().min(0).optional(),\n  minItems: joi.number().integer().min(0).optional(),\n  uniqueItems: joi.boolean().optional(),\n  maxProperties: joi.number().integer().min(0).optional(),\n  minProperties: joi.number().integer().min(0).optional(),\n  required: joi.array().items(joi.string()).optional(),\n  enum: joi.array().optional(),\n  nullable: joi.boolean().optional(),\n  discriminator: DiscriminatorObjectSchema.optional(),\n  readOnly: joi.boolean().optional(),\n  writeOnly: joi.boolean().optional(),\n  xml: XMLObjectSchema.optional(),\n  externalDocs: ExternalDocumentationObjectSchema.optional(),\n  example: joi.any().optional(),\n  deprecated: joi.boolean().optional(),\n}\n\n// Schema Object - defined with link references\nSchemaObjectSchema = joi\n  .alternatives<OpenAPIV3.SchemaObject>()\n  .try(\n    // ArraySchemaObject\n    joi.object<OpenAPIV3.ArraySchemaObject>({\n      type: joi.string().valid('array').required(),\n      items: joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')).required(),\n      ...BaseSchemaObjectProperties,\n      additionalProperties: joi\n        .alternatives()\n        .try(joi.boolean(), ReferenceObjectSchema, joi.link('#schemaObject'))\n        .optional(),\n      properties: joi\n        .object()\n        .pattern(\n          joi.string(),\n          joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject'))\n        )\n        .optional(),\n      allOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      oneOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      anyOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      not: joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')).optional(),\n    }),\n    // NonArraySchemaObject\n    joi.object<OpenAPIV3.NonArraySchemaObject>({\n      type: joi.string().valid('boolean', 'object', 'number', 'string', 'integer').optional(),\n      ...BaseSchemaObjectProperties,\n      additionalProperties: joi\n        .alternatives()\n        .try(joi.boolean(), ReferenceObjectSchema, joi.link('#schemaObject'))\n        .optional(),\n      properties: joi\n        .object()\n        .pattern(\n          joi.string(),\n          joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject'))\n        )\n        .optional(),\n      allOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      oneOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      anyOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      not: joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')).optional(),\n    })\n  )\n  .id('schemaObject') as AlternativesSchema<OpenAPIV3.SchemaObject>\n\nconst SchemaOrReferenceObjectSchema = joi\n  .alternatives<OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>()\n  .try(ReferenceObjectSchema, SchemaObjectSchema)\n\nconst HeaderObjectSchema = joi.object<OpenAPIV3.HeaderObject>({\n  description: joi.string().optional(),\n  required: joi.boolean().optional(),\n  deprecated: joi.boolean().optional(),\n  allowEmptyValue: joi.boolean().optional(),\n  style: joi.string().optional(),\n  explode: joi.boolean().optional(),\n  allowReserved: joi.boolean().optional(),\n  schema: joi.alternatives().try(ReferenceObjectSchema, SchemaObjectSchema).optional(),\n  example: joi.any().optional(),\n  examples: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ExampleObjectSchema))\n    .optional(),\n  content: joi.object().pattern(joi.string(), joi.link('#mediaTypeObject')).optional(),\n})\n\nconst ParameterObjectSchema = joi.object<OpenAPIV3.ParameterObject>({\n  name: joi.string().required(),\n  in: joi.string().required(),\n  description: joi.string().optional(),\n  required: joi.boolean().optional(),\n  deprecated: joi.boolean().optional(),\n  allowEmptyValue: joi.boolean().optional(),\n  style: joi.string().optional(),\n  explode: joi.boolean().optional(),\n  allowReserved: joi.boolean().optional(),\n  schema: joi.alternatives().try(ReferenceObjectSchema, SchemaObjectSchema).optional(),\n  example: joi.any().optional(),\n  examples: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ExampleObjectSchema))\n    .optional(),\n  content: joi.object().pattern(joi.string(), joi.link('#mediaTypeObject')).optional(),\n})\n\nconst EncodingObjectSchema = joi.object<OpenAPIV3.EncodingObject>({\n  contentType: joi.string().optional(),\n  headers: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, HeaderObjectSchema))\n    .optional(),\n  style: joi.string().optional(),\n  explode: joi.boolean().optional(),\n  allowReserved: joi.boolean().optional(),\n})\n\nMediaTypeObjectSchema = joi\n  .object<OpenAPIV3.MediaTypeObject>({\n    schema: joi.alternatives().try(ReferenceObjectSchema, SchemaObjectSchema).optional(),\n    example: joi.any().optional(),\n    examples: joi\n      .object()\n      .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ExampleObjectSchema))\n      .optional(),\n    encoding: joi.object().pattern(joi.string(), EncodingObjectSchema).optional(),\n  })\n  .id('mediaTypeObject')\n\nconst LinkObjectSchema = joi.object<OpenAPIV3.LinkObject>({\n  operationRef: joi.string().optional(),\n  operationId: joi.string().optional(),\n  parameters: joi.object().pattern(joi.string(), joi.any()).optional(),\n  requestBody: joi.any().optional(),\n  description: joi.string().optional(),\n  server: ServerObjectSchema.optional(),\n})\n\nconst ResponseObjectSchema = joi.object<OpenAPIV3.ResponseObject>({\n  description: joi.string().required(),\n  headers: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, HeaderObjectSchema))\n    .optional(),\n  content: joi.object().pattern(joi.string(), MediaTypeObjectSchema).optional(),\n  links: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, LinkObjectSchema))\n    .optional(),\n})\n\nconst ResponsesObjectSchema = joi\n  .object<OpenAPIV3.ResponsesObject>()\n  .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ResponseObjectSchema))\n\nconst RequestBodyObjectSchema = joi.object<OpenAPIV3.RequestBodyObject>({\n  description: joi.string().optional(),\n  content: joi.object().pattern(joi.string(), MediaTypeObjectSchema).required(),\n  required: joi.boolean().optional(),\n})\n\nconst SecurityRequirementObjectSchema = joi\n  .object<OpenAPIV3.SecurityRequirementObject>()\n  .pattern(joi.string(), joi.array().items(joi.string()))\n\nconst OperationObjectSchema = <T extends {} = {}>() =>\n  joi\n    .object<OpenAPIV3.OperationObject<T>>({\n      tags: joi.array().items(joi.string()).optional(),\n      summary: joi.string().optional(),\n      description: joi.string().optional(),\n      externalDocs: ExternalDocumentationObjectSchema.optional(),\n      operationId: joi.string().optional(),\n      parameters: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, ParameterObjectSchema))\n        .optional(),\n      requestBody: joi\n        .alternatives()\n        .try(ReferenceObjectSchema, RequestBodyObjectSchema)\n        .optional(),\n      responses: ResponsesObjectSchema.required(),\n      callbacks: joi\n        .object()\n        .pattern(\n          joi.string(),\n          joi.alternatives().try(ReferenceObjectSchema, joi.link('#callbackObject'))\n        )\n        .optional(),\n      deprecated: joi.boolean().optional(),\n      security: joi.array().items(SecurityRequirementObjectSchema).optional(),\n      servers: joi.array().items(ServerObjectSchema).optional(),\n    })\n    .unknown(true) // Allow additional properties for extension\n\nPathItemObjectSchema = (<T extends {} = {}>() =>\n  joi\n    .object<OpenAPIV3.PathItemObject<T>>({\n      $ref: joi.string().optional(),\n      summary: joi.string().optional(),\n      description: joi.string().optional(),\n      servers: joi.array().items(ServerObjectSchema).optional(),\n      parameters: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, ParameterObjectSchema))\n        .optional(),\n      // HTTP method operations\n      get: OperationObjectSchema<T>().optional(),\n      put: OperationObjectSchema<T>().optional(),\n      post: OperationObjectSchema<T>().optional(),\n      delete: OperationObjectSchema<T>().optional(),\n      options: OperationObjectSchema<T>().optional(),\n      head: OperationObjectSchema<T>().optional(),\n      patch: OperationObjectSchema<T>().optional(),\n      trace: OperationObjectSchema<T>().optional(),\n    })\n    .unknown(true)\n    .id('pathItemObject'))() as ObjectSchema<OpenAPIV3.PathItemObject> // Allow additional properties for extension\n\nCallbackObjectSchema = joi\n  .object<OpenAPIV3.CallbackObject>()\n  .pattern(joi.string(), PathItemObjectSchema)\n  .id('callbackObject')\n\nconst PathsObjectSchema = <T extends {} = {}, P extends {} = {}>() =>\n  joi\n    .object<OpenAPIV3.PathsObject<T, P>>()\n    .pattern(joi.string(), PathItemObjectSchema.allow(undefined))\n\nconst TagObjectSchema = joi.object<OpenAPIV3.TagObject>({\n  name: joi.string().required(),\n  description: joi.string().optional(),\n  externalDocs: ExternalDocumentationObjectSchema.optional(),\n})\n\n// Security Scheme Objects\nconst HttpSecuritySchemeSchema = joi.object<OpenAPIV3.HttpSecurityScheme>({\n  type: joi.string().valid('http').required(),\n  description: joi.string().optional(),\n  scheme: joi.string().required(),\n  bearerFormat: joi.string().optional(),\n})\n\nconst ApiKeySecuritySchemeSchema = joi.object<OpenAPIV3.ApiKeySecurityScheme>({\n  type: joi.string().valid('apiKey').required(),\n  description: joi.string().optional(),\n  name: joi.string().required(),\n  in: joi.string().required(),\n})\n\nconst OAuth2SecuritySchemeSchema = joi.object<OpenAPIV3.OAuth2SecurityScheme>({\n  type: joi.string().valid('oauth2').required(),\n  description: joi.string().optional(),\n  flows: joi\n    .object({\n      implicit: joi\n        .object({\n          authorizationUrl: joi.string().uri().required(),\n          refreshUrl: joi.string().uri().optional(),\n          scopes: joi.object().pattern(joi.string(), joi.string()).required(),\n        })\n        .optional(),\n      password: joi\n        .object({\n          tokenUrl: joi.string().uri().required(),\n          refreshUrl: joi.string().uri().optional(),\n          scopes: joi.object().pattern(joi.string(), joi.string()).required(),\n        })\n        .optional(),\n      clientCredentials: joi\n        .object({\n          tokenUrl: joi.string().uri().required(),\n          refreshUrl: joi.string().uri().optional(),\n          scopes: joi.object().pattern(joi.string(), joi.string()).required(),\n        })\n        .optional(),\n      authorizationCode: joi\n        .object({\n          authorizationUrl: joi.string().uri().required(),\n          tokenUrl: joi.string().uri().required(),\n          refreshUrl: joi.string().uri().optional(),\n          scopes: joi.object().pattern(joi.string(), joi.string()).required(),\n        })\n        .optional(),\n    })\n    .required(),\n})\n\nconst OpenIdSecuritySchemeSchema = joi.object<OpenAPIV3.OpenIdSecurityScheme>({\n  type: joi.string().valid('openIdConnect').required(),\n  description: joi.string().optional(),\n  openIdConnectUrl: joi.string().uri().required(),\n})\n\nconst SecuritySchemeObjectSchema = joi\n  .alternatives<OpenAPIV3.SecuritySchemeObject>()\n  .try(\n    HttpSecuritySchemeSchema,\n    ApiKeySecuritySchemeSchema,\n    OAuth2SecuritySchemeSchema,\n    OpenIdSecuritySchemeSchema\n  )\n\nconst ComponentsObjectSchema = joi.object<OpenAPIV3.ComponentsObject>({\n  schemas: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, SchemaObjectSchema))\n    .optional(),\n  responses: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ResponseObjectSchema))\n    .optional(),\n  parameters: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ParameterObjectSchema))\n    .optional(),\n  examples: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ExampleObjectSchema))\n    .optional(),\n  requestBodies: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, RequestBodyObjectSchema))\n    .optional(),\n  headers: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, HeaderObjectSchema))\n    .optional(),\n  securitySchemes: joi\n    .object()\n    .pattern(\n      joi.string(),\n      joi.alternatives().try(ReferenceObjectSchema, SecuritySchemeObjectSchema)\n    )\n    .optional(),\n  links: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, LinkObjectSchema))\n    .optional(),\n  callbacks: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, CallbackObjectSchema))\n    .optional(),\n})\n\n// Main Document Schema\nexport const OpenAPIV3DocumentSchema = <T extends {} = {}>() =>\n  joi\n    .object<OpenAPIV3.Document<T>>({\n      'openapi': joi\n        .string()\n        .required()\n        .pattern(/^3\\.\\d+\\.\\d+$/),\n      'info': InfoObjectSchema.required(),\n      'servers': joi.array().items(ServerObjectSchema).optional(),\n      'paths': PathsObjectSchema<T>().required(),\n      'components': ComponentsObjectSchema.optional(),\n      'security': joi.array().items(SecurityRequirementObjectSchema).optional(),\n      'tags': joi.array().items(TagObjectSchema).optional(),\n      'externalDocs': ExternalDocumentationObjectSchema.optional(),\n      'x-express-openapi-additional-middleware': joi.array().items(joi.function()).optional(),\n      'x-express-openapi-validation-strict': joi.boolean().optional(),\n    })\n    .unknown(true) // Allow additional properties for extension\n\n// Export individual schemas for reuse\nexport {\n  InfoObjectSchema,\n  ContactObjectSchema,\n  LicenseObjectSchema,\n  ServerObjectSchema,\n  ServerVariableObjectSchema,\n  PathsObjectSchema,\n  PathItemObjectSchema,\n  OperationObjectSchema,\n  ExternalDocumentationObjectSchema,\n  ParameterObjectSchema,\n  HeaderObjectSchema,\n  SchemaObjectSchema,\n  SchemaOrReferenceObjectSchema,\n  DiscriminatorObjectSchema,\n  XMLObjectSchema,\n  ReferenceObjectSchema,\n  ExampleObjectSchema,\n  MediaTypeObjectSchema,\n  EncodingObjectSchema,\n  RequestBodyObjectSchema,\n  ResponsesObjectSchema,\n  ResponseObjectSchema,\n  LinkObjectSchema,\n  CallbackObjectSchema,\n  SecurityRequirementObjectSchema,\n  ComponentsObjectSchema,\n  SecuritySchemeObjectSchema,\n  HttpSecuritySchemeSchema,\n  ApiKeySecuritySchemeSchema,\n  OAuth2SecuritySchemeSchema,\n  OpenIdSecuritySchemeSchema,\n  TagObjectSchema,\n}\n","import { isObject } from '../../type_guards'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport {\n  SchemaOrReferenceObjectSchema as schemaOrReferenceObjectSchema,\n  ParameterObjectSchema as parameterObjectSchema,\n} from '../utils/openapi_validation_schemas'\nimport type { RouteCallback, AdditionalResourcefulRouteDetails } from '../types'\n\nconst RouteCallbackSchema = joi.function<RouteCallback>().required()\n\nconst AdditionalResourcefulRouteDetailsSchema = joi.object<AdditionalResourcefulRouteDetails>({\n  title: joi.string().optional(),\n  description: joi.string().optional(),\n  handler: RouteCallbackSchema,\n  parameters: joi.array().items(parameterObjectSchema).optional(),\n  requestPayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  responsePayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  tags: joi.alternatives(joi.string(), joi.array().items(joi.string())).optional(),\n})\n\nexport const isAdditionalResourcefulRouteDetails = (\n  value: unknown\n): value is AdditionalResourcefulRouteDetails => {\n  if (!isObject(value)) {\n    return false\n  }\n  const { error } = AdditionalResourcefulRouteDetailsSchema.validate(value, { abortEarly: true })\n  return !error\n}\n","import { isObject } from '../../type_guards'\nimport { default as string } from '@poppinss/string'\nimport type { ElementCompact } from 'xml-js'\n\nconst isSimpleValue = (value: any): boolean => {\n  switch (typeof value) {\n    case 'string':\n    case 'number':\n    case 'boolean':\n    case 'bigint':\n      return true\n    default:\n      return false\n  }\n}\n\n// Helper to convert primitive/array/object values into xml-js ElementCompact structure\nexport const toXmlValue = (value: any, parent?: string): any => {\n  if (Array.isArray(value)) {\n    return value.map((v) => (parent ? { [string.singular(parent)]: toXmlValue(v) } : toXmlValue(v)))\n  }\n  if (isObject(value)) {\n    const out: ElementCompact = {}\n    Object.entries(value).forEach(([k, v]) => {\n      if (isSimpleValue(v)) {\n        if (!out._attributes) {\n          out._attributes = {}\n        }\n        out._attributes[k] = String(v)\n        return\n      } else {\n        out[k] = toXmlValue(v, k)\n      }\n    })\n    return out\n  } else if (isSimpleValue(value)) {\n    return { _text: String(value) }\n  } else if (value === undefined) {\n    return undefined\n  } else {\n    return {}\n  }\n  //   if (value === null || value === undefined) return undefined\n  //   if (isSimpleValue(value)) {\n  //     return { _text: String(value) }\n  //   }\n  //   if (Array.isArray(value)) {\n  //     return value.map((v) => toXmlValue(v)).filter(Boolean)\n  //   }\n  //   if (typeof value === 'object') {\n  //     const out: Record<string, any> = {}\n  //     const attributes: Record<string, any> = {}\n\n  //     Object.entries(value).forEach(([k, v]) => {\n  //       const converted = toXmlValue(v)\n  //       if (converted !== undefined) {\n  //         // Simple values go to _attributes, complex values become child properties\n  //         if (isSimpleValue(v)) {\n  //           attributes[k] = String(v)\n  //         } else {\n  //           out[k] = converted\n  //         }\n  //       }\n  //     })\n\n  //     // Only add _attributes if there are any\n  //     if (Object.keys(attributes).length > 0) {\n  //       out._attributes = attributes\n  //     }\n\n  //     return out\n  //   }\n  //   return { _text: String(value) }\n}\n","import { DateTime } from 'luxon'\nimport { default as qs } from 'qs'\nimport { version } from '../../../'\nimport { default as YAML } from 'yaml'\nimport { default as pMap } from 'p-map'\nimport { toXmlValue } from '../utils/xml'\nimport { encode, decode } from '../../encoding'\nimport { negotiateContent } from '../utils/http'\nimport { normalizeError } from '../utils/errors'\nimport { default as Hooks } from '@poppinss/hooks'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { stripUndefinedValuesFromObject } from '../../utils'\nimport { encode as encodeJoi } from '@nhtio/lucid-resourceful/joi'\nimport { isObject, isArray, isResourcefulModel } from '../../type_guards'\nimport {\n  E_UNRESOLVABLE_MODEL,\n  E_ROUTE_NOT_FOUND,\n  E_RELATIONSHIP_NOT_FOUND_EXCEPTION,\n  E_RECORD_NOT_FOUND_EXCEPTION,\n  E_UNSYNCABLE_RELATIONSHIP_EXCEPTION,\n  E_INVALID_RELATIONSHIP_EXCEPTION,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ElementCompact } from 'xml-js'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { AnySchema } from '@nhtio/lucid-resourceful/joi'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { ResourcefulRouterModelServiceOptionsService } from '../services/resourceful_router_model_options_service'\nimport type {\n  ResourcefulModel,\n  ResourcefulIndexResult,\n  ServableResourcefulIndexResult,\n  ResourcefulIndexResponse,\n  ResourceResourcefulRecordResponse,\n  ResourcefulQueryScopeCallback,\n  ResourcefulPayloadSchemaGetter,\n  ResourcefulPolicy,\n  ResourcefulIndexResponseHook,\n  ResourceResourcefulRecordResponseHook,\n  ResourcefulRouterMutatorOptions,\n} from '@nhtio/lucid-resourceful/types'\n\nconst encoder = (_key: string, value: any) => {\n  if (value instanceof Date) {\n    return DateTime.fromJSDate(value).toISO()\n  }\n  if (value instanceof DateTime) {\n    return value.toISO()\n  }\n  if (typeof value === 'bigint') {\n    return value.toString()\n  }\n  return value\n}\n\nconst makeEncodable = (data: any): any => {\n  if (Array.isArray(data)) {\n    return data.map((item) => makeEncodable(item))\n  }\n  if (data instanceof Date) {\n    return DateTime.fromJSDate(data).toISO()\n  }\n  if (data instanceof DateTime) {\n    return data.toISO()\n  }\n  if (isObject(data)) {\n    return Object.fromEntries(\n      Object.entries(data).map(([key, value]) => [key, makeEncodable(value)])\n    )\n  }\n  return data\n}\n\nconst baseIndexRequestSchema = joi\n  .object({\n    aggregations: joi\n      .object()\n      .pattern(\n        joi.string().required(),\n        joi\n          .array()\n          .items(\n            joi\n              .string()\n              .valid('avg', 'min', 'max', 'sum', 'countDistinct', 'sumDistinct', 'avgDistinct')\n          )\n          .unique()\n          .required()\n      )\n      .optional(),\n    filter: joi.string().allow('', null).default(''),\n    page: joi.number().integer().min(1).default(1),\n    perPage: joi.number().integer().min(1).max(100).default(20),\n    sort: joi\n      .object()\n      .pattern(joi.string().required(), joi.string().valid('asc', 'desc').default('asc'))\n      .default({ id: 'asc' }),\n  })\n  .unknown(false)\n\nconst preProcessingIndexRequestSchema = baseIndexRequestSchema.concat(\n  joi.object({\n    fields: joi.alternatives(\n      joi\n        .string()\n        .pattern(/^[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)?(,[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)?)*$/)\n        .allow('', null)\n        .default(''),\n      joi.array().items(joi.string()).unique().optional()\n    ),\n  })\n)\n\nconst postProcessingIndexRequestSchema = baseIndexRequestSchema.concat(\n  joi.object({\n    fields: joi.array().items(joi.string()).unique().optional(),\n  })\n)\n\ninterface ModelRelationshipSyncPayload {\n  ruid: string | number\n  [key: string]: any\n}\n\nconst modelRelationshipSyncPayloadSchema = joi\n  .object<ModelRelationshipSyncPayload>({\n    ruid: joi\n      .alternatives()\n      .try(joi.string().required(), joi.number().integer().required())\n      .required(),\n  })\n  .pattern(joi.string().required(), joi.any())\n  .unknown(true)\nconst modelRelationshipSyncPayloadSchemaArray = joi\n  .array()\n  .items(modelRelationshipSyncPayloadSchema)\n\nexport type ResourcefulModelControllerHooks = {\n  index: [\n    [ResourcefulIndexResponse, HttpContext],\n    [error: Error | null, ResourcefulIndexResponse, HttpContext],\n  ]\n  create: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n  read: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n  readRelated: [\n    [ResourcefulIndexResponse, HttpContext],\n    [error: Error | null, ResourcefulIndexResponse, HttpContext],\n  ]\n  update: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n}\n\nexport class ResourcefulModelController {\n  readonly #subpath: string\n  readonly #model: Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>\n  readonly #options: ResourcefulRouterModelServiceOptionsService\n  readonly #headers: {\n    [key: string]: string\n  }\n  readonly #mutators: Hooks<ResourcefulModelControllerHooks>\n  readonly #scopeRestrictors: ResourcefulQueryScopeCallback[]\n  readonly #payloadRestrictors: ResourcefulPayloadSchemaGetter[]\n  get options() {\n    return this.#options\n  }\n\n  constructor(\n    subpath: string,\n    model: Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>,\n    options: ResourcefulRouterModelServiceOptionsService,\n    headers: {\n      [key: string]: string\n    },\n    groupResourcefulQueryScopeCallbacks?: ResourcefulQueryScopeCallback[],\n    groupResourcefulPayloadSchemaGetters?: ResourcefulPayloadSchemaGetter[],\n    groupResourcefulRouterMutatorOptions?: ResourcefulRouterMutatorOptions,\n    groupResourcefulPolicies?: ResourcefulPolicy[]\n  ) {\n    this.#subpath = subpath\n    this.#model = model\n    this.#options = options\n    this.#headers = headers\n    this.#mutators = new Hooks<ResourcefulModelControllerHooks>()\n    this.#scopeRestrictors = [\n      ...(groupResourcefulQueryScopeCallbacks || []),\n      ...(this.#options.scopeRestrictors || []),\n    ]\n    this.#payloadRestrictors = [\n      ...(groupResourcefulPayloadSchemaGetters || []),\n      ...(this.#options.payloadRestrictors || []),\n    ]\n    if (isObject(groupResourcefulRouterMutatorOptions)) {\n      if (\n        'index' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.index)\n      ) {\n        groupResourcefulRouterMutatorOptions.index.forEach((hook) => {\n          this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n        })\n      }\n      if (\n        'create' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.create)\n      ) {\n        groupResourcefulRouterMutatorOptions.create.forEach((hook) => {\n          this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'read' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.read)\n      ) {\n        groupResourcefulRouterMutatorOptions.read.forEach((hook) => {\n          this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'readRelated' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.readRelated)\n      ) {\n        groupResourcefulRouterMutatorOptions.readRelated.forEach((hook) => {\n          this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'update' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.update)\n      ) {\n        groupResourcefulRouterMutatorOptions.update.forEach((hook) => {\n          this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n    }\n    if (isObject(this.#options.mutators)) {\n      if ('index' in this.#options.mutators && isArray(this.#options.mutators.index)) {\n        this.#options.mutators.index.forEach((hook) => {\n          this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n        })\n      }\n      if ('create' in this.#options.mutators && isArray(this.#options.mutators.create)) {\n        this.#options.mutators.create.forEach((hook) => {\n          this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('read' in this.#options.mutators && isArray(this.#options.mutators.read)) {\n        this.#options.mutators.read.forEach((hook) => {\n          this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('readRelated' in this.#options.mutators && isArray(this.#options.mutators.readRelated)) {\n        this.#options.mutators.readRelated.forEach((hook) => {\n          this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('update' in this.#options.mutators && isArray(this.#options.mutators.update)) {\n        this.#options.mutators.update.forEach((hook) => {\n          this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n    }\n    if (groupResourcefulPolicies) {\n      groupResourcefulPolicies.forEach((policy) => {\n        if (policy.scope) {\n          this.#scopeRestrictors.push(policy.scope)\n        }\n        if (policy.payload) {\n          this.#payloadRestrictors.push(policy.payload)\n        }\n        if (isObject(policy.mutators)) {\n          if ('index' in policy.mutators && isArray(policy.mutators.index)) {\n            policy.mutators.index.forEach((hook) => {\n              this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n            })\n          }\n          if ('create' in policy.mutators && isArray(policy.mutators.create)) {\n            policy.mutators.create.forEach((hook) => {\n              this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('read' in policy.mutators && isArray(policy.mutators.read)) {\n            policy.mutators.read.forEach((hook) => {\n              this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('readRelated' in policy.mutators && isArray(policy.mutators.readRelated)) {\n            policy.mutators.readRelated.forEach((hook) => {\n              this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('update' in policy.mutators && isArray(policy.mutators.update)) {\n            policy.mutators.update.forEach((hook) => {\n              this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n        }\n      })\n    }\n  }\n\n  async resolveRequestRequirements(ctx: HttpContext) {\n    const [model, { default: app }] = await Promise.all([\n      this.#model,\n      import('@adonisjs/core/services/app'),\n    ])\n    const serveAs = negotiateContent(ctx)\n    const method = ctx.request.method() || 'GET'\n    const url = ctx.request.url() || '/'\n    if (model instanceof E_UNRESOLVABLE_MODEL) {\n      throw new E_ROUTE_NOT_FOUND([method, url])\n    }\n    const respond = (status: number, body: any, headers: { [key: string]: string } = {}) => {\n      ctx.response.status(status)\n      // apply macro-level headers\n      Object.entries(this.#headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // apply controller-level headers\n      Object.entries(this.#options.headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // apply request-level headers\n      Object.entries(headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // if response is requested as encoded, return as encoded plaintext\n      if (ctx.request.header('x-resourceful-response-encoded') === '1') {\n        ctx.response.header(\n          'Content-Type',\n          `application/vnd.resourceful.structured; coding=\"zlib+base64\"; ver=\"${version}\"`\n        )\n        const encodable = makeEncodable(body)\n        ctx.response.send(encode(encodable))\n        return\n      }\n      // apply content-type headers\n      switch (serveAs) {\n        case 'yaml':\n          ctx.response.header('Content-Type', 'application/x-yaml')\n          break\n        default:\n          ctx.response.header('Content-Type', 'application/json')\n          break\n      }\n      if ('undefined' !== typeof body && 204 !== status) {\n        switch (serveAs) {\n          case 'yaml':\n            ctx.response.send(YAML.stringify(body, encoder))\n            break\n          default:\n            ctx.response.send(JSON.stringify(body, encoder))\n            break\n        }\n      }\n    }\n    return {\n      model,\n      app,\n      prefix: this.#subpath,\n      serveAs,\n      method,\n      url,\n      respond,\n    }\n  }\n\n  async #processIndexRequest(requested: any, ctx: HttpContext) {\n    // Normalize indexed-object fields (qs arrayLimit shim):\n    // When qs parses >20 indexed array params (e.g. fields[21]=x), it produces\n    // a plain object {\"0\":\"id\",\"1\":\"status\",...} instead of an array.\n    // Convert it to a sorted array before Joi validation.\n    if ('fields' in requested && isObject(requested.fields) && !Array.isArray(requested.fields)) {\n      const keys = Object.keys(requested.fields)\n      if (keys.length > 0 && keys.every((k) => /^\\d+$/.test(k))) {\n        requested = {\n          ...requested,\n          fields: keys.sort((a, b) => Number(a) - Number(b)).map((k) => requested.fields[k]),\n        }\n      }\n    }\n    const { error: preprocessingError, value: prepared } = preProcessingIndexRequestSchema.validate(\n      requested,\n      {\n        abortEarly: false,\n        convert: true,\n      }\n    )\n    if (preprocessingError) {\n      throw preprocessingError\n    }\n    if ('fields' in prepared && 'string' === typeof prepared.fields) {\n      prepared.fields = prepared.fields\n        .split(',')\n        .map((str: string) => str.trim())\n        .filter((str: string) => str.length > 0)\n    }\n    const { error: postprocessingError, value: processed } =\n      postProcessingIndexRequestSchema.validate(prepared, {\n        abortEarly: false,\n        convert: true,\n      })\n    if (postprocessingError) {\n      throw postprocessingError\n    }\n    const sort = Object.entries(processed.sort) as [string, 'asc' | 'desc'][]\n    const encoded = encode(requested)\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const response = await model.$onResourcefulIndex(\n      processed.filter,\n      processed.page,\n      processed.perPage,\n      processed.fields || null,\n      sort,\n      ctx,\n      app,\n      this.#scopeRestrictors,\n      processed.aggregations\n    )\n    let fullUrl = ctx.request.completeUrl(false)\n    if (ctx.params.encoded) {\n      fullUrl = fullUrl.replace(/\\/s\\/.*$/, '/')\n    }\n    while (!fullUrl.endsWith('/')) {\n      fullUrl += '/'\n    }\n    const metaUrl = `${fullUrl}$meta.index`\n    let linkedUrl = ctx.params.encoded\n      ? `${fullUrl}${qs.stringify(requested, { addQueryPrefix: true })}`\n      : `${fullUrl}s/${encodeURIComponent(encoded)}`\n    const linkedUrlKey = ctx.params.encoded ? 'x-full-url' : 'x-shortcut-url'\n    const ret: ResourcefulIndexResponse = {\n      records: response.records,\n      total: response.total,\n      page: response.page,\n      perPage: response.perPage,\n      aggregations: response.aggregations,\n    }\n    const runner = this.#mutators.runner('index')\n    await runner.run(ret, ctx)\n    return respond(200, ret, {\n      'x-metadata-url': metaUrl,\n      [linkedUrlKey]: linkedUrl,\n    })\n  }\n\n  // GET /:subpath/\n  async serveModelIndex(ctx: HttpContext) {\n    return await this.#processIndexRequest(ctx.request.qs(), ctx)\n  }\n\n  // GET /:subpath/s/:encoded\n  async serveModelShortcut(ctx: HttpContext) {\n    const { encoded } = ctx.params\n    const decoded = decode(decodeURIComponent(encoded))\n    return await this.#processIndexRequest(decoded, ctx)\n  }\n\n  // GET /:subpath/$meta.index\n  async serveModelIndexMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const schema = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n    const filterable = schema['x-resourceful-filterable'] || []\n    const sortable = schema['x-resourceful-sortable'] || []\n    const aggregatable = schema['x-resourceful-aggregatable'] || []\n    return respond(\n      200,\n      JSON.parse(\n        JSON.stringify(\n          {\n            selectable: schema.properties,\n            filterable,\n            sortable,\n            aggregatable,\n          },\n          encoder\n        )\n      )\n    )\n  }\n\n  async #getWriteValidationSchema(\n    ctx: HttpContext,\n    model: ResourcefulModel,\n    app: ApplicationService,\n    forUpdate: boolean = false\n  ) {\n    return await model.$getResourcefulWriteValidationSchema(ctx, app, forUpdate)\n  }\n\n  // POST /:subpath/\n  async serveModelCreate(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const { validator } = await this.#getWriteValidationSchema(ctx, model, app)\n    const { error, value: validated } = validator.validate(ctx.request.all(), {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    let fullUrl = ctx.request.completeUrl(false)\n    while (!fullUrl.endsWith('/')) {\n      fullUrl += '/'\n    }\n    const metaUrl = `${fullUrl}$meta.create`\n    try {\n      const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulCreate(\n        validated,\n        ctx,\n        app,\n        this.#payloadRestrictors\n      )\n      const runner = this.#mutators.runner('create')\n      await runner.run(ret, ctx)\n      return respond(201, ret, {\n        'x-metadata-url': metaUrl,\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  // GET /:subpath/$meta.create\n  async serveModelCreateMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const { schema, validator } = await this.#getWriteValidationSchema(ctx, model, app)\n    const ret = {\n      schema: schema.properties,\n      joiSchema: encodeJoi(validator),\n      joiSchemaDescription: validator.describe(),\n    }\n    return respond(200, ret)\n  }\n\n  // GET /:subpath/:id\n  async serveModelRead(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const id = ctx.params.id\n    const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulRead(\n      id,\n      ctx,\n      app,\n      this.#scopeRestrictors\n    )\n    const runner = this.#mutators.runner('read')\n    await runner.run(ret, ctx)\n    return respond(200, ret)\n  }\n\n  async #processModelReadRelatedRequest(requested: any, ctx: HttpContext) {\n    const { id, relationship } = ctx.params\n    // Normalize indexed-object fields (qs arrayLimit shim)\n    if ('fields' in requested && isObject(requested.fields) && !Array.isArray(requested.fields)) {\n      const keys = Object.keys(requested.fields)\n      if (keys.length > 0 && keys.every((k) => /^\\d+$/.test(k))) {\n        requested = {\n          ...requested,\n          fields: keys.sort((a, b) => Number(a) - Number(b)).map((k) => requested.fields[k]),\n        }\n      }\n    }\n    const { error: preprocessingError, value: prepared } = preProcessingIndexRequestSchema.validate(\n      requested,\n      {\n        abortEarly: false,\n        convert: true,\n      }\n    )\n    if (preprocessingError) {\n      throw preprocessingError\n    }\n    if ('fields' in prepared && 'string' === typeof prepared.fields) {\n      prepared.fields = prepared.fields\n        .split(',')\n        .map((str: string) => str.trim())\n        .filter((str: string) => str.length > 0)\n    }\n    const { error: postprocessingError, value: processed } =\n      postProcessingIndexRequestSchema.validate(prepared, {\n        abortEarly: false,\n        convert: true,\n      })\n    if (postprocessingError) {\n      throw postprocessingError\n    }\n    const sort = Object.entries(processed.sort) as [string, 'asc' | 'desc'][]\n    const encoded = encode(requested)\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const response = await model.$onResourcefulReadRelationship(\n      id,\n      relationship,\n      processed.filter,\n      processed.page,\n      processed.perPage,\n      processed.fields || null,\n      sort,\n      ctx,\n      app,\n      this.#scopeRestrictors,\n      processed.aggregations\n    )\n    let fullUrl = ctx.request.completeUrl(false)\n    if (ctx.params.encoded) {\n      fullUrl = fullUrl.replace(/\\/s\\/.*$/, '/')\n    }\n    while (!fullUrl.endsWith('/')) {\n      fullUrl += '/'\n    }\n    const metaUrl = `${fullUrl}$meta.index`\n    let linkedUrl = ctx.params.encoded\n      ? `${fullUrl}${qs.stringify(requested, { addQueryPrefix: true })}`\n      : `${fullUrl}s/${encodeURIComponent(encoded)}`\n    const linkedUrlKey = ctx.params.encoded ? 'x-full-url' : 'x-shortcut-url'\n    const ret: ResourcefulIndexResponse = {\n      records: response.records,\n      total: response.total,\n      page: response.page,\n      perPage: response.perPage,\n      aggregations: response.aggregations,\n    }\n    const runner = this.#mutators.runner('readRelated')\n    await runner.run(ret, ctx)\n    return respond(200, ret, {\n      'x-metadata-url': metaUrl,\n      [linkedUrlKey]: linkedUrl,\n    })\n  }\n\n  // GET /:subpath/:id/:relationship\n  async serveModelReadRelated(ctx: HttpContext) {\n    return await this.#processModelReadRelatedRequest(ctx.request.qs(), ctx)\n  }\n\n  // GET /:subpath/:id/:relationship/s/:encoded\n  async serveModelReadRelatedShortcut(ctx: HttpContext) {\n    const { encoded } = ctx.params\n    const decoded = decode(decodeURIComponent(encoded))\n    return await this.#processModelReadRelatedRequest(decoded, ctx)\n  }\n\n  // GET /:subpath/:id/:relationship/$meta.index\n  async serveModelReadRelatedMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const { relationship } = ctx.params\n    const resourcefulRelationshipDefinition = model.$resourcefulRelationships.get(relationship)\n    if (!resourcefulRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const lucidRelationshipDefinition = model.$getRelation(relationship)\n    if (!lucidRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    switch (lucidRelationshipDefinition.type) {\n      case 'hasOne':\n      case 'belongsTo':\n        throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const relatedResourcefulModel = resourcefulRelationshipDefinition.relatedModel()\n    if (!isResourcefulModel(relatedResourcefulModel)) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const schema = await relatedResourcefulModel.$asOpenApiSchemaObject(ctx, app, 'read')\n    const selectable = schema.properties || {}\n    const filterable = schema['x-resourceful-filterable'] || []\n    const sortable = schema['x-resourceful-sortable'] || []\n    const aggregatable = schema['x-resourceful-aggregatable'] || []\n    return respond(200, {\n      selectable,\n      filterable,\n      sortable,\n      aggregatable,\n    })\n  }\n\n  // PUT /:subpath (with id in the payload)\n  // PUT /:subpath/:id\n  // PATCH /:subpath/:id\n  async serveModelUpdate(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const id = ctx.params.id || ctx.request.input(model.primaryKey)\n    const { validator } = await this.#getWriteValidationSchema(ctx, model, app, true)\n    const { error, value: validated } = validator.validate(\n      stripUndefinedValuesFromObject({\n        ...ctx.request.all(),\n        [model.primaryKey]: undefined,\n      }),\n      {\n        abortEarly: false,\n        convert: true,\n      }\n    )\n    if (error) {\n      throw normalizeError(error)\n    }\n    let fullUrl = ctx.request.completeUrl(false)\n    while (!fullUrl.endsWith('/')) {\n      fullUrl += '/'\n    }\n    const metaUrl = `${fullUrl}$meta.update`\n    try {\n      const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulUpdate(\n        id,\n        validated,\n        ctx,\n        app,\n        {\n          queryScopeCallbacks: this.#scopeRestrictors,\n          payloadValidationSchemas: this.#payloadRestrictors,\n        }\n      )\n      const runner = this.#mutators.runner('update')\n      await runner.run(ret, ctx)\n      return respond(201, ret, {\n        'x-metadata-url': metaUrl,\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  // GET /:subpath/$meta.update\n  async serveModelUpdateMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const { schema, validator } = await this.#getWriteValidationSchema(ctx, model, app, true)\n    const ret = {\n      schema: schema.properties,\n      joiSchema: encodeJoi(validator),\n      joiSchemaDescription: validator.describe(),\n    }\n    return respond(200, ret)\n  }\n\n  async #getAndValidateBulkUpdatePayload(\n    input: unknown,\n    ctx: HttpContext,\n    model: ResourcefulModel,\n    app: ApplicationService\n  ) {\n    const { validator } = await this.#getWriteValidationSchema(ctx, model, app, true)\n    const { error, value: validated } = validator.validate(input, {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    return validated\n  }\n\n  async #processModelBulkUpdateRequestByFilter(filter: string | null, ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const payload = await this.#getAndValidateBulkUpdatePayload(\n      stripUndefinedValuesFromObject({\n        ...ctx.request.all(),\n        filter: undefined,\n      }),\n      ctx,\n      model,\n      app\n    )\n    try {\n      await model.$onResourcefulBulkUpdate(filter, payload, ctx, app, {\n        queryScopeCallbacks: this.#scopeRestrictors,\n        payloadValidationSchemas: this.#payloadRestrictors,\n      })\n      return respond(204, undefined)\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  async #processModelBulkUpdateRequestById(ids: string, ctx: HttpContext) {\n    const { error: preprocessingError, value: prepared } = joi\n      .string()\n      .pattern(/^[a-zA-Z0-9_,\\s]+$/)\n      .required()\n      .validate(ids, {\n        abortEarly: false,\n        convert: true,\n      })\n    if (preprocessingError) {\n      throw preprocessingError\n    }\n    const parsedIds = prepared.split(',').map((id: string) => id.trim())\n    const { error: postprocessingError, value: processed } = joi\n      .array()\n      .items(joi.alternatives(joi.number().integer(), joi.string()))\n      .unique()\n      .min(1)\n      .validate(parsedIds, {\n        abortEarly: false,\n        convert: true,\n      }) as { error?: Error; value: (string | number)[] }\n    if (postprocessingError) {\n      throw postprocessingError\n    }\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const payload = await this.#getAndValidateBulkUpdatePayload(\n      stripUndefinedValuesFromObject({\n        ...ctx.request.all(),\n        ids: undefined,\n      }),\n      ctx,\n      model,\n      app\n    )\n    try {\n      await model.$onResourcefulBulkUpdateByUid(processed, payload, ctx, app, {\n        queryScopeCallbacks: this.#scopeRestrictors,\n        payloadValidationSchemas: this.#payloadRestrictors,\n      })\n      return respond(204, undefined)\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  // PUT /:subpath/$bulk (with ids or filters in the query)\n  // PUT /:subpath/$bulk/:ids\n  // PATCH /:subpath/$bulk (with ids or filters in the query)\n  // PATCH /:subpath/$bulk/:ids\n  async serveModelBulkUpdate(ctx: HttpContext) {\n    const ids = ctx.params.ids || ctx.request.qs().ids\n    if (ids) {\n      return await this.#processModelBulkUpdateRequestById(ids, ctx)\n    }\n    return await this.#processModelBulkUpdateRequestByFilter(ctx.request.qs().filter || null, ctx)\n  }\n\n  // GET /:subpath/$meta.$bulk.update\n  async serveModelBulkUpdateMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const readable = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n    const schema = await model.$asOpenApiSchemaObject(ctx, app, 'write')\n    const asResourceful = await model.$getAsResourcefulForContext(ctx, app)\n    const modelJoiSchema =\n      await ResourcefulModelController.getResourcefulModelCreatePayloadValidationSchema(\n        model,\n        ctx,\n        app\n      )\n    const modelUpdateSchema = joi.object(\n      Object.assign(\n        {},\n        ...Object.keys(schema.properties!)\n          .filter((p) => p !== model.primaryKey)\n          .map((creatablePropertyKey) => {\n            const returnable = { [creatablePropertyKey]: joi.any() }\n            const prop = asResourceful.properties[creatablePropertyKey]\n            if (prop) {\n              const validator = prop.validator\n              if (validator) {\n                returnable[creatablePropertyKey] = validator\n              }\n            }\n            try {\n              const extracted = modelJoiSchema.extract(creatablePropertyKey)\n              if (extracted) {\n                returnable[creatablePropertyKey] =\n                  returnable[creatablePropertyKey].concat(extracted)\n              }\n            } catch {\n              // noop\n            }\n            return returnable\n          })\n      )\n    )\n    const filterable = readable['x-resourceful-filterable'] || []\n    const modelSchema = Object.fromEntries(\n      Object.entries(schema.properties || {}).filter(\n        ([p, d]: [string, any]) =>\n          p !== model.primaryKey && !d['x-resourceful-autoupdated'] && !d['x-resourceful-immutable']\n      )\n    )\n    const ret = {\n      schema: modelSchema,\n      filterable: JSON.parse(JSON.stringify(filterable, encoder)),\n      joiSchema: encodeJoi(modelUpdateSchema),\n      joiSchemaDescription: modelUpdateSchema.describe(),\n    }\n    return respond(200, ret)\n  }\n\n  // PUT /:subpath/:id/:relationship\n  // PATCH /:subpath/:id/:relationship\n  async serveModelSyncRelated(ctx: HttpContext) {\n    const payload = Object.values(ctx.request.all())\n    const { error, value } = modelRelationshipSyncPayloadSchemaArray.validate(payload, {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    const { model, respond } = await this.resolveRequestRequirements(ctx)\n    const { id, relationship } = ctx.params\n    // @ts-ignore\n    const instance = await model.query().where(model.primaryKey, id).first()\n    if (!instance) {\n      throw new E_RECORD_NOT_FOUND_EXCEPTION()\n    }\n    const resourcefulRelationshipDefinition = model.$resourcefulRelationships.get(relationship)\n    if (!resourcefulRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const lucidRelationshipDefinition = model.$getRelation(relationship)\n    if (!lucidRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    switch (lucidRelationshipDefinition.type) {\n      case 'hasOne':\n      case 'belongsTo':\n        throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n      case 'hasManyThrough':\n        throw new E_UNSYNCABLE_RELATIONSHIP_EXCEPTION()\n    }\n    if (lucidRelationshipDefinition.type === 'manyToMany') {\n      const syncable: { [key: string]: { [key: string]: any } } = Object.assign(\n        {},\n        ...value.map((v) => ({\n          [v.ruid.toString()]: stripUndefinedValuesFromObject({\n            ...v,\n            ruid: undefined,\n          }),\n        }))\n      )\n      try {\n        await instance.related(relationship).sync(syncable)\n      } catch (e) {\n        throw normalizeError(e)\n      }\n    }\n    if (lucidRelationshipDefinition.type === 'hasMany') {\n      // in order to ensure that model hooks are run, we will load the relevant related models which need to be synced\n      // and then update them one by one\n      const foreignKey = (lucidRelationshipDefinition as any).options.foreignKey\n      if (!foreignKey) {\n        throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n          `HasMany relationship '${relationship}' missing foreignKey`\n        )\n      }\n      const relatedModel = resourcefulRelationshipDefinition.relatedModel()\n      const idsToInclude = value.map((v) => v.ruid)\n      const [relatedModelInstancesEnclude, relatedModelInstancesToInclude] = await Promise.all([\n        instance.related(relationship).query().whereNotIn(relatedModel.primaryKey, idsToInclude),\n        // @ts-ignore\n        relatedModel.query().whereIn(relatedModel.primaryKey, idsToInclude),\n      ])\n      const relatedModelInstancesEncludeResults = await pMap(\n        relatedModelInstancesEnclude as InstanceType<typeof relatedModel>[],\n        async (relatedInstance) => {\n          relatedInstance.merge({\n            [foreignKey]: null,\n          })\n          try {\n            await relatedInstance.save()\n          } catch (e) {\n            return e\n          }\n        },\n        { concurrency: 1, stopOnError: false }\n      )\n      const relatedModelInstancesEncludeResultsErr = relatedModelInstancesEncludeResults.filter(\n        (result) => 'undefined' !== typeof result\n      )\n      if (relatedModelInstancesEncludeResultsErr.length > 0) {\n        throw relatedModelInstancesEncludeResultsErr[0]\n      }\n      const relatedModelInstancesToIncludeResults = await pMap(\n        relatedModelInstancesToInclude as InstanceType<typeof relatedModel>[],\n        async (relatedInstance) => {\n          relatedInstance.merge({\n            [foreignKey]: instance.$getAttribute(model.primaryKey),\n          })\n          try {\n            await relatedInstance.save()\n          } catch (e) {\n            return e\n          }\n        },\n        { concurrency: 1, stopOnError: false }\n      )\n      const relatedModelInstancesToIncludeResultsErr = relatedModelInstancesToIncludeResults.filter(\n        (result) => 'undefined' !== typeof result\n      )\n      if (relatedModelInstancesToIncludeResultsErr.length > 0) {\n        throw relatedModelInstancesToIncludeResultsErr[0]\n      }\n    }\n    return respond(204, undefined)\n  }\n\n  // DELETE /:subpath/:id\n  async serveModelDelete(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    try {\n      await model.$onResourcefulDelete(ctx.params.id, ctx, app, this.#scopeRestrictors)\n      return respond(204, undefined)\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  static resourcefulIndexResultToConsumable(\n    result: ResourcefulIndexResult\n  ): ServableResourcefulIndexResult {\n    return stripUndefinedValuesFromObject({\n      ...result,\n      countQuery: undefined,\n      recordsQuery: undefined,\n    })\n  }\n\n  static resourcefulIndexResultToXmlConsumable(result: ResourcefulIndexResult) {\n    const servable: ServableResourcefulIndexResult =\n      ResourcefulModelController.resourcefulIndexResultToConsumable(result)\n    const ret: ElementCompact = stripUndefinedValuesFromObject({\n      _declaration: { _attributes: { version: '1.0', encoding: 'utf-8' } },\n      results: {\n        _attributes: {\n          total: servable.total,\n          page: servable.page,\n          perPage: servable.perPage,\n        },\n        records: servable.records.map((record: ResourcefulIndexResult['records'][number]) =>\n          toXmlValue(record)\n        ),\n      },\n      aggregations:\n        Object.keys(servable.aggregations).length === 0\n          ? undefined\n          : Object.entries(servable.aggregations).map(([key, aggs]) =>\n              stripUndefinedValuesFromObject({\n                [key]: {\n                  _attributes: aggs,\n                },\n              })\n            ),\n    })\n    return ret\n  }\n\n  static async getResourcefulModelCreatePayloadValidationSchema(\n    model: ResourcefulModel,\n    ctx: HttpContext,\n    app: ApplicationService\n  ) {\n    const schemas: AnySchema[] = []\n    await pMap(\n      model.$resourcefulPayloadValidationSchemaBuilders.create,\n      async (builder) => {\n        const schema = await builder(ctx, app)\n        if (schema) {\n          schemas.push(schema)\n        }\n      },\n      { concurrency: 1 }\n    )\n    let ret = joi.any()\n    schemas.forEach((schema) => {\n      ret = ret.concat(schema)\n    })\n    return ret\n  }\n}\n","'use strict'\n\nfunction _process (v, mod) {\n  var i\n  var r\n\n  if (typeof mod === 'function') {\n    r = mod(v)\n    if (r !== undefined) {\n      v = r\n    }\n  } else if (Array.isArray(mod)) {\n    for (i = 0; i < mod.length; i++) {\n      r = mod[i](v)\n      if (r !== undefined) {\n        v = r\n      }\n    }\n  }\n\n  return v\n}\n\nfunction parseKey (key, val) {\n  // detect negative index notation\n  if (key[0] === '-' && Array.isArray(val) && /^-\\d+$/.test(key)) {\n    return val.length + parseInt(key, 10)\n  }\n  return key\n}\n\nfunction isIndex (k) {\n  return /^\\d+$/.test(k)\n}\n\nfunction isObject (val) {\n  return Object.prototype.toString.call(val) === '[object Object]'\n}\n\nfunction isArrayOrObject (val) {\n  return Object(val) === val\n}\n\nfunction isEmptyObject (val) {\n  return Object.keys(val).length === 0\n}\n\nvar blacklist = ['__proto__', 'prototype', 'constructor']\nvar blacklistFilter = function (part) { return blacklist.indexOf(part) === -1 }\n\nfunction parsePath (path, sep) {\n  if (path.indexOf('[') >= 0) {\n    path = path.replace(/\\[/g, sep).replace(/]/g, '')\n  }\n\n  var parts = path.split(sep)\n\n  var check = parts.filter(blacklistFilter)\n\n  if (check.length !== parts.length) {\n    throw Error('Refusing to update blacklisted property ' + path)\n  }\n\n  return parts\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction DotObject (separator, override, useArray, useBrackets) {\n  if (!(this instanceof DotObject)) {\n    return new DotObject(separator, override, useArray, useBrackets)\n  }\n\n  if (typeof override === 'undefined') override = false\n  if (typeof useArray === 'undefined') useArray = true\n  if (typeof useBrackets === 'undefined') useBrackets = true\n  this.separator = separator || '.'\n  this.override = override\n  this.useArray = useArray\n  this.useBrackets = useBrackets\n  this.keepArray = false\n\n  // contains touched arrays\n  this.cleanup = []\n}\n\nvar dotDefault = new DotObject('.', false, true, true)\nfunction wrap (method) {\n  return function () {\n    return dotDefault[method].apply(dotDefault, arguments)\n  }\n}\n\nDotObject.prototype._fill = function (a, obj, v, mod) {\n  var k = a.shift()\n\n  if (a.length > 0) {\n    obj[k] = obj[k] || (this.useArray && isIndex(a[0]) ? [] : {})\n\n    if (!isArrayOrObject(obj[k])) {\n      if (this.override) {\n        obj[k] = {}\n      } else {\n        if (!(isArrayOrObject(v) && isEmptyObject(v))) {\n          throw new Error(\n            'Trying to redefine `' + k + '` which is a ' + typeof obj[k]\n          )\n        }\n\n        return\n      }\n    }\n\n    this._fill(a, obj[k], v, mod)\n  } else {\n    if (!this.override && isArrayOrObject(obj[k]) && !isEmptyObject(obj[k])) {\n      if (!(isArrayOrObject(v) && isEmptyObject(v))) {\n        throw new Error(\"Trying to redefine non-empty obj['\" + k + \"']\")\n      }\n\n      return\n    }\n\n    obj[k] = _process(v, mod)\n  }\n}\n\n/**\n *\n * Converts an object with dotted-key/value pairs to it's expanded version\n *\n * Optionally transformed by a set of modifiers.\n *\n * Usage:\n *\n *   var row = {\n *     'nr': 200,\n *     'doc.name': '  My Document  '\n *   }\n *\n *   var mods = {\n *     'doc.name': [_s.trim, _s.underscored]\n *   }\n *\n *   dot.object(row, mods)\n *\n * @param {Object} obj\n * @param {Object} mods\n */\nDotObject.prototype.object = function (obj, mods) {\n  var self = this\n\n  Object.keys(obj).forEach(function (k) {\n    var mod = mods === undefined ? null : mods[k]\n    // normalize array notation.\n    var ok = parsePath(k, self.separator).join(self.separator)\n\n    if (ok.indexOf(self.separator) !== -1) {\n      self._fill(ok.split(self.separator), obj, obj[k], mod)\n      delete obj[k]\n    } else {\n      obj[k] = _process(obj[k], mod)\n    }\n  })\n\n  return obj\n}\n\n/**\n * @param {String} path dotted path\n * @param {String} v value to be set\n * @param {Object} obj object to be modified\n * @param {Function|Array} mod optional modifier\n */\nDotObject.prototype.str = function (path, v, obj, mod) {\n  var ok = parsePath(path, this.separator).join(this.separator)\n\n  if (path.indexOf(this.separator) !== -1) {\n    this._fill(ok.split(this.separator), obj, v, mod)\n  } else {\n    obj[path] = _process(v, mod)\n  }\n\n  return obj\n}\n\n/**\n *\n * Pick a value from an object using dot notation.\n *\n * Optionally remove the value\n *\n * @param {String} path\n * @param {Object} obj\n * @param {Boolean} remove\n */\nDotObject.prototype.pick = function (path, obj, remove, reindexArray) {\n  var i\n  var keys\n  var val\n  var key\n  var cp\n\n  keys = parsePath(path, this.separator)\n  for (i = 0; i < keys.length; i++) {\n    key = parseKey(keys[i], obj)\n    if (obj && typeof obj === 'object' && key in obj) {\n      if (i === keys.length - 1) {\n        if (remove) {\n          val = obj[key]\n          if (reindexArray && Array.isArray(obj)) {\n            obj.splice(key, 1)\n          } else {\n            delete obj[key]\n          }\n          if (Array.isArray(obj)) {\n            cp = keys.slice(0, -1).join('.')\n            if (this.cleanup.indexOf(cp) === -1) {\n              this.cleanup.push(cp)\n            }\n          }\n          return val\n        } else {\n          return obj[key]\n        }\n      } else {\n        obj = obj[key]\n      }\n    } else {\n      return undefined\n    }\n  }\n  if (remove && Array.isArray(obj)) {\n    obj = obj.filter(function (n) {\n      return n !== undefined\n    })\n  }\n  return obj\n}\n/**\n *\n * Delete value from an object using dot notation.\n *\n * @param {String} path\n * @param {Object} obj\n * @return {any} The removed value\n */\nDotObject.prototype.delete = function (path, obj) {\n  return this.remove(path, obj, true)\n}\n\n/**\n *\n * Remove value from an object using dot notation.\n *\n * Will remove multiple items if path is an array.\n * In this case array indexes will be retained until all\n * removals have been processed.\n *\n * Use dot.delete() to automatically  re-index arrays.\n *\n * @param {String|Array<String>} path\n * @param {Object} obj\n * @param {Boolean} reindexArray\n * @return {any} The removed value\n */\nDotObject.prototype.remove = function (path, obj, reindexArray) {\n  var i\n\n  this.cleanup = []\n  if (Array.isArray(path)) {\n    for (i = 0; i < path.length; i++) {\n      this.pick(path[i], obj, true, reindexArray)\n    }\n    if (!reindexArray) {\n      this._cleanup(obj)\n    }\n    return obj\n  } else {\n    return this.pick(path, obj, true, reindexArray)\n  }\n}\n\nDotObject.prototype._cleanup = function (obj) {\n  var ret\n  var i\n  var keys\n  var root\n  if (this.cleanup.length) {\n    for (i = 0; i < this.cleanup.length; i++) {\n      keys = this.cleanup[i].split('.')\n      root = keys.splice(0, -1).join('.')\n      ret = root ? this.pick(root, obj) : obj\n      ret = ret[keys[0]].filter(function (v) {\n        return v !== undefined\n      })\n      this.set(this.cleanup[i], ret, obj)\n    }\n    this.cleanup = []\n  }\n}\n\n/**\n * Alias method  for `dot.remove`\n *\n * Note: this is not an alias for dot.delete()\n *\n * @param {String|Array<String>} path\n * @param {Object} obj\n * @param {Boolean} reindexArray\n * @return {any} The removed value\n */\nDotObject.prototype.del = DotObject.prototype.remove\n\n/**\n *\n * Move a property from one place to the other.\n *\n * If the source path does not exist (undefined)\n * the target property will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.move = function (source, target, obj, mods, merge) {\n  if (typeof mods === 'function' || Array.isArray(mods)) {\n    this.set(target, _process(this.pick(source, obj, true), mods), obj, merge)\n  } else {\n    merge = mods\n    this.set(target, this.pick(source, obj, true), obj, merge)\n  }\n\n  return obj\n}\n\n/**\n *\n * Transfer a property from one object to another object.\n *\n * If the source path does not exist (undefined)\n * the property on the other object will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj1\n * @param {Object} obj2\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.transfer = function (\n  source,\n  target,\n  obj1,\n  obj2,\n  mods,\n  merge\n) {\n  if (typeof mods === 'function' || Array.isArray(mods)) {\n    this.set(\n      target,\n      _process(this.pick(source, obj1, true), mods),\n      obj2,\n      merge\n    )\n  } else {\n    merge = mods\n    this.set(target, this.pick(source, obj1, true), obj2, merge)\n  }\n\n  return obj2\n}\n\n/**\n *\n * Copy a property from one object to another object.\n *\n * If the source path does not exist (undefined)\n * the property on the other object will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj1\n * @param {Object} obj2\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.copy = function (source, target, obj1, obj2, mods, merge) {\n  if (typeof mods === 'function' || Array.isArray(mods)) {\n    this.set(\n      target,\n      _process(\n        // clone what is picked\n        JSON.parse(JSON.stringify(this.pick(source, obj1, false))),\n        mods\n      ),\n      obj2,\n      merge\n    )\n  } else {\n    merge = mods\n    this.set(target, this.pick(source, obj1, false), obj2, merge)\n  }\n\n  return obj2\n}\n\n/**\n *\n * Set a property on an object using dot notation.\n *\n * @param {String} path\n * @param {any} val\n * @param {Object} obj\n * @param {Boolean} merge\n */\nDotObject.prototype.set = function (path, val, obj, merge) {\n  var i\n  var k\n  var keys\n  var key\n\n  // Do not operate if the value is undefined.\n  if (typeof val === 'undefined') {\n    return obj\n  }\n  keys = parsePath(path, this.separator)\n\n  for (i = 0; i < keys.length; i++) {\n    key = keys[i]\n    if (i === keys.length - 1) {\n      if (merge && isObject(val) && isObject(obj[key])) {\n        for (k in val) {\n          if (hasOwnProperty.call(val, k)) {\n            obj[key][k] = val[k]\n          }\n        }\n      } else if (merge && Array.isArray(obj[key]) && Array.isArray(val)) {\n        for (var j = 0; j < val.length; j++) {\n          obj[keys[i]].push(val[j])\n        }\n      } else {\n        obj[key] = val\n      }\n    } else if (\n      // force the value to be an object\n      !hasOwnProperty.call(obj, key) ||\n      (!isObject(obj[key]) && !Array.isArray(obj[key]))\n    ) {\n      // initialize as array if next key is numeric\n      if (/^\\d+$/.test(keys[i + 1])) {\n        obj[key] = []\n      } else {\n        obj[key] = {}\n      }\n    }\n    obj = obj[key]\n  }\n  return obj\n}\n\n/**\n *\n * Transform an object\n *\n * Usage:\n *\n *   var obj = {\n *     \"id\": 1,\n *    \"some\": {\n *      \"thing\": \"else\"\n *    }\n *   }\n *\n *   var transform = {\n *     \"id\": \"nr\",\n *    \"some.thing\": \"name\"\n *   }\n *\n *   var tgt = dot.transform(transform, obj)\n *\n * @param {Object} recipe Transform recipe\n * @param {Object} obj Object to be transformed\n * @param {Array} mods modifiers for the target\n */\nDotObject.prototype.transform = function (recipe, obj, tgt) {\n  obj = obj || {}\n  tgt = tgt || {}\n  Object.keys(recipe).forEach(\n    function (key) {\n      this.set(recipe[key], this.pick(key, obj), tgt)\n    }.bind(this)\n  )\n  return tgt\n}\n\n/**\n *\n * Convert object to dotted-key/value pair\n *\n * Usage:\n *\n *   var tgt = dot.dot(obj)\n *\n *   or\n *\n *   var tgt = {}\n *   dot.dot(obj, tgt)\n *\n * @param {Object} obj source object\n * @param {Object} tgt target object\n * @param {Array} path path array (internal)\n */\nDotObject.prototype.dot = function (obj, tgt, path) {\n  tgt = tgt || {}\n  path = path || []\n  var isArray = Array.isArray(obj)\n\n  Object.keys(obj).forEach(\n    function (key) {\n      var index = isArray && this.useBrackets ? '[' + key + ']' : key\n      if (\n        isArrayOrObject(obj[key]) &&\n        ((isObject(obj[key]) && !isEmptyObject(obj[key])) ||\n          (Array.isArray(obj[key]) && !this.keepArray && obj[key].length !== 0))\n      ) {\n        if (isArray && this.useBrackets) {\n          var previousKey = path[path.length - 1] || ''\n          return this.dot(\n            obj[key],\n            tgt,\n            path.slice(0, -1).concat(previousKey + index)\n          )\n        } else {\n          return this.dot(obj[key], tgt, path.concat(index))\n        }\n      } else {\n        if (isArray && this.useBrackets) {\n          tgt[path.join(this.separator).concat('[' + key + ']')] = obj[key]\n        } else {\n          tgt[path.concat(index).join(this.separator)] = obj[key]\n        }\n      }\n    }.bind(this)\n  )\n  return tgt\n}\n\nDotObject.pick = wrap('pick')\nDotObject.move = wrap('move')\nDotObject.transfer = wrap('transfer')\nDotObject.transform = wrap('transform')\nDotObject.copy = wrap('copy')\nDotObject.object = wrap('object')\nDotObject.str = wrap('str')\nDotObject.set = wrap('set')\nDotObject.delete = wrap('delete')\nDotObject.del = DotObject.remove = wrap('remove')\nDotObject.dot = wrap('dot');\n['override', 'overwrite'].forEach(function (prop) {\n  Object.defineProperty(DotObject, prop, {\n    get: function () {\n      return dotDefault.override\n    },\n    set: function (val) {\n      dotDefault.override = !!val\n    }\n  })\n});\n['useArray', 'keepArray', 'useBrackets'].forEach(function (prop) {\n  Object.defineProperty(DotObject, prop, {\n    get: function () {\n      return dotDefault[prop]\n    },\n    set: function (val) {\n      dotDefault[prop] = val\n    }\n  })\n})\n\nDotObject._process = _process\n\nmodule.exports = DotObject\n","import { deepmerge } from 'deepmerge-ts'\nimport { default as dot } from 'dot-object'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { ResourcefulRouterOperation, ResourcefulRouterVerb } from '../types'\nimport { E_INVALID_RESOURCEFUL_ROUTER_OPTIONS } from '@nhtio/lucid-resourceful/errors'\nimport { ResourcefulErrorMiddleware } from '../middlewares/resourceful_error_middleware'\nimport {\n  SchemaOrReferenceObjectSchema as schemaOrReferenceObjectSchema,\n  InfoObjectSchema as infoObjectSchema,\n  ExternalDocumentationObjectSchema as externalDocsSchema,\n  SecuritySchemeObjectSchema,\n} from '../utils/openapi_validation_schemas'\nimport type { ValidationError } from '@nhtio/lucid-resourceful/joi'\nimport type { ResourcefulErrorMiddlewareOptions } from '../middlewares/resourceful_error_middleware'\nimport type {\n  ResourcefulRouterOptions,\n  ResourcefulSecuritySchemaDefinition,\n  RouteCallback,\n  AdditionalResourcefulRoutesMap,\n  AdditionalResourcefulRouteDetails,\n  ResourcefulPolicy,\n  ResourcefulIndexResponseHook,\n  ResourceResourcefulRecordResponseHook,\n  ResourcefulRouterMutatorOptions,\n} from '../types'\n\nconst DEFAULT_RESOURCEFUL_ROUTER_OPTIONS: ResourcefulRouterOptions = {\n  prefix: '/',\n  domain: undefined,\n  middleware: [],\n  except: [],\n  additional: {},\n  info: {\n    title: 'Resourceful API',\n    version: '0.0.0',\n  },\n  tagMap: {\n    general: 'General',\n    additional: 'Additional',\n  },\n  catchThrown: true,\n  headers: {},\n  security: [],\n  scopeRestrictors: [],\n  payloadRestrictors: [],\n  policies: [],\n  mutators: {},\n}\n\nconst FORBIDDEN_ADDITIONALS = ['get|/']\n\nconst FORBIDDEN_ADDITIONAL_PATTERNS = [\n  /^get\\|\\/?[\\w.-]+\\/?$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.index$/,\n  /^post\\|\\/?[\\w.-]+\\/?$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.create$/,\n  /^get\\|\\/?[\\w.-]+\\/:id$/,\n  /^get\\|\\/?[\\w.-]+\\/:id\\/\\$meta\\.read$/,\n  /^get\\|\\/?[\\w.-]+\\/:id\\/:relationship$/,\n  /^get\\|\\/?[\\w.-]+\\/:id\\/:relationship\\/\\$meta\\.index$/,\n  /^put\\|\\/?[\\w.-]+\\/:id$/,\n  /^patch\\|\\/?[\\w.-]+\\/:id$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.update$/,\n  /^put\\|\\/?[\\w.-]+\\/\\$bulk$/,\n  /^put\\|\\/?[\\w.-]+\\/\\$bulk\\/:ids$/,\n  /^patch\\|\\/?[\\w.-]+\\/\\$bulk$/,\n  /^patch\\|\\/?[\\w.-]+\\/\\$bulk\\/:ids$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.\\$bulk\\.update$/,\n  /^put\\|\\/?[\\w.-]+\\/:id\\/:relationship$/,\n  /^patch\\|\\/?[\\w.-]+\\/:id\\/:relationship$/,\n  /^get\\|\\/?[\\w.-]+\\/:id\\/:relationship\\/\\$meta\\.sync$/,\n  /^delete\\|\\/?[\\w.-]+\\/:id$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.delete$/,\n]\n\nlet ForbiddenAdditionalPatternsSchema = joi.string()\nFORBIDDEN_ADDITIONAL_PATTERNS.forEach((p) => {\n  ForbiddenAdditionalPatternsSchema = ForbiddenAdditionalPatternsSchema.concat(\n    joi.string().regex(p, { invert: true })\n  )\n})\n\nconst RouteCallbackSchema = joi.function<RouteCallback>().required()\n\nconst AdditionalResourcefulRouteDetailsSchema = joi.object<AdditionalResourcefulRouteDetails>({\n  title: joi.string().optional(),\n  description: joi.string().optional(),\n  handler: RouteCallbackSchema,\n  requestPayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  responsePayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  tags: joi.alternatives(joi.string(), joi.array().items(joi.string())).optional(),\n})\n\nconst AdditionalResourcefulRoutesMapValueSchema = joi.alternatives<\n  RouteCallback | AdditionalResourcefulRouteDetails\n>(RouteCallbackSchema, AdditionalResourcefulRouteDetailsSchema)\n\nconst ResourcefulRouterOptionsMiddlewareSchema = joi.alternatives(\n  joi.function(),\n  joi\n    .object({\n      name: joi.string().required(),\n      args: joi.array().optional(),\n    })\n    .unknown(true)\n)\n\nconst ResourcefulSecuritySchemaDefinitionSchema = joi.object<ResourcefulSecuritySchemaDefinition>({\n  key: joi.string().required(),\n  schema: SecuritySchemeObjectSchema.required(),\n  applyToModels: joi.alternatives(\n    joi.boolean(),\n    joi\n      .object()\n      .pattern(\n        joi.string(),\n        joi.alternatives(\n          joi.boolean(),\n          joi\n            .object()\n            .pattern(\n              joi.string().valid(...ResourcefulRouterVerb),\n              joi.alternatives(joi.boolean(), joi.array().items(joi.string()))\n            )\n        )\n      )\n      .required()\n  ),\n  applyToAdditional: joi\n    .alternatives(\n      joi.boolean(),\n      joi\n        .object()\n        .pattern(\n          joi\n            .string()\n            .regex(\n              /^(get|post|put|patch|delete)\\|\\/(?:[\\w\\-\\.]+(?:\\/[\\w\\-\\.]+)*(?:\\/:\\w+(?:\\([^)]+\\))?(?:\\?)?)*(?:\\/\\*)?)?$/\n            ),\n          joi.alternatives(joi.boolean(), joi.array().items(joi.string()))\n        )\n    )\n    .required(),\n})\n\nconst ResourcefulIndexResponseHookSchema = joi\n  .array<ResourcefulIndexResponseHook[]>()\n  .items(\n    joi.alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n  )\nconst ResourceResourcefulRecordResponseHookSchema = joi\n  .array<ResourceResourcefulRecordResponseHook[]>()\n  .items(\n    joi.alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n  )\n\nexport const ResourcefulRouterMutatorOptionsSchema = joi.object<ResourcefulRouterMutatorOptions>({\n  index: ResourcefulIndexResponseHookSchema.optional(),\n  create: ResourceResourcefulRecordResponseHookSchema.optional(),\n  read: ResourceResourcefulRecordResponseHookSchema.optional(),\n  readRelated: ResourceResourcefulRecordResponseHookSchema.optional(),\n  update: ResourceResourcefulRecordResponseHookSchema.optional(),\n})\n\nexport const ResourcefulPolicySchema = joi\n  .object<ResourcefulPolicy>({\n    scope: joi\n      .alternatives(\n        joi.function().arity(0),\n        joi.function().arity(1),\n        joi.function().arity(2),\n        joi.function().arity(3)\n      )\n      .optional(),\n    payload: joi\n      .alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n      .optional(),\n    mutators: ResourcefulRouterMutatorOptionsSchema.optional(),\n  })\n  .unknown(false)\n  .or('scope', 'payload', 'mutators')\n\nconst ResourcefulRouterOptionsSchema = joi.object<ResourcefulRouterOptions>({\n  prefix: joi.string().pattern(/^\\//).required(),\n  domain: joi.string().optional().allow(null),\n  middleware: joi\n    .alternatives(\n      ResourcefulRouterOptionsMiddlewareSchema,\n      joi.array().items(ResourcefulRouterOptionsMiddlewareSchema)\n    )\n    .required(),\n  except: joi\n    .array()\n    .items(joi.string().valid(...ResourcefulRouterOperation))\n    .required(),\n  additional: joi\n    .object<AdditionalResourcefulRoutesMap>()\n    .pattern(\n      joi\n        .string()\n        .regex(\n          /^(get|post|put|patch|delete)\\|\\/(?:[\\w\\-\\.]+(?:\\/[\\w\\-\\.]+)*(?:\\/:\\w+(?:\\([^)]+\\))?(?:\\?)?)*(?:\\/\\*)?)?$/\n        )\n        .disallow(...FORBIDDEN_ADDITIONALS)\n        .concat(ForbiddenAdditionalPatternsSchema),\n\n      AdditionalResourcefulRoutesMapValueSchema\n    )\n    .required(),\n  info: infoObjectSchema.required(),\n  externalDocs: externalDocsSchema.optional(),\n  tagMap: joi\n    .object({\n      general: joi.string().required(),\n    })\n    .unknown(true)\n    .required(),\n  catchThrown: joi.boolean().default(true),\n  onVineValidationError: joi.function().arity(1).optional(),\n  onJoiValidationError: joi.function().arity(1).optional(),\n  onException: joi.function().arity(1).optional(),\n  onError: joi.function().arity(1).optional(),\n  onUnknown: joi.function().arity(1).optional(),\n  onAny: joi.function().arity(1).optional(),\n  headers: joi.object().pattern(joi.string(), joi.string()).default({}),\n  security: joi.array().items(ResourcefulSecuritySchemaDefinitionSchema),\n  scopeRestrictors: joi\n    .array()\n    .items(\n      joi.alternatives(\n        joi.function().arity(0),\n        joi.function().arity(1),\n        joi.function().arity(2),\n        joi.function().arity(3)\n      )\n    )\n    .optional()\n    .default([]),\n  payloadRestrictors: joi\n    .array()\n    .items(\n      joi.alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n    )\n    .optional()\n    .default([]),\n  policies: joi.array().items(ResourcefulPolicySchema).optional().default([]),\n  mutators: ResourcefulRouterMutatorOptionsSchema.optional().default({}),\n})\n\nexport class ResourcefulRouterOptionsService {\n  readonly #options: ResourcefulRouterOptions\n\n  private constructor(options: ResourcefulRouterOptions) {\n    const modified = { ...options }\n    if (options.catchThrown === true) {\n      const errorMiddlewareOptions: ResourcefulErrorMiddlewareOptions = {\n        onVineValidationError: options.onVineValidationError,\n        onJoiValidationError: options.onJoiValidationError,\n        onException: options.onException,\n        onError: options.onError,\n        onUnknown: options.onUnknown,\n        onAny: options.onAny,\n        asYaml: true,\n        headers: options.headers,\n      }\n      if (!Array.isArray(modified.middleware)) {\n        modified.middleware = [modified.middleware].filter(Boolean)\n      }\n      modified.middleware.unshift(ResourcefulErrorMiddleware.usable(errorMiddlewareOptions))\n    }\n    this.#options = Object.freeze(deepmerge({}, modified))\n    Object.defineProperty(this, 'prefix', {\n      get: () => this.#options.prefix,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'domain', {\n      get: () => this.#options.domain,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'middleware', {\n      get: () => this.#options.middleware,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'except', {\n      get: () => this.#options.except,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'additional', {\n      get: () => this.#options.additional,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'info', {\n      get: () => this.#options.info,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'externalDocs', {\n      get: () => this.#options.externalDocs,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'tagMap', {\n      get: () => this.#options.tagMap,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'catchThrown', {\n      get: () => this.#options.catchThrown,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onVineValidationError', {\n      get: () => this.#options.onVineValidationError,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onJoiValidationError', {\n      get: () => this.#options.onJoiValidationError,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onException', {\n      get: () => this.#options.onException,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onError', {\n      get: () => this.#options.onError,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onUnknown', {\n      get: () => this.#options.onUnknown,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onAny', {\n      get: () => this.#options.onAny,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'headers', {\n      get: () => this.#options.headers,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'security', {\n      get: () => this.#options.security,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'scopeRestrictors', {\n      get: () => this.#options.scopeRestrictors,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'payloadRestrictors', {\n      get: () => this.#options.payloadRestrictors,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'policies', {\n      get: () => this.#options.policies,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'mutators', {\n      get: () => this.#options.mutators,\n      enumerable: true,\n      configurable: false,\n    })\n  }\n\n  declare prefix: Readonly<ResourcefulRouterOptions['prefix']>\n  declare domain: Readonly<ResourcefulRouterOptions['domain']>\n  declare middleware: Readonly<ResourcefulRouterOptions['middleware']>\n  declare except: Readonly<ResourcefulRouterOptions['except']>\n  declare additional: Readonly<ResourcefulRouterOptions['additional']>\n  declare info: Readonly<ResourcefulRouterOptions['info']>\n  declare externalDocs: Readonly<ResourcefulRouterOptions['externalDocs']>\n  declare tagMap: Readonly<ResourcefulRouterOptions['tagMap']>\n  declare catchThrown: Readonly<ResourcefulRouterOptions['catchThrown']>\n  declare onVineValidationError: ResourcefulRouterOptions['onVineValidationError']\n  declare onJoiValidationError: ResourcefulRouterOptions['onJoiValidationError']\n  declare onException: ResourcefulRouterOptions['onException']\n  declare onError: ResourcefulRouterOptions['onError']\n  declare onUnknown: ResourcefulRouterOptions['onUnknown']\n  declare onAny: ResourcefulRouterOptions['onAny']\n  declare headers: Readonly<ResourcefulRouterOptions['headers']>\n  declare security: Readonly<ResourcefulRouterOptions['security']>\n  declare scopeRestrictors: ResourcefulRouterOptions['scopeRestrictors']\n  declare payloadRestrictors: ResourcefulRouterOptions['payloadRestrictors']\n  declare policies: ResourcefulRouterOptions['policies']\n  declare mutators: ResourcefulRouterOptions['mutators']\n\n  get(key: string): any {\n    return dot.pick(key, this.#options, false)\n  }\n\n  public static init(options: unknown): ResourcefulRouterOptionsService {\n    // step 1: at minimum, ensure that we are dealing with an object\n    const { error: checkIfObjectError } = joi.object().unknown(true).required().validate(options, {\n      abortEarly: true,\n    })\n    if (checkIfObjectError) {\n      throw new E_INVALID_RESOURCEFUL_ROUTER_OPTIONS(checkIfObjectError)\n    }\n    // step 2: create an object which is merged with the defaults\n    const mergedOptions = deepmerge(\n      DEFAULT_RESOURCEFUL_ROUTER_OPTIONS,\n      options\n    ) as ResourcefulRouterOptions\n    // step 3: validate the merged options\n    const { error: resourcefulRouterOptionsValidationError } =\n      ResourcefulRouterOptionsSchema.validate(mergedOptions, {\n        abortEarly: true,\n        convert: true,\n        allowUnknown: true,\n        stripUnknown: true,\n      }) as { error?: ValidationError; value: ResourcefulRouterOptions }\n    if (resourcefulRouterOptionsValidationError) {\n      throw new E_INVALID_RESOURCEFUL_ROUTER_OPTIONS(resourcefulRouterOptionsValidationError)\n    }\n    const instance = new ResourcefulRouterOptionsService(mergedOptions)\n    return instance\n  }\n}\n","import { DateTime } from 'luxon'\nimport { version } from '../../../'\nimport { default as YAML } from 'yaml'\nimport { default as pMap } from 'p-map'\nimport { Middleware } from '@nhtio/middleware'\nimport { encode, decode } from '../../encoding'\nimport { negotiateContent } from '../utils/http'\nimport { validator } from '@nhtio/lucid-resourceful/joi'\nimport { isObject, isResourcefulModel } from '../../type_guards'\nimport { resolveModelDisplayColumn } from '../utils/relationships'\nimport { E_MISSING_CURRENT_INSTANCE_ID } from '@nhtio/lucid-resourceful/errors'\nimport { ResourcefulRouterModelResolverService } from './resourceful_router_model_resolver_service'\nimport type { NextFn } from '@nhtio/middleware'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { Schema } from '@nhtio/lucid-resourceful/joi'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { ResourcefulModel } from '@nhtio/lucid-resourceful/types'\nimport type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder'\nimport type { ResourcefulRouterOptionsService } from './resourceful_router_options_service'\nimport type { ResourcefulModelController } from '../controllers/resourceful_model_controller'\n\nconst encoder = (_key: string, value: any) => {\n  if (value instanceof Date) {\n    return DateTime.fromJSDate(value).toISO()\n  }\n  if (value instanceof DateTime) {\n    return value.toISO()\n  }\n  if (typeof value === 'bigint') {\n    return value.toString()\n  }\n  return value\n}\n\nconst makeEncodable = (data: any): any => {\n  if (Array.isArray(data)) {\n    return data.map((item) => makeEncodable(item))\n  }\n  if (data instanceof Date) {\n    return DateTime.fromJSDate(data).toISO()\n  }\n  if (data instanceof DateTime) {\n    return data.toISO()\n  }\n  if (isObject(data)) {\n    return Object.fromEntries(\n      Object.entries(data).map(([key, value]) => [key, makeEncodable(value)])\n    )\n  }\n  return data\n}\n\ntype ResourcefulRouterChoicesServiceMiddlewareContext = {\n  ctx: HttpContext\n  app: ApplicationService\n  query: DatabaseQueryBuilderContract\n}\n\ntype ResourcefulRouterChoicesServiceMiddlewareFn = (\n  ctx: ResourcefulRouterChoicesServiceMiddlewareContext,\n  next: NextFn\n) => void | Promise<void>\n\ntype ResourcefulRouterChoicesRequestAttributes = {\n  uid: string | number | bigint\n  modelValue: string | number | bigint\n  search: string\n  exclude: Array<string | number | bigint>\n}\n\nexport class ResourcefulRouterChoicesService {\n  readonly #options: ResourcefulRouterOptionsService\n  // @ts-ignore\n  readonly #models: ResourcefulRouterModelResolverService\n  // @ts-ignore\n  readonly #controllers: Map<string, ResourcefulModelController>\n\n  constructor(\n    options: ResourcefulRouterOptionsService,\n    models: ResourcefulRouterModelResolverService,\n    controllers: Map<string, ResourcefulModelController>\n  ) {\n    this.#options = options\n    this.#models = models\n    this.#controllers = controllers\n  }\n\n  async #resolveRequestRequirements(ctx: HttpContext) {\n    const { default: app } = await import('@adonisjs/core/services/app')\n    const serveAs = negotiateContent(ctx)\n    const method = ctx.request.method() || 'GET'\n    const url = ctx.request.url() || '/'\n    const respond = (status: number, body: any, headers: { [key: string]: string } = {}) => {\n      ctx.response.status(status)\n      // apply macro-level headers\n      Object.entries(this.#options.headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // apply request-level headers\n      Object.entries(headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // if response is requested as encoded, return as encoded plaintext\n      if (ctx.request.header('x-resourceful-response-encoded') === '1') {\n        ctx.response.header(\n          'Content-Type',\n          `application/vnd.resourceful.structured; coding=\"zlib+base64\"; ver=\"${version}\"`\n        )\n        const encodable = makeEncodable(body)\n        ctx.response.send(encode(encodable))\n        return\n      }\n      // apply content-type headers\n      switch (serveAs) {\n        case 'yaml':\n          ctx.response.header('Content-Type', 'application/x-yaml')\n          break\n        default:\n          ctx.response.header('Content-Type', 'application/json')\n          break\n      }\n      if ('undefined' !== typeof body && 204 !== status) {\n        switch (serveAs) {\n          case 'yaml':\n            ctx.response.send(YAML.stringify(body, encoder))\n            break\n          default:\n            ctx.response.send(JSON.stringify(body, encoder))\n            break\n        }\n      }\n    }\n    return {\n      app,\n      serveAs,\n      method,\n      url,\n      respond,\n    }\n  }\n\n  async #resolveModel(modelName: string): Promise<ResourcefulModel | undefined> {\n    const resolvedModelEntries = await pMap(\n      Object.getOwnPropertyNames(this.#models),\n      async (name) => {\n        const modelOrError = await this.#models[name]\n        if (!isResourcefulModel(modelOrError)) {\n          return [name, undefined] as const\n        }\n        return [modelOrError.name, modelOrError] as const\n      },\n      { concurrency: 5 }\n    )\n    const resolvedModels = Object.fromEntries(resolvedModelEntries)\n    return resolvedModels[modelName]\n  }\n\n  #extractValidatedRequestAttribute<A extends keyof ResourcefulRouterChoicesRequestAttributes>(\n    attribute: A,\n    schema: Schema<any>,\n    ctx: HttpContext\n  ): ResourcefulRouterChoicesRequestAttributes[A] | undefined {\n    const original = ctx.request.input(attribute)\n    if ('undefined' === typeof original || null === original) {\n      return undefined\n    }\n    const { error, value } = schema.validate(original, { abortEarly: true, convert: true })\n    if (error) {\n      return undefined\n    }\n    return value as ResourcefulRouterChoicesRequestAttributes[A]\n  }\n\n  #getValidatedValue<A>(value: unknown, schema: Schema<any>, fallback: A): A {\n    const { error, value: validated } = schema.validate(value, { abortEarly: true, convert: true })\n    if (error) {\n      return fallback\n    }\n    return validated as A\n  }\n\n  async handleRequest(ctx: HttpContext) {\n    const { respond, app } = await this.#resolveRequestRequirements(ctx)\n    /*\n     |--------------------------------------------------------------------------\n     | Decode model and relationship information from the URL\n     |--------------------------------------------------------------------------\n     */\n    const doubleEncoded = Array.isArray(ctx.params['*']) ? ctx.params['*'][0] : ctx.params['*']\n    if ('string' !== typeof doubleEncoded) {\n      return respond(400, [])\n    }\n    const encoded = decodeURIComponent(doubleEncoded)\n    let decoded: any = {}\n    try {\n      decoded = decode(encoded)\n    } catch {\n      return respond(400, [])\n    }\n    const { ResourcefulModel, relationship } = decoded as {\n      ResourcefulModel: string\n      relationship: string\n    }\n    /*\n     |--------------------------------------------------------------------------\n     | Resolve the model from the name of the model class\n     |--------------------------------------------------------------------------\n     */\n    const model = await this.#resolveModel(ResourcefulModel)\n    if (!model) {\n      return respond(404, [])\n    }\n    /*\n     |--------------------------------------------------------------------------\n     | Resolve the relationship from the model\n     |--------------------------------------------------------------------------\n     */\n    const resourcefulRelationship = model.$resourcefulRelationships.get(relationship)\n    if (!resourcefulRelationship) {\n      return respond(404, [])\n    }\n    const relatedModel = resourcefulRelationship.relatedModel()\n    if (!isResourcefulModel(relatedModel)) {\n      return respond(404, [])\n    }\n    /*\n     |--------------------------------------------------------------------------\n     | Check the ACL for reading the related model from the rules on the\n     | base model's relationship definition\n     |--------------------------------------------------------------------------\n     */\n    const canReadFilterResults = await pMap(\n      resourcefulRelationship.readAccessControlFilters,\n      async (filter) => filter(ctx, app),\n      { concurrency: 5 }\n    )\n    if (canReadFilterResults.includes(false)) {\n      return respond(403, [])\n    }\n    /*\n     |--------------------------------------------------------------------------\n     | Enqueue all scope hooks for the related model\n     |--------------------------------------------------------------------------\n     */\n    const middleware = new Middleware<ResourcefulRouterChoicesServiceMiddlewareFn>()\n    /*\n     |--------------------------------------------------------------------------\n     | Initialize the query so that we can apply scopes\n     |--------------------------------------------------------------------------\n     */\n    const valueColumn = relatedModel.primaryKey\n    const displayColumn = resolveModelDisplayColumn(relatedModel)\n    /*\n     |--------------------------------------------------------------------------\n     | Not used in MVP\n     |--------------------------------------------------------------------------\n     | This functionality will aide in pagination in the future, but it's not\n     | needed for the MVP\n     */\n    // @ts-ignore\n    const modelValue = this.#extractValidatedRequestAttribute(\n      'modelValue',\n      validator.alternatives(validator.string(), validator.number(), validator.bigint()),\n      ctx\n    )\n    // @ts-ignore\n    const search = this.#extractValidatedRequestAttribute('search', validator.string().trim(), ctx)\n    // @ts-ignore\n    const exclude = this.#extractValidatedRequestAttribute(\n      'exclude',\n      validator\n        .array()\n        .items(validator.alternatives(validator.string(), validator.number(), validator.bigint())),\n      ctx\n    )\n\n    const connectionClient = relatedModel.$adapter.modelConstructorClient(relatedModel)\n    const queryTable = relatedModel.table\n    const query: DatabaseQueryBuilderContract = connectionClient.query().from(queryTable)\n    if (Array.isArray(this.#options.scopeRestrictors)) {\n      this.#options.scopeRestrictors.forEach((restrictor) => {\n        middleware.add(async (_, next) => {\n          await restrictor(ctx, app, query, relatedModel)\n          await next()\n        })\n      })\n    }\n    if (Array.isArray(relatedModel.$resourcefulQueryScopeCallbacks.list)) {\n      relatedModel.$resourcefulQueryScopeCallbacks.list.forEach((scopeCallback) => {\n        middleware.add(async (_, next) => {\n          await scopeCallback(ctx, app, query, relatedModel)\n          await next()\n        })\n      })\n    }\n    if (model.table === relatedModel.table) {\n      /*\n      |--------------------------------------------------------------------------\n      | Self-referential relationships\n      |--------------------------------------------------------------------------\n      | For self-referential relationships, we require the current model's \n      | primary key value as a query parameter to avoid returning the base\n      | model itself in the choices.\n      */\n      const currentModelInstanceId = this.#extractValidatedRequestAttribute(\n        'uid',\n        validator.alternatives(validator.string(), validator.number(), validator.bigint()),\n        ctx\n      )\n      if (!currentModelInstanceId) {\n        throw new E_MISSING_CURRENT_INSTANCE_ID()\n      }\n      middleware.add(async (_, next) => {\n        // currentInstanceModelId.toString() is used to cast to a string to handle\n        // bigint values which are not natively supported by the query builder\n        query.whereNot(`${queryTable}.${valueColumn}`, currentModelInstanceId.toString())\n        await next()\n      })\n    }\n    await middleware.runner().run(async (fn, next) => fn({ ctx, app, query }, next))\n    const countQuery = query.clone().count(`${valueColumn} as total`)\n    /*\n     |--------------------------------------------------------------------------\n     | Dev Note\n     |--------------------------------------------------------------------------\n     | In the MVP we will return all of the results without any additional\n     | filtration since the front-end will be handling that for now, and we\n     | are not likely to have an issue until we hit 10,000+ results.\n     |\n     | In the future we will add a proper pagination mechanism and have it\n     | coordinate with the front end using the ignored `modelValue`, `search`,\n     | and `exclude` parameters.\n     |--------------------------------------------------------------------------\n     |\n     | The `total` count will be eventually used as part of the pagination\n     | functionality, and in order to maintain the contract that the `choices`\n     | will be an attribute of the returned payload instead of the entire\n     | returned payload, and because we already have the count query separated out\n     | we are leaving it in during the MVP\n     */\n    const resultsQuery = query\n      .clone()\n      .select(`${valueColumn} as value`, `${displayColumn} as title`)\n    const [countResults, choices] = await Promise.all([countQuery.first(), resultsQuery])\n    const total = this.#getValidatedValue<number>(countResults?.total, validator.number().min(0), 0)\n    respond(200, {\n      total,\n      choices,\n    })\n  }\n\n  public static async serve(\n    ctx: HttpContext,\n    options: ResourcefulRouterOptionsService,\n    models: ResourcefulRouterModelResolverService,\n    controllers: Map<string, ResourcefulModelController>\n  ) {\n    const instance = new ResourcefulRouterChoicesService(options, models, controllers)\n    return await instance.handleRequest(ctx)\n  }\n}\n","import { ResourcefulRouterVerb } from '../types'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { isObject, isResourcefulModel } from '../../type_guards'\nimport {\n  E_INVALID_RESOURCEFUL_MODELS_MAP,\n  E_UNRESOLVABLE_MODEL,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ValidationError } from '@nhtio/lucid-resourceful/joi'\nimport type { ResourcefulModel } from '@nhtio/lucid-resourceful/types'\nimport type { MacroModelsMap, Resolvable, ResourcefulRouterModelMappedOptions } from '../types'\n\nconst MacroModelsMapSchema = joi.object<MacroModelsMap>().pattern(\n  joi.string().min(1).required(),\n  joi\n    .object<ResourcefulRouterModelMappedOptions>({\n      model: joi.alternatives(\n        joi.function().class(),\n        joi\n          .object()\n          .instance(Promise)\n          .custom((value, helpers) => {\n            if (\n              typeof value.then !== 'function' ||\n              value.then.length === 0 ||\n              typeof value.catch !== 'function' ||\n              value.catch.length === 0\n            ) {\n              return helpers.error('any.invalid')\n            }\n            return value\n          }, 'Promise validation'),\n        joi\n          .function()\n          .arity(0)\n          .custom((value, helpers) => {\n            try {\n              const result = value()\n              if (\n                typeof result === 'object' &&\n                result !== null &&\n                typeof (result as Promise<unknown>).then === 'function' &&\n                (result as Promise<unknown>).then.length > 0 &&\n                typeof (result as Promise<unknown>).catch === 'function' &&\n                (result as Promise<unknown>).catch.length > 0\n              ) {\n                return result\n              } else if (typeof result === 'function') {\n                return helpers.error('any.invalid')\n              } else if (typeof result === 'object' && result !== null && 'default' in result) {\n                return result.default\n              } else {\n                return result\n              }\n            } catch {\n              return helpers.error('any.invalid')\n            }\n          }, 'Lazy import validation')\n      ),\n      crudActionMiddlewares: joi\n        .object(\n          Object.fromEntries([...ResourcefulRouterVerb].map((verb) => [verb, joi.any().optional()]))\n        )\n        .optional(),\n    })\n    .unknown(true)\n)\n\nexport class ResourcefulRouterModelResolverService {\n  readonly #cache: Map<string, Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>>\n  readonly #errors: Map<string, E_UNRESOLVABLE_MODEL>\n  readonly #crudActionMiddlewaresByModel: Map<\n    string,\n    MacroModelsMap[string]['crudActionMiddlewares']\n  >\n  private constructor(map: MacroModelsMap) {\n    this.#cache = new Map<string, Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>>()\n    this.#errors = new Map<string, E_UNRESOLVABLE_MODEL>()\n    this.#crudActionMiddlewaresByModel = new Map<\n      string,\n      MacroModelsMap[string]['crudActionMiddlewares']\n    >()\n    Object.entries(map).forEach(([name, { model: resolveable, crudActionMiddlewares }]) => {\n      this.#cache.set(name, this.#resolveToPromise(name, resolveable))\n      this.#crudActionMiddlewaresByModel.set(name, crudActionMiddlewares)\n      Object.defineProperty(this, name, {\n        get: () => this.#errors.get(name) ?? this.#cache.get(name),\n        enumerable: true,\n        configurable: false,\n      })\n    })\n  }\n\n  // @ts-ignore\n  public getCrudActionMiddlewaresForModel(\n    modelName: string\n  ): MacroModelsMap[string]['crudActionMiddlewares'] | undefined {\n    return this.#crudActionMiddlewaresByModel.get(modelName)\n  }\n\n  async #resolveToPromise(\n    name: string,\n    resolveable: Resolvable<ResourcefulModel>\n  ): Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL> {\n    if (isResourcefulModel(resolveable)) {\n      return resolveable\n    }\n    let resolved: unknown\n    try {\n      if (typeof resolveable === 'function') {\n        resolved = await Promise.resolve(resolveable())\n      } else {\n        resolved = await Promise.resolve(resolveable)\n      }\n    } catch (err) {\n      const e = new E_UNRESOLVABLE_MODEL(name, err)\n      this.#errors.set(name, e)\n      return e\n    }\n    if (isResourcefulModel(resolved)) {\n      return resolved\n    }\n    if (isObject(resolved) && 'default' in resolved && isResourcefulModel(resolved.default)) {\n      return resolved.default\n    }\n    const e = new E_UNRESOLVABLE_MODEL(name)\n    this.#errors.set(name, e)\n    return e\n  }\n\n  [key: string]: Promise<ResourcefulModel> | E_UNRESOLVABLE_MODEL | undefined\n\n  public static init(map: unknown): ResourcefulRouterModelResolverService {\n    const { error, value } = MacroModelsMapSchema.validate(map, {\n      abortEarly: true,\n      convert: true,\n      allowUnknown: false,\n      stripUnknown: true,\n    }) as { error?: ValidationError; value: MacroModelsMap }\n    if (error) {\n      throw new E_INVALID_RESOURCEFUL_MODELS_MAP(error)\n    }\n    return new ResourcefulRouterModelResolverService(value)\n  }\n}\n","import { DateTime } from 'luxon'\nimport { default as qs } from 'qs'\nimport { default as YAML } from 'yaml'\nimport { default as pMap } from 'p-map'\nimport { deepmerge } from 'deepmerge-ts'\nimport { default as string } from '@poppinss/string'\nimport { ResourcefulAggregateMethods } from '../../mixin'\nimport { validator as joi, encode } from '@nhtio/validation'\nimport { stripUndefinedValuesFromObject } from '../../utils'\nimport { isObject, isResourcefulModel } from '../../type_guards'\nimport { encode as minify } from '@nhtio/lucid-resourceful/encoding'\nimport { ResourcefulHttpVerb, ResourcefulRouterVerb } from '../types'\nimport { E_UNRESOLVABLE_MODEL } from '@nhtio/lucid-resourceful/errors'\nimport { isAdditionalResourcefulRouteDetails } from '../utils/type_guards'\nimport { getPossibleHttpErrorCodes, describeHttpError } from '../utils/http'\nimport { ResourcefulModelController } from '../controllers/resourceful_model_controller'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { ResourcefulResponseFormat } from '../types'\nimport type { HttpContext, Request } from '@adonisjs/core/http'\nimport type { ResourcefulModelOpenApiSchema } from '../../types'\nimport type { default as ApplicationService } from '@adonisjs/core/services/app'\nimport type { ResourcefulRouterOptionsService } from './resourceful_router_options_service'\nimport type { ResourcefulRouterModelResolverService } from './resourceful_router_model_resolver_service'\nimport type {\n  ResourcefulModel,\n  ResourcefulIndexResult,\n  AnySchema,\n  RouteCallback,\n  AdditionalResourcefulRouteDetails,\n} from '@nhtio/lucid-resourceful/types'\n\nenum HttpMethodSortOrder {\n  'get' = 1,\n  'post' = 2,\n  'put' = 3,\n  'patch' = 4,\n  'delete' = 5,\n  'head' = 6,\n  'options' = 7,\n}\n\nconst encoder = (_key: string, value: any) => {\n  if (value instanceof Date) {\n    return DateTime.fromJSDate(value).toISO()\n  }\n  if (value instanceof DateTime) {\n    return value.toISO()\n  }\n  if (typeof value === 'bigint') {\n    return value.toString()\n  }\n  return value\n}\n\nexport class ResourcefulRouterOpenApiDocumentService {\n  readonly #opts: ResourcefulRouterOptionsService\n  readonly #modelMap: ResourcefulRouterModelResolverService\n  readonly #controllers: Map<string, ResourcefulModelController>\n  readonly #app: typeof ApplicationService\n  readonly #models: Map<string, ResourcefulModel>\n  readonly #modelReadSchemas: Map<ResourcefulModel, ResourcefulModelOpenApiSchema>\n  readonly #modelWriteSchemas: Map<ResourcefulModel, ResourcefulModelOpenApiSchema>\n\n  constructor(\n    opts: ResourcefulRouterOptionsService,\n    modelMap: ResourcefulRouterModelResolverService,\n    controllers: Map<string, ResourcefulModelController>,\n    app: typeof ApplicationService\n  ) {\n    this.#opts = opts\n    this.#modelMap = modelMap\n    this.#controllers = controllers\n    this.#app = app\n    this.#models = new Map<string, ResourcefulModel>()\n    this.#modelReadSchemas = new Map<ResourcefulModel, ResourcefulModelOpenApiSchema>()\n    this.#modelWriteSchemas = new Map<ResourcefulModel, ResourcefulModelOpenApiSchema>()\n  }\n\n  async boot(ctx: HttpContext) {\n    const names = Object.getOwnPropertyNames(this.#modelMap)\n    await pMap(\n      names,\n      async (name) => {\n        const cached = this.#models.get(name)\n        if (cached) {\n          const [readable, writeable] = await Promise.all([\n            cached.$asOpenApiSchemaObject(ctx, this.#app, 'read'),\n            cached.$asOpenApiSchemaObject(ctx, this.#app, 'write'),\n          ])\n          this.#modelReadSchemas.set(cached, readable)\n          this.#modelWriteSchemas.set(cached, writeable)\n          return\n        }\n        const promiseOrError = this.#modelMap[name]\n        if (promiseOrError instanceof E_UNRESOLVABLE_MODEL) return\n        const resolved = await promiseOrError\n        if (isResourcefulModel(resolved)) {\n          this.#models.set(name, resolved)\n          const [readable, writeable] = await Promise.all([\n            resolved.$asOpenApiSchemaObject(ctx, this.#app, 'read'),\n            resolved.$asOpenApiSchemaObject(ctx, this.#app, 'write'),\n          ])\n          this.#modelReadSchemas.set(resolved, readable)\n          this.#modelWriteSchemas.set(resolved, writeable)\n        }\n      },\n      {\n        concurrency: 5,\n      }\n    )\n  }\n\n  #getBaseUrl(request: Request): string {\n    const protocol = request.protocol()\n    const host = request.host()\n    const url = request.url()\n    const normalizedBase = url.replace(/\\/(openapi|swagger)?(\\.(json|yaml|yml))?$/, '')\n    return `${protocol}://${host}${normalizedBase}`\n  }\n\n  #makeAbsoluteUrl(ctx: HttpContext, path: string): string {\n    const baseUrl = this.#getBaseUrl(ctx.request)\n    while (path.startsWith('/')) {\n      path = path.slice(1)\n    }\n    return [baseUrl, path]\n      .filter((v) => 'string' === typeof v && v.trim().length > 0)\n      .map((v) => v.trim())\n      .join('/')\n  }\n\n  #stringifyQueryObject(obj: any): string {\n    return qs.stringify(obj, { arrayFormat: 'brackets', encode: false })\n  }\n\n  #queryParamExample(obj: any): string {\n    const stringified = this.#stringifyQueryObject(obj)\n    return stringified.replace(/^.*=/, '')\n  }\n\n  #descriptionOfFieldWithPossibleValues(\n    standaloneText: string,\n    possibleValuesText: string,\n    possibleValues: string[]\n  ): string {\n    let ret = standaloneText\n    if (possibleValues.length > 0) {\n      ret += `\\n\\n ${possibleValuesText}:\\n\\n - ${possibleValues.join('\\n - ')}`\n    }\n    return ret\n  }\n\n  #getHeadersForResponseObject(\n    global: {\n      [key: string]: string\n    },\n    model?: {\n      [key: string]: string\n    },\n    additional?: {\n      [key: string]: string\n    }\n  ): { [key: string]: OpenAPIV3.HeaderObject } {\n    const ret: { [key: string]: OpenAPIV3.HeaderObject } = {}\n    const toMerge = [global, model, additional].filter(isObject)\n    const all = deepmerge(...toMerge) as { [key: string]: string }\n    Object.keys(all).forEach((key) => {\n      ret[key] = {}\n    })\n    return ret\n  }\n\n  async #openapi(): Promise<OpenAPIV3.Document['openapi']> {\n    return '3.0.0'\n  }\n\n  async #info(): Promise<OpenAPIV3.Document['info']> {\n    return this.#opts.info\n  }\n\n  async #servers(ctx: HttpContext): Promise<OpenAPIV3.Document['servers']> {\n    return [\n      {\n        url: this.#getBaseUrl(ctx.request),\n      },\n    ]\n  }\n\n  #makeMetaIndexResponseSchema(\n    properties: { [key: string]: any },\n    filterable: { [key: string]: any },\n    sortable: string[],\n    aggregatable: string[],\n    format: ResourcefulResponseFormat = 'json'\n  ) {\n    return {\n      schema: {\n        type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n        properties: {\n          selectable: {\n            description: 'Describes the fields that can be selected for the index response',\n            properties: Object.assign(\n              {},\n              ...Object.keys(properties).map((k) => {\n                const example = 'type' in properties[k] ? properties[k] : { type: 'object' }\n                return {\n                  [k]: {\n                    type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n                    properties: {\n                      type: {\n                        type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n                        description: 'The type of the selectable field',\n                        enum: ['integer', 'number', 'string', 'boolean'],\n                      },\n                    },\n                    additionalProperties: true,\n                    required: ['type'],\n                    example: 'json' === format ? example : YAML.stringify(example),\n                  },\n                }\n              })\n            ),\n          },\n          filterable: {\n            description: 'Describes the fields that can be used to filter the index response',\n            type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n            properties: Object.assign(\n              {},\n              ...Object.keys(filterable).map((k) => ({\n                [k]: {\n                  type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n                  properties: {\n                    type: {\n                      type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n                      description: 'The type of the filterable field',\n                      enum: ['integer', 'number', 'string', 'boolean'],\n                    },\n                  },\n                  additionalProperties: true,\n                  required: ['type'],\n                  example: 'json' === format ? filterable[k] : YAML.stringify(filterable[k]),\n                },\n              }))\n            ),\n          },\n          sortable: {\n            description: 'Describes the fields that can be used to sort the index response',\n            type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n            items: {\n              type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n            },\n            uniqueItems: true,\n            example: 'json' === format ? sortable : YAML.stringify(sortable),\n          },\n          aggregatable: {\n            description:\n              'Describes the fields that can return aggregate calculations for the index response',\n            type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n            items: {\n              type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n            },\n            uniqueItems: true,\n            example: 'json' === format ? aggregatable : YAML.stringify(aggregatable),\n          },\n        },\n        required: ['selectable', 'filterable', 'sortable', 'aggregatable'],\n      },\n      example:\n        'yaml' === format\n          ? YAML.stringify({\n              selectable: properties,\n              filterable,\n              sortable,\n              aggregatable,\n            })\n          : {\n              selectable: properties,\n              filterable,\n              sortable,\n              aggregatable,\n            },\n    }\n  }\n\n  #makeMetaWriteOperationResponseSchema(\n    properties: { [key: string]: any },\n    schema: AnySchema,\n    encoded: string,\n    format: ResourcefulResponseFormat = 'json'\n  ) {\n    return {\n      schema: {\n        type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n        properties: {\n          schema: {\n            description: 'The OpenAPI schema for the payload',\n            type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n            schema: {\n              properties,\n            },\n            example:\n              'yaml' === format\n                ? YAML.stringify(properties, encoder)\n                : JSON.stringify(properties, encoder, 2),\n          },\n          joiSchema: {\n            description: 'The encoded Joi schema for the payload',\n            type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n            example: encoded,\n          },\n          joiSchemaDescription: {\n            description: 'The description of the Joi schema for the payload',\n            type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n            schema: {\n              additionalProperties: true,\n            },\n            example:\n              'yaml' === format\n                ? YAML.stringify(schema.describe(), encoder)\n                : JSON.stringify(schema.describe(), encoder, 2),\n          },\n        },\n      },\n      example:\n        'yaml' === format\n          ? YAML.stringify(\n              {\n                schema: properties,\n                joiSchema: encoded,\n                joiSchemaDescription: schema.describe(),\n              },\n              encoder\n            )\n          : {\n              schema: properties,\n              joiSchema: encoded,\n              joiSchemaDescription: schema.describe(),\n            },\n    }\n  }\n\n  #makeSchemaForAdditionalRoute(\n    method: ResourcefulHttpVerb,\n    path: string,\n    callbackOrRouteDetails: RouteCallback | AdditionalResourcefulRouteDetails\n  ): OpenAPIV3.OperationObject {\n    const operationId = string.camelCase(`${method}_${path.replace(/^\\//, '_')}`)\n    if (isAdditionalResourcefulRouteDetails(callbackOrRouteDetails)) {\n      const operation: OpenAPIV3.OperationObject = {\n        tags: Array.isArray(callbackOrRouteDetails.tags)\n          ? callbackOrRouteDetails.tags\n          : 'string' === typeof callbackOrRouteDetails.tags\n            ? [callbackOrRouteDetails.tags]\n            : [],\n        summary: callbackOrRouteDetails.title,\n        description: callbackOrRouteDetails.description,\n        operationId,\n        parameters: callbackOrRouteDetails.parameters,\n        requestBody: callbackOrRouteDetails.requestPayloadSchema\n          ? {\n              content: {\n                'application/json': {\n                  schema: callbackOrRouteDetails.requestPayloadSchema,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: callbackOrRouteDetails.requestPayloadSchema,\n                },\n                'multipart/form-data': {\n                  schema: callbackOrRouteDetails.requestPayloadSchema,\n                },\n                'application/x-yaml': {\n                  schema: callbackOrRouteDetails.requestPayloadSchema,\n                },\n              },\n            }\n          : undefined,\n        responses: callbackOrRouteDetails.responsePayloadSchema\n          ? {\n              '200': {\n                description: 'Successful response',\n                headers: this.#getHeadersForResponseObject(this.#opts.headers),\n                content: {\n                  'application/json': {\n                    schema: callbackOrRouteDetails.responsePayloadSchema,\n                  },\n                  'application/x-yaml': {\n                    schema: callbackOrRouteDetails.responsePayloadSchema,\n                  },\n                },\n              },\n            }\n          : {},\n      }\n      return operation\n    } else {\n      const operation: OpenAPIV3.OperationObject = {\n        tags: [this.#opts.tagMap.additional],\n        summary: `Custom ${method.toUpperCase()} Route`,\n        operationId,\n        responses: {},\n      }\n      return operation\n    }\n  }\n\n  async #paths(ctx: HttpContext): Promise<OpenAPIV3.Document['paths']> {\n    const ret: OpenAPIV3.PathsObject = {\n      '/': {\n        get: {\n          summary: `${this.#opts.info.title} OpenAPI Specification`,\n          operationId: `resourcefulOpenApiSpecRoot`,\n          tags: [this.#opts.tagMap.general],\n          responses: {\n            '200': {\n              description: 'The document you are currently viewing',\n              headers: this.#getHeadersForResponseObject(this.#opts.headers, undefined, {\n                'x-api-version': this.#opts.info.version,\n                'x-api-base-url': this.#getBaseUrl(ctx.request),\n              }),\n              content: {\n                'application/json': {\n                  schema: {\n                    type: 'object',\n                    additionalProperties: true,\n                  },\n                },\n                'application/x-yaml': {\n                  schema: {\n                    type: 'object',\n                    additionalProperties: true,\n                  },\n                },\n              },\n            },\n          },\n        },\n      },\n    }\n    const prefixesAndModels = Array.from(this.#models.entries())\n    await pMap(\n      prefixesAndModels,\n      async ([prefix, model]) => {\n        if (!isResourcefulModel(model)) return\n        const modelController = this.#controllers.get(prefix)\n        if (!modelController) return\n        const asResourceful = await model.$getAsResourcefulForContext(ctx, this.#app)\n        const base = `/${prefix}`\n        const resourcefulModelName = model.$resourcefulName\n        const readable = this.#modelReadSchemas.get(model)\n        const writable = this.#modelWriteSchemas.get(model)\n        if (!readable || !writable) return\n        const creatable = { ...writable }\n        creatable.properties = stripUndefinedValuesFromObject({\n          ...creatable.properties,\n          id: undefined,\n        }) as unknown as OpenAPIV3.SchemaObject['properties']\n        creatable.required = creatable.required\n          ? creatable.required.filter((r) => r !== 'id' && r in creatable.properties!)\n          : []\n        const modelJoiSchema =\n          await ResourcefulModelController.getResourcefulModelCreatePayloadValidationSchema(\n            model,\n            ctx,\n            this.#app\n          )\n        const modelCreateSchema = joi.object(\n          Object.assign(\n            {},\n            ...Object.keys(creatable.properties!).map((creatablePropertyKey) => {\n              const returnable = { [creatablePropertyKey]: joi.any() }\n              const prop = asResourceful.properties[creatablePropertyKey]\n              if (prop) {\n                const validator = prop.validator\n                if (validator) {\n                  returnable[creatablePropertyKey] = validator\n                }\n              }\n              try {\n                const extracted = modelJoiSchema.extract(creatablePropertyKey)\n                if (extracted) {\n                  returnable[creatablePropertyKey] =\n                    returnable[creatablePropertyKey].concat(extracted)\n                }\n              } catch {\n                // noop\n              }\n              return returnable\n            })\n          )\n        )\n        const modelUpdateSchema = joi.object(\n          Object.assign(\n            {},\n            ...Object.keys(writable.properties!).map((writablePropertyKey) => {\n              const returnable = { [writablePropertyKey]: joi.any() }\n              const prop = asResourceful.properties[writablePropertyKey]\n              if (prop) {\n                const validator = prop.validator\n                if (validator) {\n                  returnable[writablePropertyKey] = validator\n                }\n              }\n              try {\n                const extracted = modelJoiSchema.extract(writablePropertyKey)\n                if (extracted) {\n                  returnable[writablePropertyKey] =\n                    returnable[writablePropertyKey].concat(extracted)\n                }\n              } catch {\n                // noop\n              }\n              return returnable\n            })\n          )\n        )\n        const encodedModelCreateSchema = encode(modelCreateSchema)\n        const encodedModelUpdateSchema = encode(modelUpdateSchema)\n        const propertyNames = readable.properties ? Object.keys(readable.properties) : []\n        const filterable = readable['x-resourceful-filterable'] || []\n        const sortable = readable['x-resourceful-sortable'] || []\n        const aggregatable = readable['x-resourceful-aggregatable'] || []\n\n        const indexResponseFor = (\n          format: 'json' | 'yaml',\n          properties: OpenAPIV3.SchemaObject['properties']\n        ): OpenAPIV3.SchemaObject => {\n          const exampleObject: ResourcefulIndexResult = {\n            records: [\n              { id: 1 },\n              { id: 2 },\n              { id: 3 },\n              { id: 4 },\n              { id: 5 },\n              { id: 6 },\n              { id: 7 },\n              { id: 8 },\n              { id: 9 },\n              { id: 10 },\n            ],\n            total: 100,\n            page: 1,\n            perPage: 10,\n            aggregations:\n              aggregatable.length === 0\n                ? {}\n                : {\n                    [aggregatable[0]]: {\n                      avg: 50,\n                      min: 1,\n                      max: 100,\n                      sum: 500,\n                      countDistinct: 10,\n                      sumDistinct: 500,\n                      avgDistinct: 50,\n                    },\n                  },\n            countQuery: '',\n            recordsQuery: '',\n          }\n          return stripUndefinedValuesFromObject({\n            schema: {\n              type: 'object',\n              properties: {\n                records: {\n                  type: 'array',\n                  items: {\n                    type: 'object',\n                    properties,\n                  },\n                },\n                total: {\n                  type: 'integer',\n                  description: 'The total number of items matching the query',\n                },\n                page: {\n                  type: 'integer',\n                  description: 'The current page number',\n                },\n                perPage: {\n                  type: 'integer',\n                  description: 'The number of items per page',\n                },\n                aggregations: {\n                  type: 'object',\n                  properties: Object.assign(\n                    {},\n                    ...aggregatable.map((f) => ({\n                      [f]: {\n                        type: 'object',\n                        properties: {\n                          avg: {\n                            type: 'number',\n                          },\n                          min: {\n                            type: 'number',\n                          },\n                          max: {\n                            type: 'number',\n                          },\n                          sum: {\n                            type: 'number',\n                          },\n                          countDistinct: {\n                            type: 'number',\n                          },\n                          sumDistinct: {\n                            type: 'number',\n                          },\n                          avgDistinct: {\n                            type: 'number',\n                          },\n                        },\n                      },\n                    }))\n                  ),\n                },\n              },\n            },\n            example:\n              'json' === format\n                ? JSON.stringify(\n                    ResourcefulModelController.resourcefulIndexResultToConsumable(exampleObject),\n                    null,\n                    2\n                  )\n                : 'yaml' === format\n                  ? YAML.stringify(\n                      ResourcefulModelController.resourcefulIndexResultToConsumable(exampleObject)\n                    )\n                  : undefined,\n          })\n        }\n\n        ret[base] = {\n          get: {\n            summary: `Filterable Index of ${resourcefulModelName} Model`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(['serve', resourcefulModelName, 'index'].join('_')),\n            parameters: [\n              {\n                name: 'filter',\n                in: 'query',\n                allowReserved: true,\n                description: this.#descriptionOfFieldWithPossibleValues(\n                  'The lucene filter to apply to the results',\n                  'Filterable fields',\n                  Object.keys(filterable)\n                ),\n                required: false,\n                allowEmptyValue: true,\n                schema: {\n                  type: 'string',\n                  example: 'id:[20 TO 30]',\n                },\n                example: this.#queryParamExample({\n                  filter: 'id:[20 TO 30]',\n                }),\n              },\n              {\n                name: 'page',\n                in: 'query',\n                description: 'The page number to return',\n                required: false,\n                schema: {\n                  type: 'integer',\n                  minimum: 1,\n                  example: 1,\n                },\n                example: this.#queryParamExample({\n                  page: 1,\n                }),\n              },\n              {\n                name: 'perPage',\n                in: 'query',\n                description: 'The number of items to return per page',\n                required: false,\n                schema: {\n                  type: 'integer',\n                  minimum: 1,\n                  maximum: 100,\n                  example: 20,\n                },\n                example: this.#queryParamExample({\n                  perPage: 20,\n                }),\n              },\n              {\n                name: 'fields',\n                in: 'query',\n                description: this.#descriptionOfFieldWithPossibleValues(\n                  'A comma separated list of the fields to include in the response',\n                  'Available fields',\n                  propertyNames\n                ),\n                required: false,\n                allowEmptyValue: true,\n                style: 'form',\n                explode: false,\n                schema: {\n                  type: 'array',\n                  items: {\n                    type: 'string',\n                    enum: propertyNames,\n                  },\n                },\n                example: this.#queryParamExample({\n                  fields: propertyNames.length > 0 ? propertyNames.slice(1, 3).join(',') : 'id',\n                }),\n              },\n              {\n                name: 'sort',\n                in: 'query',\n                description:\n                  'The sort order to return results in. Sort operations will be applied in the order that they are specified.',\n                required: false,\n                allowEmptyValue: true,\n                explode: true,\n                style: 'deepObject',\n                schema: {\n                  type: 'object',\n                  properties: Object.assign(\n                    {},\n                    ...sortable.map((field) => ({\n                      [field]: {\n                        type: 'string',\n                        enum: ['asc', 'desc'],\n                        default: 'asc',\n                        example: 'asc',\n                      },\n                    }))\n                  ),\n                },\n                example: this.#stringifyQueryObject({\n                  sort:\n                    sortable.length > 0\n                      ? Object.assign(\n                          {},\n                          ...sortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                        )\n                      : { id: 'desc' },\n                }),\n              },\n              aggregatable.length > 0\n                ? {\n                    name: 'aggregations',\n                    in: 'query',\n                    description: this.#descriptionOfFieldWithPossibleValues(\n                      'An object containing a comma separated list of the aggregations to return with the results, per field',\n                      'Aggregatable fields',\n                      aggregatable\n                    ),\n                    required: false,\n                    allowEmptyValue: true,\n                    explode: true,\n                    style: 'deepObject',\n                    schema: {\n                      type: 'object',\n                      properties: Object.assign(\n                        {},\n                        ...aggregatable.map((field) => ({\n                          [field]: {\n                            type: 'array',\n                            items: {\n                              type: 'string',\n                              enum: ResourcefulAggregateMethods,\n                              description: this.#descriptionOfFieldWithPossibleValues(\n                                `The aggregation methods to apply to the ${field} field`,\n                                'Aggregation methods',\n                                Array.from(ResourcefulAggregateMethods)\n                              ),\n                            },\n                          },\n                        }))\n                      ),\n                    },\n                    example: this.#stringifyQueryObject({\n                      aggregations: Object.assign(\n                        {},\n                        ...aggregatable.slice(0, 2).map((field, index) => ({\n                          [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(','),\n                        }))\n                      ),\n                    }),\n                  }\n                : undefined,\n            ].filter(Boolean) as OpenAPIV3.ParameterObject[],\n            responses: {\n              '200': {\n                description: 'A paginated list of model instances matching the requested query',\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.index`),\n                    'x-shortcut-url': this.#makeAbsoluteUrl(\n                      ctx,\n                      [\n                        base,\n                        's',\n                        minify(\n                          stripUndefinedValuesFromObject({\n                            filter: 'id:[20 TO 30]',\n                            page: 1,\n                            perPage: 20,\n                            fields:\n                              propertyNames.length > 0 ? propertyNames.slice(1, 3).join(',') : 'id',\n                            sort:\n                              sortable.length > 0\n                                ? Object.assign(\n                                    {},\n                                    ...sortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                                  )\n                                : { id: 'desc' },\n                            aggregations: aggregatable.length\n                              ? Object.assign(\n                                  {},\n                                  ...aggregatable.slice(0, 2).map((field, index) => ({\n                                    [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(\n                                      ','\n                                    ),\n                                  }))\n                                )\n                              : undefined,\n                          })\n                        ),\n                      ].join('/')\n                    ),\n                  }\n                ),\n                content: {\n                  'application/json': indexResponseFor('json', readable.properties),\n                  'application/x-yaml': indexResponseFor('yaml', readable.properties),\n                },\n              },\n            },\n          },\n          post: {\n            summary: `Create a new ${resourcefulModelName} Model instance`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(['serve', resourcefulModelName, 'create'].join('_')),\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: {\n              '201': {\n                description: `The newly created ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.create`),\n                  }\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n          put: {\n            summary: `Update an existing ${resourcefulModelName} Model instance with ID in payload`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'putUpdateWithIdInPayload'].join('_')\n            ),\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...writable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...writable,\n                    required: undefined,\n                  }),\n                },\n                'multipart/form-data': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...writable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-yaml': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...writable,\n                    required: undefined,\n                  }),\n                },\n              },\n            },\n            responses: {\n              '201': {\n                description: `The updated ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.update`),\n                  }\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n        }\n\n        const metaIndexResponseSchema = this.#makeMetaIndexResponseSchema(\n          readable.properties as any,\n          filterable,\n          sortable,\n          aggregatable\n        )\n\n        const metaCreateOperationResponseSchema = this.#makeMetaWriteOperationResponseSchema(\n          writable.properties as any,\n          modelCreateSchema,\n          encodedModelCreateSchema\n        )\n\n        const metaUpdateOperationResponseSchema = this.#makeMetaWriteOperationResponseSchema(\n          writable.properties as any,\n          modelUpdateSchema,\n          encodedModelUpdateSchema\n        )\n\n        const metaBulkUpdateOperationResponseSchema = {\n          schema: {\n            type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n            properties: deepmerge(\n              stripUndefinedValuesFromObject({\n                filterable: {\n                  ...metaIndexResponseSchema.schema.properties!.filterable,\n                  description: this.#descriptionOfFieldWithPossibleValues(\n                    'The lucene filter used to select the records to update',\n                    'Filterable fields',\n                    Object.keys(filterable)\n                  ),\n                },\n              }),\n              metaUpdateOperationResponseSchema.schema.properties!\n            ),\n          },\n        }\n\n        ret[`${base}/$meta.index`] = {\n          get: {\n            summary: `${resourcefulModelName} index operation metadata`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'meta', 'for', 'index'].join('_')\n            ),\n            responses: {\n              '200': {\n                description: `The metadata for the ${resourcefulModelName} index operation`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': metaIndexResponseSchema,\n                  'application/x-yaml': metaIndexResponseSchema,\n                },\n              },\n            },\n          },\n        }\n        ret[`${base}/$meta.create`] = {\n          get: {\n            summary: `${resourcefulModelName} create operation metadata`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'meta', 'for', 'create'].join('_')\n            ),\n            responses: {\n              '200': {\n                description: `The metadata for the ${resourcefulModelName} create operation`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': metaCreateOperationResponseSchema,\n                  'application/x-yaml': metaCreateOperationResponseSchema,\n                },\n              },\n            },\n          },\n        }\n        ret[`${base}/$meta.update`] = {\n          get: {\n            summary: `${resourcefulModelName} update operation metadata`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'meta', 'for', 'update'].join('_')\n            ),\n            responses: {\n              '200': {\n                description: `The metadata for the ${resourcefulModelName} update operation`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': metaUpdateOperationResponseSchema,\n                  'application/x-yaml': metaUpdateOperationResponseSchema,\n                },\n              },\n            },\n          },\n        }\n        ret[`${base}/$meta.bulk.update`] = {\n          get: {\n            summary: `${resourcefulModelName} bulk.update operation metadata`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'meta', 'for', 'bulkUpdate'].join('_')\n            ),\n            responses: {\n              '200': {\n                description: `The metadata for the ${resourcefulModelName} bulk.update operation`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': metaBulkUpdateOperationResponseSchema,\n                  'application/x-yaml': metaBulkUpdateOperationResponseSchema,\n                },\n              },\n            },\n          },\n        }\n\n        const bulkUpdateResponses = {\n          '201': {\n            description: `The updated ${resourcefulModelName} Model instances`,\n            headers: this.#getHeadersForResponseObject(\n              this.#opts.headers,\n              modelController.options.headers,\n              {\n                'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.bulk.update`),\n              }\n            ),\n            content: {\n              'application/json': {\n                schema: {\n                  type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n                  items: {\n                    ...readable,\n                    type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n                  },\n                },\n              },\n              'application/x-yaml': {\n                schema: {\n                  type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n                  items: {\n                    ...readable,\n                    type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n                  },\n                },\n              },\n            },\n          },\n        }\n\n        ret[`${base}/$bulk`] = {\n          put: {\n            summary: `Bulk update existing ${resourcefulModelName} Model instances by filter`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'putBulkUpdateWithFilter'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'filter',\n                in: 'query',\n                allowReserved: true,\n                description: this.#descriptionOfFieldWithPossibleValues(\n                  'The lucene filter to apply to the results',\n                  'Filterable fields',\n                  Object.keys(filterable)\n                ),\n                required: false,\n                allowEmptyValue: true,\n                schema: {\n                  type: 'string',\n                  example: 'id:[20 TO 30]',\n                },\n                example: this.#queryParamExample({\n                  filter: 'id:[20 TO 30]',\n                }),\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: bulkUpdateResponses,\n          },\n          patch: {\n            summary: `Bulk update existing ${resourcefulModelName} Model instances by filter`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'patchBulkUpdateWithFilter'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'filter',\n                in: 'query',\n                allowReserved: true,\n                description: this.#descriptionOfFieldWithPossibleValues(\n                  'The lucene filter to apply to the results',\n                  'Filterable fields',\n                  Object.keys(filterable)\n                ),\n                required: false,\n                allowEmptyValue: true,\n                schema: {\n                  type: 'string',\n                  example: 'id:[20 TO 30]',\n                },\n                example: this.#queryParamExample({\n                  filter: 'id:[20 TO 30]',\n                }),\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: bulkUpdateResponses,\n          },\n        }\n        ret[`${base}/$bulk/{uids}`] = {\n          put: {\n            summary: `Bulk update existing ${resourcefulModelName} Model instances by unique ids`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'putBulkUpdateWithUniqueIds'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uids',\n                in: 'path',\n                description: `A comma separated list of unique identifier of the ${resourcefulModelName} Model instance to update`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: bulkUpdateResponses,\n          },\n          patch: {\n            summary: `Bulk update existing ${resourcefulModelName} Model instances by unique ids`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'patchBulkUpdateWithUniqueIds'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uids',\n                in: 'path',\n                description: `A comma separated list of unique identifier of the ${resourcefulModelName} Model instance to update`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1,2,3,4,5',\n                },\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: bulkUpdateResponses,\n          },\n        }\n\n        ret[`${base}/s/{encoded}`] = {\n          get: {\n            summary: `Filterable Index Shortcut of ${resourcefulModelName} Model`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'index', 'shortcut'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'encoded',\n                in: 'path',\n                description: `A URL encoded string representing the filter, page, perPage, fields, sort and aggregations parameters, generated via the \\`encode\\` method provided by the \\`@nhtio/lucid-resourceful/encoding\\` package`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: minify(\n                    stripUndefinedValuesFromObject({\n                      filter: 'id:[20 TO 30]',\n                      page: 1,\n                      perPage: 20,\n                      fields: propertyNames.length > 0 ? propertyNames.slice(1, 3).join(',') : 'id',\n                      sort:\n                        sortable.length > 0\n                          ? Object.assign(\n                              {},\n                              ...sortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                            )\n                          : { id: 'desc' },\n                      aggregations: aggregatable.length\n                        ? Object.assign(\n                            {},\n                            ...aggregatable.slice(0, 2).map((field, index) => ({\n                              [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(','),\n                            }))\n                          )\n                        : undefined,\n                    })\n                  ),\n                },\n              },\n            ],\n            responses: {\n              '200': {\n                description: 'A paginated list of model instances matching the requested query',\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.index`),\n                    'x-full-url': this.#makeAbsoluteUrl(\n                      ctx,\n                      [\n                        base,\n                        's',\n                        qs.stringify(\n                          stripUndefinedValuesFromObject({\n                            filter: 'id:[20 TO 30]',\n                            page: 1,\n                            perPage: 20,\n                            fields:\n                              propertyNames.length > 0 ? propertyNames.slice(1, 3).join(',') : 'id',\n                            sort:\n                              sortable.length > 0\n                                ? Object.assign(\n                                    {},\n                                    ...sortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                                  )\n                                : { id: 'desc' },\n                            aggregations: aggregatable.length\n                              ? Object.assign(\n                                  {},\n                                  ...aggregatable.slice(0, 2).map((field, index) => ({\n                                    [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(\n                                      ','\n                                    ),\n                                  }))\n                                )\n                              : undefined,\n                          }),\n                          { addQueryPrefix: true }\n                        ),\n                      ].join('/')\n                    ),\n                  }\n                ),\n                content: {\n                  'application/json': indexResponseFor('json', readable.properties),\n                  'application/x-yaml': indexResponseFor('yaml', readable.properties),\n                },\n              },\n            },\n          },\n        }\n\n        ret[`${base}/{uid}`] = {\n          get: {\n            summary: `Retrieve a specific ${resourcefulModelName} Model instance by its ID`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(['serve', resourcefulModelName, 'read'].join('_')),\n            parameters: [\n              {\n                name: 'uid',\n                in: 'path',\n                description: `The unique identifier of the ${resourcefulModelName} Model instance to retrieve`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            responses: {\n              '200': {\n                description: `The requested ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n          put: {\n            summary: `Update a specific ${resourcefulModelName} Model instance by its ID`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'put', 'update'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uid',\n                in: 'path',\n                description: `The unique identifier of the ${resourcefulModelName} Model instance to update`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'multipart/form-data': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-yaml': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n              },\n            },\n            responses: {\n              '201': {\n                description: `The updated ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.update`),\n                  }\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n          patch: {\n            summary: `Partially update a specific ${resourcefulModelName} Model instance by its ID`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'patch', 'update'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uid',\n                in: 'path',\n                description: `The unique identifier of the ${resourcefulModelName} Model instance to update`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'multipart/form-data': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-yaml': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n              },\n            },\n            responses: {\n              '201': {\n                description: `The updated ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.update`),\n                  }\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n          delete: {\n            summary: `Delete a specific ${resourcefulModelName} Model instance by its ID`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'delete', 'remove'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uid',\n                in: 'path',\n                description: `The unique identifier of the ${resourcefulModelName} Model instance to delete`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            responses: {\n              '204': {\n                description: `The ${resourcefulModelName} Model instance was successfully deleted`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n              },\n            },\n          },\n        }\n        const relationshipPaths: Set<string> = new Set()\n        await pMap(\n          Array.from(model.$resourcefulRelationships.entries()),\n          async ([name, relationship]) => {\n            const lucidRelationshipDefinition = model.$getRelation(name)\n            if (!lucidRelationshipDefinition) return\n            switch (lucidRelationshipDefinition.type) {\n              case 'hasOne':\n              case 'belongsTo':\n                return\n            }\n            const relatedResourcefulModel = relationship.relatedModel()\n            if (!isResourcefulModel(relatedResourcefulModel)) return\n            let relatedReadable = this.#modelReadSchemas.get(relatedResourcefulModel)\n            if (!relatedReadable) {\n              relatedReadable = await relatedResourcefulModel.$asOpenApiSchemaObject(\n                ctx,\n                this.#app,\n                'read'\n              )\n              this.#modelReadSchemas.set(relatedResourcefulModel, relatedReadable)\n            }\n            if (!relatedReadable) return\n            const relatedResourcefulModelName = relatedResourcefulModel.$resourcefulName\n            const relatedPropertyNames = relatedReadable.properties\n              ? Object.keys(relatedReadable.properties)\n              : []\n            const relatedFilterable = relatedReadable['x-resourceful-filterable'] || []\n            const relatedSortable = relatedReadable['x-resourceful-sortable'] || []\n            const relatedAggregatable = relatedReadable['x-resourceful-aggregatable'] || []\n            const baseWithRelationship = `${base}/{uid}/${name}`\n            relationshipPaths.add(baseWithRelationship)\n            ret[baseWithRelationship] = {\n              get: {\n                summary: `Retrieve the related ${name} ${relatedResourcefulModelName} Model instances for a specific ${resourcefulModelName} Model instance by its ID`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'read', 'related', name].join('_')\n                ),\n                parameters: [\n                  {\n                    name: 'uid',\n                    in: 'path',\n                    description: `The unique identifier of the ${resourcefulModelName} Model instance to retrieve related instances for`,\n                    required: true,\n                    schema: {\n                      type: 'string',\n                      example: '1',\n                    },\n                  },\n                  {\n                    name: 'filter',\n                    in: 'query',\n                    description: this.#descriptionOfFieldWithPossibleValues(\n                      'The lucene filter to apply to the results',\n                      'Filterable fields',\n                      Object.keys(relatedFilterable)\n                    ),\n                    required: false,\n                    allowEmptyValue: true,\n                    schema: {\n                      type: 'string',\n                      example: 'id:[20 TO 30]',\n                    },\n                    example: this.#queryParamExample({\n                      filter: 'id:[20 TO 30]',\n                    }),\n                  },\n                  {\n                    name: 'page',\n                    in: 'query',\n                    description: 'The page number to return',\n                    required: false,\n                    schema: {\n                      type: 'integer',\n                      minimum: 1,\n                      example: 1,\n                    },\n                    example: this.#queryParamExample({\n                      page: 1,\n                    }),\n                  },\n                  {\n                    name: 'perPage',\n                    in: 'query',\n                    description: 'The number of items to return per page',\n                    required: false,\n                    schema: {\n                      type: 'integer',\n                      minimum: 1,\n                      maximum: 100,\n                      example: 20,\n                    },\n                    example: this.#queryParamExample({\n                      perPage: 20,\n                    }),\n                  },\n                  {\n                    name: 'fields',\n                    in: 'query',\n                    description: this.#descriptionOfFieldWithPossibleValues(\n                      'A comma separated list of the fields to include in the response',\n                      'Available fields',\n                      relatedPropertyNames\n                    ),\n                    required: false,\n                    allowEmptyValue: true,\n                    style: 'form',\n                    explode: false,\n                    schema: {\n                      type: 'array',\n                      items: {\n                        type: 'string',\n                        enum: relatedPropertyNames,\n                      },\n                    },\n                    example: this.#queryParamExample({\n                      fields:\n                        relatedPropertyNames.length > 0\n                          ? relatedPropertyNames.slice(1, 3).join(',')\n                          : 'id',\n                    }),\n                  },\n                  {\n                    name: 'sort',\n                    in: 'query',\n                    description:\n                      'The sort order to return results in. Sort operations will be applied in the order that they are specified.',\n                    required: false,\n                    allowEmptyValue: true,\n                    explode: true,\n                    style: 'deepObject',\n                    schema: {\n                      type: 'object',\n                      properties: Object.assign(\n                        {},\n                        ...relatedSortable.map((field) => ({\n                          [field]: {\n                            type: 'string',\n                            enum: ['asc', 'desc'],\n                            default: 'asc',\n                            example: 'asc',\n                          },\n                        }))\n                      ),\n                    },\n                    example: this.#stringifyQueryObject({\n                      sort:\n                        relatedSortable.length > 0\n                          ? Object.assign(\n                              {},\n                              ...relatedSortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                            )\n                          : { id: 'desc' },\n                    }),\n                  },\n                  relatedAggregatable.length > 0\n                    ? {\n                        name: 'aggregations',\n                        in: 'query',\n                        description: this.#descriptionOfFieldWithPossibleValues(\n                          'An object containing a comma separated list of the aggregations to return with the results, per field',\n                          'Aggregatable fields',\n                          relatedAggregatable\n                        ),\n                        required: false,\n                        allowEmptyValue: true,\n                        explode: true,\n                        style: 'deepObject',\n                        schema: {\n                          type: 'object',\n                          properties: Object.assign(\n                            {},\n                            ...relatedAggregatable.map((field) => ({\n                              [field]: {\n                                type: 'array',\n                                items: {\n                                  type: 'string',\n                                  enum: ResourcefulAggregateMethods,\n                                  description: this.#descriptionOfFieldWithPossibleValues(\n                                    `The aggregation methods to apply to the ${field} field`,\n                                    'Aggregation methods',\n                                    Array.from(ResourcefulAggregateMethods)\n                                  ),\n                                },\n                              },\n                            }))\n                          ),\n                        },\n                        example: this.#stringifyQueryObject({\n                          aggregations: Object.assign(\n                            {},\n                            ...relatedAggregatable.slice(0, 2).map((field, index) => ({\n                              [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(','),\n                            }))\n                          ),\n                        }),\n                      }\n                    : undefined,\n                ].filter(Boolean) as OpenAPIV3.ParameterObject[],\n                responses: {\n                  '200': {\n                    description: `A paginated list of related ${relatedResourcefulModelName} Model instances`,\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers,\n                      {\n                        'x-metadata-url': this.#makeAbsoluteUrl(\n                          ctx,\n                          `${baseWithRelationship}/$meta.index`\n                        ),\n                        'x-shortcut-url': this.#makeAbsoluteUrl(\n                          ctx,\n                          [\n                            baseWithRelationship,\n                            's',\n                            minify(\n                              stripUndefinedValuesFromObject({\n                                filter: 'id:[20 TO 30]',\n                                page: 1,\n                                perPage: 20,\n                                fields:\n                                  relatedPropertyNames.length > 0\n                                    ? relatedPropertyNames.slice(1, 3).join(',')\n                                    : 'id',\n                                sort:\n                                  relatedSortable.length > 0\n                                    ? Object.assign(\n                                        {},\n                                        ...relatedSortable\n                                          .slice(0, 2)\n                                          .map((field) => ({ [field]: 'desc' }))\n                                      )\n                                    : { id: 'desc' },\n                                aggregations: relatedAggregatable.length\n                                  ? Object.assign(\n                                      {},\n                                      ...relatedAggregatable.slice(0, 2).map((field, index) => ({\n                                        [field]: ResourcefulAggregateMethods.slice(\n                                          0,\n                                          index + 1\n                                        ).join(','),\n                                      }))\n                                    )\n                                  : undefined,\n                              })\n                            ),\n                          ].join('/')\n                        ),\n                      }\n                    ),\n                    content: {\n                      'application/json': indexResponseFor('json', relatedReadable.properties),\n                      'application/x-yaml': indexResponseFor('yaml', relatedReadable.properties),\n                    },\n                  },\n                },\n              },\n              put: {\n                summary: `Sync the related ${name} ${relatedResourcefulModelName} Model instances for a specific ${resourcefulModelName} Model instance by its ID`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'update', 'related', name, 'put'].join('_')\n                ),\n                parameters: [\n                  {\n                    name: 'uid',\n                    in: 'path',\n                    description: `The unique identifier of the ${resourcefulModelName} Model instance to retrieve related instances for`,\n                    required: true,\n                    schema: {\n                      type: 'string',\n                      example: '1',\n                    },\n                  },\n                ],\n                requestBody: {\n                  $ref: '#/components/requestBodies/SyncRelatedInstancesRequestBody',\n                },\n                responses: {\n                  204: {\n                    description: `The related ${relatedResourcefulModelName} Model instances were successfully synced`,\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers\n                    ),\n                  },\n                },\n              },\n              patch: {\n                summary: `Sync the related ${name} ${relatedResourcefulModelName} Model instances for a specific ${resourcefulModelName} Model instance by its ID`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'update', 'related', name, 'patch'].join('_')\n                ),\n                parameters: [\n                  {\n                    name: 'uid',\n                    in: 'path',\n                    description: `The unique identifier of the ${resourcefulModelName} Model instance to retrieve related instances for`,\n                    required: true,\n                    schema: {\n                      type: 'string',\n                      example: '1',\n                    },\n                  },\n                ],\n                requestBody: {\n                  $ref: '#/components/requestBodies/SyncRelatedInstancesRequestBody',\n                },\n                responses: {\n                  204: {\n                    description: `The related ${relatedResourcefulModelName} Model instances were successfully synced`,\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers\n                    ),\n                  },\n                },\n              },\n            }\n            ret[`${baseWithRelationship}/s/{encoded}`] = {\n              get: {\n                summary: `Shortcut to Retrieve the related ${name} ${relatedResourcefulModelName} Model instances for a specific ${resourcefulModelName} Model instance by its ID`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'read', 'related', name, 'shortcut'].join('_')\n                ),\n                parameters: [\n                  {\n                    name: 'encoded',\n                    in: 'path',\n                    description: `A URL encoded string representing the filter, page, perPage, fields, sort and aggregations parameters, generated via the \\`encode\\` method provided by the \\`@nhtio/lucid-resourceful/encoding\\` package`,\n                    required: true,\n                    schema: {\n                      type: 'string',\n                      example: minify(\n                        stripUndefinedValuesFromObject({\n                          filter: 'id:[20 TO 30]',\n                          page: 1,\n                          perPage: 20,\n                          fields:\n                            relatedPropertyNames.length > 0\n                              ? relatedPropertyNames.slice(1, 3).join(',')\n                              : 'id',\n                          sort:\n                            relatedSortable.length > 0\n                              ? Object.assign(\n                                  {},\n                                  ...relatedSortable\n                                    .slice(0, 2)\n                                    .map((field) => ({ [field]: 'desc' }))\n                                )\n                              : { id: 'desc' },\n                          aggregations: relatedAggregatable.length\n                            ? Object.assign(\n                                {},\n                                ...relatedAggregatable.slice(0, 2).map((field, index) => ({\n                                  [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(\n                                    ','\n                                  ),\n                                }))\n                              )\n                            : undefined,\n                        })\n                      ),\n                    },\n                  },\n                ],\n                responses: {\n                  '200': {\n                    description: 'A paginated list of model instances matching the requested query',\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers,\n                      {\n                        'x-metadata-url': this.#makeAbsoluteUrl(\n                          ctx,\n                          `${baseWithRelationship}/$meta.index`\n                        ),\n                        'x-full-url': this.#makeAbsoluteUrl(\n                          ctx,\n                          [\n                            baseWithRelationship,\n                            's',\n                            qs.stringify(\n                              stripUndefinedValuesFromObject({\n                                filter: 'id:[20 TO 30]',\n                                page: 1,\n                                perPage: 20,\n                                fields:\n                                  relatedPropertyNames.length > 0\n                                    ? relatedPropertyNames.slice(1, 3).join(',')\n                                    : 'id',\n                                sort:\n                                  relatedSortable.length > 0\n                                    ? Object.assign(\n                                        {},\n                                        ...relatedSortable\n                                          .slice(0, 2)\n                                          .map((field) => ({ [field]: 'desc' }))\n                                      )\n                                    : { id: 'desc' },\n                                aggregations: relatedAggregatable.length\n                                  ? Object.assign(\n                                      {},\n                                      ...relatedAggregatable.slice(0, 2).map((field, index) => ({\n                                        [field]: ResourcefulAggregateMethods.slice(\n                                          0,\n                                          index + 1\n                                        ).join(','),\n                                      }))\n                                    )\n                                  : undefined,\n                              }),\n                              { addQueryPrefix: true }\n                            ),\n                          ].join('/')\n                        ),\n                      }\n                    ),\n                    content: {\n                      'application/json': indexResponseFor('json', relatedReadable.properties),\n                      'application/x-yaml': indexResponseFor('yaml', relatedReadable.properties),\n                    },\n                  },\n                },\n              },\n            }\n            ret[`${baseWithRelationship}/$meta.index`] = {\n              get: {\n                summary: `Related ${relatedResourcefulModelName} index operation metadata`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'read', 'related', name, 'metadata'].join('_')\n                ),\n                responses: {\n                  '200': {\n                    description: `The metadata for the ${resourcefulModelName} index operation`,\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers\n                    ),\n                    content: {\n                      'application/json': this.#makeMetaIndexResponseSchema(\n                        relatedReadable.properties as any,\n                        relatedFilterable,\n                        relatedSortable,\n                        relatedAggregatable\n                      ),\n                      'application/x-yaml': this.#makeMetaIndexResponseSchema(\n                        relatedReadable.properties as any,\n                        relatedFilterable,\n                        relatedSortable,\n                        relatedAggregatable,\n                        'yaml'\n                      ),\n                    },\n                  },\n                },\n              },\n            }\n          },\n          { concurrency: 1 }\n        )\n        this.#opts.security.forEach((def) => {\n          const applyToModel = isObject(def.applyToModels)\n            ? def.applyToModels[prefix]\n            : def.applyToModels\n          if (applyToModel === false || !applyToModel) return\n          const toApply: Map<string, any[]> = new Map()\n          if (applyToModel === true) {\n            toApply.set([base, 'get'].join('|'), [])\n            toApply.set([base, 'post'].join('|'), [])\n            toApply.set([base, 'put'].join('|'), [])\n            toApply.set([base, 'patch'].join('|'), [])\n            toApply.set([`${base}/{uid}`, 'get'].join('|'), [])\n            toApply.set([`${base}/{uid}`, 'put'].join('|'), [])\n            toApply.set([`${base}/{uid}`, 'patch'].join('|'), [])\n            toApply.set([`${base}/{uid}`, 'delete'].join('|'), [])\n            toApply.set([`${base}/$bulk`, 'put'].join('|'), [])\n            toApply.set([`${base}/$bulk`, 'patch'].join('|'), [])\n            toApply.set([`${base}/$bulk/{uids}`, 'put'].join('|'), [])\n            toApply.set([`${base}/$bulk/{uids}`, 'patch'].join('|'), [])\n            toApply.set([`${base}/s/{encoded}`, 'get'].join('|'), [])\n            relationshipPaths.forEach((path) => {\n              toApply.set([path, 'get'].join('|'), [])\n              toApply.set([path, 'put'].join('|'), [])\n              toApply.set([path, 'patch'].join('|'), [])\n            })\n          } else if (isObject(applyToModel)) {\n            Object.entries(applyToModel).forEach(([resourcefulRouterVerb, requiredPermissions]) => {\n              if (!requiredPermissions) return\n              const permissionsToApply = true === requiredPermissions ? [] : requiredPermissions\n              switch (resourcefulRouterVerb) {\n                case 'index':\n                  toApply.set([base, 'get'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/s/{encoded}`, 'get'].join('|'), permissionsToApply)\n                  break\n                case 'create':\n                  toApply.set([base, 'post'].join('|'), permissionsToApply)\n                  break\n                case 'read':\n                  toApply.set([`${base}/{uid}`, 'get'].join('|'), permissionsToApply)\n                  break\n                case 'readRelated':\n                  relationshipPaths.forEach((path) => {\n                    toApply.set([path, 'get'].join('|'), permissionsToApply)\n                    toApply.set([`${path}/s/{encoded}`, 'get'].join('|'), permissionsToApply)\n                  })\n                  break\n                case 'update':\n                  toApply.set([base, 'put'].join('|'), permissionsToApply)\n                  toApply.set([base, 'patch'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/{uid}`, 'put'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/{uid}`, 'patch'].join('|'), permissionsToApply)\n                  break\n                case 'bulkUpdate':\n                  toApply.set([`${base}/$bulk`, 'put'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/$bulk`, 'patch'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/$bulk/{uids}`, 'put'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/$bulk/{uids}`, 'patch'].join('|'), permissionsToApply)\n                  break\n                case 'syncRelated':\n                  relationshipPaths.forEach((path) => {\n                    toApply.set([path, 'put'].join('|'), permissionsToApply)\n                    toApply.set([path, 'patch'].join('|'), permissionsToApply)\n                  })\n                  break\n                case 'delete':\n                  toApply.set([`${base}/{uid}`, 'delete'].join('|'), permissionsToApply)\n                  break\n              }\n            })\n          }\n          toApply.forEach((permissions, relativePathAndMethod) => {\n            const [relativePath, method] = relativePathAndMethod.split('|') as [\n              keyof typeof ret,\n              ResourcefulHttpVerb,\n            ]\n            if (\n              typeof ret[relativePath] === 'undefined' ||\n              !isObject(ret[relativePath]) ||\n              typeof ret[relativePath][method] === 'undefined' ||\n              !isObject(ret[relativePath][method])\n            )\n              return false\n            if (!Array.isArray(ret[relativePath][method].security)) {\n              ret[relativePath][method].security = []\n            }\n            ret[relativePath][method].security.push({\n              [def.key]: permissions,\n            })\n          })\n        })\n        ResourcefulRouterVerb.forEach((verb) => {\n          if (this.#opts.except.includes(verb) || modelController.options.except.includes(verb)) {\n            switch (verb) {\n              case 'index':\n                delete ret[`${base}/$meta.index`]\n                delete ret[`${base}/s/{encoded}`]\n                delete ret[base]?.get\n                break\n              case 'create':\n                delete ret[`${base}/$meta.create`]\n                delete ret[base]?.post\n                break\n              case 'read':\n                delete ret[`${base}/{uid}`]?.get\n                delete ret[`${base}/$meta.read`]\n                break\n              case 'readRelated':\n                Object.entries(ret).forEach(([key]) => {\n                  if (key.startsWith(`${base}/{uid}/`)) {\n                    delete ret[key]?.get\n                  }\n                })\n                break\n              case 'update':\n                delete ret[base]?.put\n                delete ret[base]?.patch\n                delete ret[`${base}/{uid}`]?.put\n                delete ret[`${base}/{uid}`]?.patch\n                delete ret[`${base}/$meta.update`]\n                break\n              case 'bulkUpdate':\n                delete ret[`${base}/$bulk`]?.put\n                delete ret[`${base}/$bulk`]?.patch\n                delete ret[`${base}/$bulk/{uids}`]?.put\n                delete ret[`${base}/$bulk/{uids}`]?.patch\n                delete ret[`${base}/$meta.bulk.update`]\n                break\n              case 'syncRelated':\n                Object.entries(ret).forEach(([key]) => {\n                  if (key.startsWith(`${base}/{uid}/`)) {\n                    delete ret[key]?.put\n                    delete ret[key]?.patch\n                  }\n                })\n                break\n              case 'delete':\n                delete ret[`${base}/{uid}`]?.delete\n                break\n            }\n          }\n        })\n        Object.keys(ret).forEach((key) => {\n          if (isObject(ret[key]) && Object.keys(ret[key]).length === 0) {\n            delete ret[key]\n          }\n        })\n        Object.entries(modelController.options.additional).forEach(\n          ([methodAndRelativePath, callbackOrRouteDetails]) => {\n            const [method, relativePath] = methodAndRelativePath.split('|')\n            if (!ResourcefulHttpVerb.includes(method.toLowerCase() as any)) return\n            const resourcefulHttpMethod = method.toLowerCase() as ResourcefulHttpVerb\n            const pathKey = `${base}/${relativePath}`.replace('//', '/')\n            const schema = this.#makeSchemaForAdditionalRoute(\n              resourcefulHttpMethod,\n              pathKey,\n              callbackOrRouteDetails\n            )\n            const matchingSecuritySchemaDefinitions = this.#opts.security\n              .filter(\n                (def) =>\n                  def.applyToAdditional === true ||\n                  Object.keys(def.applyToAdditional).includes(pathKey)\n              )\n              .map((def) => ({\n                key: def.key,\n                application: isObject(def.applyToAdditional)\n                  ? def.applyToAdditional[pathKey as keyof typeof def.applyToAdditional]!\n                  : def.applyToAdditional,\n              }))\n              .filter((def) => def.application !== false)\n            if (matchingSecuritySchemaDefinitions.length > 0) {\n              if (!schema.security) {\n                schema.security = []\n              }\n              matchingSecuritySchemaDefinitions.forEach((def) => {\n                if (def.application === false) return\n                schema.security!.push({\n                  [def.key]: def.application === true ? [] : def.application,\n                })\n              })\n            }\n            if (!ret[pathKey]) ret[pathKey] = {}\n            if (!ret[pathKey][resourcefulHttpMethod]) ret[pathKey][resourcefulHttpMethod] = schema\n          }\n        )\n      },\n      { concurrency: 10 }\n    )\n    Object.entries(this.#opts.additional).forEach(\n      ([methodAndRelativePath, callbackOrRouteDetails]) => {\n        const [method, relativePath] = methodAndRelativePath.split('|')\n        if (!ResourcefulHttpVerb.includes(method.toLowerCase() as any)) return\n        const resourcefulHttpMethod = method.toLowerCase() as ResourcefulHttpVerb\n        const pathKey = relativePath\n        const schema = this.#makeSchemaForAdditionalRoute(\n          resourcefulHttpMethod,\n          pathKey,\n          callbackOrRouteDetails\n        )\n        const matchingSecuritySchemaDefinitions = this.#opts.security\n          .filter(\n            (def) =>\n              def.applyToAdditional === true ||\n              Object.keys(def.applyToAdditional).includes(methodAndRelativePath)\n          )\n          .map((def) => ({\n            key: def.key,\n            application: isObject(def.applyToAdditional)\n              ? def.applyToAdditional[pathKey as keyof typeof def.applyToAdditional]!\n              : def.applyToAdditional,\n          }))\n          .filter((def) => def.application !== false)\n        if (matchingSecuritySchemaDefinitions.length > 0) {\n          if (!schema.security) {\n            schema.security = []\n          }\n          matchingSecuritySchemaDefinitions.forEach((def) => {\n            if (def.application === false) return\n            schema.security!.push({\n              [def.key]: def.application === true ? [] : def.application,\n            })\n          })\n        }\n        if (!ret[pathKey]) ret[pathKey] = {}\n        if (!ret[pathKey][resourcefulHttpMethod]) ret[pathKey][resourcefulHttpMethod] = schema\n      }\n    )\n    const errorResponseReferences = getPossibleHttpErrorCodes().map((c) => ({\n      [c.toString()]: {\n        $ref: `#/components/responses/${string.camelCase(['error', c].join('_'))}`,\n      },\n    }))\n    Object.entries(ret).forEach(([path, operations]) => {\n      Object.entries(operations!).forEach(([method, operation]) => {\n        if (isObject(operation)) {\n          if (this.#opts.catchThrown) {\n            if (!operation.responses) {\n              operation.responses = {}\n            }\n            operation.responses = deepmerge(\n              operation.responses,\n              ...errorResponseReferences\n            ) as OpenAPIV3.ResponsesObject\n            // @ts-ignore\n            ret[path][method] = operation\n          }\n        }\n      })\n    })\n    return Object.assign(\n      {},\n      ...Object.entries(ret)\n        .sort(([a], [b]) => a.localeCompare(b))\n        .map(([k, v]) => ({\n          [k]: Object.assign(\n            {},\n            ...Object.entries(v!)\n              .sort(([a], [b]) => {\n                const aOrder = HttpMethodSortOrder[a as keyof typeof HttpMethodSortOrder]\n                const bOrder = HttpMethodSortOrder[b as keyof typeof HttpMethodSortOrder]\n                if (!aOrder || !bOrder) return a.localeCompare(b)\n                return aOrder - bOrder\n              })\n              .map(([k2, v2]) => ({ [k2]: v2 }))\n          ),\n        }))\n    )\n  }\n\n  async #components(): Promise<OpenAPIV3.Document['components']> {\n    const syncRelatedInstancesSchema = {\n      type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n      items: {\n        description: 'An object representing a related instance to sync, including pivot data',\n        type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n        properties: {\n          ruid: {\n            type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n            description: 'The unique identifier of the related instance',\n            example: '1',\n          },\n        },\n        additionalProperties: true,\n        required: ['ruid'],\n      },\n      uniqueItems: true,\n    }\n\n    const ret: OpenAPIV3.ComponentsObject = {\n      schemas: {},\n      requestBodies: {\n        SyncRelatedInstancesRequestBody: {\n          description:\n            'A request body to sync related instances.\\n\\n**Note**: For Many to Many relationships, additional properties may be specified to update pivot properties.',\n          content: {\n            'application/json': {\n              schema: syncRelatedInstancesSchema,\n              example: JSON.stringify(\n                [{ ruid: '1' }, { ruid: '2', pivotValue: 'foo' }, { ruid: '3' }],\n                null,\n                2\n              ),\n            },\n            'application/x-www-form-urlencoded': {\n              schema: syncRelatedInstancesSchema,\n              example: qs.stringify([\n                { ruid: '1' },\n                { ruid: '2', pivotValue: 'foo' },\n                { ruid: '3' },\n              ]),\n            },\n            'multipart/form-data': {\n              schema: syncRelatedInstancesSchema,\n              example: [{ ruid: '1' }, { ruid: '2', pivotValue: 'foo' }, { ruid: '3' }],\n            },\n            'application/x-yaml': {\n              schema: syncRelatedInstancesSchema,\n              example: YAML.stringify([\n                { ruid: '1' },\n                { ruid: '2', pivotValue: 'foo' },\n                { ruid: '3' },\n              ]),\n            },\n          },\n        },\n      },\n    }\n    if (this.#opts.catchThrown) {\n      if (!ret.responses) {\n        ret.responses = {}\n      }\n      const errorResponses: { [key: string]: OpenAPIV3.ResponseObject } = {}\n      const errorCodes = getPossibleHttpErrorCodes()\n      errorCodes.forEach((code) => {\n        const key = string.camelCase(['error', code].join('_'))\n        const errorCodeSchema: OpenAPIV3.MediaTypeObject = {\n          schema: {\n            type: 'object',\n            required: ['status', 'code', 'message'],\n            properties: {\n              status: {\n                type: 'number',\n                enum: [code],\n                example: code,\n                description: 'The HTTP Status code of the error',\n              },\n              code: {\n                type: 'string',\n                example: 'E_SOME_ERROR_CODE',\n                description:\n                  'A machine readable code used to differentiate different errors within the same HTTP status code',\n              },\n              message: {\n                type: 'string',\n                example: 'Some message which is much friendier to humans',\n                description: 'A message meant to be consumed by non-machine consumers',\n              },\n              help: {\n                type: 'string',\n                example: 'To fix this error, change something',\n                description: 'Optional help text providing guidance on how to resolve the error',\n              },\n              details: {\n                description: 'Array of detailed error information, typically for validation errors',\n                type: 'array',\n                items: {\n                  description:\n                    'Provides field-level information for validation errors or error chain details.',\n                  type: 'object',\n                  required: ['code', 'message'],\n                  properties: {\n                    code: {\n                      type: 'string',\n                      example: 'E_SOME_ERROR_CODE',\n                      description:\n                        'A machine readable code used to differentiate different errors within the same HTTP status code',\n                    },\n                    message: {\n                      type: 'string',\n                      example: 'Some message which is much friendier to humans',\n                      description: 'A message meant to be consumed by non-machine consumers',\n                    },\n                    target: {\n                      type: 'string',\n                      example: 'yourObject.yourObjectField',\n                      description:\n                        'The field or property that caused the error (for validation errors)',\n                    },\n                    context: {\n                      type: 'object',\n                      example: {},\n                      description: 'Additional context information about the error',\n                      additionalProperties: true,\n                    },\n                  },\n                },\n              },\n            },\n          },\n        }\n        errorResponses[key] = {\n          description: describeHttpError(code),\n          headers: this.#getHeadersForResponseObject(this.#opts.headers),\n          content: {\n            'application/json': errorCodeSchema,\n            'application/x-www-form-urlencoded': errorCodeSchema,\n            'multipart/form-data': errorCodeSchema,\n            'application/x-yaml': errorCodeSchema,\n          },\n        }\n      })\n      ret.responses = deepmerge(ret.responses, errorResponses)\n    }\n    const prefixesAndModels = Array.from(this.#models.entries())\n    await pMap(\n      prefixesAndModels,\n      async ([_prefix, model]) => {\n        if (!isResourcefulModel(model)) return\n        const readable = this.#modelReadSchemas.get(model)\n        const key = model.$resourcefulName\n        if (readable && key) {\n          ret.schemas = ret.schemas || {}\n          ret.schemas[key] = readable\n        }\n      },\n      {\n        concurrency: 5,\n      }\n    )\n    const securitySchemas: { [key: string]: OpenAPIV3.SecuritySchemeObject } = {}\n    this.#opts.security.forEach((def) => {\n      securitySchemas[def.key] = def.schema\n    })\n    ret.securitySchemes = securitySchemas\n    return ret\n  }\n\n  async #security(): Promise<OpenAPIV3.Document['security']> {\n    return undefined\n  }\n\n  async #tags(): Promise<OpenAPIV3.Document['tags']> {\n    return undefined\n  }\n\n  async #externalDocs(): Promise<OpenAPIV3.Document['externalDocs']> {\n    return this.#opts.externalDocs || undefined\n  }\n\n  async #getJsonAndYamlCompatibleObject(ctx: HttpContext): Promise<OpenAPIV3.Document> {\n    const [openapi, info, servers, paths, components, security, tags, externalDocs] =\n      await Promise.all([\n        this.#openapi(),\n        this.#info(),\n        this.#servers(ctx),\n        this.#paths(ctx),\n        this.#components(),\n        this.#security(),\n        this.#tags(),\n        this.#externalDocs(),\n      ])\n    return {\n      openapi,\n      info,\n      servers,\n      paths,\n      components,\n      security,\n      tags,\n      externalDocs,\n    }\n  }\n\n  async #serveAsJson(ctx: HttpContext): Promise<void> {\n    const spec = await this.#getJsonAndYamlCompatibleObject(ctx)\n    return ctx.response\n      .header('Content-Type', 'application/json')\n      .status(200)\n      .send(JSON.stringify(spec, encoder))\n  }\n\n  async #serveAsYaml(ctx: HttpContext): Promise<void> {\n    const spec = await this.#getJsonAndYamlCompatibleObject(ctx)\n    return ctx.response\n      .header('Content-Type', 'application/x-yaml')\n      .status(200)\n      .send(YAML.stringify(spec, encoder))\n  }\n\n  async serveAs(format: ResourcefulResponseFormat, ctx: HttpContext): Promise<void> {\n    switch (format) {\n      case 'yaml':\n        return await this.#serveAsYaml(ctx)\n      default:\n        return await this.#serveAsJson(ctx)\n    }\n  }\n}\n","import { deepmerge } from 'deepmerge-ts'\nimport { default as dot } from 'dot-object'\nimport { validator as joi } from '@nhtio/validation'\nimport { ResourcefulRouterOperation } from '../types'\nimport { E_INVALID_RESOURCEFUL_ROUTER_OPTIONS } from '@nhtio/lucid-resourceful/errors'\nimport { SchemaOrReferenceObjectSchema as schemaOrReferenceObjectSchema } from '../utils/openapi_validation_schemas'\nimport {\n  ResourcefulPolicySchema,\n  ResourcefulRouterMutatorOptionsSchema,\n} from './resourceful_router_options_service'\nimport type { ValidationError } from '@nhtio/lucid-resourceful/joi'\nimport type {\n  ResourcefulRouterModelServiceOptions,\n  RouteCallback,\n  AdditionalResourcefulRoutesMap,\n  AdditionalResourcefulRouteDetails,\n} from '../types'\n\nconst DEFAULT_RESOURCEFUL_ROUTER_MODEL_OPTIONS: ResourcefulRouterModelServiceOptions = {\n  middleware: [],\n  except: [],\n  additional: {},\n  headers: {},\n  scopeRestrictors: [],\n  payloadRestrictors: [],\n  policies: [],\n  mutators: {},\n}\n\nconst FORBIDDEN_ADDITIONALS = [\n  'get|/',\n  'get|/$meta.index',\n  'post|/',\n  'get|/$meta.create',\n  'get|/:id',\n  'get|/:id/$meta.read',\n  'get|/:id/:relationship',\n  'get|/:id/:relationship/$meta.index',\n  'put|/:id',\n  'patch|/:id',\n  'get|/$meta.update',\n  'put|/$bulk',\n  'put|/$bulk/:ids',\n  'patch|/$bulk',\n  'patch|/$bulk/:ids',\n  'get|/$meta.$bulk.update',\n  'put|/:id/:relationship',\n  'patch|/:id/:relationship',\n  'get|/:id/:relationship/$meta.sync',\n  'delete|/:id',\n  'get|/$meta.delete',\n]\n\nconst RouteCallbackSchema = joi.function<RouteCallback>().required()\n\nconst AdditionalResourcefulRouteDetailsSchema = joi.object<AdditionalResourcefulRouteDetails>({\n  title: joi.string().optional(),\n  description: joi.string().optional(),\n  handler: RouteCallbackSchema,\n  requestPayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  responsePayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  tags: joi.alternatives(joi.string(), joi.array().items(joi.string())).optional(),\n})\n\nconst AdditionalResourcefulRoutesMapValueSchema = joi.alternatives<\n  RouteCallback | AdditionalResourcefulRouteDetails\n>(RouteCallbackSchema, AdditionalResourcefulRouteDetailsSchema)\n\nconst ResourcefulRouterModelServiceOptionsMiddlewareSchema = joi.alternatives(\n  joi.function(),\n  joi\n    .object({\n      name: joi.string().required(),\n      args: joi.array().optional(),\n    })\n    .unknown(true)\n)\n\nconst ResourcefulRouterModelServiceOptionsSchema = joi.object<ResourcefulRouterModelServiceOptions>(\n  {\n    middleware: joi\n      .alternatives(\n        ResourcefulRouterModelServiceOptionsMiddlewareSchema,\n        joi.array().items(ResourcefulRouterModelServiceOptionsMiddlewareSchema)\n      )\n      .required(),\n    except: joi\n      .array()\n      .items(joi.string().valid(...ResourcefulRouterOperation))\n      .required(),\n    additional: joi\n      .object<AdditionalResourcefulRoutesMap>()\n      .pattern(\n        joi\n          .alternatives(joi.string(), joi.string().disallow(...FORBIDDEN_ADDITIONALS))\n          .match('all'),\n        AdditionalResourcefulRoutesMapValueSchema\n      )\n      .keys(\n        Object.assign({}, ...FORBIDDEN_ADDITIONALS.map((route) => ({ [route]: joi.forbidden() })))\n      )\n      .custom((value, helpers) => {\n        const keys = Object.keys(value)\n        const passed = keys.every((key) => /^(get|post|put|patch|delete)\\|\\/.*$/gm.test(key))\n        if (!passed) {\n          return helpers.error('any.invalid')\n        }\n        return value\n      }),\n    headers: joi.object().pattern(joi.string(), joi.string()).default({}),\n    scopeRestrictors: joi\n      .array()\n      .items(\n        joi.alternatives(\n          joi.function().arity(0),\n          joi.function().arity(1),\n          joi.function().arity(2),\n          joi.function().arity(3)\n        )\n      )\n      .optional()\n      .default([]),\n    payloadRestrictors: joi\n      .array()\n      .items(\n        joi.alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n      )\n      .optional()\n      .default([]),\n    policies: joi.array().items(ResourcefulPolicySchema).optional().default([]),\n    mutators: ResourcefulRouterMutatorOptionsSchema.optional().default({}),\n  }\n)\n\nexport class ResourcefulRouterModelServiceOptionsService {\n  readonly #options: ResourcefulRouterModelServiceOptions\n\n  private constructor(options: ResourcefulRouterModelServiceOptions) {\n    this.#options = Object.freeze(deepmerge({}, options))\n    Object.defineProperty(this, 'middleware', {\n      get: () => this.#options.middleware,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'except', {\n      get: () => this.#options.except,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'additional', {\n      get: () => this.#options.additional,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'headers', {\n      get: () => this.#options.headers,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'scopeRestrictors', {\n      get: () => this.#options.scopeRestrictors,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'payloadRestrictors', {\n      get: () => this.#options.payloadRestrictors,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'policies', {\n      get: () => this.#options.policies,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'mutators', {\n      get: () => this.#options.mutators,\n      enumerable: true,\n      configurable: false,\n    })\n  }\n\n  declare middleware: Readonly<ResourcefulRouterModelServiceOptions['middleware']>\n  declare except: Readonly<ResourcefulRouterModelServiceOptions['except']>\n  declare additional: Readonly<ResourcefulRouterModelServiceOptions['additional']>\n  declare headers: Readonly<ResourcefulRouterModelServiceOptions['headers']>\n  declare scopeRestrictors: Readonly<ResourcefulRouterModelServiceOptions['scopeRestrictors']>\n  declare payloadRestrictors: Readonly<ResourcefulRouterModelServiceOptions['payloadRestrictors']>\n  declare policies: Readonly<ResourcefulRouterModelServiceOptions['policies']>\n  declare mutators: Readonly<ResourcefulRouterModelServiceOptions['mutators']>\n\n  get(key: string): any {\n    return dot.pick(key, this.#options, false)\n  }\n\n  public static init(options: unknown): ResourcefulRouterModelServiceOptionsService {\n    // step 1: at minimum, ensure that we are dealing with an object\n    const { error: checkIfObjectError } = joi.object().unknown(true).required().validate(options, {\n      abortEarly: true,\n    })\n    if (checkIfObjectError) {\n      throw new E_INVALID_RESOURCEFUL_ROUTER_OPTIONS(checkIfObjectError)\n    }\n    // step 2: create an object which is merged with the defaults\n    const mergedOptions = deepmerge(DEFAULT_RESOURCEFUL_ROUTER_MODEL_OPTIONS, options)\n    // step 3: validate the merged options\n    const {\n      error: ResourcefulRouterModelServiceOptionsValidationError,\n      value: ResourcefulRouterModelServiceOptions,\n    } = ResourcefulRouterModelServiceOptionsSchema.validate(mergedOptions, {\n      abortEarly: false,\n      convert: true,\n      allowUnknown: true,\n      stripUnknown: true,\n    }) as { error?: ValidationError; value: ResourcefulRouterModelServiceOptions }\n    if (ResourcefulRouterModelServiceOptionsValidationError) {\n      throw new E_INVALID_RESOURCEFUL_ROUTER_OPTIONS(\n        ResourcefulRouterModelServiceOptionsValidationError\n      )\n    }\n    const instance = new ResourcefulRouterModelServiceOptionsService(\n      ResourcefulRouterModelServiceOptions\n    )\n    return instance\n  }\n}\n","/*\n|--------------------------------------------------------------------------\n| Resourceful Router Module\n|--------------------------------------------------------------------------\n|\n| This module contains all the components needed for the resourceful router\n| macro functionality, including validation, route generation, OpenAPI\n| generation, and route registration services.\n|\n*/\nimport { negotiateContent } from './utils/http'\nimport { ResourcefulRouterVerb } from './types'\nimport { isAdditionalResourcefulRouteDetails } from './utils/type_guards'\nimport { ResourcefulHttpContext } from './services/resourceful_router_context_service'\nimport { ResourcefulModelController } from './controllers/resourceful_model_controller'\nimport { ResourcefulErrorMiddleware } from './middlewares/resourceful_error_middleware'\nimport { ResourcefulRouterOptionsService } from './services/resourceful_router_options_service'\nimport { ResourcefulRouterChoicesService } from './services/resourceful_router_choices_service'\nimport { ResourcefulRouterModelResolverService } from './services/resourceful_router_model_resolver_service'\nimport { ResourcefulRouterOpenApiDocumentService } from './services/resourceful_router_openapi_document_service'\nimport { ResourcefulRouterModelServiceOptionsService } from './services/resourceful_router_model_options_service'\nimport {\n  E_UNRESOLVABLE_MODEL,\n  E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE,\n  E_INVALID_HTTP_METHOD_EXCEPTION,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { HttpContext, Router, RouteGroup } from '@adonisjs/core/http'\nimport type { ResourcefulHttpContextResolver } from './services/resourceful_router_context_service'\nimport type {\n  RouteCallback,\n  ResourcefulHttpVerb,\n  MacroModelsMap,\n  ResourcefulRouterOptions,\n  ResourcefulRouterMacro,\n  MiddlewareFn,\n  ParsedNamedMiddleware,\n} from './types'\n\nclass ResourcefulRouterService {\n  readonly #router: Router\n  readonly #rawModelMap: MacroModelsMap\n  readonly #options?: Partial<ResourcefulRouterOptions>\n  readonly #opts: ResourcefulRouterOptionsService\n  readonly #modelMap: ResourcefulRouterModelResolverService\n  readonly #controllers: Map<string, ResourcefulModelController>\n  readonly #group: RouteGroup\n\n  /** @private */\n  constructor(\n    router: Router,\n    rawModelMap: MacroModelsMap,\n    options?: Partial<ResourcefulRouterOptions>\n  ) {\n    this.#router = router\n    this.#rawModelMap = rawModelMap\n    this.#options = options\n    this.#controllers = new Map<string, ResourcefulModelController>()\n    this.#opts = ResourcefulRouterOptionsService.init(this.#options)\n    this.#modelMap = ResourcefulRouterModelResolverService.init(this.#rawModelMap)\n    const unresolvableModels: E_UNRESOLVABLE_MODEL[] = []\n    Object.getOwnPropertyNames(this.#modelMap).forEach((name) => {\n      const promiseOrError = this.#modelMap[name]\n      if (promiseOrError instanceof E_UNRESOLVABLE_MODEL) {\n        unresolvableModels.push(promiseOrError)\n      } else if ('undefined' !== typeof promiseOrError) {\n        const modelOptions = ResourcefulRouterModelServiceOptionsService.init(\n          this.#rawModelMap[name as any]\n        )\n        const controller = new ResourcefulModelController(\n          name,\n          promiseOrError,\n          modelOptions,\n          this.#opts.headers,\n          this.#opts.scopeRestrictors,\n          this.#opts.payloadRestrictors,\n          this.#opts.mutators,\n          this.#opts.policies\n        )\n        this.#controllers.set(name, controller)\n      }\n    })\n    if (unresolvableModels.length > 0) {\n      throw new E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE(unresolvableModels)\n    }\n    this.#group = this.#router.group(this.#groupCallback.bind(this))\n    if (this.#opts.prefix !== '/') {\n      this.#group.prefix(this.#opts.prefix)\n    }\n    if (Array.isArray(this.#opts.middleware) && this.#opts.middleware.length > 0) {\n      this.#group.use(Array.from(this.#opts.middleware))\n    } else if (!Array.isArray(this.#opts.middleware) && this.#opts.middleware) {\n      this.#group.use(this.#opts.middleware as any)\n    }\n    if ('string' === typeof this.#opts.domain && this.#opts.domain.length > 0) {\n      this.#group.domain(this.#opts.domain)\n    }\n  }\n\n  #groupCallback() {\n    this.#controllers.forEach((controller, name) => {\n      const controllerGroup = this.#router\n        .group(() => {\n          let crudActionMiddlewares = this.#modelMap.getCrudActionMiddlewaresForModel(name)\n          if ('undefined' === typeof crudActionMiddlewares) {\n            crudActionMiddlewares = Object.fromEntries(\n              [...ResourcefulRouterVerb].map((verb) => [verb, []])\n            )\n          }\n          ResourcefulRouterVerb.forEach((verb) => {\n            crudActionMiddlewares![verb] = Array.isArray(crudActionMiddlewares![verb])\n              ? crudActionMiddlewares![verb]\n              : 'undefined' === typeof crudActionMiddlewares![verb]\n                ? []\n                : [crudActionMiddlewares![verb]]\n          })\n          const modelActionMiddlewares: {\n            [K in ResourcefulRouterVerb]: Array<MiddlewareFn | ParsedNamedMiddleware>\n          } = crudActionMiddlewares as any\n          this.#router.any(\n            `/$meta.choices/*`,\n            this.#processRequest.bind(this, this.#serveResourcefulChoices.bind(this))\n          )\n          Object.entries(controller.options.additional).forEach(([methodAndPath, callback]) => {\n            const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n            if (!method || !path) return\n            switch (method) {\n              case 'get':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.get(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.get(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              case 'post':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.post(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.post(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              case 'put':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.put(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.put(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              case 'patch':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.patch(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.patch(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              case 'delete':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.delete(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.delete(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              default:\n                throw new E_INVALID_HTTP_METHOD_EXCEPTION([method, path])\n            }\n          })\n          if (\n            !this.#opts.except.includes('index') &&\n            !controller.options.except.includes('index')\n          ) {\n            this.#router\n              .get(\n                '/',\n                this.#processRequest.bind(this, controller.serveModelIndex.bind(controller))\n              )\n              .use(modelActionMiddlewares['index'] as any)\n            this.#router\n              .get(\n                '/s/:encoded',\n                this.#processRequest.bind(this, controller.serveModelShortcut.bind(controller))\n              )\n              .use(modelActionMiddlewares['index'] as any)\n            this.#router.get(\n              '/$meta.index',\n              this.#processRequest.bind(this, controller.serveModelIndexMeta.bind(controller))\n            )\n          }\n          if (\n            !this.#opts.except.includes('create') &&\n            !controller.options.except.includes('create')\n          ) {\n            this.#router\n              .post(\n                '/',\n                this.#processRequest.bind(this, controller.serveModelCreate.bind(controller))\n              )\n              .use(modelActionMiddlewares['create'] as any)\n            this.#router.get(\n              '/$meta.create',\n              this.#processRequest.bind(this, controller.serveModelCreateMeta.bind(controller))\n            )\n          }\n          if (\n            !this.#opts.except.includes('update') &&\n            !controller.options.except.includes('update')\n          ) {\n            this.#router.get(\n              '/$meta.update',\n              this.#processRequest.bind(this, controller.serveModelUpdateMeta.bind(controller))\n            )\n          }\n          if (\n            !this.#opts.except.includes('bulkUpdate') &&\n            !controller.options.except.includes('bulkUpdate')\n          ) {\n            this.#router.get(\n              '/$meta.$bulk.update',\n              this.#processRequest.bind(this, controller.serveModelBulkUpdateMeta.bind(controller))\n            )\n          }\n          if (!this.#opts.except.includes('read') && !controller.options.except.includes('read')) {\n            this.#router\n              .get(\n                '/:id',\n                this.#processRequest.bind(this, controller.serveModelRead.bind(controller))\n              )\n              .use(modelActionMiddlewares['read'] as any)\n          }\n          if (\n            !this.#opts.except.includes('readRelated') &&\n            !controller.options.except.includes('readRelated')\n          ) {\n            this.#router\n              .get(\n                '/:id/:relationship',\n                this.#processRequest.bind(this, controller.serveModelReadRelated.bind(controller))\n              )\n              .use(modelActionMiddlewares['readRelated'] as any)\n            this.#router\n              .get(\n                '/:id/:relationship/s/:encoded',\n                this.#processRequest.bind(\n                  this,\n                  controller.serveModelReadRelatedShortcut.bind(controller)\n                )\n              )\n              .use(modelActionMiddlewares['readRelated'] as any)\n            this.#router.get(\n              '/:id/:relationship/$meta.index',\n              this.#processRequest.bind(this, controller.serveModelReadRelatedMeta.bind(controller))\n            )\n          }\n          if (\n            !this.#opts.except.includes('bulkUpdate') &&\n            !controller.options.except.includes('bulkUpdate')\n          ) {\n            this.#router\n              .put('/$bulk', controller.serveModelBulkUpdate.bind(controller))\n              .use(modelActionMiddlewares['bulkUpdate'] as any)\n            this.#router\n              .put('/$bulk/:ids', controller.serveModelBulkUpdate.bind(controller))\n              .use(modelActionMiddlewares['bulkUpdate'] as any)\n            this.#router\n              .patch('/$bulk', controller.serveModelBulkUpdate.bind(controller))\n              .use(modelActionMiddlewares['bulkUpdate'] as any)\n            this.#router\n              .patch('/$bulk/:ids', controller.serveModelBulkUpdate.bind(controller))\n              .use(modelActionMiddlewares['bulkUpdate'] as any)\n          }\n          if (\n            !this.#opts.except.includes('syncRelated') &&\n            !controller.options.except.includes('syncRelated')\n          ) {\n            this.#router\n              .put(\n                '/:id/:relationship',\n                this.#processRequest.bind(this, controller.serveModelSyncRelated.bind(controller))\n              )\n              .use(modelActionMiddlewares['syncRelated'] as any)\n            this.#router\n              .patch(\n                '/:id/:relationship',\n                this.#processRequest.bind(this, controller.serveModelSyncRelated.bind(controller))\n              )\n              .use(modelActionMiddlewares['syncRelated'] as any)\n          }\n          if (\n            !this.#opts.except.includes('update') &&\n            !controller.options.except.includes('update')\n          ) {\n            this.#router\n              .put(\n                '/',\n                this.#processRequest.bind(this, controller.serveModelUpdate.bind(controller))\n              )\n              .use(modelActionMiddlewares['update'] as any)\n            this.#router\n              .put(\n                '/:id',\n                this.#processRequest.bind(this, controller.serveModelUpdate.bind(controller))\n              )\n              .use(modelActionMiddlewares['update'] as any)\n            this.#router\n              .patch(\n                '/:id',\n                this.#processRequest.bind(this, controller.serveModelUpdate.bind(controller))\n              )\n              .use(modelActionMiddlewares['update'] as any)\n          }\n          if (\n            !this.#opts.except.includes('delete') &&\n            !controller.options.except.includes('delete')\n          ) {\n            this.#router\n              .delete(\n                '/:id',\n                this.#processRequest.bind(this, controller.serveModelDelete.bind(controller))\n              )\n              .use(modelActionMiddlewares['delete'] as any)\n          }\n        })\n        .prefix(name)\n      if (controller.options.middleware) {\n        if (\n          Array.isArray(controller.options.middleware) &&\n          controller.options.middleware.length > 0\n        ) {\n          controllerGroup.use(Array.from(controller.options.middleware))\n        } else if (!Array.isArray(controller.options.middleware) && controller.options.middleware) {\n          controllerGroup.use(controller.options.middleware as any)\n        }\n      }\n    })\n    Object.entries(this.#opts.additional).forEach(([methodAndPath, callback]) => {\n      const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n      if (!method || !path) return\n      if (isAdditionalResourcefulRouteDetails(callback)) {\n        this.#router[method](path, this.#processRequest.bind(this, callback.handler))\n      } else {\n        this.#router[method](path, this.#processRequest.bind(this, callback))\n      }\n    })\n    this.#router.any(\n      '/$meta.choices/*',\n      this.#processRequest.bind(this, this.#serveResourcefulChoices.bind(this))\n    )\n    this.#router.get('/', this.#serveResourcefulRouteIndex.bind(this))\n  }\n\n  async #processRequest(callback: RouteCallback, ctx: HttpContext) {\n    let next: ((ctx: HttpContext) => unknown | PromiseLike<unknown> | Promise<unknown>) | undefined\n    if (typeof callback === 'function') {\n      next = async (c) => await callback(c)\n    } else if (Array.isArray(callback) && callback.length === 2) {\n      const [maybeResolvableController, method] = callback\n      if (\n        method in maybeResolvableController &&\n        typeof maybeResolvableController[method] === 'function'\n      ) {\n        // @ts-ignore\n        next = async (c) => await maybeResolvableController[method](c)\n      } else {\n        // @ts-ignore\n        const resolvedController = maybeResolvableController()\n        if (typeof resolvedController[method] === 'function') {\n          next = async (c) => await resolvedController[method](c)\n        }\n      }\n    }\n    if (!next) return\n    try {\n      await next(ctx)\n    } catch (error) {\n      if (this.#opts.catchThrown && ResourcefulErrorMiddleware.shouldHandle(ctx)) {\n        return await ResourcefulErrorMiddleware.handle(error, ctx, {\n          onVineValidationError: this.#opts.onVineValidationError,\n          onJoiValidationError: this.#opts.onJoiValidationError,\n          onException: this.#opts.onException,\n          onError: this.#opts.onError,\n          onUnknown: this.#opts.onUnknown,\n          onAny: this.#opts.onAny,\n          asYaml: true,\n          headers: this.#opts.headers,\n        })\n      } else {\n        throw error\n      }\n    }\n  }\n\n  async #serveInResourcefulModelRouterContext(\n    controller: ResourcefulModelController,\n    callback: RouteCallback,\n    ctx: HttpContext\n  ) {\n    const resolver: ResourcefulHttpContextResolver = controller.resolveRequestRequirements.bind(\n      controller,\n      ctx\n    ) as ResourcefulHttpContextResolver\n    await ResourcefulHttpContext.run({ resolver }, async () => {\n      if (typeof callback === 'function') {\n        await callback(ctx)\n      } else if (Array.isArray(callback) && callback.length === 2) {\n        const [maybeResolvableController, method] = callback\n        if (\n          method in maybeResolvableController &&\n          typeof maybeResolvableController[method] === 'function'\n        ) {\n          // @ts-ignore\n          await maybeResolvableController[method](ctx)\n        } else {\n          // @ts-ignore\n          const resolvedController = maybeResolvableController()\n          if (typeof resolvedController[method] === 'function') {\n            await resolvedController[method](ctx)\n          }\n        }\n      }\n    })\n  }\n\n  async #serveResourcefulChoices(ctx: HttpContext) {\n    return await ResourcefulRouterChoicesService.serve(\n      ctx,\n      this.#opts,\n      this.#modelMap,\n      this.#controllers\n    )\n  }\n\n  async #serveResourcefulRouteIndex(ctx: HttpContext) {\n    const serveAs = negotiateContent(ctx)\n    if (serveAs === 'html') {\n      return await this.#serveResourcefulRouteIndexHtml(ctx)\n    }\n    const { default: app } = await import('@adonisjs/core/services/app')\n    const service = new ResourcefulRouterOpenApiDocumentService(\n      this.#opts,\n      this.#modelMap,\n      this.#controllers,\n      app\n    )\n    await service.boot(ctx)\n    return await service.serveAs(serveAs, ctx)\n  }\n\n  async #serveResourcefulRouteIndexHtml(ctx: HttpContext) {\n    const html = `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title inertia>${this.#opts.info.title}</title><script src=\"https://unpkg.com/@stoplight/elements/web-components.min.js\"></script><link rel=\"stylesheet\" href=\"https://unpkg.com/@stoplight/elements/styles.min.css\"><style>elements-api{min-height:100dvh}elements-api .sl-h-full{min-height:100dvh}</style></head><body><elements-api apiDescriptionUrl=${JSON.stringify(ctx.request.url())} router=\"hash\" layout=\"responsive\" /></body></html>`\n    ctx.response.type('text/html')\n    ctx.response.status(200)\n    ctx.response.send(html)\n  }\n\n  get group() {\n    return this.#group\n  }\n\n  public static hook(\n    router: Router,\n    rawModelMap: MacroModelsMap,\n    options?: Partial<ResourcefulRouterOptions>\n  ): RouteGroup {\n    const instance = new ResourcefulRouterService(router, rawModelMap, options)\n    return instance.group\n  }\n}\n\nexport const resourcefulRouterMacro: ResourcefulRouterMacro = function (\n  this: Router,\n  models: MacroModelsMap,\n  options: Partial<ResourcefulRouterOptions> = {}\n): RouteGroup {\n  return ResourcefulRouterService.hook(this, models, options)\n}\n\nexport type { ResourcefulRouterService }\n\nexport type GetResourcefulModelCreatePayloadValidationSchemaArgs = Parameters<\n  (typeof ResourcefulModelController)['getResourcefulModelCreatePayloadValidationSchema']\n>\n\nexport const getResourcefulModelCreatePayloadValidationSchema = (\n  ...args: GetResourcefulModelCreatePayloadValidationSchemaArgs\n) => ResourcefulModelController.getResourcefulModelCreatePayloadValidationSchema(...args)\n","import { isObject } from '../../type_guards'\nimport type { ODataPreference } from './http'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { ResourcefulModel } from '@nhtio/lucid-resourceful/types'\n\nexport const isSimpleIdentifier = (name: unknown): boolean => {\n  if (typeof name !== 'string') {\n    return false\n  }\n  // Must be 1–128 Unicode code points\n  if (!name || [...name].length < 1 || [...name].length > 128) {\n    return false\n  }\n\n  // Regex based on OData \"SimpleIdentifier\" rules\n  // First character: underscore (_) or Unicode category Letter (L) or Letter Number (Nl)\n  // Remaining characters: underscore, Letter, Letter Number, Decimal Number, Non-spacing mark,\n  // Combining spacing mark, Connector punctuation, or Other Format\n  const simpleIdentifierRegex = /^[_\\p{L}\\p{Nl}][_\\p{L}\\p{Nl}\\p{Nd}\\p{Mn}\\p{Mc}\\p{Pc}\\p{Cf}]*$/u\n\n  return simpleIdentifierRegex.test(name)\n}\n\nexport const sanitizeSelect = async (\n  query: Record<string, any>,\n  model: ResourcefulModel,\n  ctx: HttpContext,\n  app: ApplicationService\n): Promise<{ valid: string[] | undefined; isFullSet: boolean }> => {\n  const potential: string[] = []\n  if (typeof query['$select'] === 'string') {\n    potential.push(\n      ...query['$select']\n        .split(',')\n        .map((s) => s.trim())\n        .filter((s) => s.length > 0)\n    )\n  } else if (Array.isArray(query['$select'])) {\n    potential.push(...query['$select'].map((s) => String(s).trim()).filter((s) => s.length > 0))\n  }\n  const readSchema = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n  const possible =\n    !isObject(readSchema) || !('properties' in readSchema) || !isObject(readSchema.properties)\n      ? []\n      : Object.keys(readSchema.properties)\n  if (!('$select' in query)) {\n    // Default selection for OData should avoid relationship objects unless explicitly expanded/selected.\n    // Returning relationship fields by default causes deep/cyclic payloads and unstable serialization.\n    const relationshipNames = new Set(\n      Array.from(model.$resourcefulRelationships.keys()).map((k) => k.toLowerCase())\n    )\n    const scalarFields = possible.filter((k) => !relationshipNames.has(String(k).toLowerCase()))\n    if (!scalarFields.includes(model.primaryKey)) {\n      scalarFields.unshift(model.primaryKey)\n    }\n    return { valid: scalarFields, isFullSet: true }\n  }\n  if (potential.length === 0) {\n    return { valid: undefined, isFullSet: false }\n  }\n  if (potential.includes('*')) {\n    // return possible\n    return { valid: possible.filter((k) => k !== model.primaryKey), isFullSet: true }\n  }\n  const valid = potential.filter((p) => possible.includes(p))\n  if (valid.length === 0) {\n    return { valid: undefined, isFullSet: false }\n  }\n  if (!valid.includes(model.primaryKey)) {\n    valid.unshift(model.primaryKey)\n  }\n  return { valid, isFullSet: valid.length === possible.length - 1 }\n}\n\nexport const sanitizeExpand = (query: Record<string, any>): string[] | undefined => {\n  const potential: string[] = []\n  if (typeof query['$expand'] === 'string') {\n    potential.push(\n      ...query['$expand']\n        .split(',')\n        .map((s) => s.trim())\n        .filter((s) => s.length > 0)\n    )\n  } else if (Array.isArray(query['$expand'])) {\n    potential.push(...query['$expand'].map((s) => String(s).trim()).filter((s) => s.length > 0))\n  }\n  if (potential.length === 0) {\n    return\n  }\n  return potential\n}\n\nexport const santizeResponsePayload = (\n  payload: any,\n  selections: string[] | undefined,\n  preference: ODataPreference = 'representation'\n): any => {\n  if (!isObject(payload)) {\n    return payload\n  }\n  if ('minimal' === preference && !Array.isArray(selections)) {\n    return undefined\n  }\n  const ret: any = {}\n  if (Array.isArray(selections)) {\n    for (const key of selections) {\n      if (key in payload) {\n        ret[key] = payload[key]\n      }\n    }\n  } else {\n    Object.assign(ret, payload)\n  }\n  return ret\n}\n\nexport function sanitizeODataKeys(value: unknown, seen: WeakSet<object> = new WeakSet()): unknown {\n  if (\n    typeof value === 'object' &&\n    value !== null &&\n    !Array.isArray(value) &&\n    !(value instanceof Date) &&\n    !(typeof Buffer !== 'undefined' && value instanceof Buffer)\n  ) {\n    if ((value as any).isLuxonDateTime === true) {\n      return value\n    }\n    if (seen.has(value)) {\n      return undefined\n    }\n    seen.add(value)\n\n    const result: Record<string, unknown> = {}\n    for (const key in value as Record<string, unknown>) {\n      const sanitizedKey = key.startsWith('@') ? key : key.replace(/\\./g, '__')\n      result[sanitizedKey] = sanitizeODataKeys((value as Record<string, unknown>)[key], seen)\n    }\n    return result\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) => sanitizeODataKeys(item, seen))\n  }\n  return value\n}\n\nexport function desanitizeODataKeys(\n  value: unknown,\n  seen: WeakSet<object> = new WeakSet()\n): unknown {\n  if (\n    typeof value === 'object' &&\n    value !== null &&\n    !Array.isArray(value) &&\n    !(value instanceof Date) &&\n    !(typeof Buffer !== 'undefined' && value instanceof Buffer)\n  ) {\n    if ((value as any).isLuxonDateTime === true) {\n      return value\n    }\n    if (seen.has(value)) {\n      return undefined\n    }\n    seen.add(value)\n\n    const result: Record<string, unknown> = {}\n    for (const key in value as Record<string, unknown>) {\n      const desanitizedKey = key.startsWith('@') ? key : key.replace(/__/g, '.')\n      result[desanitizedKey] = desanitizeODataKeys((value as Record<string, unknown>)[key], seen)\n    }\n    return result\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) => desanitizeODataKeys(item, seen))\n  }\n  return value\n}\n","/*\n|--------------------------------------------------------------------------\n| Internal Helper Functions\n|--------------------------------------------------------------------------\n|\n| Functionality to help keep things DRY\n|\n*/\n\n/**\n * Removes all properties with undefined values from an object.\n * This utility function creates a new object containing only the properties\n * that have defined values, effectively filtering out any undefined properties.\n *\n * @example\n * ```typescript\n * const input = {\n *   name: 'John',\n *   age: undefined,\n *   email: 'john@example.com',\n *   phone: undefined\n * }\n *\n * const result = stripUndefinedValuesFromObject(input)\n * // Result: { name: 'John', email: 'john@example.com' }\n * ```\n *\n * @example\n * ```typescript\n * // Useful for cleaning up optional parameters before API calls\n * const apiParams = stripUndefinedValuesFromObject({\n *   userId: user.id,\n *   filter: searchFilter || undefined,\n *   limit: pageSize || undefined,\n *   offset: currentPage ? currentPage * pageSize : undefined\n * })\n * ```\n *\n * @template T - The type of the input object, must extend Record<string, any>\n * @param {T} obj - The object to filter, removing properties with undefined values\n * @returns {T} A new object of the same type with undefined properties removed\n */\nexport const stripUndefinedValuesFromObject = <T extends Record<string, any>>(obj: T): T => {\n  return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== undefined)) as T\n}\n","import { default as pMap } from 'p-map'\nimport { default as string } from '@poppinss/string'\nimport { stripUndefinedValuesFromObject } from '../../helpers'\nimport { ResourcefulRouterVerb } from '../../router_macro/types'\nimport {\n  isResourcefulModel,\n  isObject,\n  isInstanceOf,\n  isNonArraySchemaObject,\n} from '../../type_guards'\nimport {\n  ResourcefulStringType,\n  ResourcefulDateType,\n  ResourcefulDateTimeType,\n  ResourcefulBinaryType,\n  ResourcefulNumberType,\n  ResourcefulIntegerType,\n  ResourcefulBigintType,\n  ResourcefulUnsignedIntegerType,\n  ResourcefulBooleanType,\n  ResourcefulObjectType,\n  ResourcefulArrayType,\n  ResourcefulDataType,\n} from '../../data_types'\nimport type { ElementCompact } from 'xml-js'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { default as ApplicationService } from '@adonisjs/core/services/app'\nimport type { ModelColumnOptions, LucidModel } from '@adonisjs/lucid/types/model'\nimport type { ResourcefulModelController } from '../controllers/resourceful_model_controller'\nimport type { ResourcefulRouterOptionsService } from '../../router_macro/services/resourceful_router_options_service'\nimport type {\n  ResourcefulModelOpenApiSchema,\n  ResourcefulColumnDefinition,\n  ResourcefulComputedAccessorDefinition,\n} from '../../types'\nimport type {\n  DateColumnOptions,\n  ResourcefulHttpVerb,\n  ResourcefulModel,\n  ResourcefulModelMetaSchema,\n} from '@nhtio/lucid-resourceful/types'\nimport type {\n  PropertyAttributes,\n  NavigationPropertyAttributes,\n  AnnotationAttributes,\n  EntityTypeAttributes,\n  EntitySetAttributes,\n  NavigationPropertyBindingAttributes,\n} from '../types'\nimport type {\n  HasOneRelationContract,\n  BelongsToRelationContract,\n  HasManyRelationContract,\n  HasManyThroughRelationContract,\n  ManyToManyRelationContract,\n} from '@adonisjs/lucid/types/relations'\n\ntype AppServiceInstance = typeof ApplicationService\n\ntype ODataModelVerbPolicy = {\n  [key in ResourcefulRouterVerb]: boolean\n}\ntype ParamSpec = { name: string; type: string; nullable: boolean }\ntype Boundness = 'entity' | 'collection'\ntype OpKind = 'action' | 'function'\ntype BasicResourcefulOModelScalarType =\n  | 'Edm.String'\n  | 'Edm.Date'\n  | 'Edm.DateTimeOffset'\n  | 'Edm.Binary'\n  | 'Edm.Decimal'\n  | 'Edm.Int32'\n  | 'Edm.Int64'\n  | 'Edm.Boolean'\n  | 'self.ResourcefulObjectType'\n  | 'Collection(self.ResourcefulObjectType)'\n  | 'Edm.String'\n\ntype ResourcefulOModelScalarType =\n  | BasicResourcefulOModelScalarType\n  | `Collection(${BasicResourcefulOModelScalarType})`\n\ntype ColumnAndComputedAccessorAttributes = {\n  // shows in index operation results\n  selectable: boolean\n  // can be used for filtration\n  filterable: boolean\n  // can be used for sorting\n  sortable: boolean\n  // is visible in read operations\n  readable: boolean\n  // is usable in write operations\n  insertable: boolean | 'required'\n  // is usable in update operations\n  updatable: boolean\n  // is usable in bulk update operations\n  bulkUpdatable: boolean\n  // is a readonly immutable computed value\n  isComputed: boolean\n  // is a writable value which has a computed default value\n  hasComputedDefault: boolean\n}\n\n// Utility to process knobs and ensure rule precedence\nconst processKnobs = (\n  knobs: ColumnAndComputedAccessorAttributes\n): ColumnAndComputedAccessorAttributes => {\n  if (knobs.isComputed) {\n    knobs.insertable = false\n    knobs.updatable = false\n    knobs.bulkUpdatable = false\n  }\n  if (knobs.hasComputedDefault) {\n    if ('required' === knobs.insertable) {\n      knobs.insertable = true\n    }\n  }\n  if (knobs.readable === false) {\n    knobs.selectable = false\n    knobs.filterable = false\n    knobs.sortable = false\n  }\n  if (knobs.selectable === false) {\n    knobs.filterable = false\n    knobs.sortable = false\n  }\n  if (knobs.updatable === false) {\n    knobs.bulkUpdatable = false\n  }\n  return knobs\n}\n\nconst isAutoincrementedPrimaryKey = (\n  lucidDefinition: ModelColumnOptions,\n  resourcefulDefinition: ResourcefulColumnDefinition<any>,\n  propReadSchema: OpenAPIV3.SchemaObject | undefined,\n  propWriteSchema: OpenAPIV3.SchemaObject | undefined\n): boolean => {\n  if (!lucidDefinition.isPrimary || !isNonArraySchemaObject(propWriteSchema)) {\n    return false\n  }\n  if (\n    !isInstanceOf<ResourcefulIntegerType>(\n      resourcefulDefinition.type,\n      'ResourcefulIntegerType',\n      ResourcefulIntegerType\n    ) &&\n    !isInstanceOf<ResourcefulUnsignedIntegerType>(\n      resourcefulDefinition.type,\n      'ResourcefulUnsignedIntegerType',\n      ResourcefulUnsignedIntegerType\n    ) &&\n    !isInstanceOf<ResourcefulBigintType>(\n      resourcefulDefinition.type,\n      'ResourcefulBigintType',\n      ResourcefulBigintType\n    )\n  ) {\n    return false\n  }\n  if (\n    (isNonArraySchemaObject(propReadSchema) && propReadSchema.nullable) ||\n    !isNonArraySchemaObject(propWriteSchema) ||\n    (isNonArraySchemaObject(propReadSchema) && !propWriteSchema.nullable) ||\n    propWriteSchema.writeOnly\n  ) {\n    return false\n  }\n  return true\n}\n\ntype SimpleCapabilityAnnotationProperties = {\n  [key: string]: boolean | number | string | Array<string> | SimpleCapabilityAnnotationProperties\n}\n\nconst makeRecord = (\n  key: string,\n  value: boolean | number | string | Array<string> | SimpleCapabilityAnnotationProperties\n) => {\n  const ret: ElementCompact = {\n    _attributes: {\n      Property: key,\n    },\n  }\n  switch (typeof value) {\n    case 'boolean':\n      ret._attributes!.Bool = value ? 'true' : 'false'\n      break\n    case 'number':\n      ret._attributes!.Int = value\n      break\n    case 'string':\n      ret._attributes!.String = value\n      break\n  }\n  if (Array.isArray(value) && value.length > 0) {\n    ret.Collection = {\n      PropertyPath: value.map((v) => ({ _text: v })),\n    }\n  }\n  if (isObject(value)) {\n    ret.Record = {\n      PropertyValue: Object.entries(value).map(([k, v]) => makeRecord(k, v)),\n    }\n  }\n  return ret\n}\n\nconst makeSimpleCapabilityAnnotation = (\n  term: string,\n  properties: SimpleCapabilityAnnotationProperties = {},\n  attributes: ElementCompact['_attributes'] = {}\n): ElementCompact => {\n  const records = Object.entries(properties).map(([key, value]) => makeRecord(key, value))\n  const ret: ElementCompact = {\n    _attributes: {\n      ...attributes,\n      Term: term,\n    },\n    Record: records.length > 0 ? { PropertyValue: records } : undefined,\n  }\n  return stripUndefinedValuesFromObject(ret)\n}\n\nexport const makeOpName = (...parts: string[]) => {\n  const combinable: string[] = []\n  parts.forEach((part) => {\n    const frags = part.trim().split(/(\\/|-|_)/gm)\n    frags.forEach((frag) => {\n      if (frag.includes(':uid')) {\n        combinable.push('Instance')\n      } else {\n        combinable.push(frag)\n      }\n    })\n  })\n  return string.pascalCase(combinable.join(' '))\n}\n\ntype OperationSpec = {\n  kind: OpKind\n  binding: Boundness // 'entity' => self.Model, 'collection' => Collection(self.Model)\n  name: string // e.g., \"SyncPosts\", \"FollowersCount\"\n  params?: ParamSpec[] // OData types e.g. Edm.Int32, self.Post, Collection(self.User)\n  returnType?: string // required for functions, optional for actions\n  entitySetPath?: string // e.g. \"BindingParameter/posts\" or \"BindingParameter\"\n  isComposable?: boolean // functions only\n  enabled?: (policy: ODataModelVerbPolicy) => boolean // policy gate\n  annotations?: ElementCompact[] // optional per-op annotations\n}\n\nexport class ODataMetadataService {\n  readonly #opts: ResourcefulRouterOptionsService\n  readonly #controllers: Map<string, ResourcefulModelController>\n  readonly #models: Map<string, ResourcefulModel>\n  readonly #policiesByModelName: Map<string, ODataModelVerbPolicy>\n  readonly #modelMetaSchemas: Map<ResourcefulModel, ResourcefulModelMetaSchema>\n  readonly #modelReadSchemas: Map<ResourcefulModel, ResourcefulModelOpenApiSchema>\n  readonly #modelWriteSchemas: Map<ResourcefulModel, ResourcefulModelOpenApiSchema>\n  readonly #policiesByModelCtor: Map<ResourcefulModel, ODataModelVerbPolicy>\n  readonly #controllersByModelCtor: Map<ResourcefulModel, ResourcefulModelController>\n  readonly #modelPathByModelCtor: Map<ResourcefulModel, string>\n\n  constructor(\n    opts: ResourcefulRouterOptionsService,\n    controllers: Map<string, ResourcefulModelController>\n  ) {\n    this.#opts = opts\n    this.#controllers = controllers\n    this.#models = new Map<string, ResourcefulModel>()\n    this.#policiesByModelName = new Map<string, ODataModelVerbPolicy>()\n    this.#modelMetaSchemas = new Map<ResourcefulModel, ResourcefulModelMetaSchema>()\n    this.#modelReadSchemas = new Map<ResourcefulModel, ResourcefulModelOpenApiSchema>()\n    this.#modelWriteSchemas = new Map<ResourcefulModel, ResourcefulModelOpenApiSchema>()\n    this.#policiesByModelCtor = new Map<ResourcefulModel, ODataModelVerbPolicy>()\n    this.#controllersByModelCtor = new Map<ResourcefulModel, ResourcefulModelController>()\n    this.#modelPathByModelCtor = new Map<ResourcefulModel, string>()\n  }\n\n  #currentModelCan(verb: ResourcefulRouterVerb, controller?: ResourcefulModelController): boolean {\n    if (!controller) {\n      return !this.#opts.except.includes(verb)\n    }\n    // Defensive: controller.options should always be present, but guard to prevent hard crash\n    const controllerExcept = controller?.options?.except || []\n    return !this.#opts.except.includes(verb) && !controllerExcept.includes(verb as any)\n  }\n\n  async #cacheModel(\n    ctx: HttpContext,\n    app: AppServiceInstance,\n    model: ResourcefulModel,\n    onRelatedModel: (related: ResourcefulModel) => void\n  ) {\n    const modelName = model.$resourcefulName\n    if (!this.#models.has(modelName)) {\n      // we have not registered this model yet\n      this.#models.set(modelName, model)\n    }\n    if (!this.#modelMetaSchemas.has(model)) {\n      const asResourceful = await model.$getAsResourcefulForContext(ctx, app)\n      this.#modelMetaSchemas.set(model, asResourceful)\n    }\n    if (!this.#modelReadSchemas.has(model) && !this.#modelWriteSchemas.has(model)) {\n      const [readSchema, writeSchema] = await Promise.all([\n        model.$asOpenApiSchemaObject(ctx, app, 'read'),\n        model.$asOpenApiSchemaObject(ctx, app, 'write'),\n      ])\n      this.#modelReadSchemas.set(model, readSchema)\n      this.#modelWriteSchemas.set(model, writeSchema)\n    } else if (!this.#modelReadSchemas.has(model)) {\n      const readSchema = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n      this.#modelReadSchemas.set(model, readSchema)\n    } else if (!this.#modelWriteSchemas.has(model)) {\n      const writeSchema = await model.$asOpenApiSchemaObject(ctx, app, 'write')\n      this.#modelWriteSchemas.set(model, writeSchema)\n    }\n    await pMap(\n      Array.from(model.$relationsDefinitions.values()),\n      async (relation) => {\n        relation.boot()\n        const related = relation.relatedModel()\n        if (isResourcefulModel(related)) {\n          onRelatedModel(related)\n        }\n      },\n      { concurrency: 10 }\n    )\n  }\n\n  async #boot(ctx: HttpContext) {\n    const relatedModelsToProcess = new Map<string, ResourcefulModel>()\n    await pMap(\n      Array.from(this.#controllers.entries()),\n      async ([modelPath, controller]) => {\n        const { model, app } = await controller.resolveBaseRequirements()\n        if (!isResourcefulModel(model)) {\n          return\n        }\n        const policy: ODataModelVerbPolicy = {\n          index: this.#currentModelCan('index', controller),\n          create: this.#currentModelCan('create', controller),\n          read: this.#currentModelCan('read', controller),\n          readRelated: this.#currentModelCan('readRelated', controller),\n          update: this.#currentModelCan('update', controller),\n          bulkUpdate: this.#currentModelCan('bulkUpdate', controller),\n          syncRelated: this.#currentModelCan('syncRelated', controller),\n          delete: this.#currentModelCan('delete', controller),\n        }\n        this.#policiesByModelName.set(model.$resourcefulName, policy)\n        this.#policiesByModelCtor.set(model, policy)\n        this.#controllersByModelCtor.set(model, controller)\n        this.#modelPathByModelCtor.set(model, modelPath)\n        await this.#cacheModel(ctx, app, model, (related) => {\n          const relatedModelName = related.$resourcefulName\n          if (\n            !this.#models.has(relatedModelName) &&\n            !relatedModelsToProcess.has(relatedModelName)\n          ) {\n            relatedModelsToProcess.set(relatedModelName, related)\n          }\n        })\n      },\n      { concurrency: 5 }\n    )\n    while (relatedModelsToProcess.size > 0) {\n      const modelsToProcess = Array.from(relatedModelsToProcess.values())\n      relatedModelsToProcess.clear()\n      await pMap(\n        modelsToProcess,\n        async (model) => {\n          const { default: app } = await import('@adonisjs/core/services/app')\n          await this.#cacheModel(ctx, app, model, (related) => {\n            const relatedModelName = related.$resourcefulName\n            if (\n              !this.#models.has(relatedModelName) &&\n              !relatedModelsToProcess.has(relatedModelName)\n            ) {\n              relatedModelsToProcess.set(relatedModelName, related)\n            }\n          })\n        },\n        { concurrency: 5 }\n      )\n    }\n  }\n\n  async generateMetadataElements(ctx: HttpContext): Promise<ElementCompact> {\n    await this.#boot(ctx)\n    const ret: ElementCompact = {\n      'edmx:Edmx': {\n        '_attributes': {\n          'Version': '4.0',\n          'xmlns:edmx': 'http://docs.oasis-open.org/odata/ns/edmx',\n        },\n        'edmx:Reference': [\n          {\n            '_attributes': {\n              Uri: 'https://docs.oasis-open.org/odata/odata-vocabularies/v4.0/Org.OData.Validation.V1.xml',\n            },\n            'edmx:Include': {\n              _attributes: {\n                Namespace: 'Org.OData.Validation.V1',\n                Alias: 'Validation',\n              },\n            },\n          },\n          {\n            '_attributes': {\n              Uri: 'https://docs.oasis-open.org/odata/odata-vocabularies/v4.0/Org.OData.Core.V1.xml',\n            },\n            'edmx:Include': {\n              _attributes: {\n                Namespace: 'Org.OData.Core.V1',\n                Alias: 'Core',\n              },\n            },\n          },\n          {\n            '_attributes': {\n              Uri: 'https://docs.oasis-open.org/odata/odata-vocabularies/v4.0/Org.OData.Capabilities.V1.xml',\n            },\n            'edmx:Include': {\n              _attributes: {\n                Namespace: 'Org.OData.Capabilities.V1',\n                Alias: 'Capabilities',\n              },\n            },\n          },\n        ],\n        'edmx:DataServices': {\n          Schema: {\n            _attributes: {\n              Namespace: 'Default',\n              Alias: 'self',\n              xmlns: 'http://docs.oasis-open.org/odata/ns/edm',\n            },\n            ...(await this.generateEdmElements()),\n          },\n        },\n      },\n    }\n    return ret\n  }\n\n  #getEdmIntScalarType(type: ResourcefulIntegerType | ResourcefulUnsignedIntegerType) {\n    let min: number = Number.MIN_SAFE_INTEGER\n    if (\n      isInstanceOf<ResourcefulUnsignedIntegerType>(\n        type,\n        'ResourcefulUnsignedIntegerType',\n        ResourcefulUnsignedIntegerType\n      )\n    ) {\n      min = 0\n    } else {\n      min = type.exclusiveMinimum ? type.minimum + 1 : type.minimum\n    }\n    const max = type.exclusiveMaximum\n      ? type.maximum\n      : typeof type.maximum === 'bigint'\n        ? type.maximum - BigInt(1)\n        : type.maximum - 1\n    return min < -2_147_483_648 || max > 2_147_483_647 ? 'Edm.Int64' : 'Edm.Int32'\n  }\n\n  #resourcefulDataTypeToEdmScalarType(type: ResourcefulDataType): ResourcefulOModelScalarType {\n    switch (true) {\n      case isInstanceOf<ResourcefulStringType>(\n        type,\n        'ResourcefulStringType',\n        ResourcefulStringType\n      ):\n        return 'Edm.String'\n      case isInstanceOf<ResourcefulDateType>(type, 'ResourcefulDateType', ResourcefulDateType):\n        return 'Edm.Date'\n      case isInstanceOf<ResourcefulDateTimeType>(\n        type,\n        'ResourcefulDateTimeType',\n        ResourcefulDateTimeType\n      ):\n        return 'Edm.DateTimeOffset'\n      case isInstanceOf<ResourcefulBinaryType>(\n        type,\n        'ResourcefulBinaryType',\n        ResourcefulBinaryType\n      ):\n        return 'Edm.Binary'\n      case isInstanceOf<ResourcefulNumberType>(\n        type,\n        'ResourcefulNumberType',\n        ResourcefulNumberType\n      ):\n        return 'Edm.Decimal'\n      case isInstanceOf<ResourcefulBigintType>(\n        type,\n        'ResourcefulBigintType',\n        ResourcefulBigintType\n      ):\n        return 'Edm.Int64'\n      case isInstanceOf<ResourcefulIntegerType>(\n        type,\n        'ResourcefulIntegerType',\n        ResourcefulIntegerType\n      ):\n      case isInstanceOf<ResourcefulUnsignedIntegerType>(\n        type,\n        'ResourcefulUnsignedIntegerType',\n        ResourcefulUnsignedIntegerType\n      ):\n        return this.#getEdmIntScalarType(type)\n      case isInstanceOf<ResourcefulBooleanType>(\n        type,\n        'ResourcefulBooleanType',\n        ResourcefulBooleanType\n      ):\n        return 'Edm.Boolean'\n      case isInstanceOf(type, 'ResourcefulObjectType', ResourcefulObjectType):\n        return 'self.ResourcefulObjectType'\n      case isInstanceOf<ResourcefulArrayType>(type, 'ResourcefulArrayType', ResourcefulArrayType): {\n        const t: ResourcefulArrayType = type\n        if ('oneOf' in t.items || 'allOf' in t.items || 'anyOf' in t.items || 'not' in t.items) {\n          return 'Collection(self.ResourcefulObjectType)'\n        }\n        const it = this.#resourcefulDataTypeToEdmScalarType(\n          t.items as unknown as ResourcefulDataType\n        )\n        return `Collection(${it})` as `Collection(${BasicResourcefulOModelScalarType})`\n      }\n      default:\n        return 'Edm.String'\n    }\n  }\n\n  #getEdmScalarType(\n    resourcefulDef: ResourcefulColumnDefinition<any> | ResourcefulComputedAccessorDefinition<any>\n  ) {\n    return this.#resourcefulDataTypeToEdmScalarType(resourcefulDef.type)\n  }\n\n  #getValidationAnnotationsForProperty(\n    scalarType: string,\n    schema: OpenAPIV3.SchemaObject | undefined\n  ): AnnotationAttributes[] {\n    const ret: AnnotationAttributes[] = []\n    if (isObject(schema) && 'array' !== schema.type) {\n      const s: OpenAPIV3.NonArraySchemaObject = schema as OpenAPIV3.NonArraySchemaObject\n      const valueKey = scalarType\n        .replace(/^Edm\\./, '')\n        .replace(/32$/, '')\n        .replace(/64$/, '') as Extract<keyof AnnotationAttributes, string>\n      if ('Edm.String' === scalarType && s.pattern) {\n        ret.push({\n          Term: 'Validation.Pattern',\n          String: s.pattern,\n        })\n      }\n      if ('undefined' !== typeof s.minimum) {\n        ret.push({\n          Term: 'Validation.Minimum',\n          [valueKey]: s.minimum.toString(),\n          Exclusive: s.exclusiveMinimum ? 'true' : undefined,\n        } as AnnotationAttributes)\n      }\n      if ('undefined' !== typeof s.maximum) {\n        ret.push({\n          Term: 'Validation.Maximum',\n          [valueKey]: s.maximum.toString(),\n          Exclusive: s.exclusiveMaximum ? 'true' : undefined,\n        } as AnnotationAttributes)\n      }\n      if ('undefined' !== typeof s.multipleOf) {\n        ret.push({\n          Term: 'Validation.MultipleOf',\n          [valueKey]: s.multipleOf.toString(),\n        } as AnnotationAttributes)\n      }\n    }\n    return ret\n  }\n\n  #resolveSchemaPropertySchemas(\n    props: { [key: string]: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject } = {},\n    mode: 'read' | 'write' = 'read',\n    depth: number = 0\n  ): Map<string, OpenAPIV3.SchemaObject> {\n    const ret = new Map<string, OpenAPIV3.SchemaObject>()\n    if (depth > 1) {\n      return ret\n    }\n    Object.entries(props).forEach(([propName, propSchema]) => {\n      if ('$ref' in propSchema) {\n        const referencedModelName = propSchema.$ref.split('/').pop() || 'Unknown'\n        const referencedModel = this.#models.get(referencedModelName)\n        // if we cannot find the referenced model, skip it\n        if (!referencedModel) return\n        const referencedModelSchema =\n          'read' === mode\n            ? this.#modelReadSchemas.get(referencedModel)\n            : this.#modelWriteSchemas.get(referencedModel)\n        // if we cannot find the referenced model schema, skip it\n        if (!referencedModelSchema) return\n        const resolvedReferencedModelPropertySchemas = this.#resolveSchemaPropertySchemas(\n          referencedModelSchema.properties,\n          mode,\n          depth + 1\n        )\n        const resolvedReferenceModelPropertySchemasObject: {\n          [key: string]: OpenAPIV3.SchemaObject\n        } = Object.assign(\n          {},\n          ...Array.from(resolvedReferencedModelPropertySchemas.entries()).map(([k, v]) => ({\n            [k]: v,\n          }))\n        )\n        ret.set(propName, {\n          ...referencedModelSchema,\n          properties: resolvedReferenceModelPropertySchemasObject,\n        })\n      } else {\n        ret.set(propName, propSchema)\n      }\n    })\n    return ret\n  }\n\n  #hasComputedDefault(\n    resourcefulDef: ResourcefulColumnDefinition<any> | ResourcefulComputedAccessorDefinition<any>,\n    lucidDef: ModelColumnOptions\n  ) {\n    if (\n      !isInstanceOf<ResourcefulDateType>(\n        resourcefulDef.type,\n        'ResourcefulDateType',\n        ResourcefulDateType\n      ) &&\n      !isInstanceOf<ResourcefulDateTimeType>(\n        resourcefulDef.type,\n        'ResourcefulDateTimeType',\n        ResourcefulDateTimeType\n      )\n    ) {\n      return false\n    }\n    const dateColumnOptions: DateColumnOptions = lucidDef as unknown as DateColumnOptions\n    return true === dateColumnOptions.autoCreate\n  }\n\n  async generateEdmElements(): Promise<ElementCompact> {\n    const ret: ElementCompact = {}\n    const EntityTypeMap = new Map<string, ElementCompact>()\n    const ComplexTypeMap = new Map<string, ElementCompact>()\n    const EnumTypeMap = new Map<string, ElementCompact>()\n    const EntitySetMap = new Map<string, ElementCompact>()\n    const AnnotationsArray: Array<ElementCompact> = [\n      {\n        _attributes: { Target: 'self.Container' },\n        Annotation: [\n          {\n            _attributes: { Term: 'Capabilities.BatchSupport' },\n            Record: {\n              PropertyValue: [\n                {\n                  _attributes: {\n                    Property: 'Supported',\n                    Bool: 'false',\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    ]\n    const ActionMap = new Map<string, ElementCompact[]>()\n    const FunctionMap = new Map<string, ElementCompact[]>()\n    const ActionImportSet = new Set<string>()\n    const FunctionImportSet = new Set<string>()\n    // Registry of actions, functions and operations by model\n    const modelOps = new Map<ResourcefulModel, OperationSpec[]>()\n    const registerModelOps = (modelCtor: ResourcefulModel, ops: OperationSpec[]) => {\n      const cur = modelOps.get(modelCtor) || []\n      modelOps.set(modelCtor, cur.concat(ops))\n    }\n    let hasResourcefulObjectType = false\n    this.#models.forEach((model, modelName) => {\n      const controller = this.#controllersByModelCtor.get(model)\n      const readSchema = this.#modelReadSchemas.get(model)!\n      const writeSchema = this.#modelWriteSchemas.get(model)!\n      const filterable: string[] = isObject(readSchema['x-resourceful-filterable'])\n        ? Object.keys(readSchema['x-resourceful-filterable'])\n        : []\n      const sortable: string[] = readSchema['x-resourceful-sortable'] || []\n      const readablePropertySchemas = this.#resolveSchemaPropertySchemas(\n        readSchema.properties,\n        'read'\n      )\n      const writablePropertySchemas = this.#resolveSchemaPropertySchemas(\n        writeSchema.properties,\n        'write'\n      )\n      const modelPolicy = this.#policiesByModelCtor.get(model) || {\n        index: false,\n        create: false,\n        read: false,\n        readRelated: false,\n        update: false,\n        bulkUpdate: false,\n        syncRelated: false,\n        delete: false,\n      }\n      const entityTypeName = model.$resourcefulName\n      const rawEntitySetName = this.#modelPathByModelCtor.get(model)\n      const entitySetName = rawEntitySetName || modelName\n      const resourcefulColumns = Array.from(model.$resourcefulColumns.entries())\n      const resourcefulComputedAccessors = Array.from(model.$resourcefulComputedAccessors.entries())\n      const resourcefulRelationships = Array.from(model.$resourcefulRelationships.entries())\n      // sort all of the information into maps for easy access\n      const modelEntitySetNavigationPropertyBindings: NavigationPropertyBindingAttributes[] = []\n      const modelEntitySetAnnotations: ElementCompact[] = []\n      const modelPropertyMap = new Map<string, PropertyAttributes>()\n      const modelPropertyAnnotationsMap = new Map<string, AnnotationAttributes[]>()\n      const modelPropertyAnnotationsCompactElementMap = new Map<string, ElementCompact[]>()\n      const modelNavigationPropertyMap = new Map<string, NavigationPropertyAttributes>()\n      const modelNavigationPropertyReferentialConstraintsMap = new Map<string, ElementCompact[]>()\n      const modelNavigationPropertyAnnotationsMap = new Map<string, AnnotationAttributes[]>()\n      const modelNavigationPropertyAnnotationsCompactElementMap = new Map<\n        string,\n        ElementCompact[]\n      >()\n      const insertRequiredProperties = new Set<string>()\n      const nonInsertableProperties = new Set<string>()\n      const nonUpdatableProperties = new Set<string>()\n      const nonBulkUpdatableProperties = new Set<string>()\n      const nonSelectableProperties = new Set<string>()\n      const nonReadableProperties = new Set<string>()\n      const nonFilterableProperties = new Set<string>()\n      const nonSortableProperties = new Set<string>()\n      const nonNavigableProperties = new Set<string>()\n      const nonExpandableProperties = new Set<string>()\n      const modelOperationSpecMap: Map<string, OperationSpec> = new Map()\n      const modelOperationRestrictions: ElementCompact[] = []\n      // iterate through columns, computed accessors and then relationships\n      // to populate the buckets appropriately\n      resourcefulColumns.forEach(([propName, resourcefulDef]) => {\n        const lucidDefinition = model.$columnsDefinitions.get(propName)!\n        // Columns with serializeAs: null are intentionally excluded from\n        // serialized output (toJSON). Declaring them in $metadata would cause\n        // OData clients (Power BI, Excel) to expect data that is never\n        // provided, producing per-cell \"Error\" values. Skip them so the\n        // advertised schema matches the wire format.\n        if (lucidDefinition.serializeAs === null) return\n        const propReadSchema = readablePropertySchemas.get(propName)\n        const propWriteSchema = writablePropertySchemas.get(propName)\n        const Type = this.#getEdmScalarType(resourcefulDef)\n        if (Type.includes('self.ResourcefulObjectType')) {\n          hasResourcefulObjectType = true\n        }\n        const propPropertyAttributes: PropertyAttributes = {\n          Name: propName,\n          Type,\n          Nullable: true === resourcefulDef.nullable ? undefined : false,\n        }\n        const propAnnotationAttributes: AnnotationAttributes[] = []\n        const propAnnotationElements: ElementCompact[] = []\n        this.#getValidationAnnotationsForProperty(Type, propReadSchema).forEach((a) =>\n          propAnnotationAttributes.push(a)\n        )\n        if (isNonArraySchemaObject(propReadSchema) && Array.isArray(propReadSchema.enum)) {\n          propAnnotationElements.push({\n            _attributes: {\n              Term: 'Validation.AllowedValues',\n            },\n            Collection: {\n              AllowedValue: propReadSchema.enum.map((enumValue) => ({\n                _attributes: {\n                  Value: String(isObject(enumValue) ? enumValue.value : enumValue),\n                },\n              })),\n            },\n          })\n        }\n        const knobs = processKnobs({\n          selectable: modelPolicy.index && isObject(propReadSchema),\n          filterable:\n            modelPolicy.index && isObject(propReadSchema) && filterable.includes(propName),\n          sortable: modelPolicy.index && isObject(propReadSchema) && sortable.includes(propName),\n          readable: modelPolicy.read && isObject(propReadSchema),\n          insertable:\n            modelPolicy.create &&\n            isObject(propWriteSchema) &&\n            !isAutoincrementedPrimaryKey(\n              lucidDefinition,\n              resourcefulDef,\n              propReadSchema,\n              propWriteSchema\n            )\n              ? writeSchema.required?.includes(propName)\n                ? 'required'\n                : true\n              : false,\n          updatable: modelPolicy.update && isObject(propWriteSchema),\n          bulkUpdatable: modelPolicy.bulkUpdate && isObject(propWriteSchema),\n          isComputed: false,\n          hasComputedDefault: this.#hasComputedDefault(resourcefulDef, lucidDefinition),\n        } satisfies ColumnAndComputedAccessorAttributes)\n        if (false === knobs.selectable) {\n          nonSelectableProperties.add(propName)\n        }\n        if (false === knobs.filterable) {\n          nonFilterableProperties.add(propName)\n        }\n        if (false === knobs.sortable) {\n          nonSortableProperties.add(propName)\n        }\n        if (false === knobs.readable) {\n          nonReadableProperties.add(propName)\n        }\n        if (false === knobs.insertable) {\n          nonInsertableProperties.add(propName)\n        } else if ('required' === knobs.insertable) {\n          insertRequiredProperties.add(propName)\n        }\n        if (false === knobs.updatable) {\n          nonUpdatableProperties.add(propName)\n        }\n        if (false === knobs.bulkUpdatable) {\n          nonBulkUpdatableProperties.add(propName)\n        }\n        if (knobs.isComputed) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Computed',\n            Bool: true,\n          })\n        }\n        if (knobs.hasComputedDefault) {\n          propAnnotationAttributes.push({\n            Term: 'Core.ComputedDefaultValue',\n            Bool: true,\n          })\n        }\n        if (knobs.readable && !knobs.insertable && !knobs.updatable) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Permissions',\n            EnumMember: 'Core.Permission/Read',\n          })\n        }\n        if (!knobs.readable && knobs.insertable && knobs.updatable) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Permissions',\n            EnumMember: 'Core.Permission/Write',\n          })\n        }\n        modelPropertyMap.set(propName, propPropertyAttributes)\n        if (propAnnotationAttributes.length > 0) {\n          modelPropertyAnnotationsMap.set(propName, propAnnotationAttributes)\n        }\n        if (propAnnotationElements.length > 0) {\n          modelPropertyAnnotationsCompactElementMap.set(propName, propAnnotationElements)\n        }\n      })\n      resourcefulComputedAccessors.forEach(([propName, resourcefulDef]) => {\n        const propReadSchema = readablePropertySchemas.get(propName)\n        const propWriteSchema = writablePropertySchemas.get(propName)\n        const Type = this.#getEdmScalarType(resourcefulDef)\n        if (Type.includes('self.ResourcefulObjectType')) {\n          hasResourcefulObjectType = true\n        }\n        const propPropertyAttributes: PropertyAttributes = {\n          Name: propName,\n          Type,\n          Nullable: true === resourcefulDef.nullable ? undefined : false,\n        }\n        const propAnnotationAttributes: AnnotationAttributes[] = []\n        const propAnnotationElements: ElementCompact[] = []\n        this.#getValidationAnnotationsForProperty(Type, propReadSchema).forEach((a) =>\n          propAnnotationAttributes.push(a)\n        )\n        if (isNonArraySchemaObject(propReadSchema) && Array.isArray(propReadSchema.enum)) {\n          propAnnotationElements.push({\n            _attributes: {\n              Term: 'Validation.AllowedValues',\n            },\n            Collection: {\n              AllowedValue: propReadSchema.enum.map((enumValue) => ({\n                _attributes: {\n                  Value: String(isObject(enumValue) ? enumValue.value : enumValue),\n                },\n              })),\n            },\n          })\n        }\n        const knobs = processKnobs({\n          selectable: modelPolicy.index && isObject(propReadSchema),\n          filterable:\n            modelPolicy.index && isObject(propReadSchema) && filterable.includes(propName),\n          sortable: modelPolicy.index && isObject(propReadSchema) && sortable.includes(propName),\n          readable: modelPolicy.read && isObject(propReadSchema),\n          insertable:\n            modelPolicy.create && resourcefulDef.writable && isObject(propWriteSchema)\n              ? writeSchema.required?.includes(propName)\n                ? 'required'\n                : true\n              : false,\n          updatable: modelPolicy.update && resourcefulDef.writable && isObject(propWriteSchema),\n          bulkUpdatable: false,\n          isComputed: !resourcefulDef.writable,\n          hasComputedDefault: false,\n        } satisfies ColumnAndComputedAccessorAttributes)\n        if (false === knobs.selectable) {\n          nonSelectableProperties.add(propName)\n        }\n        if (false === knobs.filterable) {\n          nonFilterableProperties.add(propName)\n        }\n        if (false === knobs.sortable) {\n          nonSortableProperties.add(propName)\n        }\n        if (false === knobs.readable) {\n          nonReadableProperties.add(propName)\n        }\n        if (false === knobs.insertable) {\n          nonInsertableProperties.add(propName)\n        } else if ('required' === knobs.insertable) {\n          insertRequiredProperties.add(propName)\n        }\n        if (false === knobs.updatable) {\n          nonUpdatableProperties.add(propName)\n        }\n        if (false === knobs.bulkUpdatable) {\n          nonBulkUpdatableProperties.add(propName)\n        }\n        if (knobs.isComputed) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Computed',\n            Bool: true,\n          })\n        }\n        if (knobs.hasComputedDefault) {\n          propAnnotationAttributes.push({\n            Term: 'Core.ComputedDefaultValue',\n            Bool: true,\n          })\n        }\n        if (knobs.readable && !knobs.insertable && !knobs.updatable) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Permissions',\n            EnumMember: 'Core.Permission/Read',\n          })\n        }\n        if (!knobs.readable && knobs.insertable && knobs.updatable) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Permissions',\n            EnumMember: 'Core.Permission/Write',\n          })\n        }\n        modelPropertyMap.set(propName, propPropertyAttributes)\n        if (propAnnotationAttributes.length > 0) {\n          modelPropertyAnnotationsMap.set(propName, propAnnotationAttributes)\n        }\n        if (propAnnotationElements.length > 0) {\n          modelPropertyAnnotationsCompactElementMap.set(propName, propAnnotationElements)\n        }\n      })\n      const addModelEntitySetNavigationPropertyBindings = (\n        propName: string,\n        relatedModel: ResourcefulModel\n      ) => {\n        const modelPath = this.#modelPathByModelCtor.get(relatedModel)\n        if (!modelPath) {\n          return\n        }\n        const fixedModelPath = modelPath\n        modelEntitySetNavigationPropertyBindings.push({\n          Path: propName,\n          Target: fixedModelPath,\n        })\n      }\n      const processNonCollectionRelationship = (\n        propName: string,\n        lucidDef:\n          | HasOneRelationContract<LucidModel, LucidModel>\n          | BelongsToRelationContract<LucidModel, LucidModel>,\n        propReadSchema: OpenAPIV3.SchemaObject | undefined\n      ) => {\n        if (!isNonArraySchemaObject(propReadSchema) || (!modelPolicy.index && !modelPolicy.read))\n          return\n        const relatedModel = lucidDef.relatedModel()\n        if (!isResourcefulModel(relatedModel)) {\n          return\n        }\n        addModelEntitySetNavigationPropertyBindings(propName, relatedModel)\n        const targetType = relatedModel.$resourcefulName\n        const fkProp = lucidDef.foreignKey\n        const fkCol =\n          'belongsTo' === lucidDef.type\n            ? model.$resourcefulColumns.get(fkProp)\n            : relatedModel.$resourcefulColumns.get(fkProp)\n        const nullable = fkCol ? true === fkCol.nullable : true\n        const propNavigationPropertyAttributes: NavigationPropertyAttributes = {\n          Name: propName,\n          Type: `self.${targetType}`,\n          Nullable: nullable,\n        }\n        const propNavigationPropertyReferentialConstraints: ElementCompact[] = []\n        if (lucidDef.type === 'belongsTo') {\n          const referentialConstraint = {\n            _attributes: {\n              Property: lucidDef.foreignKey,\n              ReferencedProperty: lucidDef.localKey,\n            },\n          }\n          propNavigationPropertyReferentialConstraints.push(referentialConstraint)\n        }\n        const propNavigationPropertyAnnotations: AnnotationAttributes[] = []\n        propNavigationPropertyAnnotations.push({\n          Term: 'Core.AutoExpand',\n          Bool: true,\n        })\n        modelNavigationPropertyMap.set(propName, propNavigationPropertyAttributes)\n        if (propNavigationPropertyReferentialConstraints.length > 0) {\n          modelNavigationPropertyReferentialConstraintsMap.set(\n            propName,\n            propNavigationPropertyReferentialConstraints\n          )\n        }\n        if (propNavigationPropertyAnnotations.length > 0) {\n          modelNavigationPropertyAnnotationsMap.set(propName, propNavigationPropertyAnnotations)\n        }\n        nonNavigableProperties.add(propName)\n        nonExpandableProperties.add(propName)\n      }\n      const processCollectionRelationship = (\n        propName: string,\n        lucidDef:\n          | HasManyRelationContract<LucidModel, LucidModel>\n          | HasManyThroughRelationContract<LucidModel, LucidModel>\n          | ManyToManyRelationContract<LucidModel, LucidModel>\n      ) => {\n        const relatedModel = lucidDef.relatedModel()\n        if (!isResourcefulModel(relatedModel)) {\n          return\n        }\n        addModelEntitySetNavigationPropertyBindings(propName, relatedModel)\n        const targetType = relatedModel.$resourcefulName\n        const propNavigationPropertyAttributes: NavigationPropertyAttributes = {\n          Name: propName,\n          Type: `Collection(self.${targetType})`,\n        }\n        modelNavigationPropertyMap.set(propName, propNavigationPropertyAttributes)\n        if (!modelPolicy.readRelated) {\n          nonNavigableProperties.add(propName)\n        }\n        nonExpandableProperties.add(propName)\n        if (modelPolicy.syncRelated) {\n          const opName = string.pascalCase(\n            ['sync', model.$resourcefulName, 'related', propName].join(' ')\n          )\n          if (!modelOperationSpecMap.has(opName)) {\n            const opSpec: OperationSpec = {\n              kind: 'action',\n              binding: 'entity',\n              name: opName,\n              params: [{ name: 'ruids', type: 'Collection(Edm.String)', nullable: false }],\n              returnType: 'Edm.String',\n              entitySetPath: propName,\n              isComposable: false,\n              enabled: () => true,\n            }\n            modelOperationSpecMap.set(opName, opSpec)\n            modelOperationRestrictions.push({\n              PropertyValue: [\n                {\n                  _attributes: {\n                    Property: 'Operation',\n                    String: `Default.${opName}`,\n                  },\n                },\n                {\n                  _attributes: {\n                    Property: 'Target',\n                    NavigationPropertyPath: propName,\n                  },\n                },\n              ],\n            })\n          }\n        }\n      }\n      resourcefulRelationships.forEach(([propName]) => {\n        const lucidDefinition = model.$relationsDefinitions.get(propName)!\n        const propReadSchema = readablePropertySchemas.get(propName)\n        // differentiate between collection and non collection relationships\n        if (['hasMany', 'manyToMany', 'hasManyThrough'].includes(lucidDefinition.type)) {\n          // process as collection\n          processCollectionRelationship(\n            propName,\n            lucidDefinition as\n              | HasManyRelationContract<LucidModel, LucidModel>\n              | HasManyThroughRelationContract<LucidModel, LucidModel>\n              | ManyToManyRelationContract<LucidModel, LucidModel>\n          )\n        } else {\n          // process as single entity\n          processNonCollectionRelationship(\n            propName,\n            lucidDefinition as\n              | HasOneRelationContract<LucidModel, LucidModel>\n              | BelongsToRelationContract<LucidModel, LucidModel>,\n            propReadSchema\n          )\n        }\n      })\n      // create the entity type now that we have all of the information\n      const modelEntityType: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: {\n          Name: entityTypeName,\n        } satisfies EntityTypeAttributes,\n        Key: {\n          PropertyRef: {\n            _attributes: { Name: model.primaryKey },\n          },\n        },\n        Property:\n          modelPropertyMap.size > 0\n            ? Array.from(modelPropertyMap.entries()).map(([prop, attrs]) => {\n                const propAnnotations = modelPropertyAnnotationsMap.get(prop) || []\n                const propAnnotationElements =\n                  modelPropertyAnnotationsCompactElementMap.get(prop) || []\n                const Annotation = [\n                  ...propAnnotations.map((a) => ({ _attributes: a })),\n                  ...propAnnotationElements,\n                ]\n                return stripUndefinedValuesFromObject({\n                  _attributes: attrs,\n                  Annotation: Annotation.length > 0 ? Annotation : undefined,\n                })\n              })\n            : undefined,\n        NavigationProperty:\n          modelNavigationPropertyMap.size > 0\n            ? Array.from(modelNavigationPropertyMap.entries()).map(([prop, attrs]) => {\n                const propReferentialConstraints =\n                  modelNavigationPropertyReferentialConstraintsMap.get(prop) || []\n                const propAnnotations = modelNavigationPropertyAnnotationsMap.get(prop) || []\n                const propAnnotationElements =\n                  modelNavigationPropertyAnnotationsCompactElementMap.get(prop) || []\n                const Annotation = [\n                  ...propAnnotations.map((a) => ({ _attributes: a })),\n                  ...propAnnotationElements,\n                ]\n                return stripUndefinedValuesFromObject({\n                  _attributes: attrs,\n                  ReferentialConstraint:\n                    propReferentialConstraints.length > 0 ? propReferentialConstraints : undefined,\n                  Annotation: Annotation.length > 0 ? Annotation : undefined,\n                })\n              })\n            : undefined,\n      })\n      EntityTypeMap.set(modelName, modelEntityType)\n      // create the entity set now that we have all of the information\n      const modelEntitySet: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: {\n          Name: entitySetName,\n          EntityType: `self.${entityTypeName}`,\n        } satisfies EntitySetAttributes,\n        NavigationPropertyBinding:\n          modelEntitySetNavigationPropertyBindings.length === 0\n            ? undefined\n            : modelEntitySetNavigationPropertyBindings.map((b) => ({ _attributes: b })),\n      })\n      EntitySetMap.set(entitySetName, modelEntitySet)\n      // build the model-level annotations now that we have all of the information\n      const annotationsTarget = `self.Container/${entitySetName}`\n      if (modelPolicy.index) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.SearchRestrictions', { Searchable: true })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.FilterRestrictions',\n            stripUndefinedValuesFromObject({\n              Filterable: true,\n              NonFilterableProperties:\n                nonFilterableProperties.size > 0 ? Array.from(nonFilterableProperties) : undefined,\n            } as SimpleCapabilityAnnotationProperties)\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.SortRestrictions',\n            stripUndefinedValuesFromObject({\n              Sortable: true,\n              NonSortableProperties:\n                nonSortableProperties.size > 0 ? Array.from(nonSortableProperties) : undefined,\n            } as SimpleCapabilityAnnotationProperties)\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.CountRestrictions', {\n            Countable: true,\n          })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.TopSupported',\n            {},\n            {\n              Bool: 'true',\n            }\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.SkipSupported',\n            {},\n            {\n              Bool: 'true',\n            }\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.SelectSupport',\n            stripUndefinedValuesFromObject({\n              Supported: true,\n              NonSelectableProperties:\n                nonSelectableProperties.size > 0 ? Array.from(nonSelectableProperties) : undefined,\n            } as SimpleCapabilityAnnotationProperties)\n          )\n        )\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.SearchRestrictions', { Searchable: false })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.FilterRestrictions', { Filterable: false })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.SortRestrictions', { Sortable: false })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.CountRestrictions', {\n            Countable: false,\n          })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.TopSupported',\n            {},\n            {\n              Bool: 'false',\n            }\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.SkipSupported',\n            {},\n            {\n              Bool: 'false',\n            }\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.SelectSupport', {\n            Supported: false,\n          })\n        )\n      }\n      if (modelPolicy.index || modelPolicy.read) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.ReadRestrictions', {\n            Readable: true,\n            ReadByKeyRestrictions: {\n              Readable: modelPolicy.read,\n            },\n          })\n        )\n        if (modelNavigationPropertyMap.size > 0) {\n          if (modelNavigationPropertyMap.size !== nonExpandableProperties.size) {\n            modelEntitySetAnnotations.push({\n              _attributes: {\n                Term: 'Capabilities.ExpandRestrictions',\n              },\n              Record: {\n                PropertyValue: [\n                  { _attributes: { Property: 'Expandable', Bool: 'true' } },\n                  { _attributes: { Property: 'MaxLevels', Int: '1' } },\n                  nonExpandableProperties.size > 0\n                    ? {\n                        _attributes: { Property: 'NonExpandableProperties' },\n                        Collection: {\n                          NavigationPropertyPath: Array.from(nonExpandableProperties).map((v) => ({\n                            _text: v,\n                          })),\n                        },\n                      }\n                    : undefined,\n                ].filter(isObject),\n              },\n            })\n            if (nonNavigableProperties.size > 0) {\n              modelEntitySetAnnotations.push({\n                _attributes: {\n                  Term: 'Capabilities.NavigationRestrictions',\n                },\n                Record: {\n                  PropertyValue: {\n                    _attributes: { Property: 'RestrictedProperties' },\n                    Collection: {\n                      Record: Array.from(nonNavigableProperties).map((prop) => ({\n                        PropertyValue: [\n                          {\n                            _attributes: {\n                              Property: 'NavigationProperty',\n                              NavigationPropertyPath: prop,\n                            },\n                          },\n                          {\n                            _attributes: {\n                              Property: 'Navigability',\n                              EnumMember: 'Capabilities.NavigationType/None',\n                            },\n                          },\n                        ],\n                      })),\n                    },\n                  },\n                },\n              })\n            }\n          } else {\n            modelEntitySetAnnotations.push(\n              makeSimpleCapabilityAnnotation('Capabilities.ExpandRestrictions', {\n                Expandable: false,\n              })\n            )\n          }\n        } else {\n          modelEntitySetAnnotations.push(\n            makeSimpleCapabilityAnnotation('Capabilities.ExpandRestrictions', {\n              Expandable: false,\n            })\n          )\n        }\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.ReadRestrictions', {\n            Readable: false,\n          })\n        )\n        if (modelNavigationPropertyMap.size > 0) {\n          modelEntitySetAnnotations.push(\n            makeSimpleCapabilityAnnotation('Capabilities.ExpandRestrictions', {\n              Expandable: false,\n            })\n          )\n        }\n      }\n      if (modelPolicy.create) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.InsertRestrictions',\n            stripUndefinedValuesFromObject({\n              Insertable: true,\n              RequiredProperties:\n                insertRequiredProperties.size > 0\n                  ? Array.from(insertRequiredProperties)\n                  : undefined,\n              NonInsertableProperties:\n                nonInsertableProperties.size > 0 ? Array.from(nonInsertableProperties) : undefined,\n            }) as SimpleCapabilityAnnotationProperties\n          )\n        )\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.InsertRestrictions', {\n            Insertable: false,\n          })\n        )\n      }\n      if (modelPolicy.update) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.UpdateRestrictions',\n            stripUndefinedValuesFromObject({\n              Updatable: true,\n              NonUpdatableProperties:\n                nonUpdatableProperties.size > 0 ? Array.from(nonUpdatableProperties) : undefined,\n              FilterSegmentSupported: modelPolicy.bulkUpdate,\n              TypecastSegmentSupported: modelPolicy.bulkUpdate,\n              DeltaUpdateSupported: true,\n            } as SimpleCapabilityAnnotationProperties)\n          )\n        )\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.UpdateRestrictions', {\n            Updatable: false,\n          })\n        )\n      }\n      if (modelPolicy.delete) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.DeleteRestrictions', {\n            Deletable: true,\n          })\n        )\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.DeleteRestrictions', {\n            Deletable: false,\n          })\n        )\n      }\n      if (controller) {\n        const additional = controller.options?.additional || {}\n        Object.entries(additional).forEach(([methodAndPath]) => {\n          const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n          if (!method || !path) return\n          const opName = makeOpName(method, model.$resourcefulName, path)\n          if (!modelOperationSpecMap.has(opName)) {\n            const opBinding: Boundness = path.includes(':uid\\/') ? 'entity' : 'collection'\n            const opKind: OpKind = ['post', 'patch', 'put', 'delete'].includes(method)\n              ? 'action'\n              : 'function'\n            const opSpec: OperationSpec = {\n              kind: opKind,\n              binding: opBinding,\n              name: opName,\n              params:\n                'action' === opKind\n                  ? [{ name: 'payload', type: 'Edm.String', nullable: true }]\n                  : [],\n              returnType: 'Edm.String',\n              entitySetPath: path.replace(/:uid\\/?/g, ''),\n              isComposable: false,\n              enabled: () => true,\n            }\n            modelOperationSpecMap.set(opName, opSpec)\n            modelOperationRestrictions.push({\n              PropertyValue: [\n                {\n                  _attributes: {\n                    Property: 'Operation',\n                    String: `Default.${opName}`,\n                  },\n                },\n                {\n                  _attributes: {\n                    Property: 'Target',\n                    NavigationPropertyPath: opSpec.entitySetPath!,\n                  },\n                },\n              ],\n            })\n          }\n        })\n      }\n      // Add the operations to the registry for processing later\n      registerModelOps(model, Array.from(modelOperationSpecMap.values()))\n      // Add the operation restrictions annotations if needed\n      if (modelOperationRestrictions.length > 0) {\n        modelEntitySetAnnotations.push({\n          _attributes: {\n            Term: 'Capabilities.OperationRestrictions',\n          },\n          Collection: {\n            Record: modelOperationRestrictions,\n          },\n        })\n      }\n      // Add the model entity set annotations to the global array\n      const modelEntitySetAnnotationsElement: ElementCompact = {\n        _attributes: {\n          Target: annotationsTarget,\n        },\n        Annotation: modelEntitySetAnnotations,\n      }\n      AnnotationsArray.push(modelEntitySetAnnotationsElement)\n    })\n    // Process all registered actions and functions\n    const addBoundAction = (\n      entityTypeName: string,\n      binding: Boundness,\n      name: string,\n      params: ParamSpec[] = [],\n      returnType?: string,\n      extras: Partial<ElementCompact['_attributes']> = {},\n      annotations?: ElementCompact[]\n    ) => {\n      const bindingType =\n        binding === 'collection' ? `Collection(self.${entityTypeName})` : `self.${entityTypeName}`\n\n      const el: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: { Name: name, IsBound: 'true', ...extras },\n        Parameter: [{ _attributes: { Name: 'BindingParameter', Type: bindingType } }].concat(\n          params.map((p) =>\n            stripUndefinedValuesFromObject({\n              _attributes: {\n                Name: p.name,\n                Type: p.type,\n                Nullable: p.nullable ? undefined : 'false',\n              },\n            })\n          )\n        ),\n        ReturnType: returnType ? { _attributes: { Type: returnType } } : undefined,\n        Annotation: annotations && annotations.length ? annotations : undefined,\n      })\n\n      const arr = ActionMap.get(entityTypeName) || []\n      arr.push(el)\n      ActionMap.set(entityTypeName, arr)\n    }\n    const addBoundFunction = (\n      entityTypeName: string,\n      binding: Boundness,\n      name: string,\n      params: ParamSpec[] = [],\n      returnType: string,\n      opts: {\n        isComposable?: boolean\n        entitySetPath?: string\n        extras?: Partial<ElementCompact['_attributes']>\n        annotations?: ElementCompact[]\n      } = {}\n    ) => {\n      const bindingType =\n        binding === 'collection' ? `Collection(self.${entityTypeName})` : `self.${entityTypeName}`\n\n      const el: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: stripUndefinedValuesFromObject({\n          Name: name,\n          IsBound: 'true',\n          IsComposable: opts.isComposable ? 'true' : undefined,\n          ...(opts.extras || {}),\n        }),\n        Parameter: [{ _attributes: { Name: 'BindingParameter', Type: bindingType } }].concat(\n          params.map((p) =>\n            stripUndefinedValuesFromObject({\n              _attributes: {\n                Name: p.name,\n                Type: p.type,\n                Nullable: p.nullable ? undefined : 'false',\n              },\n            })\n          )\n        ),\n        ReturnType: { _attributes: { Type: returnType } },\n        Annotation: opts.annotations && opts.annotations.length ? opts.annotations : undefined,\n      })\n\n      const arr = FunctionMap.get(entityTypeName) || []\n      arr.push(el)\n      FunctionMap.set(entityTypeName, arr)\n    }\n    modelOps.forEach((ops, model) => {\n      ops.forEach((op) => {\n        if (op.kind === 'action') {\n          addBoundAction(\n            model.$resourcefulName,\n            op.binding,\n            op.name,\n            op.params || [],\n            op.returnType,\n            {},\n            op.annotations\n          )\n        } else {\n          addBoundFunction(\n            model.$resourcefulName,\n            op.binding,\n            op.name,\n            op.params || [],\n            op.returnType!,\n            {\n              isComposable: op.isComposable,\n              entitySetPath: op.entitySetPath,\n              annotations: op.annotations,\n            }\n          )\n        }\n      })\n    })\n    // Add unbound operations\n    Object.entries(this.#opts.additional).forEach(([methodAndPath]) => {\n      const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n      if (!method || !path) return\n      const opName = makeOpName(method, path)\n      const opKind: OpKind = ['post', 'patch', 'put', 'delete'].includes(method)\n        ? 'action'\n        : 'function'\n      const el: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: stripUndefinedValuesFromObject({\n          Name: opName,\n          ...(opKind === 'function' ? { IsComposable: 'false' } : {}),\n        }),\n        Parameter:\n          opKind === 'action' ? [{ _attributes: { Name: 'Payload', Type: 'Edm.String' } }] : [],\n        ReturnType: opKind === 'action' ? undefined : { _attributes: { Type: 'Edm.String' } },\n      })\n      if (opKind === 'action') {\n        const arr = ActionMap.get('Unbound') || []\n        arr.push(el)\n        ActionMap.set('Unbound', arr)\n        ActionImportSet.add(opName)\n      } else {\n        const arr = FunctionMap.get('Unbound') || []\n        arr.push(el)\n        FunctionMap.set('Unbound', arr)\n        FunctionImportSet.add(opName)\n      }\n    })\n    // Add complex types if needed\n    if (hasResourcefulObjectType) {\n      ComplexTypeMap.set('ResourcefulObjectType', {\n        _attributes: { Name: 'ResourcefulObjectType', OpenType: 'true' },\n      })\n    }\n    ret.EntityType = Array.from(EntityTypeMap.values())\n    ret.ComplexType = Array.from(ComplexTypeMap.values())\n    ret.EnumType = Array.from(EnumTypeMap.values())\n    ret.EntityContainer =\n      EntitySetMap.size > 0\n        ? stripUndefinedValuesFromObject({\n            _attributes: {\n              Name: 'Container',\n            },\n            EntitySet: Array.from(EntitySetMap.values()),\n            ActionImport:\n              ActionImportSet.size > 0\n                ? Array.from(ActionImportSet.values()).map((name) => ({\n                    _attributes: {\n                      Name: name,\n                      Action: `Default.${name}`,\n                    },\n                  }))\n                : undefined,\n            FunctionImport:\n              FunctionImportSet.size > 0\n                ? Array.from(FunctionImportSet.values()).map((name) => ({\n                    _attributes: {\n                      Name: name,\n                      Function: `Default.${name}`,\n                      IncludeInServiceDocument: true,\n                    },\n                  }))\n                : undefined,\n          })\n        : undefined\n    ret.Action = Array.from(ActionMap.values()).flat()\n    ret.Function = Array.from(FunctionMap.values()).flat()\n    ret.Annotations = AnnotationsArray.length > 0 ? AnnotationsArray : undefined\n    return stripUndefinedValuesFromObject(ret)\n  }\n\n  static async serveRootMetadata(\n    opts: ResourcefulRouterOptionsService,\n    controllers: Map<string, ResourcefulModelController>,\n    ctx: HttpContext\n  ): Promise<ElementCompact> {\n    const service = new ODataMetadataService(opts, controllers)\n    return service.generateMetadataElements(ctx)\n  }\n}\n","import {\n  E_ODATA_FILTER_UNEXPECTED_CHARACTER,\n  E_ODATA_FILTER_UNEXPECTED_TYPE,\n  E_ODATA_FILTER_UNEXPECTED_END_OF_INPUT,\n  E_ODATA_UNKNOWN_PARAMETER_ALIAS,\n  E_ODATA_FILTER_UNEXPECTED_TOKEN,\n  E_ODATA_FILTER_INAPPLICABLE_NODE_TYPE,\n  E_ODATA_FILTER_UNKNOWN_LOGICAL_OPERATOR,\n  E_ODATA_FILTER_UNKNOWN_COMPARISON_OPERATOR,\n  E_ODATA_FILTER_INVALID_COMPARISON_SIDE,\n  E_ODATA_FILTER_UNEVALUATABLE_NODE_TYPE,\n  E_ODATA_FILTER_UNSUPPORTED_FUNCTION_COMPARISON,\n  E_ODATA_FILTER_EXPECTED_COLUMN_REFERENCE,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ResourcefulQueryScopeCallback } from './mixin'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder'\n\ninterface Token {\n  type:\n    | 'IDENTIFIER'\n    | 'STRING'\n    | 'NUMBER'\n    | 'BOOLEAN'\n    | 'NULL'\n    | 'OPERATOR'\n    | 'LPAREN'\n    | 'RPAREN'\n    | 'COMMA'\n    | 'WHITESPACE'\n    | 'PARAMETER'\n    | 'DATE'\n    | 'GUID'\n  value: string\n}\n\ninterface ASTNode {\n  type: string\n  [key: string]: any\n}\n\nexport type Dialect = 'postgres' | 'mysql' | 'sqlite'\n\nexport class ODataToLucidTranslator {\n  static readonly #LOGICAL_OPERATORS = ['and', 'or', 'not']\n  static readonly #COMPARISON_OPERATORS = ['eq', 'ne', 'gt', 'ge', 'lt', 'le', 'in', 'has']\n  static readonly #STRING_FUNCTIONS = [\n    'contains',\n    'endswith',\n    'startswith',\n    'length',\n    'indexof',\n    'substring',\n    'tolower',\n    'toupper',\n    'trim',\n    'concat',\n  ]\n  static readonly #DATE_FUNCTIONS = ['year', 'month', 'day', 'hour', 'minute', 'second']\n  static readonly #MATH_FUNCTIONS = ['round', 'floor', 'ceiling']\n\n  #tokens: Token[] = []\n  #position: number = 0\n  #filter: string\n  #aliases: Map<string, string>\n  #keyToColumn: Map<string, string>\n  #dialectType: Dialect\n\n  constructor(\n    filter: string,\n    aliases: Map<string, string>,\n    keyToColumn: Map<string, string>,\n    dialect: Dialect = 'postgres'\n  ) {\n    this.#filter = filter\n    this.#aliases = aliases\n    this.#keyToColumn = keyToColumn\n    this.#dialectType = dialect\n  }\n\n  public static apply(\n    $filter: string,\n    aliases: Map<string, string> = new Map(),\n    keyToColumn: Map<string, string> = new Map(),\n    dialect: Dialect = 'postgres',\n    dbQuery: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    const translator = new ODataToLucidTranslator($filter, aliases, keyToColumn, dialect)\n    return translator.#translate(dbQuery)\n  }\n\n  public static toHook(\n    $filter: string,\n    aliases: Map<string, string> = new Map(),\n    keyToColumn: Map<string, string> = new Map(),\n    dialect: Dialect = 'postgres'\n  ): ResourcefulQueryScopeCallback {\n    const bound = ODataToLucidTranslator.apply.bind(null, $filter, aliases, keyToColumn, dialect)\n    return (_ctx: HttpContext, _app: ApplicationService, query: DatabaseQueryBuilderContract) => {\n      bound(query)\n    }\n  }\n\n  #getSqlFns(query?: DatabaseQueryBuilderContract) {\n    // Prefer the actual DB client from the query when available; fall back to configured dialect\n    let resolved: Dialect = this.#dialectType\n    if (query) {\n      const client = this.#dialect(query)\n      if (client === 'pg') resolved = 'postgres'\n      else if (client === 'mysql' || client === 'mysql2') resolved = 'mysql'\n      else if (client === 'sqlite3') resolved = 'sqlite'\n    }\n\n    switch (resolved) {\n      case 'postgres':\n        return {\n          len: (col: string) => `LENGTH(${col})`,\n          instr: (col: string) => `POSITION(? IN ${col})`,\n          substr2: (col: string, start: string) => `SUBSTRING(${col} FROM ${start})`,\n          substr3: (col: string, start: string, len: string) =>\n            `SUBSTRING(${col} FROM ${start} FOR ${len})`,\n          year: (col: string) => `EXTRACT(YEAR FROM ${col})`,\n          month: (col: string) => `EXTRACT(MONTH FROM ${col})`,\n          day: (col: string) => `EXTRACT(DAY FROM ${col})`,\n          hour: (col: string) => `EXTRACT(HOUR FROM ${col})`,\n          minute: (col: string) => `EXTRACT(MINUTE FROM ${col})`,\n          second: (col: string) => `EXTRACT(SECOND FROM ${col})`,\n          floor: (col: string) => `FLOOR(${col})`,\n          ceil: (col: string) => `CEILING(${col})`,\n          round: (col: string, p?: string) => (p ? `ROUND(${col}, ${p})` : `ROUND(${col})`),\n          concat: (a: string, b: string) => `${a} || ${b}`,\n        }\n      case 'mysql':\n        return {\n          len: (col: string) => `CHAR_LENGTH(${col})`,\n          instr: (col: string) => `INSTR(${col}, ?)`,\n          substr2: (col: string, start: string) => `SUBSTRING(${col}, ${start})`,\n          substr3: (col: string, start: string, len: string) =>\n            `SUBSTRING(${col}, ${start}, ${len})`,\n          year: (col: string) => `YEAR(${col})`,\n          month: (col: string) => `MONTH(${col})`,\n          day: (col: string) => `DAY(${col})`,\n          hour: (col: string) => `HOUR(${col})`,\n          minute: (col: string) => `MINUTE(${col})`,\n          second: (col: string) => `SECOND(${col})`,\n          floor: (col: string) => `FLOOR(${col})`,\n          ceil: (col: string) => `CEIL(${col})`,\n          round: (col: string, p?: string) => (p ? `ROUND(${col}, ${p})` : `ROUND(${col})`),\n          concat: (a: string, b: string) => `CONCAT(${a}, ${b})`,\n        }\n      case 'sqlite':\n        return {\n          len: (col: string) => `LENGTH(${col})`,\n          instr: (col: string) => `INSTR(${col}, ?)`,\n          substr2: (col: string, start: string) => `SUBSTR(${col}, ${start})`,\n          substr3: (col: string, start: string, len: string) => `SUBSTR(${col}, ${start}, ${len})`,\n          year: (col: string) => `CAST(STRFTIME('%Y', ${col}) AS INTEGER)`,\n          month: (col: string) => `CAST(STRFTIME('%m', ${col}) AS INTEGER)`,\n          day: (col: string) => `CAST(STRFTIME('%d', ${col}) AS INTEGER)`,\n          hour: (col: string) => `CAST(STRFTIME('%H', ${col}) AS INTEGER)`,\n          minute: (col: string) => `CAST(STRFTIME('%M', ${col}) AS INTEGER)`,\n          second: (col: string) => `CAST(STRFTIME('%S', ${col}) AS INTEGER)`,\n          floor: (col: string) =>\n            `CASE WHEN (${col} - CAST(${col} AS INTEGER)) >= 0 THEN CAST(${col} AS INTEGER) ELSE CAST(${col} AS INTEGER) - 1 END`,\n          // Ceil using SQLite semantics (CAST truncates toward zero)\n          // ceil(x) = CAST(x AS INTEGER) + (x > CAST(x AS INTEGER) ? 1 : 0)\n          ceil: (col: string) =>\n            `CAST(${col} AS INTEGER) + CASE WHEN ${col} > CAST(${col} AS INTEGER) THEN 1 ELSE 0 END`,\n          round: (col: string, p?: string) => (p ? `ROUND(${col}, ${p})` : `ROUND(${col})`),\n          concat: (a: string, b: string) => `${a} || ${b}`,\n        }\n    }\n  }\n\n  #asSqlExpr(node: ASTNode): { sql: string; params: any[] } {\n    if (node.type === 'PROPERTY') {\n      return { sql: '??', params: [this.#getColumnName(node.name)] }\n    }\n    if (node.type === 'LITERAL') {\n      return { sql: '?', params: [node.value] }\n    }\n    throw new E_ODATA_FILTER_UNEVALUATABLE_NODE_TYPE(node)\n  }\n\n  #translate(dbQuery: DatabaseQueryBuilderContract): DatabaseQueryBuilderContract {\n    this.#tokens = this.#tokenize(this.#filter)\n    this.#position = 0\n\n    if (this.#tokens.length === 0) {\n      return dbQuery\n    }\n\n    const ast = this.#parseExpression()\n    return this.#applyASTToQuery(ast, dbQuery)\n  }\n\n  #tokenize(input: string): Token[] {\n    const tokens: Token[] = []\n    let i = 0\n\n    while (i < input.length) {\n      // Skip whitespace\n      if (/\\s/.test(input[i])) {\n        while (i < input.length && /\\s/.test(input[i])) i++\n        continue\n      }\n\n      // Parameter reference (@param)\n      if (input[i] === '@') {\n        let j = i + 1\n        while (j < input.length && /[a-zA-Z0-9_]/.test(input[j])) j++\n        if (j === i + 1) {\n          // No parameter name after @\n          throw new E_ODATA_FILTER_UNEXPECTED_CHARACTER(input[i], i)\n        }\n        tokens.push({ type: 'PARAMETER', value: input.substring(i + 1, j) })\n        i = j\n        continue\n      }\n\n      // String literals\n      if (input[i] === \"'\") {\n        let j = i + 1\n        let value = ''\n        let closed = false\n        while (j < input.length) {\n          if (input[j] === \"'\") {\n            if (j + 1 < input.length && input[j + 1] === \"'\") {\n              value += \"'\"\n              j += 2\n            } else {\n              j++\n              closed = true\n              break\n            }\n          } else {\n            value += input[j]\n            j++\n          }\n        }\n        if (!closed) {\n          throw new E_ODATA_FILTER_UNEXPECTED_END_OF_INPUT()\n        }\n        tokens.push({ type: 'STRING', value })\n        i = j\n        continue\n      }\n\n      // Numbers (including decimals and scientific notation)\n      if (\n        /[0-9]/.test(input[i]) ||\n        (input[i] === '-' && i + 1 < input.length && /[0-9]/.test(input[i + 1]))\n      ) {\n        let j = i\n        if (input[j] === '-') j++\n        while (j < input.length && /[0-9]/.test(input[j])) j++\n        if (j < input.length && input[j] === '.') {\n          j++\n          while (j < input.length && /[0-9]/.test(input[j])) j++\n        }\n        if (j < input.length && /[eE]/.test(input[j])) {\n          j++\n          if (j < input.length && /[+-]/.test(input[j])) j++\n          while (j < input.length && /[0-9]/.test(input[j])) j++\n        }\n        tokens.push({ type: 'NUMBER', value: input.substring(i, j) })\n        i = j\n        continue\n      }\n\n      // Parentheses\n      if (input[i] === '(') {\n        tokens.push({ type: 'LPAREN', value: '(' })\n        i++\n        continue\n      }\n      if (input[i] === ')') {\n        tokens.push({ type: 'RPAREN', value: ')' })\n        i++\n        continue\n      }\n\n      // Comma\n      if (input[i] === ',') {\n        tokens.push({ type: 'COMMA', value: ',' })\n        i++\n        continue\n      }\n\n      // Identifiers and keywords\n      if (/[a-zA-Z_$]/.test(input[i])) {\n        let j = i\n        while (j < input.length && /[a-zA-Z0-9_$\\/]/.test(input[j])) j++\n        const value = input.substring(i, j)\n\n        // Check for boolean literals\n        if (value === 'true' || value === 'false') {\n          tokens.push({ type: 'BOOLEAN', value })\n        }\n        // Check for null literal\n        else if (value === 'null') {\n          tokens.push({ type: 'NULL', value })\n        }\n        // Check for operators\n        else if (\n          [\n            ...ODataToLucidTranslator.#LOGICAL_OPERATORS,\n            ...ODataToLucidTranslator.#COMPARISON_OPERATORS,\n          ].includes(value.toLowerCase())\n        ) {\n          tokens.push({ type: 'OPERATOR', value: value.toLowerCase() })\n        }\n        // Otherwise it's an identifier\n        else {\n          tokens.push({ type: 'IDENTIFIER', value })\n        }\n        i = j\n        continue\n      }\n\n      // If we get here, we have an unexpected character\n      throw new E_ODATA_FILTER_UNEXPECTED_CHARACTER(input[i], i)\n    }\n\n    return tokens\n  }\n\n  #peek(): Token | null {\n    if (this.#position >= this.#tokens.length) return null\n    return this.#tokens[this.#position]\n  }\n\n  #consume(): Token | null {\n    if (this.#position >= this.#tokens.length) return null\n    return this.#tokens[this.#position++]\n  }\n\n  #expect(type: Token['type'], value?: string): Token {\n    const token = this.#consume()\n    if (!token || token.type !== type || (value !== undefined && token.value !== value)) {\n      throw new E_ODATA_FILTER_UNEXPECTED_TYPE(type, token, value)\n    }\n    return token\n  }\n\n  #parseExpression(): ASTNode {\n    return this.#parseLogicalOr()\n  }\n\n  #parseLogicalOr(): ASTNode {\n    let left = this.#parseLogicalAnd()\n\n    while (this.#peek()?.type === 'OPERATOR' && this.#peek()?.value === 'or') {\n      this.#consume()\n      const right = this.#parseLogicalAnd()\n      left = { type: 'LOGICAL', operator: 'or', left, right }\n    }\n\n    return left\n  }\n\n  #parseLogicalAnd(): ASTNode {\n    let left = this.#parseNot()\n\n    while (this.#peek()?.type === 'OPERATOR' && this.#peek()?.value === 'and') {\n      this.#consume()\n      const right = this.#parseNot()\n      left = { type: 'LOGICAL', operator: 'and', left, right }\n    }\n\n    return left\n  }\n\n  #parseNot(): ASTNode {\n    if (this.#peek()?.type === 'OPERATOR' && this.#peek()?.value === 'not') {\n      this.#consume()\n      return { type: 'LOGICAL', operator: 'not', operand: this.#parseNot() }\n    }\n\n    return this.#parseComparison()\n  }\n\n  #parseComparison(): ASTNode {\n    let left = this.#parsePrimary()\n\n    const token = this.#peek()\n    if (\n      token?.type === 'OPERATOR' &&\n      ODataToLucidTranslator.#COMPARISON_OPERATORS.includes(token.value)\n    ) {\n      const operator = this.#consume()!.value\n\n      if (operator === 'in') {\n        // Handle 'in' operator which expects a list\n        this.#expect('LPAREN')\n        const values: ASTNode[] = []\n        if (this.#peek()?.type !== 'RPAREN') {\n          values.push(this.#parsePrimary())\n          while (this.#peek()?.type === 'COMMA') {\n            this.#consume()\n            values.push(this.#parsePrimary())\n          }\n        }\n        this.#expect('RPAREN')\n        return { type: 'COMPARISON', operator: 'in', left, right: values }\n      } else {\n        const right = this.#parsePrimary()\n        return { type: 'COMPARISON', operator, left, right }\n      }\n    }\n\n    return left\n  }\n\n  #parsePrimary(): ASTNode {\n    const token = this.#peek()\n\n    if (!token) {\n      throw new E_ODATA_FILTER_UNEXPECTED_END_OF_INPUT()\n    }\n\n    // Parenthesized expression\n    if (token.type === 'LPAREN') {\n      this.#consume()\n      const expr = this.#parseExpression()\n      this.#expect('RPAREN')\n      return expr\n    }\n\n    // Function call\n    if (token.type === 'IDENTIFIER') {\n      const nextToken = this.#tokens[this.#position + 1]\n      if (nextToken?.type === 'LPAREN') {\n        return this.#parseFunctionCall()\n      }\n      // Property reference\n      const identifier = this.#consume()!\n      return { type: 'PROPERTY', name: identifier.value }\n    }\n\n    // String literal\n    if (token.type === 'STRING') {\n      this.#consume()\n      return { type: 'LITERAL', dataType: 'string', value: token.value }\n    }\n\n    // Number literal\n    if (token.type === 'NUMBER') {\n      this.#consume()\n      return { type: 'LITERAL', dataType: 'number', value: Number.parseFloat(token.value) }\n    }\n\n    // Boolean literal\n    if (token.type === 'BOOLEAN') {\n      this.#consume()\n      return { type: 'LITERAL', dataType: 'boolean', value: token.value === 'true' }\n    }\n\n    // Null literal\n    if (token.type === 'NULL') {\n      this.#consume()\n      return { type: 'LITERAL', dataType: 'null', value: null }\n    }\n\n    // Parameter reference\n    if (token.type === 'PARAMETER') {\n      this.#consume()\n      const aliasValue = this.#aliases.get(token.value)\n      if (!aliasValue) {\n        throw new E_ODATA_UNKNOWN_PARAMETER_ALIAS(token.value)\n      }\n      // Parse the alias value as a literal\n      return this.#parseLiteralValue(aliasValue)\n    }\n    throw new E_ODATA_FILTER_UNEXPECTED_TOKEN(token)\n  }\n\n  #parseFunctionCall(): ASTNode {\n    const funcName = this.#consume()!.value.toLowerCase()\n    this.#expect('LPAREN')\n\n    const args: ASTNode[] = []\n    if (this.#peek()?.type !== 'RPAREN') {\n      args.push(this.#parseExpression())\n      while (this.#peek()?.type === 'COMMA') {\n        this.#consume()\n        args.push(this.#parseExpression())\n      }\n    }\n\n    this.#expect('RPAREN')\n    return { type: 'FUNCTION', name: funcName, arguments: args }\n  }\n\n  #parseLiteralValue(value: string): ASTNode {\n    // Try to parse as number\n    if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(value)) {\n      return { type: 'LITERAL', dataType: 'number', value: Number.parseFloat(value) }\n    }\n\n    // Try to parse as boolean\n    if (value === 'true' || value === 'false') {\n      return { type: 'LITERAL', dataType: 'boolean', value: value === 'true' }\n    }\n\n    // Try to parse as null\n    if (value === 'null') {\n      return { type: 'LITERAL', dataType: 'null', value: null }\n    }\n\n    // Otherwise treat as string (remove quotes if present)\n    if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n      value = value.slice(1, -1).replace(/''/g, \"'\")\n    }\n\n    return { type: 'LITERAL', dataType: 'string', value }\n  }\n\n  #applyASTToQuery(\n    node: ASTNode,\n    query: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    // Treat bare boolean-returning expressions as \"eq true\"\n    if (node.type === 'PROPERTY') {\n      return this.#applyComparisonOperator(\n        {\n          type: 'COMPARISON',\n          operator: 'eq',\n          left: node,\n          right: { type: 'LITERAL', dataType: 'boolean', value: true },\n        },\n        query\n      )\n    }\n    if (node.type === 'FUNCTION') {\n      return this.#applyComparisonOperator(\n        {\n          type: 'COMPARISON',\n          operator: 'eq',\n          left: node,\n          right: { type: 'LITERAL', dataType: 'boolean', value: true },\n        },\n        query\n      )\n    }\n\n    switch (node.type) {\n      case 'LOGICAL':\n        return this.#applyLogicalOperator(node, query)\n      case 'COMPARISON':\n        return this.#applyComparisonOperator(node, query)\n      default:\n        throw new E_ODATA_FILTER_INAPPLICABLE_NODE_TYPE(node)\n    }\n  }\n\n  #applyLogicalOperator(\n    node: ASTNode,\n    query: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    switch (node.operator) {\n      case 'and':\n        return query\n          .where((subQuery) => {\n            this.#applyASTToQuery(node.left, subQuery)\n          })\n          .where((subQuery) => {\n            this.#applyASTToQuery(node.right, subQuery)\n          })\n\n      case 'or':\n        return query.where((subQuery) => {\n          subQuery\n            .where((sq) => this.#applyASTToQuery(node.left, sq))\n            .orWhere((sq) => this.#applyASTToQuery(node.right, sq))\n        })\n\n      case 'not':\n        return query.whereNot((subQuery) => {\n          this.#applyASTToQuery(node.operand, subQuery)\n        })\n\n      default:\n        throw new E_ODATA_FILTER_UNKNOWN_LOGICAL_OPERATOR(node)\n    }\n  }\n\n  #applyComparisonOperator(\n    node: ASTNode,\n    query: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    const left = this.#evaluateNode(node.left)\n    const right =\n      node.operator === 'in'\n        ? node.right.map((n: ASTNode) => this.#evaluateNode(n))\n        : this.#evaluateNode(node.right)\n\n    // If left side is a column reference\n    if (typeof left === 'object' && left.type === 'column') {\n      const column = this.#getColumnName(left.name)\n\n      if (node.operator === 'eq' && right === null) return query.whereNull(column)\n      if (node.operator === 'ne' && right === null) return query.whereNotNull(column)\n\n      switch (node.operator) {\n        case 'eq':\n          return right === null ? query.whereNull(column) : query.where(column, '=', right)\n        case 'ne':\n          return right === null ? query.whereNotNull(column) : query.where(column, '!=', right)\n        case 'gt':\n          return query.where(column, '>', right)\n        case 'ge':\n          return query.where(column, '>=', right)\n        case 'lt':\n          return query.where(column, '<', right)\n        case 'le':\n          return query.where(column, '<=', right)\n        case 'in':\n          return query.whereIn(column, right as any[])\n        case 'has':\n          // OData 'has' means: all flags in the RHS are present in LHS\n          // That's a bitmask test: (col & mask) = mask\n          const mask = right\n          return query.whereRaw('(?? & ?) = ?', [column, mask, mask])\n        default:\n          throw new E_ODATA_FILTER_UNKNOWN_COMPARISON_OPERATOR(node)\n      }\n    }\n\n    // Support normalized comparisons where the column is on the RIGHT side\n    // Example: `null eq Prop` or `5 gt Age`\n    if (\n      !(typeof left === 'object' && left.type === 'column') &&\n      typeof right === 'object' &&\n      right.type === 'column'\n    ) {\n      const column = this.#getColumnName(right.name)\n      const value = left\n\n      switch (node.operator) {\n        case 'eq':\n          return value === null ? query.whereNull(column) : query.where(column, '=', value)\n        case 'ne':\n          return value === null ? query.whereNotNull(column) : query.where(column, '!=', value)\n        case 'gt':\n          // value > column  => column < value\n          return query.where(column, '<', value)\n        case 'ge':\n          // value >= column => column <= value\n          return query.where(column, '<=', value)\n        case 'lt':\n          // value < column  => column > value\n          return query.where(column, '>', value)\n        case 'le':\n          // value <= column => column >= value\n          return query.where(column, '>=', value)\n        // 'in' and 'has' are not meaningful with column on RHS in our context\n        default:\n          throw new E_ODATA_FILTER_UNKNOWN_COMPARISON_OPERATOR(node)\n      }\n    }\n\n    // If it's a function comparison, we need to handle it differently\n    if (typeof left === 'object' && left.type === 'function') {\n      return this.#applyFunctionComparison(left, node.operator, right, query)\n    }\n\n    throw new E_ODATA_FILTER_INVALID_COMPARISON_SIDE()\n  }\n\n  #evaluateNode(node: ASTNode): any {\n    switch (node.type) {\n      case 'LITERAL':\n        return node.value\n\n      case 'PROPERTY':\n        return { type: 'column', name: node.name }\n\n      case 'FUNCTION':\n        return this.#evaluateFunction(node)\n\n      default:\n        throw new E_ODATA_FILTER_UNEVALUATABLE_NODE_TYPE(node)\n    }\n  }\n\n  #evaluateFunction(node: ASTNode): any {\n    const funcName = node.name.toLowerCase()\n\n    // For functions that need special handling in SQL\n    if (\n      ODataToLucidTranslator.#STRING_FUNCTIONS.includes(funcName) ||\n      ODataToLucidTranslator.#DATE_FUNCTIONS.includes(funcName) ||\n      ODataToLucidTranslator.#MATH_FUNCTIONS.includes(funcName)\n    ) {\n      return { type: 'function', name: funcName, arguments: node.arguments }\n    }\n\n    // For functions that can be evaluated immediately\n    if (funcName === 'tolower' && node.arguments.length === 1) {\n      const arg = this.#evaluateNode(node.arguments[0])\n      if (typeof arg === 'string') return arg.toLowerCase()\n    }\n\n    if (funcName === 'toupper' && node.arguments.length === 1) {\n      const arg = this.#evaluateNode(node.arguments[0])\n      if (typeof arg === 'string') return arg.toUpperCase()\n    }\n\n    return { type: 'function', name: funcName, arguments: node.arguments }\n  }\n\n  #escapeLike(v: string, esc = '\\\\') {\n    return v.replace(/[\\\\%_]/g, (m) => esc + m)\n  }\n\n  #dialect(query: DatabaseQueryBuilderContract) {\n    const client =\n      (query as any).client?.client?.config?.client || (query as any).client?.dialect?.name\n    // knex names: 'pg', 'mysql', 'mysql2', 'sqlite3'\n    return client\n  }\n\n  #likeOp(query: DatabaseQueryBuilderContract) {\n    return this.#dialect(query) === 'pg' ? 'ILIKE' : 'LIKE'\n  }\n\n  #applyFunctionComparison(\n    func: any,\n    operator: string,\n    value: any,\n    query: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    const funcName = func.name.toLowerCase()\n\n    // String functions\n    if (funcName === 'contains' && func.arguments.length === 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const val = String(this.#evaluateNode(func.arguments[1]) ?? '')\n      const patt = `%${this.#escapeLike(val)}%`\n      const like = this.#likeOp(query)\n      /*\n      |--------------------------------------------------------------------------\n      | MySQL doesn't support ESCAPE clause in LIKE statements\n      |--------------------------------------------------------------------------\n      */\n      const escapeClause = this.#dialectType === 'mysql' ? '' : ` ESCAPE '\\\\'`\n\n      if (operator === 'eq') {\n        return value === true\n          ? query.whereRaw(`?? ${like} ?${escapeClause}`, [column, patt])\n          : query.whereRaw(`NOT (?? ${like} ?${escapeClause})`, [column, patt])\n      }\n    }\n    if (funcName === 'startswith' && func.arguments.length === 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const val = String(this.#evaluateNode(func.arguments[1]) ?? '')\n      const patt = `${this.#escapeLike(val)}%`\n      const like = this.#likeOp(query)\n      /*\n      |--------------------------------------------------------------------------\n      | MySQL doesn't support ESCAPE clause in LIKE statements\n      |--------------------------------------------------------------------------\n      */\n      const escapeClause = this.#dialectType === 'mysql' ? '' : ` ESCAPE '\\\\'`\n      if (operator === 'eq') {\n        return value === true\n          ? query.whereRaw(`?? ${like} ?${escapeClause}`, [column, patt])\n          : query.whereRaw(`NOT (?? ${like} ?${escapeClause})`, [column, patt])\n      }\n    }\n\n    if (funcName === 'endswith' && func.arguments.length === 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const val = String(this.#evaluateNode(func.arguments[1]) ?? '')\n      const patt = `%${this.#escapeLike(val)}`\n      const like = this.#likeOp(query)\n      /*\n      |--------------------------------------------------------------------------\n      | MySQL doesn't support ESCAPE clause in LIKE statements\n      |--------------------------------------------------------------------------\n      */\n      const escapeClause = this.#dialectType === 'mysql' ? '' : ` ESCAPE '\\\\'`\n      if (operator === 'eq') {\n        return value === true\n          ? query.whereRaw(`?? ${like} ?${escapeClause}`, [column, patt])\n          : query.whereRaw(`NOT (?? ${like} ?${escapeClause})`, [column, patt])\n      }\n    }\n\n    if (funcName === 'length' && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n      return query.whereRaw(`${f.len('??')} ${sqlOp} ?`, [column, value])\n    }\n\n    if (funcName === 'indexof' && func.arguments.length === 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const searchValue = this.#evaluateNode(func.arguments[1])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n      // OData wants 0-based; INSTR/POSITION are 1-based (or 0 on miss). Normalize.\n      // Parameter ordering differs by dialect (POSITION(? IN col) vs INSTR(col, ?)).\n      const isPg = this.#dialectType === 'postgres'\n      const params = isPg ? [searchValue, column, value] : [column, searchValue, value]\n      return query.whereRaw(`(${f.instr('??')} - 1) ${sqlOp} ?`, params)\n    }\n\n    if (funcName === 'substring' && func.arguments.length >= 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const startIndex = this.#evaluateNode(func.arguments[1])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n\n      if (func.arguments.length === 2) {\n        // substring(string, start) - from start to end (OData start is 0-based → SQL start is 1-based)\n        return query.whereRaw(`${f.substr2('??', '(? + 1)')} ${sqlOp} ?`, [\n          column,\n          startIndex,\n          value,\n        ])\n      } else if (func.arguments.length === 3) {\n        // substring(string, start, length)\n        const length = this.#evaluateNode(func.arguments[2])\n        return query.whereRaw(`${f.substr3('??', '(? + 1)', '?')} ${sqlOp} ?`, [\n          column,\n          startIndex,\n          length,\n          value,\n        ])\n      }\n    }\n\n    if (funcName === 'trim' && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      return query.whereRaw(`TRIM(??) ${sqlOp} ?`, [column, value])\n    }\n\n    if (funcName === 'concat' && func.arguments.length === 2) {\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n      // Allow column/column and column/literal combinations\n      const a = this.#asSqlExpr(func.arguments[0])\n      const b = this.#asSqlExpr(func.arguments[1])\n      return query.whereRaw(`${f.concat(a.sql, b.sql)} ${sqlOp} ?`, [\n        ...a.params,\n        ...b.params,\n        value,\n      ])\n    }\n\n    // tolower/toupper functions for columns\n    if (funcName === 'tolower' && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      return query.whereRaw(`LOWER(??) ${sqlOp} LOWER(?)`, [column, value])\n    }\n\n    if (funcName === 'toupper' && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      return query.whereRaw(`UPPER(??) ${sqlOp} UPPER(?)`, [column, value])\n    } // Date functions\n    if (ODataToLucidTranslator.#DATE_FUNCTIONS.includes(funcName) && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n      let expr: string\n      switch (funcName) {\n        case 'year':\n          expr = f.year('??')\n          break\n        case 'month':\n          expr = f.month('??')\n          break\n        case 'day':\n          expr = f.day('??')\n          break\n        case 'hour':\n          expr = f.hour('??')\n          break\n        case 'minute':\n          expr = f.minute('??')\n          break\n        case 'second':\n          expr = f.second('??')\n          break\n        default:\n          throw new E_ODATA_FILTER_UNSUPPORTED_FUNCTION_COMPARISON(funcName)\n      }\n      return query.whereRaw(`${expr} ${sqlOp} ?`, [column, value])\n    }\n\n    // Math functions\n    if (ODataToLucidTranslator.#MATH_FUNCTIONS.includes(funcName)) {\n      const f = this.#getSqlFns()\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n\n      if (funcName === 'round' && (func.arguments.length === 1 || func.arguments.length === 2)) {\n        const column = this.#getColumnFromNode(func.arguments[0])\n        if (func.arguments.length === 1) {\n          // round(value) - round to integer\n          return query.whereRaw(`${f.round('??')} ${sqlOp} ?`, [column, value])\n        } else {\n          // round(value, precision)\n          const precision = this.#evaluateNode(func.arguments[1])\n          return query.whereRaw(`${f.round('??', '?')} ${sqlOp} ?`, [column, precision, value])\n        }\n      } else if (funcName === 'floor' && func.arguments.length === 1) {\n        const column = this.#getColumnFromNode(func.arguments[0])\n        return query.whereRaw(`${f.floor('??')} ${sqlOp} ?`, [column, value])\n      } else if (funcName === 'ceiling' && func.arguments.length === 1) {\n        const column = this.#getColumnFromNode(func.arguments[0])\n        return query.whereRaw(`${f.ceil('??')} ${sqlOp} ?`, [column, value])\n      }\n    }\n    throw new E_ODATA_FILTER_UNSUPPORTED_FUNCTION_COMPARISON(funcName)\n  }\n\n  #getColumnFromNode(node: ASTNode): string {\n    const result = this.#evaluateNode(node)\n    if (typeof result === 'object' && result.type === 'column') {\n      return this.#getColumnName(result.name)\n    }\n    throw new E_ODATA_FILTER_EXPECTED_COLUMN_REFERENCE()\n  }\n\n  //   #getValueFromNode(node: ASTNode): string | number {\n  //     const result = this.#evaluateNode(node)\n  //     if (typeof result === 'object' && result.type === 'column') {\n  //       return this.#getColumnName(result.name)\n  //     }\n  //     // Return the literal value for non-column arguments\n  //     return result\n  //   }\n\n  #getColumnName(key: string): string {\n    // Check if there's a mapping for this key\n    if (this.#keyToColumn.has(key)) {\n      return this.#keyToColumn.get(key)!\n    }\n    // Otherwise use the key as-is\n    return key\n  }\n\n  #getComparisonOperatorSQL(operator: string): string {\n    const mapping: Record<string, string> = {\n      eq: '=',\n      ne: '!=',\n      gt: '>',\n      ge: '>=',\n      lt: '<',\n      le: '<=',\n    }\n    return mapping[operator] || '='\n  }\n\n  // (date/math helper mappings removed in favor of dialect-aware #getSqlFns())\n}\n","import { js2xml } from 'xml-js'\nimport { DateTime } from 'luxon'\nimport { default as qs } from 'qs'\nimport { default as pMap } from 'p-map'\nimport { Exception } from '@poppinss/utils'\nimport { default as Hooks } from '@poppinss/hooks'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { NextFn } from '@poppinss/middleware/types'\nimport { default as string } from '@poppinss/string'\nimport { stripUndefinedValuesFromObject } from '../../utils'\nimport { default as Middleware } from '@poppinss/middleware'\nimport { makeOpName } from '../services/odata_metadata_service'\nimport { normalizeError } from '../../router_macro/utils/errors'\nimport { useODataContext } from '@nhtio/lucid-resourceful/odata/context'\nimport { ODataToLucidTranslator } from '../../odata_to_lucid_translator'\nimport { isAdditionalResourcefulRouteDetails } from '../../router_macro/utils/type_guards'\nimport {\n  isObject,\n  isArray,\n  isStringContent,\n  isResourcefulModel,\n  isInstanceOf,\n} from '../../type_guards'\nimport {\n  sanitizeSelect,\n  sanitizeExpand,\n  santizeResponsePayload,\n  sanitizeODataKeys,\n} from '../utils/odata'\nimport {\n  negotiateContent,\n  negotiateMetadata,\n  negotiatePreference,\n  negotiateIeee754Compatible,\n} from '../utils/http'\nimport {\n  ResourcefulNumberType,\n  ResourcefulIntegerType,\n  ResourcefulBigintType,\n  ResourcefulUnsignedIntegerType,\n} from '../../data_types'\nimport {\n  E_UNRESOLVABLE_MODEL,\n  E_ROUTE_NOT_FOUND,\n  E_RELATIONSHIP_NOT_FOUND_EXCEPTION,\n  E_RECORD_NOT_FOUND_EXCEPTION,\n  E_UNSYNCABLE_RELATIONSHIP_EXCEPTION,\n  E_INVALID_RELATIONSHIP_EXCEPTION,\n  E_EXPAND_NOT_IMPLEMENTED,\n  E_UNSUPPORTED_DATABASE_DIALECT,\n  E_UNACCEPTABLE_FORMAT,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ElementCompact } from 'xml-js'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ResourcefulDataType } from '../../data_types'\nimport type { AnySchema } from '@nhtio/lucid-resourceful/joi'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { Dialect } from '../../odata_to_lucid_translator'\nimport type { ResourcefulModelMetaSchema } from '@nhtio/lucid-resourceful/types'\nimport type { ResourcefulRouterModelServiceOptionsService } from '../../router_macro/services/resourceful_router_model_options_service'\nimport type {\n  ResourcefulModel,\n  ResourcefulIndexResponse,\n  ResourceResourcefulRecordResponse,\n  ResourcefulQueryScopeCallback,\n  ResourcefulPayloadSchemaGetter,\n  ResourcefulPolicy,\n  ResourcefulIndexResponseHook,\n  ResourceResourcefulRecordResponseHook,\n  ResourcefulRouterMutatorOptions,\n  RouteCallback,\n  AdditionalResourcefulRouteDetails,\n} from '@nhtio/lucid-resourceful/types'\n\ntype ODataMetadata = {\n  context: string\n} & Partial<{\n  count: number\n  nextLink: string\n  deltaLink: string\n  id: string | number | bigint\n  etag: string\n  readLink: string\n  editLink: string\n  navigationLink: string\n  type: string\n  mediaReadLink: string\n  mediaEditLink: string\n  mediaContentType: string\n  mediaEtag: string\n}>\n\nconst encoder = (_key: string, value: any) => {\n  if (value instanceof Date) {\n    return DateTime.fromJSDate(value).toISO()\n  }\n  if (value instanceof DateTime) {\n    return value.toISO()\n  }\n  // Handle Luxon DateTime values that may come from a different module instance.\n  if (\n    value &&\n    typeof value === 'object' &&\n    value.isLuxonDateTime === true &&\n    typeof value.toISO === 'function'\n  ) {\n    return value.toISO()\n  }\n  if (typeof value === 'bigint') {\n    return value.toString()\n  }\n  if (typeof value === 'number') {\n    // OData JSON §7.1: Infinity and NaN are represented as string literals\n    // \"INF\", \"-INF\", \"NaN\". Normal numbers remain numeric (not stringified).\n    // NOTE: This is a behavior change from earlier versions which stringified all numbers.\n    if (Number.POSITIVE_INFINITY === value) {\n      return 'INF'\n    }\n    if (Number.NEGATIVE_INFINITY === value) {\n      return '-INF'\n    }\n    if (Number.isNaN(value)) {\n      return 'NaN'\n    }\n    return value\n  }\n  return value\n}\n\nconst asXmlEntityObject = (obj: any): any => {\n  obj = sanitizeODataKeys(obj)\n  if (!isObject(obj)) {\n    return obj\n  }\n  return Object.assign(\n    {},\n    ...Object.entries(obj).map(([key, value]) => {\n      value = encoder(key, value)\n      if (isObject(value)) {\n        return { [`data:${key}`]: asXmlEntityObject(value) }\n      } else if (isArray(value)) {\n        return { [`data:${key}`]: value.map((v) => asXmlEntityObject(v)) }\n      }\n      return { [`data:${key}`]: { _text: String(value) } }\n    })\n  )\n}\n\nconst elementCompactFromResourcefulModelRecord = (\n  record: ResourceResourcefulRecordResponse\n): ElementCompact => {\n  record = sanitizeODataKeys(record) as ResourceResourcefulRecordResponse\n  const ret: ElementCompact = {\n    'metadata:properties': asXmlEntityObject(record),\n  }\n  return ret\n}\n\nconst toJsonEntity = (entity: any) => {\n  if (entity && typeof entity.toJSON === 'function') {\n    try {\n      return sanitizeODataKeys(entity.toJSON())\n    } catch {\n      return sanitizeODataKeys({ ...entity })\n    }\n  }\n  return sanitizeODataKeys(entity)\n}\n\n/**\n * Determines whether a resourceful data type maps to an EDM scalar type that\n * must be serialized as a JSON string when `IEEE754Compatible=true` is\n * negotiated (per OData JSON Format §3.2 — `Edm.Int64`, `Edm.Decimal`).\n *\n * The Int64-vs-Int32 threshold mirrors\n * `ODataMetadataService#getEdmIntScalarType` so a property reported as\n * `Edm.Int64` in `$metadata` is also stringified on the wire.\n */\nconst isIeee754CompatibleRelevantType = (type: ResourcefulDataType): boolean => {\n  if (isInstanceOf(type, 'ResourcefulBigintType', ResourcefulBigintType)) {\n    return true\n  }\n  if (isInstanceOf(type, 'ResourcefulNumberType', ResourcefulNumberType)) {\n    return true\n  }\n  const isInteger = isInstanceOf(type, 'ResourcefulIntegerType', ResourcefulIntegerType)\n  const isUnsigned = isInstanceOf(\n    type,\n    'ResourcefulUnsignedIntegerType',\n    ResourcefulUnsignedIntegerType\n  )\n  if (!isInteger && !isUnsigned) {\n    return false\n  }\n  const intType = type as ResourcefulIntegerType | ResourcefulUnsignedIntegerType\n  const min = isUnsigned ? 0 : intType.exclusiveMinimum ? intType.minimum + 1 : intType.minimum\n  const max = intType.exclusiveMaximum\n    ? intType.maximum\n    : typeof intType.maximum === 'bigint'\n      ? (intType.maximum as unknown as bigint) - BigInt(1)\n      : (intType.maximum as number) - 1\n\n  return min < -2_147_483_648 || (max as number) > 2_147_483_647\n}\n\n/** Per-request cache of resourceful meta schemas, keyed by the model class. */\ntype ResourcefulModelMetaCache = Map<ResourcefulModel, ResourcefulModelMetaSchema>\n\n/**\n * Pre-warms a per-request cache of resourceful meta schemas for `rootModel`\n * and every related model reachable through its relationships. Having it\n * ready up-front keeps response serialization synchronous — the coercion\n * pass needs a related model's meta to walk into `$expand`ed nested data,\n * and `$getAsResourcefulForContext` is async.\n */\nconst buildModelMetaCache = async (\n  rootModel: ResourcefulModel,\n  ctx: HttpContext,\n  app: ApplicationService\n): Promise<ResourcefulModelMetaCache> => {\n  const cache: ResourcefulModelMetaCache = new Map()\n\n  const visit = async (model: ResourcefulModel): Promise<void> => {\n    if (cache.has(model)) return\n    let meta: ResourcefulModelMetaSchema\n    try {\n      meta = await model.$getAsResourcefulForContext(ctx, app)\n    } catch {\n      return\n    }\n\n    cache.set(model, meta)\n\n    for (const prop of Object.values(meta.properties)) {\n      if (prop.kind !== 'relationship') continue\n      try {\n        const related = prop.relatedModel()\n        if (isResourcefulModel(related)) {\n          await visit(related)\n        }\n      } catch {\n        // Relation resolution may fail for unregistered models — safe to skip.\n      }\n    }\n  }\n  await visit(rootModel)\n  return cache\n}\n\n/**\n * Coerces a single Int64/Decimal field in-place to match the negotiated\n * `IEEE754Compatible` parameter: stringifies the value when the client asked\n * for strings, or unstringifies it back to a JSON number when the client is\n * using the default JSON representation.\n *\n * NOTE: values above `Number.MAX_SAFE_INTEGER` (2^53 − 1) still get coerced\n * to `Number`, which may silently lose precision. This is an accepted\n * trade-off: `IEEE754Compatible=false` clients (Power BI in particular)\n * cannot parse string values at all — a slightly imprecise number is\n * strictly better than a hard error that blocks the entire table.\n */\nconst coerceNumericField = (\n  entity: Record<string, unknown>,\n  jsonKey: string,\n  ieee754Compatible: boolean\n): void => {\n  const value = entity[jsonKey]\n  // Null/undefined are valid JSON and carry no precision concern — leave as-is.\n  if (value === null || value === undefined) return\n\n  // Direction fork: stringify (true) vs. unstringify (false).\n  if (ieee754Compatible) {\n    // Already a string — matches the IEEE754=true wire format, no work needed.\n    if (typeof value === 'string') return\n    if (typeof value === 'bigint') {\n      entity[jsonKey] = value.toString()\n      return\n    }\n    // Non-finite numbers (Infinity/NaN) are handled by the JSON encoder per\n    // OData §7.1, so skip them here instead of emitting \"Infinity\" strings.\n    if (typeof value === 'number' && Number.isFinite(value)) {\n      entity[jsonKey] = String(value)\n    }\n    return\n  }\n\n  // IEEE754=false path: coerce back to JSON number. bigint came from the JS\n  // runtime; string came from node-postgres preserving precision on\n  // bigint/numeric columns — both need unwrapping for clients that expect\n  // Edm.Int64 as a number (Power BI's default).\n  if (typeof value === 'bigint') {\n    entity[jsonKey] = Number(value)\n    return\n  }\n  if (typeof value !== 'string') return\n  const num = Number(value)\n  // Reject non-numeric strings (malformed data) rather than writing NaN.\n  if (Number.isNaN(num) || !Number.isFinite(num)) return\n  entity[jsonKey] = num\n}\n\n/**\n * Walks `entity` using `model`'s resourceful metadata as the guide: any\n * scalar column whose declared type maps to Edm.Int64 / Edm.Decimal is\n * coerced per the negotiated IEEE754Compatible parameter, and any relation\n * key actually present in the data (e.g. from `$expand`) is recursed into\n * using the related model's own metadata.\n */\nconst coerceEntityForIeee754 = (\n  entity: Record<string, unknown>,\n  model: ResourcefulModel,\n  ieee754Compatible: boolean,\n  metaCache: ResourcefulModelMetaCache,\n  visited: Set<ResourcefulModel> = new Set()\n): void => {\n  if (visited.has(model)) return\n  const meta = metaCache.get(model)\n  // Meta cache miss — model wasn't reachable from the root at warm-up time.\n  // Rare but possible if a hook attached records from an unrelated model.\n  if (!meta) return\n  const nextVisited = new Set(visited)\n  nextVisited.add(model)\n\n  for (const [propertyKey, prop] of Object.entries(meta.properties)) {\n    // Fork by property kind: scalar (column / computed) vs. relation.\n    if (prop.kind === 'column' || prop.kind === 'computedAccessor') {\n      const serializeAs = (prop.lucidDefinitions as { serializeAs?: string | null } | undefined)\n        ?.serializeAs\n      // serializeAs: null means Lucid hides this column from toJSON() — it\n      // won't appear in the response, so there's nothing to coerce.\n      if (serializeAs === null) continue\n      const jsonKey = serializeAs || propertyKey\n      // Column may be declared on the model but dropped from this specific\n      // response (e.g. $select, visibility policy) — skip if absent.\n      if (!(jsonKey in entity)) continue\n      // Only Edm.Int64 / Edm.Decimal can exceed IEEE 754 safe range. Smaller\n      // integer types and booleans ride JSON numbers without precision risk,\n      // so the IEEE754Compatible parameter doesn't change their wire form.\n      if (!isIeee754CompatibleRelevantType(prop.definition.type)) continue\n      coerceNumericField(entity, jsonKey, ieee754Compatible)\n      continue\n    }\n    if (prop.kind !== 'relationship') continue\n    // Relation absent from the data means the client didn't $expand it —\n    // no nested records to walk, nothing to coerce.\n    if (!(propertyKey in entity)) continue\n    const nested = entity[propertyKey]\n    if (nested === null || nested === undefined) continue\n    let relatedModel: ResourcefulModel | null = null\n    try {\n      const related = prop.relatedModel()\n      if (isResourcefulModel(related)) relatedModel = related\n    } catch {\n      // Relation resolution may fail for unregistered models — safe to skip.\n    }\n    if (!relatedModel) continue\n    // Array vs. single object reflects the relation cardinality (hasMany /\n    // manyToMany produce arrays; hasOne / belongsTo produce single objects).\n    // Recurse with the related model's meta so each nested level is coerced\n    // against its own column definitions.\n    if (Array.isArray(nested)) {\n      for (const item of nested) {\n        if (item && typeof item === 'object') {\n          coerceEntityForIeee754(\n            item as Record<string, unknown>,\n            relatedModel,\n            ieee754Compatible,\n            metaCache,\n            nextVisited\n          )\n        }\n      }\n      continue\n    }\n    if (typeof nested === 'object') {\n      coerceEntityForIeee754(\n        nested as Record<string, unknown>,\n        relatedModel,\n        ieee754Compatible,\n        metaCache,\n        nextVisited\n      )\n    }\n  }\n}\n\n/**\n * Shapes `respond()` can be asked to serialize. Entity bodies are plain\n * dictionaries (after `toJSON()`); collections are arrays of those. Primitive\n * bodies cover `$count` and other raw text responses; `undefined` covers\n * 204/304 and minimal-preference updates.\n */\ntype RespondEntityBody = Record<string, unknown>\ntype RespondBody = undefined | number | RespondEntityBody | RespondEntityBody[]\n\n/**\n * Arguments for `respond()`.\n *\n * @property status HTTP status code of the response.\n * @property body Payload to serialize — a single entity, a collection of\n *   entities, a primitive (e.g. `$count`), or `undefined` for empty bodies\n *   (204/304, minimal-preference updates).\n * @property metadata OData `@odata.*` annotations for the response envelope\n *   (context, count, nextLink, id, etag, etc.).\n * @property model Optional. The resourceful model describing the entity\n *   shape of `body`. Drives the IEEE754 coercion pass — Edm.Int64 /\n *   Edm.Decimal detection and `$expand` recursion into related models. Omit\n *   when `body` isn't entity-shaped — 204/304 responses, error envelopes,\n *   raw `$count` numbers — since there's nothing for the coercion pass to\n *   walk.\n * @property isArray Optional. Marks `body` as a collection so it's serialized\n *   into an OData feed (`value: [...]` / `<feed>`) instead of a single\n *   entry. Omit when there's no body (204/304) or the body is a primitive —\n *   there's no ambiguity in those cases. Defaults to `Array.isArray(body)`.\n * @property headers Optional. Request-level response headers to merge on\n *   top of macro-level and controller-level defaults.\n * @property raw Optional. When `true`, serializes `String(body)` as\n *   `text/plain` and skips OData envelope construction — used for `$count`\n *   endpoints that must return a bare number per the spec.\n */\ninterface RespondOptions {\n  status: number\n  body: RespondBody\n  metadata: ODataMetadata\n  model?: ResourcefulModel\n  isArray?: boolean\n  headers?: { [key: string]: string }\n  raw?: boolean\n}\n\ninterface ModelRelationshipSyncPayload {\n  ruids: Array<string | number>\n}\n\nconst modelRelationshipSyncPayloadSchema = joi.object<ModelRelationshipSyncPayload>({\n  ruids: joi\n    .array()\n    .items(joi.alternatives().try(joi.string().required(), joi.number().integer().required()))\n    .required(),\n})\n\nexport type ResourcefulModelControllerHooks = {\n  index: [\n    [ResourcefulIndexResponse, HttpContext],\n    [error: Error | null, ResourcefulIndexResponse, HttpContext],\n  ]\n  create: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n  read: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n  readRelated: [\n    [ResourcefulIndexResponse, HttpContext],\n    [error: Error | null, ResourcefulIndexResponse, HttpContext],\n  ]\n  update: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n}\n\nexport type ODataEntityUidAndRelationshipInformation = {\n  uid: string | undefined\n  relationship: string | undefined\n  isCountRequest: boolean\n}\n\ntype MiddlewareFn = (ctx: HttpContext, next: NextFn) => void | Promise<void>\n\nexport class ResourcefulModelController {\n  readonly #subpath: string\n  readonly #model: Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>\n  readonly #options: ResourcefulRouterModelServiceOptionsService\n  readonly #headers: {\n    [key: string]: string\n  }\n  readonly #mutators: Hooks<ResourcefulModelControllerHooks>\n  readonly #scopeRestrictors: ResourcefulQueryScopeCallback[]\n  readonly #payloadRestrictors: ResourcefulPayloadSchemaGetter[]\n  readonly #operations: Map<string, RouteCallback | AdditionalResourcefulRouteDetails>\n  get options() {\n    return this.#options\n  }\n\n  constructor(\n    subpath: string,\n    model: Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>,\n    options: ResourcefulRouterModelServiceOptionsService,\n    headers: {\n      [key: string]: string\n    },\n    groupResourcefulQueryScopeCallbacks?: ResourcefulQueryScopeCallback[],\n    groupResourcefulPayloadSchemaGetters?: ResourcefulPayloadSchemaGetter[],\n    groupResourcefulRouterMutatorOptions?: ResourcefulRouterMutatorOptions,\n    groupResourcefulPolicies?: ResourcefulPolicy[]\n  ) {\n    this.#subpath = subpath\n    this.#model = model\n    this.#options = options\n    this.#headers = headers\n    this.#mutators = new Hooks<ResourcefulModelControllerHooks>()\n    this.#scopeRestrictors = [\n      ...(groupResourcefulQueryScopeCallbacks || []),\n      ...(this.#options.scopeRestrictors || []),\n    ]\n    this.#payloadRestrictors = [\n      ...(groupResourcefulPayloadSchemaGetters || []),\n      ...(this.#options.payloadRestrictors || []),\n    ]\n    if (isObject(groupResourcefulRouterMutatorOptions)) {\n      if (\n        'index' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.index)\n      ) {\n        groupResourcefulRouterMutatorOptions.index.forEach((hook) => {\n          this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n        })\n      }\n      if (\n        'create' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.create)\n      ) {\n        groupResourcefulRouterMutatorOptions.create.forEach((hook) => {\n          this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'read' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.read)\n      ) {\n        groupResourcefulRouterMutatorOptions.read.forEach((hook) => {\n          this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'readRelated' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.readRelated)\n      ) {\n        groupResourcefulRouterMutatorOptions.readRelated.forEach((hook) => {\n          this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'update' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.update)\n      ) {\n        groupResourcefulRouterMutatorOptions.update.forEach((hook) => {\n          this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n    }\n    if (isObject(this.#options.mutators)) {\n      if ('index' in this.#options.mutators && isArray(this.#options.mutators.index)) {\n        this.#options.mutators.index.forEach((hook) => {\n          this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n        })\n      }\n      if ('create' in this.#options.mutators && isArray(this.#options.mutators.create)) {\n        this.#options.mutators.create.forEach((hook) => {\n          this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('read' in this.#options.mutators && isArray(this.#options.mutators.read)) {\n        this.#options.mutators.read.forEach((hook) => {\n          this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('readRelated' in this.#options.mutators && isArray(this.#options.mutators.readRelated)) {\n        this.#options.mutators.readRelated.forEach((hook) => {\n          this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('update' in this.#options.mutators && isArray(this.#options.mutators.update)) {\n        this.#options.mutators.update.forEach((hook) => {\n          this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n    }\n    if (groupResourcefulPolicies) {\n      groupResourcefulPolicies.forEach((policy) => {\n        if (policy.scope) {\n          this.#scopeRestrictors.push(policy.scope)\n        }\n        if (policy.payload) {\n          this.#payloadRestrictors.push(policy.payload)\n        }\n        if (isObject(policy.mutators)) {\n          if ('index' in policy.mutators && isArray(policy.mutators.index)) {\n            policy.mutators.index.forEach((hook) => {\n              this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n            })\n          }\n          if ('create' in policy.mutators && isArray(policy.mutators.create)) {\n            policy.mutators.create.forEach((hook) => {\n              this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('read' in policy.mutators && isArray(policy.mutators.read)) {\n            policy.mutators.read.forEach((hook) => {\n              this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('readRelated' in policy.mutators && isArray(policy.mutators.readRelated)) {\n            policy.mutators.readRelated.forEach((hook) => {\n              this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('update' in policy.mutators && isArray(policy.mutators.update)) {\n            policy.mutators.update.forEach((hook) => {\n              this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n        }\n      })\n    }\n    this.#operations = new Map<string, RouteCallback | AdditionalResourcefulRouteDetails>()\n  }\n\n  static async getResourcefulModelCreatePayloadValidationSchema(\n    model: ResourcefulModel,\n    ctx: HttpContext,\n    app: ApplicationService\n  ) {\n    const schemas: AnySchema[] = []\n    await pMap(\n      model.$resourcefulPayloadValidationSchemaBuilders.create,\n      async (builder) => {\n        const schema = await builder(ctx, app)\n        if (schema) {\n          schemas.push(schema)\n        }\n      },\n      { concurrency: 1 }\n    )\n    let ret = joi.any()\n    schemas.forEach((schema) => {\n      ret = ret.concat(schema)\n    })\n    return ret\n  }\n\n  async #getWriteValidationSchema(\n    ctx: HttpContext,\n    model: ResourcefulModel,\n    app: ApplicationService,\n    forUpdate: boolean = false\n  ) {\n    const schema = await model.$asOpenApiSchemaObject(ctx, app, 'write')\n    const asResourceful = await model.$getAsResourcefulForContext(ctx, app)\n    const modelJoiSchema =\n      await ResourcefulModelController.getResourcefulModelCreatePayloadValidationSchema(\n        model,\n        ctx,\n        app\n      )\n    return joi.object(\n      Object.assign(\n        {},\n        ...Object.keys(schema.properties!)\n          .filter((p) => p !== model.primaryKey)\n          .map((creatablePropertyKey) => {\n            const required =\n              !forUpdate &&\n              Array.isArray(schema.required) &&\n              schema.required.includes(creatablePropertyKey)\n            const returnable = {\n              [creatablePropertyKey]: joi.any(),\n            }\n            const prop = asResourceful.properties[creatablePropertyKey]\n            if (prop) {\n              const validator = prop.validator\n              if (validator) {\n                returnable[creatablePropertyKey] = validator\n              }\n            }\n            try {\n              const extracted = modelJoiSchema.extract(creatablePropertyKey)\n              if (extracted) {\n                returnable[creatablePropertyKey] = returnable[creatablePropertyKey]\n                  ? returnable[creatablePropertyKey].concat(extracted)\n                  : extracted\n              }\n            } catch {\n              // noop\n            }\n            if (required) {\n              returnable[creatablePropertyKey] = returnable[creatablePropertyKey].concat(\n                joi.any().required()\n              )\n            } else {\n              returnable[creatablePropertyKey] = returnable[creatablePropertyKey].concat(\n                joi.any().optional()\n              )\n            }\n            return returnable\n          })\n      )\n    )\n  }\n\n  async getODataContextUrl(fragment: string) {\n    const odataContext = await useODataContext()\n    let base = odataContext.serviceBaseUrl\n    if (!base.endsWith('/')) {\n      base += '/'\n    }\n    const parts = [base, '$metadata', '#', fragment]\n    return parts.join('')\n  }\n\n  async resolveFullUrl(relative: string, ...more: string[]) {\n    const odataContext = await useODataContext()\n    let base = odataContext.serviceBaseUrl\n    if (!base.endsWith('/')) {\n      base += '/'\n    }\n    const parts = [base, relative, ...more]\n    return parts.join('/')\n  }\n\n  async resolveBaseRequirements() {\n    const [model, { default: app }] = await Promise.all([\n      this.#model,\n      import('@adonisjs/core/services/app'),\n    ])\n    return { model, app }\n  }\n\n  resolveUrlResource(ctx: HttpContext) {\n    const star = ctx.params['*']\n    let resource = Array.isArray(star)\n      ? `/${star.join('/')}`\n      : typeof star === 'string'\n        ? star.startsWith('/')\n          ? star\n          : `/${star}`\n        : '/'\n    resource = resource.replace(/\\/{2,}/g, '/')\n    return resource\n  }\n\n  async resolveRequestRequirements(ctx: HttpContext) {\n    const { model, app } = await this.resolveBaseRequirements()\n    const serveAs = negotiateContent(ctx)\n    const metadataLevel = negotiateMetadata(ctx)\n    const preference = negotiatePreference(ctx)\n    const ieee754Compatible = negotiateIeee754Compatible(ctx)\n    const method = ctx.request.method() || 'GET'\n    const url = ctx.request.url() || '/'\n    if (model instanceof E_UNRESOLVABLE_MODEL) {\n      throw new E_ROUTE_NOT_FOUND([method, url])\n    }\n    // Pre-warm a per-request cache of resourceful meta schemas for the root\n    // model and every reachable related model. The respond() coercion pass\n    // walks the data guided by each entity's own model meta (for Edm.Int64 /\n    // Edm.Decimal detection and $expand recursion), and this keeps that walk\n    // synchronous.\n    let metaCache: ResourcefulModelMetaCache = new Map()\n    if (isResourcefulModel(model)) {\n      try {\n        metaCache = await buildModelMetaCache(model, ctx, app)\n      } catch {\n        metaCache = new Map()\n      }\n    }\n\n    const respond = (options: RespondOptions) => {\n      const {\n        status,\n        body,\n        metadata,\n        model: coercionModel,\n        isArray: isCollection,\n        headers = {},\n        raw = false,\n      } = options\n\n      ctx.response.status(status)\n      // apply macro-level headers\n      Object.entries(this.#headers).forEach(([key, value]) => ctx.response.header(key, value))\n      // apply controller-level headers\n      Object.entries(this.#options.headers).forEach(([key, value]) =>\n        ctx.response.header(key, value)\n      )\n      // apply request-level headers\n      Object.entries(headers).forEach(([key, value]) => ctx.response.header(key, value))\n      // apply OData headers\n      if (!ctx.response.getHeader('OData-Version')) {\n        ctx.response.header('OData-Version', '4.0')\n      }\n      if (metadata.etag) {\n        ctx.response.header('ETag', metadata.etag)\n      }\n      // Handle empty/no-content responses\n      if (status === 204 || status === 304 || body === null || typeof body === 'undefined') {\n        ctx.response.send(null)\n        return\n      }\n      if (raw) {\n        ctx.response.header('Content-Type', `text/plain`)\n        ctx.response.send(String(body))\n        return\n      }\n      // apply content-type headers\n      switch (serveAs) {\n        case 'xml': {\n          const typeParam = isCollection ? 'feed' : 'entry'\n          ctx.response.header(\n            'Content-Type',\n            `application/atom+xml;type=${typeParam};odata.metadata=${metadataLevel}`\n          )\n          break\n        }\n        default: {\n          // Per OData JSON §3.2, the server MUST NOT advertise a\n          // `IEEE754Compatible` parameter it does not actually honor in the\n          // payload. Emitting `=true` while writing numeric `Edm.Int64` /\n          // `Edm.Decimal` values is what triggers Power BI's\n          // `DataSource.Error: Cannot convert a value to target type\n          // 'Edm.Int64' because of conflict between input format\n          // string/number and parameter 'IEEE754Compatible' false/true`.\n          // We advertise the parameter that matches the value we're actually\n          // going to serialize, based on the client's negotiation.\n          ctx.response.header(\n            'Content-Type',\n            `application/json;odata.metadata=${metadataLevel};IEEE754Compatible=${\n              ieee754Compatible ? 'true' : 'false'\n            }`\n          )\n          break\n        }\n      }\n\n      const include = (name: keyof ODataMetadata) => {\n        if (serveAs === 'xml') return true\n        if (metadataLevel === 'none') return false\n        if (metadataLevel === 'minimal') {\n          return ['context', 'count', 'nextLink', 'deltaLink', 'id', 'etag'].includes(name)\n        }\n        return true // full\n      }\n\n      // IEEE754 coercion helper — walks the JSON entity using the target\n      // model's meta to decide which fields need stringifying/unstringifying,\n      // and recurses into $expand-ed relations using their own model meta.\n      const applyIeee754Coercion = (jsonEntity: unknown): void => {\n        if (!coercionModel) return\n        if (!jsonEntity || typeof jsonEntity !== 'object' || Array.isArray(jsonEntity)) return\n\n        coerceEntityForIeee754(\n          jsonEntity as Record<string, unknown>,\n          coercionModel,\n          ieee754Compatible,\n          metaCache\n        )\n      }\n\n      // JSON\n      if (serveAs !== 'xml') {\n        if (isCollection) {\n          const records = body as RespondEntityBody[]\n          const value = records.map((item) => {\n            const jsonEntity = toJsonEntity(item)\n            applyIeee754Coercion(jsonEntity)\n            return jsonEntity\n          })\n          const payload: Record<string, any> = stripUndefinedValuesFromObject({\n            // Annotations\n            ['@odata.context']: include('context') ? metadata.context : undefined,\n            ['@odata.count']: include('count') ? metadata.count : undefined,\n            ['@odata.nextLink']: include('nextLink') ? metadata.nextLink : undefined,\n            ['@odata.deltaLink']: include('deltaLink') ? metadata.deltaLink : undefined,\n            // Data\n            value,\n          })\n          ctx.response.send(JSON.stringify(payload, encoder))\n          return\n        }\n\n        // Single entity or primitive\n        const entity = toJsonEntity(body)\n        if (isObject(entity)) {\n          applyIeee754Coercion(entity)\n          const payload: Record<string, any> = stripUndefinedValuesFromObject({\n            ['@odata.context']: include('context') ? metadata.context : undefined,\n            ['@odata.id']:\n              include('id') && metadata.id !== undefined ? String(metadata.id) : undefined,\n            ['@odata.etag']: include('etag') ? metadata.etag : undefined,\n            ['@odata.readLink']: include('readLink') ? metadata.readLink : undefined,\n            ['@odata.editLink']: include('editLink') ? metadata.editLink : undefined,\n            ['@odata.type']: include('type') ? metadata.type : undefined,\n            ['@odata.mediaReadLink']: include('mediaReadLink') ? metadata.mediaReadLink : undefined,\n            ['@odata.mediaEditLink']: include('mediaEditLink') ? metadata.mediaEditLink : undefined,\n            ['@odata.mediaContentType']: include('mediaContentType')\n              ? metadata.mediaContentType\n              : undefined,\n            ['@odata.mediaEtag']: include('mediaEtag') ? metadata.mediaEtag : undefined,\n            ...entity,\n          })\n          ctx.response.send(JSON.stringify(payload, encoder))\n          return\n        } else {\n          // Primitive value\n          const payload: Record<string, any> = stripUndefinedValuesFromObject({\n            ['@odata.context']: include('context') ? metadata.context : undefined,\n            value: entity,\n          })\n          ctx.response.send(JSON.stringify(payload, encoder))\n          return\n        }\n      }\n\n      // XML (Atom)\n      const atomNs = 'http://www.w3.org/2005/Atom'\n      const mNs = 'http://docs.oasis-open.org/odata/ns/metadata'\n      const dNs = 'http://docs.oasis-open.org/odata/ns/data'\n\n      const buildEntry = (entity: any, meta: ODataMetadata): ElementCompact => {\n        const obj = toJsonEntity(entity) as any\n        const entryAttrs: Record<string, any> = stripUndefinedValuesFromObject({\n          'metadata:context': include('context') ? meta.context : undefined,\n          'metadata:etag': include('etag') ? meta.etag : undefined,\n        })\n\n        const entryNode: ElementCompact = {\n          entry: {\n            _attributes: {\n              'xmlns': atomNs,\n              'xmlns:metadata': mNs,\n              'xmlns:data': dNs,\n              ...entryAttrs,\n            },\n            // Optional Atom children (gated by metadata level)\n            ...(include('id') && meta.id !== undefined ? { id: { _text: String(meta.id) } } : {}),\n            ...(include('readLink') && meta.readLink\n              ? { link: [{ _attributes: { rel: 'self', href: meta.readLink } }] }\n              : {}),\n            ...(include('editLink') && meta.editLink\n              ? {\n                  link: [\n                    ...(meta.readLink\n                      ? [{ _attributes: { rel: 'self', href: meta.readLink } }]\n                      : []),\n                    { _attributes: { rel: 'edit', href: meta.editLink } },\n                  ],\n                }\n              : {}),\n            content: {\n              _attributes: { type: 'application/xml' },\n              ...elementCompactFromResourcefulModelRecord(obj),\n            },\n          },\n        }\n        return entryNode.entry as ElementCompact\n      }\n\n      if (isCollection) {\n        const feedAttrs: Record<string, any> = stripUndefinedValuesFromObject({\n          'metadata:context': include('context') ? metadata.context : undefined,\n        })\n\n        const linkNext =\n          include('nextLink') && metadata.nextLink\n            ? [\n                {\n                  _attributes: { rel: 'next', href: metadata.nextLink },\n                },\n              ]\n            : undefined\n\n        const feedDoc: ElementCompact = {\n          _declaration: { _attributes: { version: '1.0', encoding: 'utf-8' } },\n          feed: stripUndefinedValuesFromObject({\n            _attributes: {\n              'xmlns': atomNs,\n              'xmlns:metadata': mNs,\n              'xmlns:data': dNs,\n              ...feedAttrs,\n            },\n            ...(include('count') && typeof metadata.count === 'number'\n              ? { 'metadata:count': { _text: String(metadata.count) } }\n              : {}),\n            ...(linkNext ? { link: linkNext } : {}),\n            entry: (body as RespondEntityBody[]).map((item) => buildEntry(item, metadata)),\n          }) as any,\n        }\n\n        const xml = js2xml(feedDoc, { compact: true })\n        ctx.response.send(xml)\n        return\n      }\n\n      const entryDoc: ElementCompact = {\n        _declaration: { _attributes: { version: '1.0', encoding: 'utf-8' } },\n        ...(() => {\n          const entry = buildEntry(body, metadata)\n          return { entry }\n        })(),\n      }\n      const xml = js2xml(entryDoc, { compact: true })\n      ctx.response.send(xml)\n    }\n    const query = ctx.request.qs()\n\n    const requestedFormat =\n      typeof query['$format'] === 'string' ? query['$format'].trim() : undefined\n    if (requestedFormat && !requestedFormat.includes('json') && !requestedFormat.includes('xml')) {\n      throw new E_UNACCEPTABLE_FORMAT(requestedFormat)\n    }\n\n    // Validate Accept header per OData §7. Allow standard JSON/XML types plus\n    // vendor/structured suffixes (e.g. application/vnd.odata+json, application/*+json)\n    // to avoid rejecting legitimate non-Power-BI clients.\n    const accept = String(ctx.request.header('accept') || '').toLowerCase()\n    if (\n      accept &&\n      !accept.includes('*/*') &&\n      !accept.includes('application/json') &&\n      !accept.includes('application/xml') &&\n      !accept.includes('text/xml') &&\n      !accept.includes('+json') &&\n      !accept.includes('+xml')\n    ) {\n      throw new E_UNACCEPTABLE_FORMAT(accept)\n    }\n\n    const allowedSystemOptions = new Set([\n      '$top',\n      '$skip',\n      '$count',\n      '$orderby',\n      '$select',\n      '$filter',\n      '$expand',\n      '$format',\n      '$search',\n    ])\n    for (const key of Object.keys(query)) {\n      if (key.startsWith('$') && !allowedSystemOptions.has(key)) {\n        throw new Exception(`Unsupported OData system query option: ${key}`, {\n          status: 400,\n          code: 'E_ODATA_UNSUPPORTED_SYSTEM_QUERY_OPTION',\n        })\n      }\n    }\n\n    const { valid: rawSelections, isFullSet } = await sanitizeSelect(query, model, ctx, app)\n    const selections = Array.isArray(rawSelections) ? [...rawSelections] : rawSelections\n    const expansions = await sanitizeExpand(query)\n    if (Array.isArray(expansions) && expansions.length > 0) {\n      const readSchema = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n      const possible =\n        !isObject(readSchema) || !('properties' in readSchema) || !isObject(readSchema.properties)\n          ? []\n          : Object.keys(readSchema.properties)\n      const possibleMap = new Map(possible.map((k) => [k.toLowerCase(), k]))\n      const relationshipMap = new Map(\n        Array.from(model.$resourcefulRelationships.keys()).map((k) => [k.toLowerCase(), k])\n      )\n\n      const unsupported: string[] = []\n      const resolvedExpansions: string[] = []\n      for (const expansion of expansions) {\n        const lcExpansion = expansion.toLowerCase()\n        const resolved = relationshipMap.get(lcExpansion) || possibleMap.get(lcExpansion)\n        if (!resolved) {\n          unsupported.push(expansion)\n          continue\n        }\n        resolvedExpansions.push(resolved)\n      }\n      if (unsupported.length > 0) {\n        throw new E_EXPAND_NOT_IMPLEMENTED(model.$resourcefulName, unsupported)\n      }\n      if (Array.isArray(selections)) {\n        for (const expansion of expansions) {\n          if (!selections.includes(expansion)) {\n            selections.push(expansion)\n          }\n        }\n        for (const expansion of resolvedExpansions) {\n          if (!selections.includes(expansion)) {\n            selections.push(expansion)\n          }\n        }\n      }\n    }\n    return {\n      model,\n      app,\n      prefix: this.#subpath,\n      serveAs,\n      method,\n      url,\n      resource: this.resolveUrlResource(ctx),\n      query,\n      selections,\n      isFullSet,\n      metadataLevel,\n      preference,\n      respond,\n    }\n  }\n\n  #parseInstanceUidFromResourceFragment(resource: string) {\n    const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n    // normalize subpath to start with a single \"/\" and have no trailing \"/\"\n    const sub = (() => {\n      let s = this.#subpath || ''\n      s = s.replace(/\\/{2,}/g, '/').replace(/\\/+$/, '')\n      if (!s.startsWith('/')) s = `/${s}`\n      return s\n    })()\n    // match: ^/<subpath>(<key>) then end or next segment\n    const pattern = new RegExp(`^${esc(sub)}\\\\(([^)]*)\\\\)(?:$|\\\\/)`)\n    const match = resource.match(pattern)\n    if (match && match[1] !== undefined) {\n      let v = match[1]\n      if ((v.startsWith(\"'\") && v.endsWith(\"'\")) || (v.startsWith('\"') && v.endsWith('\"'))) {\n        v = v.slice(1, -1)\n        if (v.includes(\"''\")) v = v.replace(/''/g, \"'\")\n      }\n      return v\n    }\n    return undefined\n  }\n\n  #parseInstanceUidAndRelationshipNameFromResourceFragment(\n    resource: string\n  ): ODataEntityUidAndRelationshipInformation {\n    const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n    // normalize subpath to start with a single \"/\" and have no trailing \"/\"\n    const sub = (() => {\n      let s = this.#subpath || ''\n      s = s.replace(/\\/{2,}/g, '/').replace(/\\/+$/, '')\n      if (!s.startsWith('/')) s = `/${s}`\n      return s\n    })()\n\n    // match: ^/<subpath>(<key>)/<relationship> with optional /$count\n    const pattern = new RegExp(`^${esc(sub)}\\\\(([^)]*)\\\\)\\\\/([^\\\\/]+)(?:\\\\/\\\\$count)?$`)\n    const match = resource.match(pattern)\n\n    if (match && match[1] !== undefined && match[2] !== undefined) {\n      // Extract and clean the UID\n      let uid = match[1]\n      if (\n        (uid.startsWith(\"'\") && uid.endsWith(\"'\")) ||\n        (uid.startsWith('\"') && uid.endsWith('\"'))\n      ) {\n        uid = uid.slice(1, -1)\n        if (uid.includes(\"''\")) uid = uid.replace(/''/g, \"'\")\n      }\n\n      // Extract relationship name\n      const relationship = match[2]\n\n      // Check if it's a count request\n      const isCountRequest = resource.endsWith('/$count')\n\n      return {\n        uid,\n        relationship,\n        isCountRequest,\n      }\n    }\n\n    // Return undefined values if pattern doesn't match\n    return {\n      uid: undefined,\n      relationship: undefined,\n      isCountRequest: false,\n    }\n  }\n\n  #parseODataMetadataIdFromResourceFragment(resource: string) {\n    while (resource.startsWith('/')) {\n      resource = resource.slice(1)\n    }\n    return resource\n  }\n\n  #makeSelectionSubsetForContextUrl(\n    selections: string[] | undefined,\n    isFullSet: boolean,\n    model: ResourcefulModel\n  ): string {\n    if (isFullSet) {\n      return ''\n    }\n    const props = [model.primaryKey]\n    if (Array.isArray(selections)) {\n      props.push(...selections.filter((s) => s !== model.primaryKey))\n    }\n    return `(${props.join(',')})`\n  }\n\n  #entityEtag(record: any): string | undefined {\n    if (!record || typeof record !== 'object') {\n      return undefined\n    }\n    const basis = record.updatedAt || record.createdAt || record.id\n    if (!basis) {\n      return undefined\n    }\n    return `W/\"${String(basis)}\"`\n  }\n\n  #normalizeEtag(value: string): string {\n    return value.trim().replace(/^W\\//i, '')\n  }\n\n  async #serveModelRead(ctx: HttpContext) {\n    console.log('ResourcefulModelController##serveModelRead')\n    const { resource, model, app, respond, selections, preference } =\n      await this.resolveRequestRequirements(ctx)\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulRead(\n      id,\n      ctx,\n      app,\n      this.#scopeRestrictors\n    )\n    const runner = this.#mutators.runner('read')\n    await runner.run(ret, ctx)\n    const metadataId = this.#parseODataMetadataIdFromResourceFragment(resource)\n    const etag = this.#entityEtag(ret)\n\n    const ifNoneMatch = ctx.request.header('if-none-match')\n    if (etag && typeof ifNoneMatch === 'string') {\n      const values = ifNoneMatch\n        .split(',')\n        .map((v) => v.trim())\n        .filter((v) => v.length > 0)\n      const current = this.#normalizeEtag(etag)\n      const matched = values.some((v) => v === '*' || this.#normalizeEtag(v) === current)\n      if (matched) {\n        return respond({\n          status: 304,\n          body: undefined,\n          metadata: {\n            context: await this.getODataContextUrl(`${this.#subpath}/$entity`),\n            etag,\n          },\n        })\n      }\n    }\n\n    const metadata: ODataMetadata = {\n      context: await this.getODataContextUrl(\n        `${this.#subpath}${this.#makeSelectionSubsetForContextUrl(selections, 'undefined' === typeof selections, model)}/$entity`\n      ),\n      id: await this.resolveFullUrl(metadataId),\n      readLink: metadataId,\n      editLink: metadataId,\n      etag,\n    }\n    return respond({\n      status: 200,\n      body: santizeResponsePayload(ret, selections, preference),\n      metadata,\n      model,\n      isArray: false,\n    })\n  }\n\n  async #serveModelUpdate(ctx: HttpContext) {\n    const { resource, model, app, respond, selections, preference } =\n      await this.resolveRequestRequirements(ctx)\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const schema = await this.#getWriteValidationSchema(ctx, model, app, true)\n    const { error, value: validated } = schema.validate(\n      stripUndefinedValuesFromObject({\n        ...ctx.request.all(),\n        [model.primaryKey]: undefined,\n      }),\n      {\n        abortEarly: false,\n        convert: true,\n      }\n    )\n    if (error) {\n      throw normalizeError(error)\n    }\n    try {\n      const existing = await model.$onResourcefulRead(id, ctx, app, this.#scopeRestrictors)\n      const existingEtag = this.#entityEtag(existing)\n      const ifMatch = ctx.request.header('if-match')\n      if (existingEtag && typeof ifMatch === 'string' && ifMatch.trim() !== '*') {\n        const requested = ifMatch\n          .split(',')\n          .map((v) => v.trim())\n          .filter((v) => v.length > 0)\n        const current = this.#normalizeEtag(existingEtag)\n        const matched = requested.some((v) => this.#normalizeEtag(v) === current)\n        if (!matched) {\n          return respond({\n            status: 412,\n            body: {\n              error: {\n                code: 'E_PRECONDITION_FAILED',\n                message: 'If-Match precondition failed',\n              },\n            },\n            metadata: {\n              context: await this.getODataContextUrl(`${this.#subpath}/$entity`),\n              etag: existingEtag,\n            },\n          })\n        }\n      }\n\n      const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulUpdate(\n        id,\n        validated,\n        ctx,\n        app,\n        {\n          queryScopeCallbacks: this.#scopeRestrictors,\n          payloadValidationSchemas: this.#payloadRestrictors,\n        }\n      )\n      const runner = this.#mutators.runner('update')\n      await runner.run(ret, ctx)\n      const metadataId = this.#parseODataMetadataIdFromResourceFragment(resource)\n      const metadata: ODataMetadata = {\n        context: await this.getODataContextUrl(\n          `${this.#subpath}${this.#makeSelectionSubsetForContextUrl(selections, 'undefined' === typeof selections, model)}/$entity`\n        ),\n        id: await this.resolveFullUrl(metadataId),\n        readLink: metadataId,\n        editLink: metadataId,\n        etag: this.#entityEtag(ret),\n      }\n      if (preference === 'minimal') {\n        return respond({\n          status: 204,\n          body: undefined,\n          metadata,\n          headers: { 'Preference-Applied': 'return=minimal' },\n        })\n      }\n      return respond({\n        status: 200,\n        body: santizeResponsePayload(ret, selections, preference),\n        metadata,\n        model,\n        isArray: false,\n        headers: { 'Preference-Applied': 'return=representation' },\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  async #serveModelDelete(ctx: HttpContext) {\n    const { resource, model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    try {\n      await model.$onResourcefulDelete(id, ctx, app, this.#scopeRestrictors)\n      return respond({\n        status: 204,\n        body: undefined,\n        metadata: {\n          context: await this.getODataContextUrl(`${this.#subpath}/$entity`),\n        },\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  async #serveModelCreate(ctx: HttpContext) {\n    const { model, app, respond, preference, selections } =\n      await this.resolveRequestRequirements(ctx)\n    const schema = await this.#getWriteValidationSchema(ctx, model, app)\n    const { error, value: validated } = schema.validate(ctx.request.all(), {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    try {\n      const ret: any = await model.$onResourcefulCreate(\n        validated,\n        ctx,\n        app,\n        this.#payloadRestrictors\n      )\n      const runner = this.#mutators.runner('create')\n      await runner.run(ret, ctx)\n      const resource = `/${this.#subpath}(${encodeURIComponent(String(ret[model.primaryKey]))})`\n      const metadataId = this.#parseODataMetadataIdFromResourceFragment(resource)\n      const metadata: ODataMetadata = {\n        context: await this.getODataContextUrl(`${this.#subpath}/$entity`),\n        id: await this.resolveFullUrl(metadataId),\n        readLink: metadataId,\n        editLink: metadataId,\n      }\n      return respond({\n        status: 201,\n        body: santizeResponsePayload(ret, selections, preference),\n        metadata,\n        model,\n        isArray: false,\n        headers: { Location: String(metadata.id!) },\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  async #serveModelReadRelated(ctx: HttpContext) {\n    const { resource, model, app, respond, preference, query } =\n      await this.resolveRequestRequirements(ctx)\n\n    let { uid, relationship, isCountRequest } =\n      this.#parseInstanceUidAndRelationshipNameFromResourceFragment(resource)\n\n    // Fallback parser for property raw-value endpoints: /EntitySet(id)/property/$value\n    // Supports numeric ids, GUIDs, and single-quoted string keys per OData URL conventions.\n    if (!uid || !relationship) {\n      const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n      const sub = (() => {\n        let s = this.#subpath || ''\n        s = s.replace(/\\/{2,}/g, '/').replace(/\\/+$/, '')\n        if (!s.startsWith('/')) s = `/${s}`\n        return s\n      })()\n      // Match keys in parentheses: numeric (123), GUID (xxx-xxx), or single-quoted strings ('foo')\n      const valueMatch = resource.match(\n        new RegExp(`^${esc(sub)}\\\\(([^)]*(?:'[^']*'[^)]*)?)\\\\)\\\\/([^\\\\/]+)\\\\/\\\\$value$`)\n      )\n      if (valueMatch && valueMatch[1] && valueMatch[2]) {\n        uid = valueMatch[1]\n        relationship = valueMatch[2]\n        isCountRequest = false\n      }\n    }\n\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n\n    // Resolve uid: strip single-quotes for string keys, parse numeric keys.\n    // Supports numeric ids, GUIDs, and single-quoted string keys per OData URL conventions.\n    let resolvedId: string | number\n    const strippedUid = uid.startsWith(\"'\") && uid.endsWith(\"'\") ? uid.slice(1, -1) : uid\n    if (/^-?\\d+$/.test(strippedUid)) {\n      const numId = Number(strippedUid)\n      if (!Number.isSafeInteger(numId)) {\n        throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n      }\n      resolvedId = numId\n    } else if (strippedUid.length > 0) {\n      // String or GUID key — pass through as-is\n      resolvedId = strippedUid\n    } else {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n\n    if (!relationship) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n\n    // Support primitive property raw value requests such as /Users(1)/username/$value.\n    const valueSuffix = `${relationship}/$value`\n    if (\n      resource.endsWith(`/${valueSuffix}`) &&\n      !model.$resourcefulRelationships.has(relationship)\n    ) {\n      let record: Record<string, unknown>\n      try {\n        record = (await model.$onResourcefulRead(\n          resolvedId as any,\n          ctx,\n          app,\n          this.#scopeRestrictors\n        )) as Record<string, unknown>\n      } catch {\n        // Key type mismatch or not found — surface as 404, not 500.\n        throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n      }\n      if (!(relationship in record)) {\n        throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n      }\n      const value = record[relationship]\n      ctx.response.header('Content-Type', 'text/plain; charset=utf-8')\n      return ctx.response.status(200).send(value === null ? '' : String(value))\n    }\n\n    const resourcefulRelationshipDefinition = model.$resourcefulRelationships.get(relationship)\n    if (!resourcefulRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const lucidRelationshipDefinition = model.$getRelation(relationship)\n    if (!lucidRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const relatedModel = resourcefulRelationshipDefinition.relatedModel()\n    if (!isResourcefulModel(relatedModel)) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const { valid: selections, isFullSet } = await sanitizeSelect(query, relatedModel, ctx, app)\n    const { filter, page, perPage, fields, sort, hooks, showCountMeta } =\n      this.#parseResourcefulIndexArguments(query, selections, resource, relatedModel)\n    const response = await model.$onResourcefulReadRelationship(\n      resolvedId as any,\n      relationship,\n      filter,\n      page,\n      perPage,\n      fields,\n      sort,\n      ctx,\n      app,\n      hooks\n    )\n    if (isCountRequest) {\n      return respond({\n        status: 200,\n        body: response.total,\n        metadata: {\n          context: '', // required for shape of ODataMetadata but not used in $count responses\n        },\n        raw: true,\n      })\n    }\n    const ret: ResourcefulIndexResponse = {\n      records: response.records,\n      total: response.total,\n      page: response.page,\n      perPage: response.perPage,\n      aggregations: response.aggregations,\n    }\n    const runner = this.#mutators.runner('readRelated')\n    await runner.run(ret, ctx)\n    const metadata: ODataMetadata = stripUndefinedValuesFromObject({\n      context: await this.getODataContextUrl(\n        `Collection(Default.${relatedModel.$resourcefulName})${this.#makeSelectionSubsetForContextUrl(selections, isFullSet, relatedModel)}`\n      ),\n      count: showCountMeta && !isCountRequest ? ret.total : undefined,\n      nextLink: this.#computeODataNextLink(ret.page, ret.perPage, ret.total, query, ctx),\n    })\n    return respond({\n      status: 200,\n      body: santizeResponsePayload(ret.records, selections, preference),\n      metadata,\n      model: relatedModel,\n      isArray: true,\n    })\n  }\n\n  #parseRelationshipFromSyncRelatedResourceFragment(resource: string, model: ResourcefulModel) {\n    const startOfActionName = resource.lastIndexOf('/Default.Sync')\n    if (startOfActionName === -1) {\n      return undefined\n    }\n    const resourceAction = resource.slice(startOfActionName + 1)\n    const toStrip = `Default.Sync${string.pascalCase([this.#subpath, 'related'].join(' '))}`\n    let relationshipName = resourceAction.replace(toStrip, '')\n    if (relationshipName.startsWith('/')) {\n      relationshipName = relationshipName.slice(1)\n    }\n    if (relationshipName.endsWith('/$ref')) {\n      relationshipName = relationshipName.slice(0, -5)\n    }\n    if (relationshipName.endsWith('/')) {\n      relationshipName = relationshipName.slice(0, -1)\n    }\n    if (!relationshipName) {\n      return undefined\n    }\n    const candidates = [relationshipName, string.camelCase(relationshipName)]\n    for (const candidate of candidates) {\n      const resourcefulRelationshipDefinition = model.$resourcefulRelationships.get(candidate)\n      if (!resourcefulRelationshipDefinition) {\n        continue\n      }\n      const lucidRelationshipDefinition = model.$getRelation(candidate)\n      if (!lucidRelationshipDefinition) {\n        continue\n      }\n      const relatedModel = resourcefulRelationshipDefinition.relatedModel()\n      if (!isResourcefulModel(relatedModel)) {\n        continue\n      }\n      return {\n        relationship: candidate,\n        relatedModel,\n        resourcefulRelationshipDefinition,\n        lucidRelationshipDefinition,\n      }\n    }\n    return undefined\n  }\n\n  async #serveModelSyncRelated(ctx: HttpContext) {\n    const { resource, model, respond } = await this.resolveRequestRequirements(ctx)\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const relInfo = this.#parseRelationshipFromSyncRelatedResourceFragment(resource, model)\n    if (!isObject(relInfo)) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const { relationship, lucidRelationshipDefinition, relatedModel } = relInfo\n    switch (lucidRelationshipDefinition.type) {\n      case 'hasOne':\n      case 'belongsTo':\n        throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n      case 'hasManyThrough':\n        throw new E_UNSYNCABLE_RELATIONSHIP_EXCEPTION()\n    }\n    const { error, value } = modelRelationshipSyncPayloadSchema.validate(ctx.request.all(), {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    const instance = await model.query().where(model.primaryKey, id).first()\n    if (!instance) {\n      throw new E_RECORD_NOT_FOUND_EXCEPTION()\n    }\n    const idsToInclude = value.ruids.map((ruid) => Number(ruid)) as number[]\n    if (lucidRelationshipDefinition.type === 'manyToMany') {\n      try {\n        // @ts-ignore\n        await instance.related(relationship).sync(idsToInclude)\n      } catch (e) {\n        throw normalizeError(e)\n      }\n    }\n    if (lucidRelationshipDefinition.type === 'hasMany') {\n      // in order to ensure that model hooks are run, we will load the relevant related models which need to be synced\n      // and then update them one by one\n      const foreignKey = (lucidRelationshipDefinition as any).options.foreignKey\n      if (!foreignKey) {\n        throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n          `HasMany relationship '${relationship}' missing foreignKey`\n        )\n      }\n      const [relatedModelInstancesEnclude, relatedModelInstancesToInclude] = await Promise.all([\n        // @ts-ignore\n        instance.related(relationship).query().whereNotIn(relatedModel.primaryKey, idsToInclude),\n        // @ts-ignore\n        relatedModel.query().whereIn(relatedModel.primaryKey, idsToInclude),\n      ])\n      const relatedModelInstancesEncludeResults = await pMap(\n        relatedModelInstancesEnclude as InstanceType<typeof relatedModel>[],\n        async (relatedInstance) => {\n          relatedInstance.merge({\n            [foreignKey]: null,\n          })\n          try {\n            await relatedInstance.save()\n          } catch (e) {\n            return e\n          }\n        },\n        { concurrency: 1, stopOnError: false }\n      )\n      const relatedModelInstancesEncludeResultsErr = relatedModelInstancesEncludeResults.filter(\n        (result) => 'undefined' !== typeof result\n      )\n      if (relatedModelInstancesEncludeResultsErr.length > 0) {\n        throw relatedModelInstancesEncludeResultsErr[0]\n      }\n      const relatedModelInstancesToIncludeResults = await pMap(\n        relatedModelInstancesToInclude as InstanceType<typeof relatedModel>[],\n        async (relatedInstance) => {\n          relatedInstance.merge({\n            [foreignKey]: instance.$getAttribute(model.primaryKey),\n          })\n          try {\n            await relatedInstance.save()\n          } catch (e) {\n            return e\n          }\n        },\n        { concurrency: 1, stopOnError: false }\n      )\n      const relatedModelInstancesToIncludeResultsErr = relatedModelInstancesToIncludeResults.filter(\n        (result) => 'undefined' !== typeof result\n      )\n      if (relatedModelInstancesToIncludeResultsErr.length > 0) {\n        throw relatedModelInstancesToIncludeResultsErr[0]\n      }\n    }\n    return respond({\n      status: 204,\n      body: undefined,\n      metadata: {\n        context: '', // required for shape of ODataMetadata but not used in sync responses\n      },\n    })\n  }\n\n  async #cacheOperations() {\n    if (\n      this.#operations.size > 0 ||\n      !isObject(this.#options.additional) ||\n      Object.keys(this.#options.additional).length === 0\n    )\n      return\n    const model = await this.#model\n    if (model instanceof E_UNRESOLVABLE_MODEL) {\n      return\n    }\n    if (isObject(this.#options.additional)) {\n      Object.entries(this.#options.additional).forEach(([methodAndPath, callback]) => {\n        const [method, path] = methodAndPath.split('|')\n        if (!method || !path) return\n        const opName = makeOpName(method, model.$resourcefulName, path)\n        this.#operations.set(opName, callback)\n      })\n    }\n  }\n\n  #parseOperationNameFromResourceFragment(resource: string) {\n    const pattern = /\\/Default\\.([^.\\/(]+)/\n    const match = resource.match(pattern)\n    if (match && match[1] !== undefined) {\n      return match[1]\n    }\n    return undefined\n  }\n\n  #getMutatedContext(ctx: HttpContext, params: Record<string, any>) {\n    const mutated: HttpContext = Object.create(ctx)\n    mutated.params = Object.freeze(params)\n    return Object.freeze(mutated)\n  }\n\n  async #processOperation(callback: RouteCallback, ctx: HttpContext) {\n    let next: ((ctx: HttpContext) => unknown | PromiseLike<unknown> | Promise<unknown>) | undefined\n    if (typeof callback === 'function') {\n      next = async (c) => await callback(c)\n    } else if (Array.isArray(callback) && callback.length === 2) {\n      const [maybeResolvableController, method] = callback\n      if (\n        method in maybeResolvableController &&\n        typeof maybeResolvableController[method] === 'function'\n      ) {\n        // @ts-ignore\n        next = async (c) => await maybeResolvableController[method](c)\n      } else {\n        // @ts-ignore\n        const resolvedController = maybeResolvableController()\n        if (typeof resolvedController[method] === 'function') {\n          next = async (c) => await resolvedController[method](c)\n        }\n      }\n    }\n    if (!next) return\n    await next(ctx)\n  }\n\n  async #processCallbackOrAdditionalResourcefulRouteDetails(\n    callback: RouteCallback | AdditionalResourcefulRouteDetails,\n    ctx: HttpContext\n  ) {\n    if (isAdditionalResourcefulRouteDetails(callback)) {\n      await this.#processOperation(callback.handler, ctx)\n    } else {\n      await this.#processOperation(callback, ctx)\n    }\n  }\n\n  async #serveModelFunction(ctx: HttpContext) {\n    const { resource } = await this.resolveRequestRequirements(ctx)\n    await this.#cacheOperations()\n    const opName = this.#parseOperationNameFromResourceFragment(resource)\n    if (!opName) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const callback = this.#operations.get(opName)\n    if ('undefined' === typeof callback) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const mutatedCtx = this.#getMutatedContext(ctx, {})\n    await this.#processCallbackOrAdditionalResourcefulRouteDetails(callback, mutatedCtx)\n  }\n\n  async #serveModelAction(ctx: HttpContext) {\n    const { resource } = await this.resolveRequestRequirements(ctx)\n    await this.#cacheOperations()\n    const opName = this.#parseOperationNameFromResourceFragment(resource)\n    if (!opName) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const callback = this.#operations.get(opName)\n    if ('undefined' === typeof callback) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const mutatedCtx = this.#getMutatedContext(ctx, {})\n    await this.#processCallbackOrAdditionalResourcefulRouteDetails(callback, mutatedCtx)\n  }\n\n  async #serveModelInstanceFunction(ctx: HttpContext) {\n    const { resource } = await this.resolveRequestRequirements(ctx)\n    await this.#cacheOperations()\n    const opName = this.#parseOperationNameFromResourceFragment(resource)\n    if (!opName) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const callback = this.#operations.get(opName)\n    if ('undefined' === typeof callback) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const mutatedCtx = this.#getMutatedContext(ctx, { uid: id })\n    await this.#processCallbackOrAdditionalResourcefulRouteDetails(callback, mutatedCtx)\n  }\n\n  async #serveModelInstanceAction(ctx: HttpContext) {\n    const { resource } = await this.resolveRequestRequirements(ctx)\n    await this.#cacheOperations()\n    const opName = this.#parseOperationNameFromResourceFragment(resource)\n    if (!opName) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const callback = this.#operations.get(opName)\n    if ('undefined' === typeof callback) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const mutatedCtx = this.#getMutatedContext(ctx, { uid: id })\n    await this.#processCallbackOrAdditionalResourcefulRouteDetails(callback, mutatedCtx)\n  }\n\n  #getPageAndPerPageFromTopAndSkip(query: Record<string, any>, isCountRequest: boolean) {\n    if (isCountRequest) {\n      return { page: 1, perPage: 1 }\n    }\n    const rawTop = isStringContent(query['$top']) ? query['$top'].trim() : '10'\n    const rawSkip = isStringContent(query['$skip']) ? query['$skip'].trim() : '0'\n    const parsedTop = Number.parseInt(rawTop, 10)\n    const parsedSkip = Number.parseInt(rawSkip, 10)\n    const top = Number.isSafeInteger(parsedTop) && parsedTop > 0 ? parsedTop : 10\n    const skip = Number.isSafeInteger(parsedSkip) && parsedSkip >= 0 ? parsedSkip : 0\n    const page = Math.floor(skip / top) + 1\n    const perPage = top > 100 ? 100 : top\n    return { page, perPage }\n  }\n\n  #getSortFromOrderBy($order: string | undefined) {\n    const ret: [string, 'asc' | 'desc'][] = []\n    if ('undefined' === typeof $order || !isStringContent($order)) {\n      return ret\n    }\n    const fragments = $order.split(',')\n    fragments.forEach((fragment) => {\n      const [field, dir] = fragment\n        .trim()\n        .split(/\\s+/)\n        .map((s) => s.trim()) as [string, string | undefined]\n      ret.push([field, dir === 'desc' ? 'desc' : 'asc'])\n    })\n    return ret\n  }\n\n  #getDialectFromModel(model: ResourcefulModel): Dialect {\n    const adapter = model.$adapter\n    const client = adapter.modelConstructorClient(model)\n    const clientDialect = client.dialect.name\n    switch (clientDialect) {\n      case 'postgres':\n      case 'redshift':\n        return 'postgres'\n      case 'mysql':\n        return 'mysql'\n      case 'sqlite3':\n      case 'better-sqlite3':\n        return 'sqlite'\n      case 'mssql':\n      case 'oracledb':\n      case 'libsql':\n      default:\n        throw new E_UNSUPPORTED_DATABASE_DIALECT(clientDialect || 'unknown')\n    }\n  }\n\n  #parseResourcefulIndexArguments(\n    query: Record<string, any>,\n    selections: string[] | undefined,\n    resource: string,\n    model: ResourcefulModel\n  ) {\n    console.log('ResourcefulModelController##parseResourcefulIndexArguments')\n    const isCountRequest = resource.endsWith('/$count')\n    const showCountMeta = '$count' in query && query['$count'] === 'true'\n    if (isStringContent(query['$search'])) {\n      throw new Exception('$search is not implemented for this OData endpoint', {\n        status: 501,\n        code: 'E_ODATA_SEARCH_NOT_IMPLEMENTED',\n      })\n    }\n\n    const filter: string | undefined = undefined\n    const { page, perPage } = this.#getPageAndPerPageFromTopAndSkip(query, isCountRequest)\n    const sort = this.#getSortFromOrderBy(query['$orderby'])\n    const aliases: Map<string, string> = new Map()\n    const keyToColumn: Map<string, string> = new Map()\n    Object.entries(query).forEach(([k, v]) => {\n      if (isStringContent(k) && k.startsWith('@')) {\n        aliases.set(k, isStringContent(v) ? v.trim() : '')\n      }\n    })\n    Object.entries(model.$keys.serializedToColumns.all()).forEach(([key, col]) => {\n      keyToColumn.set(key, col)\n    })\n    const dialect = this.#getDialectFromModel(model)\n    const $filter = isStringContent(query['$filter']) ? query['$filter'].trim() : ''\n    const hooks = [\n      ...this.#scopeRestrictors,\n      ODataToLucidTranslator.toHook($filter, aliases, keyToColumn, dialect),\n    ]\n    return {\n      filter,\n      page,\n      perPage,\n      fields: selections,\n      sort,\n      hooks,\n      showCountMeta,\n      isCountRequest,\n    }\n  }\n\n  #computeODataNextLink(\n    currentPage: number,\n    perPage: number,\n    totalItems: number,\n    query: Record<string, any>,\n    ctx: HttpContext\n  ): string | undefined {\n    const possiblyServedCount = currentPage * perPage\n    const servedCount = possiblyServedCount > totalItems ? totalItems : possiblyServedCount\n    if (servedCount >= totalItems) {\n      return undefined\n    }\n    const updatedQuery = { ...query }\n    updatedQuery['$top'] = String(perPage)\n    updatedQuery['$skip'] = String(servedCount)\n    const absUrl = ctx.request.completeUrl(false)\n    return [absUrl, qs.stringify(updatedQuery, { addQueryPrefix: true })].join('')\n  }\n\n  async #serveModelIndex(ctx: HttpContext) {\n    console.log('ResourcefulModelController##serveModelIndex')\n    const { model, app, respond, selections, isFullSet, preference, query, resource } =\n      await this.resolveRequestRequirements(ctx)\n\n    // Avoid passing relationship names into the underlying index fields selection.\n    const relationshipNames = new Set(\n      Array.from(model.$resourcefulRelationships.keys()).map((k) => k.toLowerCase())\n    )\n    const safeSelections = Array.isArray(selections)\n      ? selections.filter((k) => !relationshipNames.has(String(k).toLowerCase()))\n      : selections\n\n    const { filter, page, perPage, fields, sort, hooks, showCountMeta, isCountRequest } =\n      this.#parseResourcefulIndexArguments(query, safeSelections, resource, model)\n    const response = await model.$onResourcefulIndex(\n      filter,\n      page,\n      perPage,\n      fields,\n      sort,\n      ctx,\n      app,\n      hooks\n    )\n\n    console.log(`ResourcefulModelController#serveModelIndex - Response:`)\n    console.log(response)\n\n    if (isCountRequest) {\n      return respond({\n        status: 200,\n        body: response.total,\n        metadata: {\n          context: '', // required for shape of ODataMetadata but not used in $count responses\n        },\n        raw: true,\n      })\n    }\n    const ret: ResourcefulIndexResponse = {\n      records: response.records,\n      total: response.total,\n      page: response.page,\n      perPage: response.perPage,\n      aggregations: response.aggregations,\n    }\n    const runner = this.#mutators.runner('index')\n    await runner.run(ret, ctx)\n\n    // Handle $expand for index responses by loading related records per returned entity.\n    // NOTE: This issues one DB query per (expansion × record). To prevent runaway load,\n    // hydration is capped at ODATA_EXPAND_MAX_RECORDS (default 100). If the result set\n    // exceeds this cap and $expand is requested, only the first N records are returned\n    // and metadata (count, nextLink) is adjusted to reflect the truncated page.\n    const ODATA_EXPAND_MAX_RECORDS = 100\n    const expansions = sanitizeExpand(query)\n    let expandTruncated = false\n    if (Array.isArray(expansions) && expansions.length > 0) {\n      // Truncate records to the expand cap to guarantee consistent shape.\n      if (ret.records.length > ODATA_EXPAND_MAX_RECORDS) {\n        ret.records = ret.records.slice(0, ODATA_EXPAND_MAX_RECORDS)\n        expandTruncated = true\n      }\n      const relationshipMap = new Map(\n        Array.from(model.$resourcefulRelationships.keys()).map((k) => [k.toLowerCase(), k])\n      )\n      const resolved: string[] = []\n      for (const e of expansions) {\n        const r = relationshipMap.get(String(e).toLowerCase())\n        if (r) resolved.push(r)\n      }\n      if (resolved.length > 0) {\n        for (const originalExp of expansions) {\n          const rel = relationshipMap.get(String(originalExp).toLowerCase())\n          if (!rel) continue\n          for (const record of ret.records) {\n            try {\n              const relResp = await model.$onResourcefulReadRelationship(\n                Number(record[model.primaryKey]),\n                rel,\n                undefined,\n                1,\n                1000,\n                undefined,\n                undefined,\n                ctx,\n                app,\n                []\n              )\n              // Attach under the original expansion token (preserve requested casing).\n              record[originalExp] = Array.isArray(relResp && (relResp as any).records)\n                ? (relResp as any).records\n                : []\n            } catch (e) {\n              record[originalExp] = []\n            }\n          }\n        }\n      }\n    }\n\n    // When $expand truncated the result set, compute a nextLink so the client\n    // knows to fetch the remaining records. Use the truncated count as the\n    // effective page size for metadata purposes.\n    const effectivePerPage = expandTruncated ? ODATA_EXPAND_MAX_RECORDS : ret.perPage\n    const effectivePage = expandTruncated ? 1 : ret.page\n    const metadata: ODataMetadata = stripUndefinedValuesFromObject({\n      context: await this.getODataContextUrl(\n        `${this.#subpath}${this.#makeSelectionSubsetForContextUrl(selections, isFullSet, model)}`\n      ),\n      count: showCountMeta && !isCountRequest ? ret.total : undefined,\n      nextLink: this.#computeODataNextLink(effectivePage, effectivePerPage, ret.total, query, ctx),\n    })\n    return respond({\n      status: 200,\n      body: santizeResponsePayload(ret.records, selections, preference),\n      metadata,\n      model,\n      isArray: true,\n    })\n  }\n\n  async #applyMiddlewares(ctx: HttpContext, next: (ctx: HttpContext) => Promise<void>) {\n    const middleware = new Middleware<MiddlewareFn>()\n    if (this.#options.middleware) {\n      if (Array.isArray(this.#options.middleware)) {\n        this.#options.middleware.forEach((m) => middleware.add(m))\n      } else if (isObject(this.#options.middleware) && 'handle' in this.#options.middleware) {\n        middleware.add(this.#options.middleware.handle as MiddlewareFn)\n      } else if (typeof this.#options.middleware === 'function') {\n        middleware.add(this.#options.middleware as MiddlewareFn)\n      }\n    }\n    middleware.add(async (c) => {\n      await next(c)\n    })\n    return await middleware.runner().run(async (fn, nxt) => fn(ctx, nxt))\n  }\n\n  async serveModelRead(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelRead.bind(this, ctx))\n  }\n  async serveModelUpdate(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelUpdate.bind(this, ctx))\n  }\n  async serveModelDelete(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelDelete.bind(this, ctx))\n  }\n  async serveModelCreate(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelCreate.bind(this, ctx))\n  }\n  async serveModelReadRelated(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelReadRelated.bind(this, ctx))\n  }\n  async serveModelSyncRelated(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelSyncRelated.bind(this, ctx))\n  }\n  async serveModelFunction(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelFunction.bind(this, ctx))\n  }\n  async serveModelAction(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelAction.bind(this, ctx))\n  }\n  async serveModelInstanceFunction(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelInstanceFunction.bind(this, ctx))\n  }\n  async serveModelInstanceAction(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelInstanceAction.bind(this, ctx))\n  }\n  async serveModelIndex(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelIndex.bind(this, ctx))\n  }\n}\n","import { Exception } from '@poppinss/utils'\nimport { isSimpleIdentifier } from './utils/odata'\nimport { ODataContext } from './services/odata_context_service'\nimport { negotiateContent, negotiateMetadata } from './utils/http'\nimport { useODataContext } from '@nhtio/lucid-resourceful/odata/context'\nimport { ODataErrorMiddleware } from './middlewares/odata_error_middleware'\nimport { ODataMetadataService, makeOpName } from './services/odata_metadata_service'\nimport { ResourcefulModelController } from './controllers/resourceful_model_controller'\nimport { isAdditionalResourcefulRouteDetails } from '../router_macro/utils/type_guards'\nimport { ResourcefulHttpContext } from '../router_macro/services/resourceful_router_context_service'\nimport { ResourcefulRouterOptionsService } from '../router_macro/services/resourceful_router_options_service'\nimport { ResourcefulRouterModelResolverService } from '../router_macro/services/resourceful_router_model_resolver_service'\nimport { ResourcefulRouterModelServiceOptionsService } from '../router_macro/services/resourceful_router_model_options_service'\nimport {\n  E_ROUTE_NOT_FOUND,\n  E_UNRESOLVABLE_MODEL,\n  E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE,\n  //   E_INVALID_HTTP_METHOD_EXCEPTION,\n  E_UNACCEPTABLE_FORMAT,\n  E_INVALID_ENTITYSET_IDENTIFIERS,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ResourcefulHttpVerb } from '@nhtio/lucid-resourceful/types'\nimport type { HttpContext, Router, RouteGroup } from '@adonisjs/core/http'\nimport type { ODataResponseFormat, ODataMetadataLevel } from './utils/http'\nimport type { MacroModelsMap, ResourcefulRouterOptions, RouteCallback } from '../router_macro/types'\nimport type { ResourcefulHttpContextResolver } from '../router_macro/services/resourceful_router_context_service'\nimport type {\n  ResourcefulODataContextResolver,\n  ResolvedODataContext,\n} from './services/odata_context_service'\n\ntype ODataRouteCallback = (ctx: HttpContext) => Promise<void> | void\n\nclass ODataRouterService {\n  readonly #router: Router\n  readonly #rawModelMap: MacroModelsMap\n  readonly #options?: Partial<ResourcefulRouterOptions>\n  readonly #opts: ResourcefulRouterOptionsService\n  readonly #modelMap: ResourcefulRouterModelResolverService\n  readonly #controllers: Map<string, ResourcefulModelController>\n  readonly #group: RouteGroup\n  readonly #routes: Map<ResourcefulHttpVerb, Map<string | RegExp, ODataRouteCallback>>\n\n  /** @private */\n  constructor(\n    router: Router,\n    rawModelMap: MacroModelsMap,\n    options?: Partial<ResourcefulRouterOptions>\n  ) {\n    this.#router = router\n    this.#rawModelMap = rawModelMap\n    this.#options = options\n    this.#controllers = new Map<string, ResourcefulModelController>()\n    this.#opts = ResourcefulRouterOptionsService.init(this.#options)\n    this.#modelMap = ResourcefulRouterModelResolverService.init(this.#rawModelMap)\n    const unresolvableModels: E_UNRESOLVABLE_MODEL[] = []\n    const invalidEntitySetNames: Set<string> = new Set<string>()\n    Object.getOwnPropertyNames(this.#modelMap).forEach((name) => {\n      const promiseOrError = this.#modelMap[name]\n      if (!isSimpleIdentifier(name)) {\n        invalidEntitySetNames.add(name)\n        return\n      }\n      if (promiseOrError instanceof E_UNRESOLVABLE_MODEL) {\n        unresolvableModels.push(promiseOrError)\n      } else if ('undefined' !== typeof promiseOrError) {\n        const modelOptions = ResourcefulRouterModelServiceOptionsService.init(\n          this.#rawModelMap[name as any]\n        )\n        const controller = new ResourcefulModelController(\n          name,\n          promiseOrError,\n          modelOptions,\n          this.#opts.headers,\n          this.#opts.scopeRestrictors,\n          this.#opts.payloadRestrictors,\n          this.#opts.mutators,\n          this.#opts.policies\n        )\n        this.#controllers.set(name, controller)\n      }\n    })\n    if (unresolvableModels.length > 0) {\n      throw new E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE(unresolvableModels)\n    }\n    if (invalidEntitySetNames.size > 0) {\n      throw new E_INVALID_ENTITYSET_IDENTIFIERS(invalidEntitySetNames)\n    }\n    this.#group = this.#router.group(this.#groupCallback.bind(this))\n    if (this.#opts.prefix !== '/') {\n      this.#group.prefix(this.#opts.prefix)\n    }\n    if (Array.isArray(this.#opts.middleware) && this.#opts.middleware.length > 0) {\n      this.#group.use(Array.from(this.#opts.middleware))\n    } else if (!Array.isArray(this.#opts.middleware) && this.#opts.middleware) {\n      this.#group.use(this.#opts.middleware as any)\n    }\n    if ('string' === typeof this.#opts.domain && this.#opts.domain.length > 0) {\n      this.#group.domain(this.#opts.domain)\n    }\n    this.#routes = new Map<ResourcefulHttpVerb, Map<string | RegExp, ODataRouteCallback>>()\n    this.#initRoutes()\n  }\n\n  #initRoutes() {\n    const getRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    const postRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    const putRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    const patchRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    const deleteRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    Array.from(this.#controllers.entries())\n      .sort((a, b) => {\n        if (a[0].length === b[0].length) {\n          return a[0].localeCompare(b[0])\n        }\n        return b[0].length - a[0].length\n      })\n      .forEach(([name, controller]) => {\n        const currentControllerCan = (op: ResourcefulRouterOptions['except'][number]) => {\n          return !this.#opts.except.includes(op) && !controller.options.except.includes(op)\n        }\n        if (currentControllerCan('index')) {\n          const pattern = new RegExp(`^\\/${name}\\/?(?:\\\\$\\\\w+)*$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelIndex.bind(controller)\n          )\n          getRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n          getRoutes.set(\n            `/${name}/$count`,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('create')) {\n          const pattern = `/${name}`\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelCreate.bind(controller)\n          )\n          postRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('read')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelRead.bind(controller)\n          )\n          getRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('readRelated')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)\\/\\\\w{1,128}\\/?(?:\\\\$\\\\w+)*$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelReadRelated.bind(controller)\n          )\n          getRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('syncRelated')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)\\/Default\\\\.Sync(?:\\\\w+)+$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelSyncRelated.bind(controller)\n          )\n          postRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('update')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelUpdate.bind(controller)\n          )\n          postRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n          putRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n          patchRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('delete')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelDelete.bind(controller)\n          )\n          deleteRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        Object.entries(controller.options.additional).forEach(([methodAndPath]) => {\n          const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n          if (!method || !path) return\n          const opKind = ['post', 'patch', 'put', 'delete'].includes(method) ? 'action' : 'function'\n          const boundToInstance = path.includes(':uid\\/')\n          const pattern = boundToInstance\n            ? opKind === 'action'\n              ? new RegExp(\n                  `^\\/${name}\\\\(([^)]+)\\\\)\\/Default\\\\.(Get|Post|Put|Patch|Delete)[a-zA-Z0-9_]+$`\n                )\n              : new RegExp(\n                  `^\\/${name}\\\\(([^)]+)\\\\)\\/Default\\\\.(Get|Post|Put|Patch|Delete)[a-zA-Z0-9_]+\\\\(\\\\)$`\n                )\n            : opKind === 'action'\n              ? new RegExp(`^\\/${name}\\/Default\\\\.(Get|Post|Put|Patch|Delete)[a-zA-Z0-9_]+$`)\n              : new RegExp(`^\\/${name}\\/Default\\\\.(Get|Post|Put|Patch|Delete)[a-zA-Z0-9_]+\\\\(\\\\)$`)\n          const callback = boundToInstance\n            ? 'action' === opKind\n              ? this.#processOdataRequest.bind(\n                  this,\n                  controller.serveModelInstanceAction.bind(controller)\n                )\n              : this.#processOdataRequest.bind(\n                  this,\n                  controller.serveModelInstanceFunction.bind(controller)\n                )\n            : 'action' === opKind\n              ? this.#processOdataRequest.bind(this, controller.serveModelAction.bind(controller))\n              : this.#processOdataRequest.bind(this, controller.serveModelFunction.bind(controller))\n          switch (opKind) {\n            case 'action':\n              postRoutes.set(\n                pattern,\n                this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n              )\n              break\n            case 'function':\n              getRoutes.set(\n                pattern,\n                this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n              )\n              break\n          }\n        })\n      })\n    this.#routes.set('get', getRoutes)\n    this.#routes.set('post', postRoutes)\n    this.#routes.set('put', putRoutes)\n    this.#routes.set('patch', patchRoutes)\n    this.#routes.set('delete', deleteRoutes)\n  }\n\n  #groupCallback() {\n    Object.entries(this.#opts.additional).forEach(([methodAndPath, callback]) => {\n      const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n      if (!method || !path) return\n      const opName = makeOpName(method, path)\n      // unbound actions\n      const routerMethod = ['post', 'put', 'patch', 'delete'].includes(method.toLowerCase())\n        ? 'post'\n        : 'get'\n      const opPath = ['post', 'put', 'patch', 'delete'].includes(method.toLowerCase())\n        ? `/Default.${opName}`\n        : `/Default.${opName}()`\n      if (isAdditionalResourcefulRouteDetails(callback)) {\n        this.#router[routerMethod](opPath, this.#processOdataRequest.bind(this, callback.handler))\n      } else {\n        this.#router[routerMethod](opPath, this.#processOdataRequest.bind(this, callback))\n      }\n    })\n    this.#router.get(\n      '/$metadata',\n      this.#processOdataRequest.bind(this, this.#serveRootMetadata.bind(this))\n    )\n    this.#router.get(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveRootServiceDocument.bind(this))\n    )\n    // Explicitly route non-GET root methods through OData path resolution so they return 405.\n    this.#router.post(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n    this.#router.put(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n    this.#router.patch(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n    this.#router.delete(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n    this.#router.any(\n      '/*',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n  }\n\n  async #processRequest(callback: RouteCallback, ctx: HttpContext) {\n    let next: ((ctx: HttpContext) => unknown | PromiseLike<unknown> | Promise<unknown>) | undefined\n    if (typeof callback === 'function') {\n      next = async (c) => await callback(c)\n    } else if (Array.isArray(callback) && callback.length === 2) {\n      const [maybeResolvableController, method] = callback\n      if (\n        method in maybeResolvableController &&\n        typeof maybeResolvableController[method] === 'function'\n      ) {\n        // @ts-ignore\n        next = async (c) => await maybeResolvableController[method](c)\n      } else {\n        // @ts-ignore\n        const resolvedController = maybeResolvableController()\n        if (typeof resolvedController[method] === 'function') {\n          next = async (c) => await resolvedController[method](c)\n        }\n      }\n    }\n    if (!next) return\n    try {\n      await next(ctx)\n    } catch (error) {\n      if (this.#opts.catchThrown && ODataErrorMiddleware.shouldHandle(ctx)) {\n        return await ODataErrorMiddleware.handle(error, ctx, {\n          onVineValidationError: this.#opts.onVineValidationError,\n          onJoiValidationError: this.#opts.onJoiValidationError,\n          onException: this.#opts.onException,\n          onError: this.#opts.onError,\n          onUnknown: this.#opts.onUnknown,\n          onAny: this.#opts.onAny,\n          asYaml: true,\n          headers: this.#opts.headers,\n        })\n      } else {\n        throw error\n      }\n    }\n  }\n\n  async #serveInODataContext(\n    callback: RouteCallback,\n    fallbackResponseFormat: ODataResponseFormat,\n    fallbackMetadataLevel: ODataMetadataLevel,\n    ctx: HttpContext\n  ) {\n    const resolver: ResourcefulODataContextResolver = this.#resolvedODataContext.bind(\n      this,\n      ctx,\n      fallbackResponseFormat,\n      fallbackMetadataLevel\n    )\n    return await ODataContext.run({ resolver }, async () => {\n      if (typeof callback === 'function') {\n        return await callback(ctx)\n      } else if (Array.isArray(callback) && callback.length === 2) {\n        const [maybeResolvableController, method] = callback\n        if (\n          method in maybeResolvableController &&\n          typeof maybeResolvableController[method] === 'function'\n        ) {\n          // @ts-ignore\n          await maybeResolvableController[method](ctx)\n        } else {\n          // @ts-ignore\n          const resolvedController = maybeResolvableController()\n          if (typeof resolvedController[method] === 'function') {\n            await resolvedController[method](ctx)\n          }\n        }\n      }\n    })\n  }\n\n  async #processOdataRequest(\n    callback: RouteCallback,\n    ctx: HttpContext,\n    fallbackResponseFormat: ODataResponseFormat = 'json',\n    fallbackMetadataLevel: ODataMetadataLevel = 'minimal'\n  ) {\n    return await this.#processRequest(\n      this.#serveInODataContext.bind(\n        this,\n        callback,\n        fallbackResponseFormat,\n        fallbackMetadataLevel,\n        ctx\n      ),\n      ctx\n    )\n  }\n\n  async #resolvedODataContext(\n    ctx: HttpContext,\n    fallbackResponseFormat: ODataResponseFormat = 'json',\n    fallbackMetadataLevel: ODataMetadataLevel = 'minimal'\n  ): Promise<ResolvedODataContext> {\n    const fullUrl = ctx.request.completeUrl()\n    const indexOfPrefix = fullUrl.indexOf(this.#opts.prefix)\n    const beforePrefix = fullUrl.substring(0, indexOfPrefix === -1 ? fullUrl.length : indexOfPrefix)\n    const ret: ResolvedODataContext = {\n      serviceBaseUrl: beforePrefix + this.#opts.prefix,\n      serveAs: negotiateContent(ctx, fallbackResponseFormat),\n      metadataLevel: negotiateMetadata(ctx, fallbackMetadataLevel),\n    }\n    ctx.response.header('OData-Version', '4.0')\n    return ret\n  }\n\n  async #serveInResourcefulModelRouterContext(\n    controller: ResourcefulModelController,\n    callback: RouteCallback,\n    ctx: HttpContext\n  ) {\n    const resolver: ResourcefulHttpContextResolver = controller.resolveRequestRequirements.bind(\n      controller,\n      ctx\n    ) as ResourcefulHttpContextResolver\n    await ResourcefulHttpContext.run({ resolver }, async () => {\n      if (typeof callback === 'function') {\n        await callback(ctx)\n      } else if (Array.isArray(callback) && callback.length === 2) {\n        const [maybeResolvableController, method] = callback\n        if (\n          method in maybeResolvableController &&\n          typeof maybeResolvableController[method] === 'function'\n        ) {\n          // @ts-ignore\n          await maybeResolvableController[method](ctx)\n        } else {\n          // @ts-ignore\n          const resolvedController = maybeResolvableController()\n          if (typeof resolvedController[method] === 'function') {\n            await resolvedController[method](ctx)\n          }\n        }\n      }\n    })\n  }\n\n  async #serveRootServiceDocument(ctx: HttpContext) {\n    const { serveAs } = await useODataContext()\n    if ('xml' === serveAs) {\n      return await this.#serveRootServiceDocumentXml()\n    } else {\n      return await this.#serveRootServiceDocumentJson(ctx)\n    }\n  }\n\n  async #serveRootServiceDocumentJson(ctx: HttpContext) {\n    const payload = {\n      '@odata.context': `$metadata`,\n      'value': Array.from(this.#controllers.keys()).map((name) => ({\n        name,\n        kind: 'EntitySet',\n        url: name,\n      })),\n    }\n    return ctx.response.json(payload)\n  }\n\n  async #serveRootServiceDocumentXml() {\n    throw new E_UNACCEPTABLE_FORMAT('xml')\n  }\n\n  async #serveRootMetadata(ctx: HttpContext) {\n    const { serveAs } = await useODataContext()\n    const renegotiated = negotiateContent(ctx, 'xml')\n    if ('json' === serveAs && 'json' === renegotiated) {\n      throw new E_UNACCEPTABLE_FORMAT('json')\n    } else {\n      const metadata = await ODataMetadataService.serveRootMetadata(\n        this.#opts,\n        this.#controllers,\n        ctx\n      )\n      return ctx.response.oXml(200, metadata)\n    }\n  }\n\n  async #serveResourceRequest(ctx: HttpContext) {\n    // Normalize wildcard segment to a canonical path\n    const star = ctx.params['*']\n    let resource = Array.isArray(star)\n      ? `/${star.join('/')}`\n      : typeof star === 'string'\n        ? star.startsWith('/')\n          ? star\n          : `/${star}`\n        : '/'\n    resource = resource.replace(/\\/{2,}/g, '/')\n    const method = (ctx.request.method() || 'GET').toLowerCase()\n\n    // Service root supports read semantics only.\n    if (resource === '/' && !['get', 'head'].includes(method)) {\n      throw new Exception(`Method ${method.toUpperCase()} is not allowed for OData service root`, {\n        status: 405,\n        code: 'E_METHOD_NOT_ALLOWED',\n      })\n    }\n\n    const effectiveMethod = (method === 'head' ? 'get' : method) as ResourcefulHttpVerb\n    const routes = this.#routes.get(effectiveMethod)\n    if (!routes) {\n      throw new E_ROUTE_NOT_FOUND([method.toUpperCase(), ctx.request.url() || '/'])\n    }\n    // Exact match first (try as-is and without trailing slash)\n    const trimmed = resource !== '/' ? resource.replace(/\\/+$/, '') : resource\n    const exact = routes.get(resource) || routes.get(trimmed)\n    if (exact) {\n      return await exact(ctx)\n    }\n    // Regex match: longest match wins, then most specific pattern (by regex source length)\n    const candidates = trimmed === resource ? [resource] : [resource, trimmed]\n    const matches = Array.from(routes.entries())\n      .filter(([pattern]) => pattern instanceof RegExp)\n      .map(([pattern, cb]) => {\n        let best: { len: number; specif: number; cb: ODataRouteCallback } | null = null\n        for (const path of candidates) {\n          const m = (pattern as RegExp).exec(path)\n          if (m) {\n            const cur = { len: m[0].length, specif: (pattern as RegExp).source.length, cb }\n            if (!best || cur.len > best.len || (cur.len === best.len && cur.specif > best.specif)) {\n              best = cur\n            }\n          }\n        }\n        return best\n      })\n      .filter((v): v is { len: number; specif: number; cb: ODataRouteCallback } => !!v)\n      .sort((a, b) => b.len - a.len || b.specif - a.specif)\n\n    if (matches.length > 0) {\n      return await matches[0].cb(ctx)\n    }\n    // No match\n    throw new E_ROUTE_NOT_FOUND([method.toUpperCase(), ctx.request.url() || '/'])\n  }\n\n  get group() {\n    return this.#group\n  }\n\n  public static hook(\n    router: Router,\n    rawModelMap: MacroModelsMap,\n    options?: Partial<ResourcefulRouterOptions>\n  ): RouteGroup {\n    const instance = new ODataRouterService(router, rawModelMap, options)\n    return instance.group\n  }\n}\n\nexport const odataRouterMacro: ODataRouterMacro = function (\n  this: Router,\n  models: MacroModelsMap,\n  options: Partial<ResourcefulRouterOptions> = {}\n): RouteGroup {\n  return ODataRouterService.hook(this, models, options)\n}\n\nexport interface ODataRouterMacro {\n  (models: MacroModelsMap, options?: Partial<ResourcefulRouterOptions>): RouteGroup\n}\n\nexport type { ODataRouterService }\n","import type { default as Configure } from '@adonisjs/core/commands/configure'\n\n/** @private */\nexport async function configure(command: Configure) {\n  const codemods = await command.createCodemods()\n  await codemods.updateRcFile((rcFile) => {\n    rcFile.addProvider('@nhtio/lucid-resourceful/integration/provider')\n  })\n  await codemods.registerMiddleware('router', [\n    {\n      path: '@nhtio/lucid-resourceful/integration/middlewares/resourceful_encoded_request',\n      position: 'after',\n    },\n  ])\n}\n","/**\n * A decorator-driven AdonisJS library that lets you annotate Lucid ORM models with metadata to automatically generate CRUD controllers, validation rules, OpenAPI schemas, and a unified query interface.\n * @module @nhtio/lucid-resourceful\n */\n\n/**\n * The current version of the package.\n *\n * @tip This is a constant that is replaced during the build process with the actual version of the package.\n */\nexport const version = __VERSION__\n\nexport { withResourceful } from '@/private/mixin'\nexport {\n  setDefaultRelationsCacheService,\n  isRelationCacheTarget,\n  registerRelationCacheTarget,\n  resetRelationCacheTargets,\n} from '@/private/utils/cache_service_resolver'\nexport { registerRelationCacheTargetsForModel } from '@/private/utils/caching_preloader'\nexport {\n  setDefaultOnRelationsCacheError,\n  resetDefaultOnRelationsCacheError,\n} from '@/private/utils/cache_error_handler'\nexport {\n  setDefaultOnRelationsCacheEvent,\n  resetDefaultOnRelationsCacheEvent,\n} from '@/private/utils/cache_event_handler'\nexport type {\n  CacheDuration,\n  CacheServiceLike,\n  RelationCacheEntryOptions,\n  RelationsCacheServiceResolver,\n} from '@/private/utils/cache_service_resolver'\nexport type { RelationsCacheErrorHandler } from '@/private/utils/cache_error_handler'\nexport type {\n  RelationsCacheEventHandler,\n  RelationCacheEvent,\n  RelationCacheEventContext,\n} from '@/private/utils/cache_event_handler'\nexport type {\n  CacheMiddlewareHandler,\n  CacheMiddlewareContext,\n  CacheMiddlewareInput,\n  CacheMiddlewarePhase,\n  CacheMiddlewarePipeline,\n} from '@/private/utils/cache_middleware'\nexport {\n  resourcefulColumn,\n  resourcefulComputed,\n  resourcefulBelongsTo,\n  resourcefulHasOne,\n  resourcefulHasMany,\n  resourcefulManyToMany,\n  resourcefulHasManyThrough,\n} from '@/private/decorators'\nexport * as errors from '@nhtio/lucid-resourceful/errors'\nexport * as definitions from '@nhtio/lucid-resourceful/definitions'\n\n// Resourceful Router Macro\nexport { resourcefulRouterMacro } from '@/private/router_macro'\n\n// OData Router Macro\nexport { odataRouterMacro } from '@/private/odata_macro'\n\n// Adonis Integration\nexport { configure } from '@/integration/configure'\n"],"names":["errors","index","error","convertWildcardToRegex_1","convertWildcardToRegex","escapeRegexString_1","escapeRegexString","parseRegex_1","parseRegex","createStringTest_1","require$$0","require$$1","require$$2","createStringTest","testComparisonRange_1","testComparisonRange","testRange_1","testRange","exports","internalFilter","filter_1","filter","highlight_1","highlight","isSafeUnquotedExpression_1","isSafeUnquotedExpression","grammar_1","grammar","isSafePath_1","isSafePath","createGetValueFunctionBody_1","createGetValueFunctionBody","hydrateAst","module","this","dot","parse_1","require$$3","parse","serialize","test_1","test","require$$4","require$$5","require$$6","E_LUCENE_INVALID_TYPE","E_LUCENE_REGEX_NOT_SUPPORTED","SyntaxError","E_LUCENE_SYNTAX_EXCEPTION","E_LUCENE_UNEXPECTED_EXCEPTION","clone","encode","decode","Preloader","E_RELATION_CACHE_KEY_DIVERGENCE","joi","E_INVALID_RESOURCEFUL_MIXIN_OPTIONS","registerRelationCacheTarget","reportRelationCacheEvent","resolveRelationsCacheService","reportRelationCacheError","E_RELATION_CACHE_RESOLUTION_FAILED","E_RELATION_CACHE_READ_FAILED","E_RELATION_CACHE_REHYDRATION_FAILED","E_RELATION_CACHE_WRITE_FAILED","isString","isObject","isResourcefulModel","deepmerge","stripUndefinedValuesFromObject","guards.isResourcefulModel","definitions","ensureOwnResourcefulMap","TypedEventEmitter","_ResourcefulModel","isRelationCacheTarget","E_RELATION_CACHE_EVICTION_FAILED","HttpContext","HttpContextFactory","E_INVALID_PAYLOAD_EXCEPTION","Exception","guards.isResourcefulDateType","guards.isResourcefulDateTimeType","guards.isResourcefulBinaryType","guards.isResourcefulStringType","guards.isResourcefulIntegerType","guards.isResourcefulBigintType","guards.isResourcefulUnsignedIntegerType","guards.isResourcefulNumberType","guards.isResourcefulBooleanType","guards.isResourcefulObjectType","guards.isObject","guards.isResourcefulArrayType","CRUDOperationsEnum","operationCRUDToACL","ACLOperationsEnum","E_MISSING_PRIMARY_KEY_EXCEPTION","prepareFields","E_FORBIDDEN","E_INVALID_COLUMN_ACCESS","E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION","E_INVALID_AGGREGATION_FIELD","E_INVALID_AGGREGATION_OPERATION","SimplePaginator","E_RECORD_NOT_FOUND_EXCEPTION","guards.isString","E_INVALID_RELATIONSHIP_EXCEPTION","E_INVALID_RESOUREFUL_READ_RELATIONSHIP_REQUEST_EXCEPTION","E_FORBIDDEN_PAYLOAD_EXCEPTION","E_BULK_UPDATE_SEARCH_UNKNOWN_EXCEPTION","beforeCreate","beforeUpdate","afterUpdate","afterDelete","E_INVALID_RESOURCEFUL_DECORATOR_OPTIONS","ResourcefulStringType","ResourcefulDateType","ResourcefulDateTimeType","ResourcefulBinaryType","ResourcefulNumberType","ResourcefulIntegerType","ResourcefulBigintType","ResourcefulUnsignedIntegerType","ResourcefulBooleanType","ResourcefulObjectType","ResourcefulArrayType","lucidComputed","lucidColumn","prepareString","consumeString","prepareDate","consumeDate","prepareDateTime","consumeDateTime","prepareBinary","consumeBinary","prepareNumber","consumeNumber","prepareInteger","consumeInteger","prepareBigint","consumeBigint","prepareUnsignedint","consumeUnsignedint","prepareBoolean","consumeBoolean","prepareObject","consumeObject","prepareArray","consumeArray","lucidBelongsTo","lucidHasOne","lucidHasMany","lucidManyToMany","lucidHasManyThrough","RouteCallbackSchema","AdditionalResourcefulRouteDetailsSchema","parameterObjectSchema","schemaOrReferenceObjectSchema","encoder","DateTime","makeEncodable","modelRelationshipSyncPayloadSchema","isArray","negotiateContent","E_UNRESOLVABLE_MODEL","E_ROUTE_NOT_FOUND","YAML","normalizeError","encodeJoi","E_RELATIONSHIP_NOT_FOUND_EXCEPTION","E_UNSYNCABLE_RELATIONSHIP_EXCEPTION","FORBIDDEN_ADDITIONALS","AdditionalResourcefulRoutesMapValueSchema","ResourcefulRouterVerb","ResourcefulRouterOperation","infoObjectSchema","externalDocsSchema","ResourcefulErrorMiddleware","E_INVALID_RESOURCEFUL_ROUTER_OPTIONS","validator","E_MISSING_CURRENT_INSTANCE_ID","e","E_INVALID_RESOURCEFUL_MODELS_MAP","HttpMethodSortOrder","ResourcefulModelController","minify","ResourcefulHttpVerb","getPossibleHttpErrorCodes","describeHttpError","E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE","E_INVALID_HTTP_METHOD_EXCEPTION","ResourcefulHttpContext","Buffer","isNonArraySchemaObject","isInstanceOf","E_ODATA_FILTER_UNEVALUATABLE_NODE_TYPE","E_ODATA_FILTER_UNEXPECTED_CHARACTER","E_ODATA_FILTER_UNEXPECTED_END_OF_INPUT","E_ODATA_FILTER_UNEXPECTED_TYPE","E_ODATA_UNKNOWN_PARAMETER_ALIAS","E_ODATA_FILTER_UNEXPECTED_TOKEN","E_ODATA_FILTER_INAPPLICABLE_NODE_TYPE","E_ODATA_FILTER_UNKNOWN_LOGICAL_OPERATOR","E_ODATA_FILTER_UNKNOWN_COMPARISON_OPERATOR","E_ODATA_FILTER_INVALID_COMPARISON_SIDE","E_ODATA_FILTER_UNSUPPORTED_FUNCTION_COMPARISON","E_ODATA_FILTER_EXPECTED_COLUMN_REFERENCE","useODataContext","negotiateMetadata","negotiatePreference","negotiateIeee754Compatible","xml","js2xml","E_UNACCEPTABLE_FORMAT","E_EXPAND_NOT_IMPLEMENTED","isStringContent","E_UNSUPPORTED_DATABASE_DIALECT","Middleware","E_INVALID_ENTITYSET_IDENTIFIERS","ODataErrorMiddleware","ODataContext"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,23,39]}