lumen-framework 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/packages/database/errors/invalid-driver-error.ts", "../src/packages/database/constants.ts", "../src/constants.ts", "../src/utils/k.ts", "../src/packages/freezeable/constants.ts", "../src/utils/insert.ts", "../src/utils/is-object.ts", "../src/packages/freezeable/utils/freeze.ts", "../src/packages/freezeable/utils/is-frozen.ts", "../src/packages/freezeable/map/index.ts", "../src/packages/freezeable/set/index.ts", "../src/packages/logger/constants.ts", "../src/packages/logger/writer/index.ts", "../src/utils/entries.ts", "../src/utils/omit.ts", "../src/packages/logger/writer/constants.ts", "../src/utils/stringify.ts", "../src/packages/logger/writer/utils/format-message.ts", "../src/packages/logger/request-logger/utils/log-text.ts", "../src/packages/logger/request-logger/templates.ts", "../src/packages/template/utils/insert-values.ts", "../src/packages/logger/utils/line.ts", "../src/packages/logger/request-logger/utils/filter-params.ts", "../src/packages/logger/request-logger/utils/log-json.ts", "../src/packages/logger/request-logger/index.ts", "../src/packages/logger/utils/sql.ts", "../src/packages/logger/index.ts", "../src/packages/database/errors/model-missing-error.ts", "../src/packages/database/errors/migrations-pending-error.ts", "../src/packages/server/utils/create-server-error.ts", "../src/packages/database/errors/unique-constraint-error.ts", "../src/packages/database/errors/config-missing-error.ts", "../src/packages/database/initialize.ts", "../src/packages/database/utils/connect.ts", "../src/packages/database/utils/create-migrations.ts", "../src/packages/fs/index.ts", "../src/packages/fs/watcher/index.ts", "../src/packages/fs/watcher/initialize.ts", "../src/utils/try-catch.ts", "../src/packages/fs/utils/create-resolver.ts", "../src/utils/chain.ts", "../src/packages/database/utils/pending-migrations.ts", "../src/packages/database/utils/normalize-model-name.ts", "../src/utils/compose.ts", "../src/utils/underscore.ts", "../src/packages/database/model/index.ts", "../src/packages/database/query/index.ts", "../src/utils/uniq.ts", "../src/packages/database/query/utils/scopes-for.ts", "../src/packages/database/query/utils/format-select.ts", "../src/packages/database/query/errors/record-not-found-error.ts", "../src/packages/database/query/runner/constants.ts", "../src/packages/database/query/runner/utils/get-find-param.ts", "../src/packages/database/query/runner/utils/build-results.ts", "../src/utils/promise-hash.ts", "../src/packages/database/query/runner/index.ts", "../src/utils/map-to-object.ts", "../src/packages/database/change-set/index.ts", "../src/packages/database/relationship/index.ts", "../src/packages/database/relationship/utils/getters.ts", "../src/packages/database/relationship/utils/unassociate.ts", "../src/utils/is-null.ts", "../src/packages/database/relationship/utils/validate-type.ts", "../src/packages/database/relationship/utils/inverse-setters.ts", "../src/packages/database/relationship/utils/setters.ts", "../src/packages/database/relationship/utils/update-relationship.ts", "../src/utils/has-own-property.ts", "../src/utils/proxy.ts", "../src/packages/database/transaction/index.ts", "../src/utils/pick.ts", "../src/utils/diff.ts", "../src/packages/database/model/utils/get-columns.ts", "../src/packages/database/model/utils/persistence.ts", "../src/packages/database/model/initialize-class.ts", "../src/utils/is-undefined.ts", "../src/packages/database/attribute/utils/create-getter.ts", "../src/packages/database/attribute/utils/create-setter.ts", "../src/packages/database/attribute/utils/create-normalizer.ts", "../src/packages/database/attribute/index.ts", "../src/packages/database/validation/errors/validation-error.ts", "../src/packages/database/validation/index.ts", "../src/packages/database/model/utils/validate.ts", "../src/packages/database/model/utils/run-hooks.ts", "../src/packages/database/migration/index.ts", "../src/packages/database/utils/type-for-column.ts", "../src/packages/database/index.ts", "../src/packages/server/index.ts", "../src/packages/server/constants.ts", "../src/packages/server/request/index.ts", "../src/packages/server/request/constants.ts", "../src/packages/server/request/parser/utils/parse-nested-object.ts", "../src/packages/server/request/parser/utils/format.ts", "../src/packages/server/request/parser/constants.ts", "../src/utils/transform-keys.ts", "../src/packages/server/request/parser/utils/parse-read.ts", "../src/packages/server/request/parser/errors/malformed-request-error.ts", "../src/packages/server/request/parser/utils/parse-write.ts", "../src/packages/server/request/parser/index.ts", "../src/packages/server/request/utils/get-domain.ts", "../src/packages/server/response/index.ts", "../src/packages/jsonapi/constants.ts", "../src/packages/jsonapi/errors/not-acceptable-error.ts", "../src/packages/jsonapi/errors/unsupported-media-type-error.ts", "../src/packages/jsonapi/errors/invalid-content-type-error.ts", "../src/packages/jsonapi/utils/is-jsonapi.ts", "../src/packages/jsonapi/utils/has-media-type.ts", "../src/utils/env.ts", "../src/packages/server/responder/utils/data-for.ts", "../src/packages/server/responder/utils/normalize.ts", "../src/packages/server/responder/utils/has-content-type.ts", "../src/packages/server/responder/index.ts", "../src/packages/server/utils/validate-accept.ts", "../src/packages/server/utils/validate-content-type.ts", "../src/packages/server/utils/set-cors-headers.ts", "../src/utils/merge.ts", "../src/packages/controller/utils/params-to-query.ts", "../src/packages/controller/utils/find-one.ts", "../src/packages/controller/utils/find-many.ts", "../src/packages/controller/utils/resolve-relationships.ts", "../src/packages/controller/constants.ts", "../src/packages/controller/index.ts", "../src/packages/serializer/index.ts", "../src/packages/config/index.ts", "../src/packages/router/namespace/utils/normalize-name.ts", "../src/packages/router/namespace/utils/normalize-path.ts", "../src/packages/router/namespace/index.ts", "../src/utils/create-query-string.ts", "../src/packages/router/route/action/utils/create-page-links.ts", "../src/packages/router/route/action/enhancers/resource.ts", "../src/packages/router/route/action/constants.ts", "../src/packages/router/route/action/utils/get-action-name.ts", "../src/packages/router/route/action/utils/get-controller-name.ts", "../src/packages/router/route/action/enhancers/track-perf.ts", "../src/packages/router/route/action/index.ts", "../src/packages/router/route/params/errors/parameter-type-error.ts", "../src/packages/router/route/params/errors/parameter-value-error.ts", "../src/packages/router/route/params/errors/invalid-parameter-error.ts", "../src/packages/router/route/params/errors/resource-mismatch-error.ts", "../src/packages/router/route/params/errors/parameter-required-error.ts", "../src/packages/router/route/params/errors/parameter-not-nullable-error.ts", "../src/utils/is-buffer.ts", "../src/packages/router/route/params/utils/validate-type.ts", "../src/packages/router/route/params/parameter-group/utils/has-required-params.ts", "../src/packages/router/route/params/parameter-group/index.ts", "../src/packages/router/route/params/parameter/utils/validate-value.ts", "../src/packages/router/route/params/parameter/index.ts", "../src/packages/router/route/params/utils/get-url-params.ts", "../src/packages/router/route/params/utils/get-data-params.ts", "../src/packages/router/route/params/utils/get-default-member-params.ts", "../src/packages/router/route/params/utils/get-default-collection-params.ts", "../src/packages/router/route/params/utils/get-query-params.ts", "../src/packages/router/route/params/utils/validate-resource-id.ts", "../src/packages/router/route/params/index.ts", "../src/packages/router/route/utils/get-static-path.ts", "../src/packages/router/route/constants.ts", "../src/packages/router/route/utils/get-dynamic-segments.ts", "../src/packages/router/route/index.ts", "../src/packages/router/resource/utils/normalize-only.ts", "../src/packages/router/resource/index.ts", "../src/errors/controller-missing-error.ts", "../src/packages/router/definitions/context/utils/create-definition.ts", "../src/packages/router/definitions/context/utils/create-definition-group.ts", "../src/packages/router/definitions/context/utils/normalize-resource-args.ts", "../src/packages/router/definitions/context/index.ts", "../src/packages/router/definitions/index.ts", "../src/packages/router/utils/create-replacer.ts", "../src/packages/router/index.ts", "../src/packages/loader/utils/bundle-for.ts", "../src/packages/loader/utils/format-key.ts", "../src/packages/loader/resolver/utils/closest-ancestor.ts", "../src/packages/loader/resolver/utils/closest-child.ts", "../src/packages/loader/resolver/index.ts", "../src/packages/loader/builder/utils/create-parent-builder.ts", "../src/packages/loader/builder/utils/sort-by-namespace.ts", "../src/packages/loader/builder/utils/create-children-builder.ts", "../src/packages/loader/builder/index.ts", "../src/packages/loader/index.ts", "../src/packages/application/utils/normalize-port.ts", "../src/packages/application/utils/create-controller.ts", "../src/packages/application/utils/create-serializer.ts", "../src/packages/application/initialize.ts", "../src/packages/application/index.ts", "../src/packages/lumenify/utils/create-response-proxy.ts", "../src/packages/lumenify/index.ts"],
4
- "sourcesContent": ["import { green, yellow } from 'chalk';\n\nimport { VALID_DRIVERS } from '../constants';\nimport { line } from '../../logger';\n\n/**\n * @private\n */\nclass InvalidDriverError extends Error {\n constructor(driver: string) {\n super(line`\n Invalid database driver ${yellow(driver)} in ./config/database.js.\n Please use one of the following database drivers:\n ${VALID_DRIVERS.map(str => green(str)).join(', ')}.\n `);\n }\n}\n\nexport default InvalidDriverError;\n", "export const UNIQUE_CONSTRAINT = /UNIQUE\\sCONSTRAINT/gi;\n\nexport const VALID_DRIVERS = [\n 'pg',\n 'sqlite3',\n 'mssql',\n 'mysql',\n 'mysql2',\n 'mariasql',\n 'strong-oracle',\n 'oracle'\n];\n\nexport const TYPE_ALIASES = new Map([\n ['enu', 'array'],\n ['enum', 'array'],\n\n ['json', 'object'],\n ['jsonb', 'object'],\n\n ['binary', 'buffer'],\n\n ['bool', 'boolean'],\n ['boolean', 'boolean'],\n\n ['time', 'date'],\n ['date', 'date'],\n ['datetime', 'date'],\n\n ['text', 'string'],\n ['uuid', 'string'],\n ['string', 'string'],\n ['varchar', 'string'],\n\n ['int', 'number'],\n ['float', 'number'],\n ['integer', 'number'],\n ['decimal', 'number'],\n ['floating', 'number'],\n ['bigInteger', 'number']\n]);\n", "import { platform } from 'os';\n\nconst { env: ENV } = process;\n\nexport const CWD = process.cwd();\n\n// NOTE: the Flow original derived this via a `cluster.worker.pid` check, but\n// Node's `Worker` has no `pid` property \u2014 the pid lives at\n// `worker.process.pid` \u2014 so `typeof worker.pid === 'number'` was always false\n// and the branch never ran. It was a no-op either way: inside a worker process\n// `worker.process.pid` *is* `process.pid`. Simplified rather than preserving\n// dead code; behaviour is unchanged.\nexport const PID = process.pid;\n\n// `ENV.PORT` is `string | undefined`; `parseInt(undefined)` yields NaN, which\n// the `||` below turns into the default. Cast rather than `??` so the emitted\n// bundle stays parseable by the Babel 6 stages that still consume it.\nexport const PORT = parseInt(ENV.PORT as string, 10) || 4000;\nexport const NODE_ENV = ENV.NODE_ENV || 'development';\nexport const DATABASE_URL = ENV.DATABASE_URL;\nexport const LUMEN_CONSOLE = ENV.LUMEN_CONSOLE || false;\nexport const PLATFORM = platform();\n", "/**\n * A utility function that always returns `this` based on it's current\n * context.\n *\n * A common use case for the K function is a default parameter for optional\n * callback functions or general function arguments.\n *\n * @private\n */\nexport default function K(this: unknown): unknown {\n return this;\n}\n", "export const FREEZER = new WeakSet<object>();\n", "/**\n * @private\n */\nexport default function insert<T, U extends T[]>(target: U, items: T[]): U {\n for (let i = 0; i < items.length; i += 1) {\n target.splice(i, 1, items[i]);\n }\n\n return target;\n}\n", "/**\n * Determine wether or not a value is an Object.\n *\n * @example\n * const a = null;\n * const b = [];\n * const c = {};\n *\n * console.log(typeof a, typeof b, typeof c);\n * // => 'object', 'object', 'object' \uD83D\uDC4E\n *\n * console.log(isObject(a), isObject(b), isObject(c));\n * // => false, false, true \uD83D\uDC4D\n *\n * @private\n */\nexport default function isObject(\n value: unknown\n): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n", "import { FREEZER } from '../constants';\nimport insert from '../../../utils/insert';\nimport isObject from '../../../utils/is-object';\n\n/**\n * Anything exposing a `freeze` method \u2014 in practice FreezeableMap/FreezeableSet.\n *\n * @private\n */\ninterface Freezeable {\n freeze(deep?: boolean): unknown;\n}\n\nfunction isFreezeable(value: unknown): value is Freezeable {\n return Boolean(value) && typeof (value as Freezeable).freeze === 'function';\n}\n\n/**\n * @private\n */\nexport default function freeze<T extends object>(value: T): T {\n FREEZER.add(value);\n return value;\n}\n\n/**\n * @private\n */\nexport function freezeArray<T>(target: T[]): readonly T[] {\n const result = insert(new Array<T>(target.length), target);\n\n return Object.freeze(result);\n}\n\n/**\n * @private\n */\nexport function freezeValue<T>(value: T): T {\n if (isFreezeable(value)) {\n return Object.freeze(value).freeze(true) as T;\n } else if (isObject(value)) {\n return Object.freeze(value) as T;\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport function freezeProps<T extends object>(\n target: T,\n makePublic: boolean,\n ...props: string[]\n): T {\n Object.defineProperties(\n target,\n props.reduce<PropertyDescriptorMap>(\n (obj, key) => ({\n ...obj,\n [key]: {\n value: Reflect.get(target, key),\n writable: false,\n enumerable: makePublic,\n configurable: false\n }\n }),\n {}\n )\n );\n\n return target;\n}\n\n/**\n * @private\n */\nexport function deepFreezeProps<T extends object>(\n target: T,\n makePublic: boolean,\n ...props: string[]\n): T {\n Object.defineProperties(\n target,\n props.reduce<PropertyDescriptorMap>((obj, key) => {\n let value: unknown = Reflect.get(target, key);\n\n if (Array.isArray(value)) {\n value = freezeArray(value);\n } else {\n value = freezeValue(value);\n }\n\n return {\n ...obj,\n [key]: {\n value,\n writable: false,\n enumerable: makePublic,\n configurable: false\n }\n };\n }, {})\n );\n\n return target;\n}\n", "import { FREEZER } from '../constants';\n\n/**\n * @private\n */\nexport default function isFrozen(value: unknown): boolean {\n // `WeakSet#has` returns false for non-objects rather than throwing, so this\n // keeps the original behaviour of accepting any value.\n return FREEZER.has(value as object);\n}\n", "import freeze from '../utils/freeze';\nimport isFrozen from '../utils/is-frozen';\n\n/**\n * @private\n */\nclass FreezeableMap<K, V> extends Map<K, V> {\n override set(key: K, value: V): this {\n if (!this.isFrozen()) {\n super.set(key, value);\n }\n\n return this;\n }\n\n override clear(): void {\n if (!this.isFrozen()) {\n super.clear();\n }\n }\n\n override delete(key: K): boolean {\n return this.isFrozen() ? false : super.delete(key);\n }\n\n freeze(deep?: boolean): this {\n if (deep) {\n this.forEach(Object.freeze);\n }\n\n return freeze(this);\n }\n\n isFrozen(): boolean {\n return isFrozen(this);\n }\n}\n\nexport default FreezeableMap;\n", "import freeze from '../utils/freeze';\nimport isFrozen from '../utils/is-frozen';\n\n/**\n * @private\n */\nclass FreezeableSet<T> extends Set<T> {\n override add(value: T): this {\n if (!this.isFrozen()) {\n super.add(value);\n }\n\n return this;\n }\n\n override clear(): void {\n if (!this.isFrozen()) {\n super.clear();\n }\n }\n\n override delete(value: T): boolean {\n return this.isFrozen() ? false : super.delete(value);\n }\n\n freeze(deep?: boolean): this {\n if (deep) {\n this.forEach(Object.freeze);\n }\n\n return freeze(this);\n }\n\n isFrozen(): boolean {\n return isFrozen(this);\n }\n}\n\nexport default FreezeableSet;\n", "import { FreezeableMap, FreezeableSet } from '../freezeable';\n\nimport type { Logger$level, Logger$format } from './interfaces';\n\nexport const DEBUG = 'DEBUG';\nexport const INFO = 'INFO';\nexport const WARN = 'WARN';\nexport const ERROR = 'ERROR';\n\nexport const FORMATS: FreezeableSet<Logger$format> =\n new FreezeableSet<Logger$format>(['text', 'json']);\n\nFORMATS.freeze();\n\nexport const LEVELS: FreezeableMap<Logger$level, number> = new FreezeableMap<\n Logger$level,\n number\n>([\n [DEBUG, 0],\n [INFO, 1],\n [WARN, 2],\n [ERROR, 3]\n]);\n\nLEVELS.freeze();\n", "import { WriteStream } from 'tty';\n\nimport { dim, red, yellow } from 'chalk';\n\nimport { WARN, ERROR } from '../constants';\nimport omit from '../../../utils/omit';\nimport type { Logger$format } from '../interfaces';\n\nimport { STDOUT, STDERR } from './constants';\nimport formatMessage from './utils/format-message';\nimport type { Logger$Writer } from './interfaces';\n\n/**\n * A logged message that is itself an object carrying its own `message` field,\n * which the JSON writer hoists to the top level.\n */\nfunction isMessageObject(value: unknown): value is { message?: unknown } {\n return Boolean(value) && typeof value === 'object';\n}\n\n/**\n * @private\n */\nexport function createWriter(format: Logger$format): Logger$Writer {\n return function write(data) {\n const { level, ...etc } = data;\n let { message, timestamp } = etc;\n let output: unknown;\n\n if (format === 'json') {\n output = {};\n\n if (isMessageObject(message) && message.message) {\n output = {\n timestamp,\n level,\n message: message.message,\n ...omit(message, 'message')\n };\n } else {\n // The Flow original spread `...etc` here too, but `etc` is just\n // `{ message, timestamp }` \u2014 both already listed above with the same\n // values \u2014 so the spread only re-wrote them. Dropping it keeps the\n // identical key order and values.\n output = {\n timestamp,\n level,\n message\n };\n }\n\n output = formatMessage(output, 'json');\n } else {\n let columns = 0;\n\n if (process.stdout instanceof WriteStream) {\n columns = process.stdout.columns;\n }\n\n message = formatMessage(message, 'text');\n\n switch (level) {\n case WARN:\n timestamp = yellow(`[${timestamp}]`);\n break;\n\n case ERROR:\n timestamp = red(`[${timestamp}]`);\n break;\n\n default:\n timestamp = dim(`[${timestamp}]`);\n break;\n }\n\n output = `${timestamp} ${message}\\n\\n${dim('-').repeat(columns)}\\n`;\n }\n\n if (STDOUT.test(level)) {\n process.stdout.write(`${output}\\n`);\n } else if (STDERR.test(level)) {\n process.stderr.write(`${output}\\n`);\n }\n };\n}\n", "/**\n * @private\n */\nexport default function entries<T>(\n source: Record<string, T>\n): Array<[string, T]> {\n return Object.entries(source);\n}\n", "import entries from './entries';\n\n/**\n * Returns a copy of `src` without `omitted` keys.\n *\n * Typed as `Partial<T>` rather than Flow's `T`, since the omitted keys are by\n * definition absent from the result.\n *\n * @private\n */\nexport default function omit<T extends object>(\n src: T,\n ...omitted: string[]\n): Partial<T> {\n return entries(src as Record<string, unknown>)\n .filter(([key]) => omitted.indexOf(key) < 0)\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: value\n }),\n {}\n ) as Partial<T>;\n}\n", "import ansiRegex from 'ansi-regex';\n\nexport const ANSI = ansiRegex();\nexport const STDOUT = /^(DEBUG|INFO)$/;\nexport const STDERR = /^(WARN|ERROR)$/;\n", "import isObject from './is-object';\n\n/**\n * @private\n */\nexport default function stringify(value?: unknown, spaces?: number): string {\n if (isObject(value) || Array.isArray(value)) {\n return JSON.stringify(value, null, spaces);\n }\n\n return String(value);\n}\n", "import { ANSI } from '../constants';\nimport stringify from '../../../../utils/stringify';\nimport type { Logger$format } from '../../interfaces';\n\n/**\n * Returns `string | undefined` because `Error#stack` is optional \u2014 the Flow\n * original had the same behaviour, it just did not say so.\n *\n * `data` is required here; Flow allowed it to be declared optional ahead of a\n * required parameter, which TypeScript does not (and every caller passes both).\n */\nexport default function formatMessage(\n data: unknown,\n format: Logger$format\n): string | undefined {\n if (data instanceof Error) {\n return data.stack;\n } else if (format === 'json') {\n return stringify(data).replace(ANSI, '');\n }\n\n return stringify(data, 2);\n}\n", "import chalk from 'chalk';\n\nimport { DEBUG } from '../../constants';\nimport { infoTemplate, debugTemplate } from '../templates';\nimport type Logger from '../../index';\nimport type { Request, Response } from '../../../server';\n\nimport filterParams from './filter-params';\n\n/**\n * @private\n */\nexport default function logText(\n logger: Logger,\n {\n startTime,\n request: req,\n response: res\n }: {\n request: Request;\n response: Response;\n startTime: number;\n }\n): void {\n res.once('finish', () => {\n const endTime = Date.now();\n\n const {\n route,\n method,\n\n url: { path },\n\n connection: { remoteAddress }\n } = req;\n\n const { stats, statusCode, statusMessage } = res;\n const params = filterParams(req.params, ...logger.filter.params);\n const statusColor = statusCode >= 200 && statusCode < 400 ? 'green' : 'red';\n\n let colorStr: (source: string) => string = Reflect.get(chalk, statusColor);\n\n if (typeof colorStr === 'undefined') {\n colorStr = (str: string) => str;\n }\n\n const templateData = {\n path,\n stats,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode: statusCode.toString(),\n statusMessage,\n remoteAddress\n };\n\n if (logger.level === DEBUG) {\n logger.debug(debugTemplate(templateData));\n } else {\n logger.info(infoTemplate(templateData));\n }\n });\n}\n", "import { blue, cyan, magenta, yellow } from 'chalk';\n\nimport line from '../utils/line';\n\nimport type { RequestLogger$templateData } from './interfaces';\n\n/**\n * @private\n */\nfunction countDigits(num: number) {\n const digits = Math.floor(Math.log10(num) + 1);\n\n return digits > 0 && Number.isFinite(digits) ? digits : 1;\n}\n\n/**\n * @private\n */\nfunction pad(startTime: number, endTime: number, duration: number) {\n const maxLength = countDigits(endTime - startTime);\n\n return ' '.repeat(maxLength - countDigits(duration)) + duration;\n}\n\n/**\n * @private\n */\nexport const debugTemplate = ({\n path,\n stats,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode,\n statusMessage,\n remoteAddress\n}: RequestLogger$templateData) => `\\\n${line`\n Processed ${cyan(`${method}`)} \"${path}\" from ${remoteAddress}\n with ${Reflect.apply(colorStr, null, [`${statusCode}`])}\n ${Reflect.apply(colorStr, null, [`${statusMessage}`])} by ${\n route\n ? `${yellow(route.controller.constructor.name)}#${blue(route.action)}`\n : null\n }\n`}\n\n${magenta('Params')}\n\n${JSON.stringify(params, null, 2)}\n\n${magenta('Stats')}\n\n${stats\n .map(stat => {\n const { type, duration, controller } = stat;\n let { name } = stat;\n\n name = blue(name);\n\n if (type === 'action') {\n name = `${yellow(controller)}#${name}`;\n }\n\n return `${pad(startTime, endTime, duration)} ms ${name}`;\n })\n .join('\\n')}\n${pad(\n startTime,\n endTime,\n stats.reduce((total, { duration }) => total + duration, 0)\n)} ms Total\n${(endTime - startTime).toString()} ms Actual\\\n`;\n\n/**\n * @private\n */\nexport const infoTemplate = ({\n path,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode,\n statusMessage,\n remoteAddress\n}: RequestLogger$templateData) => line`\nProcessed ${cyan(`${method}`)} \"${path}\" ${magenta('Params')} ${JSON.stringify(\n params\n)} from ${remoteAddress} in ${(endTime - startTime).toString()} ms with ${Reflect.apply(\n colorStr,\n null,\n [`${statusCode}`]\n)} ${Reflect.apply(colorStr, null, [`${statusMessage}`])} by ${\n route\n ? `${yellow(route.controller.constructor.name)}#${blue(route.action)}`\n : null\n}\n`;\n", "/**\n * @private\n */\nexport default function insertValues(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n if (values.length) {\n return strings.reduce((result, part, idx): string => {\n const raw: unknown = values[idx];\n let value = '';\n\n if (\n raw &&\n typeof (raw as { toString?: unknown }).toString === 'function'\n ) {\n value = (raw as { toString(): string }).toString();\n }\n\n return result + part + value;\n }, '');\n }\n\n return strings.join('');\n}\n", "import { insertValues } from '../../template';\n\n/**\n * @private\n */\nexport default function line(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n return insertValues(strings, ...values)\n .replace(/(\\r\\n|\\n|\\r|)/gm, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n", "import entries from '../../../../utils/entries';\n\n/**\n * @private\n */\nexport default function filterParams(\n params: Record<string, unknown>,\n ...filtered: string[]\n): Record<string, unknown> {\n return entries(params)\n .map(([key, value]): [string, unknown] => [\n key,\n filtered.indexOf(key) >= 0 ? '[FILTERED]' : value\n ])\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]:\n value && typeof value === 'object' && !Array.isArray(value)\n ? filterParams(value as Record<string, unknown>, ...filtered)\n : value\n }),\n {}\n );\n}\n", "import type Logger from '../../index';\nimport type { Request, Response } from '../../../server';\n\nimport filterParams from './filter-params';\n\nconst MESSAGE = 'Processed Request';\n\n/**\n * @private\n */\nexport default function logJSON(\n logger: Logger,\n {\n request: req,\n response: res\n }: {\n startTime: number;\n request: Request;\n response: Response;\n }\n): void {\n res.once('finish', () => {\n const {\n method,\n headers,\n httpVersion,\n\n url: { path },\n\n connection: { remoteAddress }\n } = req;\n\n const { statusCode: status } = res;\n const userAgent = headers.get('user-agent');\n const protocol = `HTTP/${httpVersion}`;\n const params = filterParams(req.params, ...logger.filter.params);\n\n logger.info({\n message: MESSAGE,\n\n method,\n path,\n params,\n status,\n protocol,\n userAgent,\n remoteAddress\n });\n });\n}\n", "import type Logger from '../index';\n\nimport logText from './utils/log-text';\nimport logJSON from './utils/log-json';\nimport type { Logger$RequestLogger } from './interfaces';\n\n/**\n * @private\n */\nexport function createRequestLogger(logger: Logger): Logger$RequestLogger {\n return function request(req, res, { startTime }: { startTime: number }) {\n if (logger.format === 'json') {\n logJSON(logger, {\n startTime,\n request: req,\n response: res\n });\n } else {\n logText(logger, {\n startTime,\n request: req,\n response: res\n });\n }\n };\n}\n", "import { insertValues } from '../../template';\n\nconst PATTERN = /(?:,?`|'|\").+(?:`|'|\"),?/;\n\n/**\n * @private\n */\nexport default function sql(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n return insertValues(strings, ...values)\n .split(' ')\n .map(part => {\n if (PATTERN.test(part)) {\n return part;\n }\n\n return part.toUpperCase();\n })\n .join(' ');\n}\n", "import { LUMEN_CONSOLE } from '../../constants';\nimport K from '../../utils/k';\n\nimport { LEVELS } from './constants';\nimport { createWriter } from './writer';\nimport { createRequestLogger } from './request-logger';\nimport type { Logger$Writer } from './writer/interfaces';\nimport type { Logger$RequestLogger } from './request-logger/interfaces';\nimport type {\n Logger$config,\n Logger$format,\n Logger$level,\n Logger$logFn,\n Logger$filter\n} from './interfaces';\n\n/**\n * @class Logger\n * @public\n */\nclass Logger {\n /**\n * The level your application should log (DEBUG, INFO, WARN, or ERROR).\n *\n * @property level\n * @type {String}\n * @public\n */\n declare level: Logger$level;\n\n /**\n * The output format of log data (text or json).\n *\n * @property format\n * @type {String}\n * @public\n */\n declare format: Logger$format;\n\n /**\n * Hackers love logs. It's easy to get sensitive user information from log\n * data if your server has been breached. To prevent leaking sensitive\n * information in a potential attack, blacklist certain keys that should be\n * filtered out of the logs.\n *\n * ```javascript\n * // config/environments/development.js\n * export default {\n * logging: {\n * level: 'DEBUG',\n * format: 'text',\n * enabled: true,\n * filter: {\n * params: ['password']\n * }\n * }\n * };\n * ```\n *\n * Now that we've added password to the array of parameters we want to filter\n * out of the logs, let's try to create a new user.\n *\n * ```http\n * POST /users HTTP/1.1\n * Content-Type: application/vnd.api+json\n * Host: 127.0.0.1:4000\n * Connection: close\n * User-Agent: Paw/3.0.14 (Macintosh; OS X/10.12.1) GCDHTTPRequest\n * Content-Length: 188\n *\n * {\n * \"data\": {\n * \"type\": \"users\",\n * \"attributes\": {\n * \"name\": \"Zachary Golba\",\n * \"email\": \"zachary.golba@postlight.com\",\n * \"password\": \"vcZxniFYyfnFDcLn%nhe8Vrt\"\n * }\n * }\n * }\n * ```\n *\n * The request above will yield the following log message.\n *\n * ```text\n * [2016-12-10T18:28:04.610Z] Processed POST \"/users\" from ::ffff:127.0.0.1\n * with 201 Created by UsersController#create\n *\n * Params\n *\n * {\n * \"data\": {\n * \"type\": \"users\",\n * \"attributes\": {\n * \"name\": \"Zachary Golba\",\n * \"email\": \"zachary.golba@postlight.com\",\n * \"password\": \"[FILTERED]\"\n * }\n * }\n * }\n * ```\n *\n * It worked! The password value did not leak into the log message.\n *\n * @property filter\n * @type {Object}\n * @public\n */\n declare filter: Logger$filter;\n\n /**\n * A boolean flag that determines whether or not the logger is enabled.\n *\n * @property enabled\n * @type {Boolean}\n * @public\n */\n declare enabled: boolean;\n\n /**\n * Log a message at the DEBUG level.\n *\n * ```javascript\n * logger.debug('Hello World!');\n * // => [6/4/16 5:46:53 PM] Hello World!\n * ```\n *\n * @method debug\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare debug: Logger$logFn;\n\n /**\n * Log a message at the INFO level.\n *\n * ```javascript\n * logger.info('Hello World!');\n * // => [6/4/16 5:46:53 PM] Hello World!\n * ```\n *\n * @method info\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare info: Logger$logFn;\n\n /**\n * Log a message at the WARN level.\n *\n * ```javascript\n * logger.warn('Good Bye World!');\n * // => [6/4/16 5:46:53 PM] Good Bye World!\n * ```\n *\n * @method warn\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare warn: Logger$logFn;\n\n /**\n * Log a message at the ERROR level.\n *\n * ```javascript\n * logger.warn('HELP!');\n * // => [6/4/16 5:46:53 PM] HELP!\n * ```\n *\n * @method error\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare error: Logger$logFn;\n\n /**\n * Internal method used for logging requests.\n *\n * @method request\n * @param {Request} request\n * @param {Response} response\n * @param {Object} opts - An options object.\n * @param {Number} opts.startTime - The timestamp from when the request was\n * received.\n * @return {void}\n * @private\n */\n declare request: Logger$RequestLogger;\n\n constructor({ level, format, filter, enabled }: Logger$config) {\n let write: Logger$Writer = K;\n let request: Logger$RequestLogger = K;\n\n if (!LUMEN_CONSOLE && enabled) {\n write = createWriter(format);\n request = createRequestLogger(this);\n }\n\n Object.defineProperties(this, {\n level: {\n value: level,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n format: {\n value: format,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n filter: {\n value: filter,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n enabled: {\n value: Boolean(enabled),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n request: {\n value: request,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n const levelNum = LEVELS.get(level) || 0;\n\n LEVELS.forEach((val, key: Logger$level) => {\n Reflect.defineProperty(this, key.toLowerCase(), {\n writable: false,\n enumerable: false,\n configurable: false,\n\n value:\n val >= levelNum\n ? (message?: unknown) => {\n write({\n message,\n level: key,\n timestamp: this.getTimestamp()\n });\n }\n : K\n });\n });\n }\n\n /**\n * @method getTimestamp\n * @return {String} The current time as an ISO8601 string.\n * @private\n */\n getTimestamp() {\n return new Date().toISOString();\n }\n}\n\nexport default Logger;\nexport { default as line } from './utils/line';\nexport { default as sql } from './utils/sql';\n\nexport type { Logger$config } from './interfaces';\n", "/**\n * @private\n */\nclass ModelMissingError extends Error {\n constructor(name: string) {\n super(`Could not resolve model by name '${name}'`);\n }\n}\n\nexport default ModelMissingError;\n", "import { green, yellow } from 'chalk';\n\nimport { line } from '../../logger';\n\n/**\n * @private\n */\nclass MigrationsPendingError extends Error {\n constructor(migrations: Array<string> = []) {\n const pending = migrations\n .map(str => yellow(str.substr(0, str.length - 3)))\n .join(', ');\n\n super(line`\n The following migrations are pending ${pending}.\n Please run ${green('lumen db:migrate')} before starting your application.\n `);\n }\n}\n\nexport default MigrationsPendingError;\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createServerError` wraps an arbitrary error class whose constructor accepts\n * arbitrary arguments; `new (...args: any[])` is required so that error classes\n * with any constructor signature remain assignable to `Constructor<T>`.\n */\nimport type { Server$Error } from '../interfaces';\n\ntype Constructor<T> = new (...args: Array<any>) => T;\n\n/**\n * @private\n */\nexport default function createServerError<T extends object>(\n Target: Constructor<T>,\n statusCode: number\n): Constructor<T & Server$Error> {\n const ServerError = class extends (Target as Constructor<object>) {\n declare statusCode: number;\n\n constructor(...args: Array<unknown>) {\n super(...args);\n this.statusCode = statusCode;\n }\n };\n\n Reflect.defineProperty(ServerError, 'name', {\n value: Target.name\n });\n\n return ServerError as unknown as Constructor<T & Server$Error>;\n}\n", "import createServerError from '../../server/utils/create-server-error';\n\nclass UniqueConstraintError extends Error {}\n\nexport default createServerError(UniqueConstraintError, 409);\n", "class ConfigMissingError extends Error {\n constructor(environment: string) {\n super(`Database config not found for environment ${environment}.`);\n }\n}\n\nexport default ConfigMissingError;\n", "import cluster from 'cluster';\n\nimport { NODE_ENV } from '../../constants';\n\nimport { ConfigMissingError, MigrationsPendingError } from './errors';\nimport connect from './utils/connect';\nimport createMigrations from './utils/create-migrations';\nimport pendingMigrations from './utils/pending-migrations';\nimport type Database from './index';\nimport type { Database$opts } from './index';\n\n/**\n * @private\n */\nexport default async function initialize<T extends Database>(\n instance: T,\n opts: Database$opts\n): Promise<T> {\n const { path, models, logger, checkMigrations } = opts;\n const config = Reflect.get(opts.config, NODE_ENV);\n\n if (!config) {\n throw new ConfigMissingError(NODE_ENV);\n }\n\n const { debug = NODE_ENV === 'development' } = config;\n\n Object.defineProperties(instance, {\n path: {\n value: path,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n debug: {\n value: debug,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n models: {\n value: models,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n config: {\n value: config,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n schema: {\n value: () => instance.connection.schema,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n connection: {\n value: connect(path, config),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n if (cluster.isMaster || (cluster.worker && cluster.worker.id === 1)) {\n await createMigrations(instance.schema);\n\n if (checkMigrations) {\n const pending = await pendingMigrations(path, () =>\n instance.connection('migrations')\n );\n\n if (pending.length) {\n throw new MigrationsPendingError(pending);\n }\n }\n }\n\n await Promise.all(\n Array.from(models.values()).map(model =>\n model.initialize(instance, () => instance.connection(model.tableName))\n )\n );\n\n return instance;\n}\n", "import { join as joinPath } from 'path';\n\nimport type { Knex } from 'knex';\n\nimport { NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { VALID_DRIVERS } from '../constants';\nimport { InvalidDriverError } from '../errors';\nimport type { Database$environment } from '../interfaces';\n\n/**\n * @private\n */\nexport default function connect(\n path: string,\n config: Database$environment\n): Knex {\n let { pool } = config;\n\n const { host, socket, driver, database, username, password, port, ssl, url } =\n config;\n\n if (VALID_DRIVERS.indexOf(driver) < 0) {\n throw new InvalidDriverError(driver);\n }\n\n if (pool && typeof pool === 'number') {\n pool = {\n min: pool > 1 ? 2 : 1,\n max: pool\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const knex = require(joinPath(path, 'node_modules', 'knex'));\n const usingSQLite = driver === 'sqlite3';\n\n const connection = DATABASE_URL ||\n url || {\n host,\n database,\n password,\n port,\n ssl,\n user: username,\n socketPath: socket,\n filename: usingSQLite\n ? joinPath(path, 'db', `${database || 'default'}_${NODE_ENV}.sqlite`)\n : undefined\n };\n\n return knex({\n pool,\n connection,\n debug: false,\n client: driver,\n useNullAsDefault: usingSQLite\n });\n}\n", "import type Database from '../index';\n\n/**\n * @private\n */\nexport default async function createMigrations(\n schema: Database['schema']\n): Promise<boolean> {\n const hasTable: boolean = await schema().hasTable('migrations');\n\n if (!hasTable) {\n await schema().createTable('migrations', table => {\n table.string('version', 16).primary();\n });\n }\n\n return true;\n}\n", "import fs from 'fs';\nimport { join as joinPath, resolve as resolvePath } from 'path';\nimport type { Stats } from 'fs';\n\nimport Watcher from './watcher';\nimport createResolver from './utils/create-resolver';\nimport createPathRemover from './utils/create-path-remover';\nimport type { fs$readOpts, fs$writeOpts } from './interfaces';\n\nexport { default as rmrf } from './utils/rmrf';\nexport { default as exists } from './utils/exists';\nexport { default as isJSFile } from './utils/is-js-file';\nexport { default as parsePath } from './utils/parse-path';\n\nexport type { fs$ParsedPath } from './interfaces';\n\n/**\n * @private\n */\nexport function watch(path: string): Promise<Watcher> {\n return new Watcher(path) as unknown as Promise<Watcher>;\n}\n\n/**\n * @private\n */\nexport function stat(path: string): Promise<Stats> {\n return new Promise((resolve, reject) => {\n fs.stat(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function mkdir(path: string, mode: number = 511): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n fs.mkdir(path, mode, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function mkdirRec(path: string, mode: number = 511): Promise<void> {\n const parent = resolvePath(path, '..');\n\n return stat(parent)\n .catch(err => {\n if (err.code === 'ENOENT') {\n return mkdirRec(parent, mode);\n }\n\n return Promise.reject(err);\n })\n .then(() => mkdir(path, mode))\n .catch(err => {\n if (err.code !== 'EEXIST') {\n return Promise.reject(err);\n }\n\n return Promise.resolve();\n });\n}\n\n/**\n * @private\n */\nexport function rmdir(path: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.rmdir(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function readdir(\n path: string,\n // opts is accepted for signature parity with readdirRec but unused here.\n opts?: fs$readOpts // eslint-disable-line @typescript-eslint/no-unused-vars\n): Promise<Array<string>> {\n return new Promise((resolve, reject) => {\n fs.readdir(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function readdirRec(\n path: string,\n opts?: fs$readOpts\n): Promise<Array<string>> {\n const stripPath = createPathRemover(path);\n\n return readdir(path, opts)\n .then(files =>\n Promise.all(\n files.map(file => {\n const filePath = joinPath(path, file);\n\n return Promise.all([filePath, stat(filePath)]);\n })\n )\n )\n .then(files =>\n Promise.all(\n files.map(([file, stats]) =>\n Promise.all([file, stats.isDirectory() ? readdirRec(file) : []])\n )\n )\n )\n .then(files =>\n files.reduce<Array<string>>((arr, [file, children]) => {\n const basename = stripPath(file);\n\n return [\n ...arr,\n basename,\n ...children.map(child => joinPath(basename, stripPath(child)))\n ];\n }, [])\n );\n}\n\n/**\n * @private\n */\nexport function readFile(\n path: string,\n opts?: fs$readOpts\n): Promise<string | Buffer> {\n return new Promise((resolve, reject) => {\n fs.readFile(\n path,\n (typeof opts === 'object' ? opts : {}) as fs.ObjectEncodingOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function writeFile(\n path: string,\n data: string | Buffer,\n opts?: fs$writeOpts\n): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.writeFile(\n path,\n data,\n (opts || {}) as fs.WriteFileOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function appendFile(\n path: string,\n data: string | Buffer,\n opts?: fs$writeOpts\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n fs.appendFile(\n path,\n data,\n (typeof opts === 'object' ? opts : {}) as fs.WriteFileOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function unlink(path: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.unlink(path, createResolver(resolve, reject));\n });\n}\n", "import EventEmitter from 'events';\nimport type { FSWatcher } from 'fs';\n\nimport { Client } from 'fb-watchman';\n\nimport initialize from './initialize';\n\n/**\n * @private\n */\nclass Watcher extends EventEmitter {\n declare path: string;\n\n declare client: Client | FSWatcher;\n\n constructor(path: string, useWatchman: boolean = true) {\n super();\n // Watchers initialize asynchronously; `initialize` populates `this` and\n // resolves once the watchman/native watcher is wired up, so `new Watcher()`\n // is awaited by callers. TS can't type a Promise-returning constructor.\n return initialize(this, path, useWatchman) as unknown as Watcher;\n }\n\n destroy() {\n const { client } = this;\n\n if (client instanceof Client) {\n client.end();\n } else {\n client.close();\n }\n }\n}\n\nexport default Watcher;\n", "import { join as joinPath } from 'path';\nimport { watch as nativeWatch } from 'fs';\nimport type { FSWatcher } from 'fs';\n\nimport { Client } from 'fb-watchman';\n\nimport exec from '../../../utils/exec';\nimport tryCatch from '../../../utils/try-catch';\nimport isJSFile from '../utils/is-js-file';\nimport { freezeProps } from '../../freezeable';\n\nimport type Watcher from './index';\n\nconst SUBSCRIPTION_NAME = 'lumen-watcher';\n\n/**\n * @private\n */\nfunction fallback(instance: Watcher, path: string): FSWatcher {\n return nativeWatch(\n path,\n {\n recursive: true\n },\n (type, name) => {\n if (typeof name === 'string' && isJSFile(name)) {\n instance.emit('change', [{ name, type }]);\n }\n }\n );\n}\n\n/**\n * @private\n */\nfunction setupWatchmen(instance: Watcher, path: string): Promise<Client> {\n return new Promise((resolve, reject) => {\n const client = new Client();\n\n client.capabilityCheck({}, capabilityErr => {\n if (capabilityErr) {\n reject(capabilityErr);\n return;\n }\n\n client.command(\n ['watch-project', path],\n (watchErr, { watch, relative_path: relativePath } = {}) => {\n if (watchErr) {\n reject(watchErr);\n return;\n }\n\n client.command(['clock', watch], (clockErr, { clock: since }) => {\n if (clockErr) {\n reject(clockErr);\n return;\n }\n\n client.command(\n [\n 'subscribe',\n watch,\n SUBSCRIPTION_NAME,\n {\n since,\n relative_root: relativePath,\n\n fields: ['name', 'size', 'exists', 'type'],\n\n expression: ['allof', ['match', '*.js']]\n }\n ],\n subscribeErr => {\n if (subscribeErr) {\n reject(subscribeErr);\n return;\n }\n\n client.on('subscription', ({ files, subscription }) => {\n if (subscription === SUBSCRIPTION_NAME) {\n instance.emit('change', files);\n }\n });\n\n resolve(client);\n }\n );\n });\n }\n );\n });\n });\n}\n\n/**\n * @private\n */\nexport default async function initialize<T extends Watcher>(\n instance: T,\n path: string,\n useWatchman: boolean\n): Promise<T> {\n const appPath = joinPath(path, 'app');\n let client;\n\n if (useWatchman) {\n await tryCatch(async () => {\n await exec('which watchman');\n client = await setupWatchmen(instance, appPath);\n });\n }\n\n Object.assign(instance, {\n path: appPath,\n client: client || fallback(instance, appPath)\n });\n\n freezeProps(instance, true, 'path', 'client');\n\n return instance;\n}\n", "import K from './k';\n\n/**\n * A utility function used for wrapping async code that would otherwise need a\n * try-catch block.\n *\n * V8 deoptimizes functions when running into try-catch catch due to the\n * unpredictable nature of the code. The `tryCatch` utility function is a way\n * to \"have your cake and eat it too\". Since the inner function (`fn`) will not\n * become deoptimized by V8 for including a standard try-catch block, we don't\n * have to sacrifice as much perf for error handling expensive computations.\n *\n * The `tryCatch` utility is also very useful when you want to perform a noop\n * when an error is thrown as the catch argument (`rescue`) is optional unlike\n * a traditional try-catch block.\n *\n * @example\n * tryCatch(() => {\n * const n = Math.floor(Math.random() * 6);\n *\n * if (n >= 4) {\n * throw new Error('You lose!');\n * } else {\n * return Promise.resolve(n);\n * }\n * }, err => {\n * console.error(err);\n * }).then(luckyNumber => {\n * console.log(`Your lucky number is ${luckyNumber}.`);\n * });\n *\n * @private\n */\nexport default async function tryCatch<T>(\n fn: () => Promise<T>,\n rescue: (err: unknown) => unknown = K\n): Promise<T | undefined> {\n let result: T | undefined;\n\n try {\n result = await fn();\n } catch (err) {\n // `rescue` is a caller-supplied handler with no contract on its return\n // value; when it returns something meaningful it stands in for `fn`'s.\n result = (await rescue(err)) as T | undefined;\n }\n\n return result;\n}\n\n/**\n * A syncronous implementation of the `tryCatch` utility.\n *\n * @example\n * const luckyNumber = tryCatchSync(() => {\n * const n = Math.floor(Math.random() * 6);\n *\n * if (n >= 4) {\n * throw new Error('You lose!');\n * } else {\n * return n;\n * }\n * }, err => {\n * console.error(err);\n * });\n *\n * if (luckyNumber) {\n * console.log(`Your lucky number is ${luckyNumber}.`);\n * }\n *\n * @private\n */\nexport function tryCatchSync<T>(\n fn: () => T,\n rescue: (err: unknown) => unknown = K\n): T | undefined {\n let result: T | undefined;\n\n try {\n result = fn();\n } catch (err) {\n result = rescue(err) as T | undefined;\n }\n\n return result;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Adapts Node's error-first callbacks to Promise settlers; the resolved data\n * varies by fs operation (Stats, string[], Buffer, void), so it is `any` at\n * this adapter boundary.\n */\n\n/**\n * @private\n */\nexport default function createResolver(\n resolve: (data: any) => void,\n reject: (err: Error) => void\n): (err: Error | null, ...args: Array<any>) => void {\n return function fsResolver(err: Error | null, ...args: Array<any>) {\n const [data] = args;\n\n if (err) {\n reject(err);\n return;\n }\n\n resolve(args.length > 1 ? args : data);\n };\n}\n", "import type { Chain } from '../interfaces';\n\n/**\n * @private\n */\nexport default function chain<T>(source: T): Chain<T> {\n return {\n pipe<U>(handler: (value: T) => U): Chain<U> {\n return chain(handler(source));\n },\n\n value(): T {\n return source;\n },\n\n construct<U>(constructor: new (value: T) => U): Chain<U> {\n return chain(Reflect.construct(constructor, [source]) as U);\n }\n };\n}\n", "import { readdir } from '../../fs';\n\n/**\n * @private\n */\nexport default async function pendingMigrations(\n appPath: string,\n table: () => any // eslint-disable-line @typescript-eslint/no-explicit-any\n): Promise<Array<string>> {\n const migrations: Array<string> = await readdir(`${appPath}/db/migrate`);\n const versions: Array<string> = await table()\n .select()\n .then((data: Array<{ version: string }>) =>\n data.map(({ version }) => version)\n );\n\n return migrations.filter(\n migration => versions.indexOf(migration.replace(/^(\\d{16})-.+$/g, '$1')) < 0\n );\n}\n", "import { dasherize, singularize } from 'inflection';\n\nimport { compose } from '../../../utils/compose';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default compose(singularize, dasherize, underscore);\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The intermediate stages of a composed pipeline are genuinely untyped: only\n * the pipeline's input and output are knowable without full variadic typing,\n * which would cost far more than it buys for an internal helper. The `any`s\n * are confined to those intermediate positions \u2014 the exported signatures keep\n * precise `T` -> `U` types.\n */\n\n/**\n * A single stage of a composed pipeline.\n *\n * @private\n */\ntype Stage = (value: any) => any;\n\n/**\n * @private\n */\nexport function tap<T>(input: T): T {\n console.log(input);\n return input;\n}\n\n/**\n * @private\n */\nexport function compose<T, U>(\n main: (input: any) => U,\n ...etc: Stage[]\n): (input: T) => U {\n return input => main(etc.reduceRight<any>((value, fn) => fn(value), input));\n}\n\n/**\n * @private\n */\nexport function composeAsync<T, U>(\n main: (input: any) => Promise<U>,\n ...etc: Stage[]\n): (input: T | Promise<T>) => Promise<U> {\n return input =>\n etc\n .reduceRight<Promise<any>>(\n (value, fn) => Promise.resolve(value).then(fn),\n Promise.resolve(input)\n )\n .then(main);\n}\n", "import { underscore as _ } from 'inflection';\n\n/**\n * @private\n */\nexport default function underscore(\n source: string = '',\n upper: boolean = false\n): string {\n return _(source, upper).replace(/-/g, '_');\n}\n", "import { pluralize } from 'inflection';\n\nimport Query from '../query';\nimport ChangeSet from '../change-set';\nimport { updateRelationship } from '../relationship';\nimport {\n createTransactionResultProxy,\n createStaticTransactionProxy,\n createInstanceTransactionProxy\n} from '../transaction';\nimport pick from '../../../utils/pick';\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\nimport { map as diffMap } from '../../../utils/diff';\nimport mapToObject from '../../../utils/map-to-object';\nimport type Logger from '../../logger';\nimport type Database from '../../database';\nimport type Serializer from '../../serializer';\n\nimport type { Relationship$opts } from '../relationship';\nimport type { ModelClass, Database$column } from '../interfaces';\nimport type { Transaction$ResultProxy } from '../transaction';\n\nimport { create, update, destroy, createRunner } from './utils/persistence';\nimport initializeClass from './initialize-class';\nimport validate from './utils/validate';\nimport runHooks from './utils/run-hooks';\nimport type { Model$Hooks } from './interfaces';\n\n/**\n * @class Model\n * @public\n */\nclass Model {\n // The instance's static side is a `ModelClass`; declaring it lets instance\n // code reach the model class's statics (`this.constructor.relationshipFor`,\n // `.serializer`, `.primaryKey`, ...) with proper types.\n declare ['constructor']: ModelClass;\n\n /**\n * The name of the corresponding database table for a `Model` instance's\n * constructor.\n *\n * @property tableName\n * @type {String}\n * @public\n */\n declare tableName: string;\n\n /**\n * The canonical name of a `Model`'s constructor.\n *\n * @property modelName\n * @type {String}\n * @public\n */\n declare modelName: string;\n\n /**\n * The name of the API resource a `Model` instance's constructor represents.\n *\n * @property resourceName\n * @type {String}\n * @public\n */\n declare resourceName: string;\n\n /**\n * A timestamp representing when the Model instance was created.\n *\n * @property createdAt\n * @type {Date}\n * @public\n */\n declare createdAt: Date;\n\n /**\n * A timestamp representing the last time the Model instance was updated.\n *\n * @property updatedAt\n * @type {Date}\n * @public\n */\n declare updatedAt: Date;\n\n /**\n * @property initialized\n * @type {Boolean}\n * @private\n */\n declare initialized: boolean;\n\n /**\n * @property rawColumnData\n * @type {Object}\n * @private\n */\n declare rawColumnData: Record<string, unknown>;\n\n /**\n * @property isModelInstance\n * @type {Boolean}\n * @private\n */\n declare isModelInstance: boolean;\n\n /**\n * @property prevAssociations\n * @type {Set}\n * @private\n */\n declare prevAssociations: Set<Model>;\n\n /**\n * @property changeSets\n * @type {Array}\n * @private\n */\n declare changeSets: Array<ChangeSet>;\n\n /**\n * An object where you declare `hasOne` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class User extends Model {\n * static hasOne = {\n * profile: {\n * inverse: 'user'\n * // The line above lets Lumen know that this relationship is accessible\n * // on profile instances via `profile.user`.\n * }\n * };\n * }\n *\n * class Profile extends Model {\n * static belongsTo = {\n * user: {\n * inverse: 'profile'\n * // The line above lets Lumen know that this relationship is accessible\n * // on user instances via `user.profile`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Profile extends Model {\n * static belongsTo = {\n * owner: {\n * inverse: 'profile',\n * model: 'user'\n * // The line above lets Lumen know that this is a relationship with the\n * // `User` model and not a non-existent `Owner` model.\n * }\n * };\n * }\n * ```\n *\n * @property hasOne\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hasOne: Record<string, unknown>;\n\n /**\n * An object where you declare `hasMany` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class Author extends Model {\n * static hasMany = {\n * books: {\n * inverse: 'author'\n * // The line above lets Lumen know that this relationship is accessible\n * // on book instances via `book.author`.\n * }\n * };\n * }\n *\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books'\n * // The line above lets Lumen know that this relationship is accessible\n * // on author instances via `author.books`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Author extends Model {\n * static hasMany = {\n * publications: {\n * inverse: 'author',\n * model: 'book'\n * // The line above lets Lumen know that this is a relationship with the\n * // `Book` model and not a non-existent `Publication` model.\n * }\n * };\n * }\n * ```\n *\n * ##### Many to Many\n *\n * In the examples above there is only one owner of relationship. Sometimes we\n * need to express a many to many relationship. Typically in relational\n * databases, this is done with a join table. When declaring a many to many\n * relationship that uses a join table, you must specify the join model.\n *\n * ```javascript\n * class Categorization extends Model {\n * static belongsTo = {\n * tag: {\n * inverse: 'categorization'\n * },\n * post: {\n * inverse: 'categorization'\n * }\n * }\n * }\n *\n * class Tag extends Model {\n * static hasMany = {\n * posts: {\n * inverse: 'tags',\n * through: 'categorizations'\n * }\n * };\n * }\n *\n * class Post extends Model {\n * static hasMany = {\n * tags: {\n * inverse: 'posts',\n * through: 'categorizations'\n * }\n * };\n * }\n * ```\n *\n * @property hasMany\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hasMany: Record<string, unknown>;\n\n /**\n * An object where you declare `belongsTo` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books'\n * // The line above lets Lumen know that this relationship is accessible\n * // on author instances via `author.books`.\n * }\n * };\n * }\n *\n * class Author extends Model {\n * static hasMany = {\n * books: {\n * inverse: 'book'\n * // The line above lets Lumen know that this relationship is accessible\n * // on book instances via `book.author`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * writer: {\n * inverse: 'books',\n * model: 'author'\n * // The line above lets Lumen know that this is a relationship with the\n * // `Author` model and not a non-existent `Writer` model.\n * }\n * };\n * }\n * ```\n *\n * Sometimes our foreign keys in the database do not follow conventions (i.e\n * `author_id`). You have the option to manually specify foreign keys when a\n * situation like this occurs.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books',\n * foreignKey: 'SoMe_UnCoNvEnTiOnAl_FoReIgN_KeY'\n * }\n * };\n * }\n * ```\n *\n * @property belongsTo\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static belongsTo: Record<string, unknown>;\n\n /**\n * An object where you declare validations for an instance's attributes.\n *\n * Before a model instance is saved, validations declared in this block are\n * executed. To declare a validation for a model attribute, simply add the\n * attribute name as a key to the validates object. The value for the\n * attribute key should be a function that takes a single argument (the value\n * to validate against) and return a boolean value represent whether or not\n * the attribute is valid.\n *\n * ```javascript\n * class User extends Model {\n * static validates {\n * username: value => /^\\w{2,30}$/.test(value),\n * password: value => String(value).length >= 8\n * };\n * }\n * ```\n *\n * In the spirit of have a small api surface area, Lumen provides no validation\n * helper functions. You can roll your own helpers with or use one of the many\n * excellent validation libraries like [validator](https://goo.gl/LWaHBB).\n *\n * ```javascript\n * import { isEmail } from 'validator';\n *\n * class User extends Model {\n * static validates {\n * email: isEmail\n * };\n * }\n * ```\n *\n * @property validates\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static validates: Record<string, unknown>;\n\n /**\n * An object where you declare custom query scopes for the model.\n *\n * Scopes allow you to DRY up query logic by chaining custom set's of queries\n * with built-in query method such as `where`, `not`, `page`, etc. To declare\n * a scope, add it as a method on the scopes object.\n *\n * ```javascript\n * class Post extends Model {\n * static hasMany = {\n * tags: {\n * inverse: 'posts'\n * },\n * comments: {\n * inverse: 'post'\n * }\n * };\n *\n * static belongsTo = {\n * user: {\n * inverse: 'posts'\n * }\n * };\n *\n * static scopes = {\n * isPublic() {\n * return this.where({\n * isPublic: true\n * });\n * },\n *\n * byUser(user) {\n * return this.where({\n * userId: user.id\n * });\n * },\n *\n * withEverything() {\n * return this.includes('tags', 'user', 'comments');\n * }\n * };\n * }\n * ```\n *\n * Given the scopes declared in the example above, here is how we could return\n * all the public posts with relationships eager loaded for the user with the\n * id of 1.\n *\n * ```javascript\n * const user = await User.find(1);\n *\n * return Post\n * .byUser(user)\n * .isPublic()\n * .withEverything();\n * ```\n *\n * Since scopes can be chained with built-in query methods, we can easily\n * paginate this collection.\n *\n * ```javascript\n * const user = await User.find(1);\n *\n * return Post\n * .byUser(user)\n * .isPublic()\n * .withEverything()\n * .page(1);\n * ```\n *\n * @property scopes\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static scopes: Record<string, unknown>;\n\n /**\n * An object where you declare hooks to execute at certain times in a model\n * instance's lifecycle.\n *\n * There are many lifecycle hooks that are executed through out a model\n * instance's lifetime. The have many use cases such as sanitization of\n * attributes, creating dependent relationships, hashing passwords, and much\n * more.\n *\n * ##### Execution Order\n *\n * When creating a record.\n *\n * 1. beforeValidation\n * 2. afterValidation\n * 3. beforeCreate\n * 4. beforeSave\n * 5. afterCreate\n * 6. afterSave\n *\n * When updating a record.\n *\n * 1. beforeValidation\n * 2. afterValidation\n * 3. beforeUpdate\n * 4. beforeSave\n * 5. afterUpdate\n * 6. afterSave\n *\n * When deleting a record.\n *\n * 1. beforeDestroy\n * 2. afterDestroy\n *\n * ##### Anatomy\n *\n * Hooks are async functions that are called with two arguments. The first\n * argument is the record that the hook applies to and the second argument is\n * the transaction object relevant to the method from which the hook was\n * called.\n *\n * The only time you will need to use the transaction object is if you are\n * creating, updating, or deleting different record(s) within the hook. Using\n * the transaction object when modifying the database in a hook ensures that\n * any modifications made within the hook will be rolled back if the function\n * that initiated the transaction fails.\n *\n * ```javascript\n * import Notification from 'app/models/notification';\n *\n * class Comment extends Model {\n * static belongsTo = {\n * post: {\n * inverse: 'comments'\n * },\n * user: {\n * inverse: 'comments'\n * }\n * };\n *\n * static hooks = {\n * async afterCreate(comment, trx) {\n * let [post, commenter] = await Promise.all([\n * comment.post,\n * comment.user\n * ]);\n *\n * const commentee = await post.user;\n *\n * post = post.title;\n * commenter = commenter.name;\n *\n * // Calling .transacting(trx) prevents the commentee from getting a\n * // notification if the comment fails to be persisted in the database.\n * await Notification\n * .transacting(trx)\n * .create({\n * user: commentee,\n * message: `${commenter} commented on your post \"${post}\"`\n * });\n * },\n *\n * async afterSave() {\n * // Good thing you called transacting in afterCreate.\n * throw new Error('Fatal Error');\n * }\n * };\n * }\n * ```\n *\n * @property hooks\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hooks: Model$Hooks;\n\n /**\n * A reference to the application's logger.\n *\n * @property logger\n * @type {Logger}\n * @static\n * @public\n */\n declare static logger: Logger;\n\n /**\n * The name of the corresponding database table for the model.\n *\n * @property tableName\n * @type {String}\n * @static\n * @public\n */\n declare static tableName: string;\n\n /**\n * The canonical name of the model.\n *\n * @property modelName\n * @type {String}\n * @static\n * @public\n */\n declare static modelName: string;\n\n /**\n * The name of the resource the model represents.\n *\n * @property resourceName\n * @type {String}\n * @static\n * @public\n */\n declare static resourceName: string;\n\n /**\n * The column name to use for a model's primary key.\n *\n * @property primaryKey\n * @type {String}\n * @default 'id'\n * @static\n * @public\n */\n static primaryKey: string = 'id';\n\n /**\n * @property table\n * @type {Function}\n * @static\n * @private\n */\n declare static table: () => unknown;\n\n /**\n * @property store\n * @type {Database}\n * @static\n * @private\n */\n declare static store: Database;\n\n /**\n * @property initialized\n * @type {Boolean}\n * @static\n * @private\n */\n declare static initialized: boolean;\n\n /**\n * @property serializer\n * @type {Serializer}\n * @static\n * @private\n */\n declare static serializer: Serializer<Model>;\n\n /**\n * @property attributes\n * @type {Object}\n * @static\n * @private\n */\n declare static attributes: Record<string, unknown>;\n\n /**\n * @property attributeNames\n * @type {Array}\n * @static\n * @private\n */\n declare static attributeNames: Array<string>;\n\n /**\n * @property relationships\n * @type {Object}\n * @static\n * @private\n */\n declare static relationships: Record<string, Relationship$opts>;\n\n /**\n * @property relationshipNames\n * @type {Array}\n * @static\n * @private\n */\n declare static relationshipNames: Array<string>;\n\n constructor(attrs: Record<string, unknown> = {}, initialize: boolean = true) {\n Object.defineProperties(this, {\n changeSets: {\n value: [new ChangeSet()],\n writable: false,\n enumerable: false,\n configurable: false\n },\n rawColumnData: {\n value: attrs,\n writable: false,\n enumerable: false,\n configurable: false\n },\n prevAssociations: {\n value: new Set(),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n const {\n constructor: { attributeNames, relationshipNames }\n } = this;\n const props = pick(attrs, ...attributeNames.concat(relationshipNames));\n\n Object.assign(this, props);\n\n if (initialize) {\n Reflect.defineProperty(this, 'initialized', {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n return this;\n }\n\n /**\n * Indicates if the model is new.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * let post = new Post({\n * body: '',\n * title: 'New Post',\n * isPublic: false\n * });\n *\n * post.isNew;\n * // => true\n *\n * Post.create({\n * body: '',\n * title: 'New Post',\n * isPublic: false\n * }).then(post => {\n * post.isNew;\n * // => false;\n * });\n * ```\n *\n * @property isNew\n * @type {Boolean}\n * @public\n */\n get isNew(): boolean {\n return !this.persistedChangeSet;\n }\n\n /**\n * Indicates if the model is dirty.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * Post\n * .find(1)\n * .then(post => {\n * post.isDirty;\n * // => false\n *\n * post.isPublic = true;\n *\n * post.isDirty;\n * // => true\n *\n * return post.save();\n * })\n * .then(post => {\n * post.isDirty;\n * // => false\n * });\n * ```\n *\n * @property isDirty\n * @type {Boolean}\n * @public\n */\n get isDirty(): boolean {\n return Boolean(this.dirtyProperties.size);\n }\n\n /**\n * Indicates if the model is persisted.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * Post\n * .find(1)\n * .then(post => {\n * post.persisted;\n * // => true\n *\n * post.isPublic = true;\n *\n * post.persisted;\n * // => false\n *\n * return post.save();\n * })\n * .then(post => {\n * post.persisted;\n * // => true\n * });\n * ```\n *\n * @property persisted\n * @type {Boolean}\n * @public\n */\n get persisted(): boolean {\n return !this.isNew && !this.isDirty;\n }\n\n /**\n * @property dirtyAttributes\n * @type {Map}\n * @public\n */\n get dirtyAttributes(): Map<string, unknown> {\n const {\n dirtyProperties,\n constructor: { relationshipNames }\n } = this;\n\n Array.from(dirtyProperties.keys()).forEach(key => {\n if (relationshipNames.indexOf(key) >= 0) {\n dirtyProperties.delete(key);\n }\n });\n\n return dirtyProperties;\n }\n\n /**\n * @property dirtyRelationships\n * @type {Map}\n * @public\n */\n get dirtyRelationships(): Map<string, unknown> {\n const {\n dirtyProperties,\n constructor: { attributeNames }\n } = this;\n\n Array.from(dirtyProperties.keys()).forEach(key => {\n if (attributeNames.indexOf(key) >= 0) {\n dirtyProperties.delete(key);\n }\n });\n\n return dirtyProperties;\n }\n\n /**\n * @property dirtyProperties\n * @type {Map}\n * @private\n */\n get dirtyProperties(): Map<string, unknown> {\n const { currentChangeSet, persistedChangeSet } = this;\n\n if (!persistedChangeSet) {\n return new Map(currentChangeSet);\n }\n\n return diffMap(persistedChangeSet, currentChangeSet);\n }\n\n /**\n * @property currentChangeSet\n * @type {ChangeSet}\n * @private\n */\n get currentChangeSet(): ChangeSet {\n return this.changeSets[0];\n }\n\n /**\n * @property currentChangeSet\n * @type {void | ChangeSet}\n * @private\n */\n get persistedChangeSet(): ChangeSet | undefined {\n return this.changeSets.find(({ isPersisted }) => isPersisted);\n }\n\n /**\n * Specify the transaction object to use for following save, update, or\n * destroy method calls.\n *\n * When you call a method like update or destroy, lumen will create a\n * transaction and wrap the internals of the method and other downstream\n * method calls like model hooks within. In some edge cases it can be more\n * useful to manually initiate the transaction. Bulk updating or destroying\n * are good examples of this. When you manually begin a transaction, you can\n * call this method to specify the transaction object that you would like to\n * use for subsequent mutation methods (save, update, destroy, etc.) so lumen\n * knows not to automatically begin a new transaction if/when a mutation\n * method is called.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * // This call to update uses the transaction that lumen will initiate.\n * await post.update({\n * // updates to post...\n * });\n *\n * await post.transaction(trx => {\n * // This call to update uses the transaction that we created with the\n * // call to the transaction method.\n * return post\n * .transacting(trx)\n * .update({\n * // updates to post...\n * });\n * });\n * ```\n *\n * @method transacting\n * @param {Transaction} transaction - A transaction object to forward to save,\n * update, or destroy method calls.\n * @return {Model} - Returns a proxied version of `this` that delagates the\n * transaction param to subsquent save, update, or destroy method calls.\n * @public\n */\n transacting(trx: unknown): this {\n return createInstanceTransactionProxy(this, trx);\n }\n\n /**\n * Manually begin a new transaction.\n *\n * Most of the time, you don't need to start transactions yourself. However,\n * if you need to do something like implement bulk updating of related records\n * the transaction method can be useful.\n *\n * ```javascript\n * const post = await Post.first().include('user');\n * const user = await post.user;\n *\n * await post.transaction(trx => {\n * return Promise.all([\n * post.transacting(trx).update({\n * // updates to post...\n * }),\n * user.transacting(trx).update({\n * // updates to user...\n * })\n * ]);\n * });\n * ```\n *\n * @method transaction\n * @param {Function} fn - The function used for executing the tranasction.\n * This function is called with a new transaction object as it's only argument\n * and is expected to return a promise.\n * @return {Promise} Resolves with the resolved value of the fn param.\n * @public\n */\n transaction<T>(fn: (...args: Array<unknown>) => Promise<T>): Promise<T> {\n return this.constructor.transaction(fn);\n }\n\n /**\n * Persist any unsaved changes to the database.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * console.log(post.title, post.isDirty);\n * // => 'New Post' false\n *\n * post.title = 'How to Save a Lumen Model';\n *\n * console.log(post.title, post.isDirty);\n * // => 'How to Update a Lumen Model' true\n *\n * await post.save();\n *\n * console.log(post.title, post.isDirty);\n * // => 'How to Save a Lumen Model' false\n * ```\n *\n * @method save\n * @return {Promise} Resolves with `this`.\n * @public\n */\n save(transaction?: unknown): Promise<Transaction$ResultProxy<this, boolean>> {\n return this.update(mapToObject(this.dirtyProperties), transaction);\n }\n\n /**\n * Assign values to the instance and persist any changes to the database.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * console.log(post.title, post.isPublic, post.isDirty);\n * // => 'New Post' false false\n *\n * await post.update({\n * title: 'How to Update a Lumen Model',\n * isPublic: true\n * });\n *\n * console.log(post.title, post.isPublic, post.isDirty);\n * // => 'How to Update a Lumen Model' true false\n * ```\n *\n * @method update\n * @param {Object} properties - An object containing key, value pairs of the\n * attributes and/or relationships you would like to assign to the instance.\n * @return {Promise} Resolves with `this`.\n * @public\n */\n update(\n props: Record<string, unknown> = {},\n transaction?: unknown\n ): Promise<Transaction$ResultProxy<this, boolean>> {\n const run = async (trx: unknown) => {\n const {\n constructor: { hooks, logger }\n } = this;\n let statements: Array<unknown> = [];\n let promise: Array<unknown> | Promise<Array<unknown>> = Promise.resolve(\n []\n );\n let hadDirtyAttrs = false;\n let hadDirtyAssoc = false;\n\n const associations = Object.keys(props).filter(key =>\n Boolean(this.constructor.relationshipFor(key))\n );\n\n Object.assign(this, props);\n\n if (associations.length) {\n hadDirtyAssoc = true;\n statements = associations.reduce<Array<unknown>>(\n (arr, key) => [...arr, ...updateRelationship(this, key, trx)],\n []\n );\n }\n\n if (this.isDirty) {\n hadDirtyAttrs = true;\n\n await runHooks(this, trx, hooks.beforeValidation);\n\n validate(this);\n\n await runHooks(\n this,\n trx,\n hooks.afterValidation,\n hooks.beforeUpdate,\n hooks.beforeSave\n );\n\n promise = update(this, trx);\n }\n\n await createRunner(logger, statements)(await promise);\n\n this.prevAssociations.clear();\n this.currentChangeSet.persist(this.changeSets);\n\n if (hadDirtyAttrs) {\n await runHooks(this, trx, hooks.afterUpdate, hooks.afterSave);\n }\n\n return createTransactionResultProxy(this, hadDirtyAttrs || hadDirtyAssoc);\n };\n\n if (transaction) {\n return run(transaction);\n }\n\n return this.transaction(run);\n }\n\n /**\n * Permanently delete the instance from the database.\n *\n * @method destroy\n * @return {Promise} Resolves with `this`.\n * @public\n */\n destroy(transaction?: unknown): Promise<Transaction$ResultProxy<this, true>> {\n const run = async (trx: unknown) => {\n const {\n constructor: { hooks, logger }\n } = this;\n\n await runHooks(this, trx, hooks.beforeDestroy);\n await createRunner(logger, [])(await destroy(this, trx));\n await runHooks(this, trx, hooks.afterDestroy);\n\n return createTransactionResultProxy(this, true);\n };\n\n if (transaction) {\n return run(transaction);\n }\n\n return this.transaction(run);\n }\n\n /**\n * Reload the record from the database.\n *\n * @method reload\n * @return {Promise} Resolves with `this`.\n * @public\n */\n reload(): Promise<Model> {\n if (this.isNew) {\n return Promise.resolve(this);\n }\n\n return this.constructor.find(this.getPrimaryKey());\n }\n\n /**\n * Rollback attributes and relationships to the last known persisted set of\n * values.\n *\n * @method rollback\n * @return {Model} Returns `this`.\n * @public\n */\n rollback(): this {\n const { persistedChangeSet } = this;\n\n if (persistedChangeSet && !this.currentChangeSet.isPersisted) {\n persistedChangeSet.applyTo(this).persist(this.changeSets);\n }\n\n return this;\n }\n\n /**\n * @method getAttributes\n * @param {String} [...keys] - The keys of the properties to return.\n * @return {Object} An object containing keys that were passed in as agruments\n * and their associated values.\n * @private\n */\n getAttributes(...keys: Array<string>): Record<string, unknown> {\n return pick(this, ...keys);\n }\n\n /**\n * @method getPrimaryKey\n * @return {Number} The value of the primary key for the instance.\n * @private\n */\n getPrimaryKey(): number {\n return Reflect.get(this, this.constructor.primaryKey) as number;\n }\n\n /**\n * Create and persist a new instance of the model.\n *\n * @method create\n * @param {Object} properties - An object containing key, value pairs of the\n * attributes and/or relationships you would like to assign to the instance.\n * @return {Promise} Resolves with the newly created model.\n * @static\n * @public\n */\n static create(\n props: Record<string, unknown> = {},\n transaction?: unknown\n ): Promise<Transaction$ResultProxy<Model, true>> {\n const run = async (trx: unknown) => {\n const { hooks, logger, primaryKey } = this;\n const instance = Reflect.construct(this, [props, false]);\n\n await runHooks(instance, trx, hooks.beforeValidation);\n\n validate(instance);\n\n await runHooks(\n instance,\n trx,\n hooks.afterValidation,\n hooks.beforeCreate,\n hooks.beforeSave\n );\n\n const runner = createRunner(logger, []);\n const [[firstRow]] = await runner(await create(instance, trx));\n\n // `insert().returning(pk)` yields a scalar `[1]` on knex 0.16 but an\n // object `[{ id: 1 }]` on knex >= 1 (once `RETURNING` reached sqlite).\n // Normalize both so the primary key stays a scalar.\n const primaryKeyValue =\n firstRow !== null && typeof firstRow === 'object'\n ? Reflect.get(firstRow, primaryKey)\n : firstRow;\n\n Reflect.set(instance, primaryKey, primaryKeyValue);\n Reflect.set(instance.rawColumnData, primaryKey, primaryKeyValue);\n\n let statements: Array<unknown> = [];\n const associations = Object.keys(props).filter(key =>\n Boolean(this.relationshipFor(key))\n );\n\n if (associations.length) {\n statements = associations.reduce<Array<unknown>>(\n (arr, key) => [...arr, ...updateRelationship(instance, key, trx)],\n []\n );\n }\n\n await Promise.all(statements);\n\n Reflect.defineProperty(instance, 'initialized', {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n instance.currentChangeSet.persist(instance.changeSets);\n\n await runHooks(instance, trx, hooks.afterCreate, hooks.afterSave);\n\n return createTransactionResultProxy(instance, true);\n };\n\n if (transaction) {\n return run(transaction);\n }\n\n return this.transaction(run);\n }\n\n /**\n * Specify the transaction object to use for following save, update, or\n * destroy method calls.\n *\n * When you call a method like update or destroy, lumen will create a\n * transaction and wrap the internals of the method and other downstream\n * method calls like model hooks within. In some edge cases it can be more\n * useful to manually initiate the transaction. Bulk updating or destroying\n * are good examples of this. When you manually begin a transaction, you can\n * call this method to specify the transaction object that you would like to\n * use for calls to the static create method so lumen knows not to automatically\n * begin a new transaction if/when the static create method is called.\n *\n * ```javascript\n * // This call to create uses the transaction that lumen will initiate.\n * await Post.create();\n *\n * await Post.transaction(trx => {\n * // This call to create uses the transaction that we created with the\n * // call to the transaction method.\n * return Post\n * .transacting(trx)\n * .create();\n * });\n * ```\n *\n * @method transacting\n * @param {Transaction} transaction - A transaction object to forward to\n * create method calls.\n * @return {Model} - Returns a proxied version of `this` that delagates the\n * transaction param to subsquent create method calls.\n * @static\n * @public\n */\n static transacting(trx: unknown): ModelClass {\n return createStaticTransactionProxy(this, trx);\n }\n\n /**\n * Manually begin a new transaction.\n *\n * Most of the time, you don't need to start transactions yourself. However,\n * the transaction method can be useful if you need to do something like\n * bulk creating records.\n *\n * ```javascript\n * await Post.transaction(trx => {\n * return Promise.all([\n * Post.transacting(trx).create({\n * // ...props\n * }),\n * Post.transacting(trx).create({\n * // ...props\n * })\n * ]);\n * });\n * ```\n *\n * @method transaction\n * @param {Function} fn - The function used for executing the tranasction.\n * This function is called with a new transaction object as it's only argument\n * and is expected to return a promise.\n * @return {Promise} Resolves with the resolved value of the fn param.\n * @static\n * @public\n */\n static transaction<T>(\n fn: (...args: Array<unknown>) => Promise<T>\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const {\n store: { connection }\n } = this;\n let result: T;\n\n connection\n .transaction(trx => {\n fn(trx)\n .then(data => {\n result = data;\n return trx.commit();\n })\n .catch(trx.rollback);\n })\n .then(() => {\n resolve(result);\n })\n .catch(err => {\n reject(err);\n });\n });\n }\n\n static all(): Query<Array<Model>> {\n return new Query(this).all();\n }\n\n static find(primaryKey: unknown): Query<Model> {\n return new Query(this).find(primaryKey);\n }\n\n static page(num: number): Query<Array<Model>> {\n return new Query(this).page(num);\n }\n\n static limit(amount: number): Query<Array<Model>> {\n return new Query(this).limit(amount);\n }\n\n static offset(amount: number): Query<Array<Model>> {\n return new Query(this).offset(amount);\n }\n\n static count(): Query<number> {\n return new Query(this).count();\n }\n\n static order(attr: string, direction?: string): Query<Array<Model>> {\n return new Query(this).order(attr, direction);\n }\n\n static where(conditions: Record<string, unknown>): Query<Array<Model>> {\n return new Query(this).where(conditions);\n }\n\n static whereBetween(\n conditions: Record<string, unknown>\n ): Query<Array<Model>> {\n return new Query(this).whereBetween(conditions);\n }\n\n static whereRaw(\n query: string,\n bindings: Array<unknown> = []\n ): Query<Array<Model>> {\n return new Query(this).whereRaw(query, bindings);\n }\n\n static not(conditions: Record<string, unknown>): Query<Array<Model>> {\n return new Query(this).not(conditions);\n }\n\n static first(): Query<Model> {\n return new Query(this).first();\n }\n\n static last(): Query<Model> {\n return new Query(this).last();\n }\n\n static select(...params: Array<string>): Query<Array<Model>> {\n return new Query(this).select(...params);\n }\n\n static distinct(...params: Array<string>): Query<Array<Model>> {\n return new Query(this).distinct(...params);\n }\n\n static include(\n ...relationships: Array<string | Record<string, unknown>>\n ): Query<Array<Model>> {\n return new Query(this).include(...relationships);\n }\n\n static unscope(...scopes: Array<string>): Query<Array<Model>> {\n return new Query(this).unscope(...scopes);\n }\n\n /**\n * Check if a model has a scope.\n *\n * @method hasScope\n * @param {String} name - The name of the scope to look for.\n * @return {Boolean}\n * @static\n * @public\n */\n static hasScope(name: string): boolean {\n return Boolean(Reflect.get(this.scopes, name));\n }\n\n /**\n * Check if a value is an instance of a model.\n *\n * @method isInstance\n * @param {any} value - The value in question.\n * @return {Boolean}\n * @static\n * @public\n */\n static isInstance(value: unknown): boolean {\n return value instanceof this;\n }\n\n /**\n * Bind the model's connection to the database and get inferred data from the\n * schema upon application boot.\n *\n * @method initialize\n * @param {Database} store - A reference of the applications database\n * instance.\n * @param {Table} table - A function that returns a knex query builder bound\n * to the model's table name.\n * @return {Promise} Resolves with the model class.\n * @static\n * @private\n */\n static initialize(\n store: Database,\n table: () => unknown\n ): Promise<ModelClass> {\n if (this.initialized) {\n return Promise.resolve(this);\n }\n\n if (!this.tableName) {\n const getTableName = compose(pluralize, underscore);\n const tableName = getTableName(this.name);\n\n Reflect.defineProperty(this, 'tableName', {\n value: tableName,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n Reflect.defineProperty(this.prototype, 'tableName', {\n value: tableName,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n return initializeClass({\n store,\n table,\n model: this\n });\n }\n\n /**\n * @method columnFor\n * @param {String} key - The respective attribute name of the column.\n * @return {void | Object} An object containing metadata about the column if a\n * match is found.\n * @static\n * @private\n */\n static columnFor(key: string): Database$column | undefined {\n return Reflect.get(this.attributes, key) as Database$column | undefined;\n }\n\n /**\n * @method columnNameFor\n * @param {String} key - The respective attribute name of the column.\n * @return {void | String} The name of the column in the database if a match\n * is found.\n * @static\n * @private\n */\n static columnNameFor(key: string): string | undefined {\n const column = this.columnFor(key);\n\n return column ? column.columnName : undefined;\n }\n\n /**\n * @method relationshipFor\n * @param {String} key - The name of the relationship to match against.\n * @return {void | Object} An object containing relationship metadata if a\n * match is found.\n * @static\n * @private\n */\n static relationshipFor(key: string): Relationship$opts | undefined {\n return Reflect.get(this.relationships, key);\n }\n}\n\nexport default Model;\nexport type { Model$Hook, Model$Hooks } from './interfaces';\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `Query` is the chainable query builder. Its snapshot tuples (method name +\n * arbitrary Knex arguments), where/include condition objects, and the values it\n * ultimately resolves are genuinely dynamic; the original Flow typed them\n * `any`/`Object` for the same reason. The generic `T` still types what a query\n * resolves to for callers.\n */\nimport { camelize } from 'inflection';\n\nimport entries from '../../../utils/entries';\nimport uniq from '../../../utils/uniq';\nimport type { ModelClass } from '../interfaces';\n\nimport scopesFor from './utils/scopes-for';\nimport formatSelect from './utils/format-select';\nimport { runQuery, createRunner } from './runner';\n\n/**\n * @class Query\n * @extends Promise\n * @private\n */\nclass Query<T = any> extends Promise<T> {\n declare model: ModelClass;\n\n declare isFind: boolean;\n\n declare snapshots: Array<Array<any>>;\n\n declare collection: boolean;\n\n declare shouldCount: boolean;\n\n declare relationships: Record<string, any>;\n\n constructor(model: ModelClass) {\n let resolve;\n let reject;\n\n super((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n createRunner(this, {\n resolve,\n reject\n });\n\n Object.defineProperties(this, {\n model: {\n value: model,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n collection: {\n value: true,\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n snapshots: {\n value: [],\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n shouldCount: {\n value: false,\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n relationships: {\n value: {},\n writable: true,\n enumerable: false,\n configurable: false\n }\n });\n\n Object.defineProperties(this, scopesFor(this));\n }\n\n static override get [Symbol.species]() {\n return Promise;\n }\n\n all(): this {\n return this;\n }\n\n not(conditions: Record<string, any> = {}): this {\n return this.where(conditions, true);\n }\n\n find(primaryKey: any): this {\n Object.assign(this, {\n isFind: true,\n collection: false\n });\n\n this.where({\n [this.model.primaryKey]: primaryKey\n });\n\n if (!this.shouldCount) {\n this.limit(1);\n }\n\n return this;\n }\n\n page(num?: number): this {\n if (this.shouldCount) {\n return this;\n }\n\n let limit: any = this.snapshots.find(([name]) => name === 'limit');\n\n if (limit) {\n [, limit] = limit;\n }\n\n if (typeof limit !== 'number') {\n limit = 25;\n }\n\n this.limit(limit);\n\n return this.offset(Math.max(parseInt(String(num), 10) - 1, 0) * limit);\n }\n\n limit(amount?: number): this {\n if (!this.shouldCount) {\n this.snapshots.push(['limit', amount]);\n }\n\n return this;\n }\n\n order(attr: string, direction: string = 'ASC'): this {\n if (!this.shouldCount) {\n const columnName = this.model.columnNameFor(attr);\n\n if (columnName) {\n this.snapshots = this.snapshots\n .filter(([method]) => method !== 'orderByRaw')\n .concat([\n [\n 'orderByRaw',\n uniq([columnName, this.model.primaryKey])\n .map(key => `${this.model.tableName}.${key} ${direction}`)\n .join(', ')\n ]\n ]);\n }\n }\n\n return this;\n }\n\n where(conditions: Record<string, any> = {}, not: boolean = false): this {\n const {\n model: { tableName }\n } = this;\n\n const where = entries(conditions).reduce<Record<string, any>>(\n (obj, condition) => {\n let [key, value] = condition;\n const columnName = this.model.columnNameFor(key);\n\n if (columnName) {\n key = `${tableName}.${columnName}`;\n\n if (typeof value === 'undefined') {\n value = null;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 1) {\n return {\n ...obj,\n [key]: value[0]\n };\n }\n\n this.snapshots.push([not ? 'whereNotIn' : 'whereIn', [key, value]]);\n } else if (value === null) {\n this.snapshots.push([not ? 'whereNotNull' : 'whereNull', [key]]);\n } else {\n return {\n ...obj,\n [key]: value\n };\n }\n }\n\n return obj;\n },\n {}\n );\n\n if (Object.keys(where).length) {\n this.snapshots.push([not ? 'whereNot' : 'where', where]);\n }\n\n return this;\n }\n\n whereBetween(conditions: Record<string, any>, not: boolean = false): this {\n const {\n model: { tableName }\n } = this;\n\n entries(conditions).forEach(condition => {\n let [key] = condition;\n const [, value] = condition;\n const columnName = this.model.columnNameFor(key);\n\n if (columnName) {\n key = `${tableName}.${columnName}`;\n\n if (Array.isArray(value)) {\n this.snapshots.push([\n `where${not ? 'NotBetween' : 'Between'}`,\n [key, value]\n ]);\n }\n }\n });\n\n return this;\n }\n\n whereRaw(query: string, bindings: Array<any> = []): this {\n this.snapshots.push(['whereRaw', [query, bindings]]);\n return this;\n }\n\n first(): this {\n if (!this.shouldCount) {\n const willSort = this.snapshots.some(\n ([method]) => method === 'orderByRaw'\n );\n\n this.collection = false;\n\n if (!willSort) {\n this.order(this.model.primaryKey, 'ASC');\n }\n\n this.limit(1);\n }\n\n return this;\n }\n\n last(): this {\n if (!this.shouldCount) {\n const willSort = this.snapshots.some(\n ([method]) => method === 'orderByRaw'\n );\n\n this.collection = false;\n\n if (!willSort) {\n this.order(this.model.primaryKey, 'DESC');\n }\n\n this.limit(1);\n }\n\n return this;\n }\n\n count(): Query<number> {\n const validName = /^(where(((Not)?(In)?)|(Raw)|(Between)))$/g;\n\n Object.assign(this, {\n shouldCount: true,\n\n snapshots: [\n ['count', '* as countAll'],\n ...this.snapshots.filter(([name]) => validName.test(name))\n ]\n });\n\n return this as unknown as Query<number>;\n }\n\n offset(amount: number): this {\n if (!this.shouldCount) {\n this.snapshots.push(['offset', amount]);\n }\n\n return this;\n }\n\n select(...attrs: Array<string>): this {\n if (!this.shouldCount) {\n this.snapshots.push(['select', formatSelect(this.model, attrs)]);\n }\n\n return this;\n }\n\n distinct(...attrs: Array<string>): this {\n if (!this.shouldCount) {\n this.snapshots.push(['distinct', formatSelect(this.model, attrs)]);\n }\n\n return this.select();\n }\n\n include(...relationships: Array<Record<string, any> | string>): this {\n let included: Array<any>;\n\n if (!this.shouldCount) {\n if (relationships.length === 1 && typeof relationships[0] === 'object') {\n included = entries(relationships[0]).reduce<Array<any>>(\n (arr, relationship) => {\n const [name] = relationship;\n const opts = this.model.relationshipFor(name);\n let [, attrs] = relationship;\n\n if (opts) {\n if (!attrs.length) {\n attrs = opts.model.attributeNames;\n }\n\n return [...arr, { name, attrs, relationship: opts }];\n }\n\n return arr;\n },\n []\n );\n } else {\n included = relationships.reduce<Array<any>>((arr, name) => {\n let str = name;\n\n if (typeof str !== 'string') {\n str = String(str);\n }\n\n const opts = this.model.relationshipFor(str);\n\n if (opts) {\n const attrs = opts.model.attributeNames;\n\n return [...arr, { attrs, name: str, relationship: opts }];\n }\n\n return arr;\n }, []);\n }\n\n const willInclude = included\n .filter(opts => {\n const { name, relationship } = opts;\n let { attrs } = opts;\n\n if (relationship.type === 'hasMany') {\n attrs = relationship.through\n ? attrs\n : [...attrs, camelize(relationship.foreignKey, true)];\n\n this.relationships[name] = {\n attrs,\n type: 'hasMany',\n model: relationship.model,\n through: relationship.through,\n foreignKey: relationship.foreignKey\n };\n\n return false;\n }\n\n return true;\n })\n .reduce<Array<any>>((arr, { name, attrs, relationship }) => {\n arr.push([\n 'includeSelect',\n formatSelect(relationship.model, attrs, `${name}.`)\n ]);\n\n if (relationship.type === 'belongsTo') {\n arr.push([\n 'leftOuterJoin',\n [\n relationship.model.tableName,\n `${this.model.tableName}.${relationship.foreignKey}`,\n '=',\n `${relationship.model.tableName}.${relationship.model.primaryKey}`\n ]\n ]);\n } else if (relationship.type === 'hasOne') {\n arr.push([\n 'leftOuterJoin',\n [\n relationship.model.tableName,\n `${this.model.tableName}.${this.model.primaryKey}`,\n '=',\n `${relationship.model.tableName}.${relationship.foreignKey}`\n ]\n ]);\n }\n\n return arr;\n }, []);\n\n this.snapshots.push(...willInclude);\n }\n\n return this;\n }\n\n unscope(...scopes: Array<string>): this {\n if (scopes.length) {\n const keys = scopes.map(scope => {\n if (scope === 'order') {\n return 'orderByRaw';\n }\n\n return scope;\n });\n\n this.snapshots = this.snapshots.filter(([, , scope]) => {\n if (typeof scope === 'string') {\n return keys.indexOf(scope) < 0;\n }\n\n return true;\n });\n } else {\n this.snapshots = this.snapshots.filter(([, , scope]) => !scope);\n }\n\n return this;\n }\n\n override then<TResult1 = T, TResult2 = never>(\n onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onRejected?: ((error: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n runQuery(this);\n return super.then(onFulfilled, onRejected);\n }\n\n override catch<TResult = never>(\n onRejected?: ((error: unknown) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n runQuery(this);\n return super.catch(onRejected);\n }\n\n static from(src: any): Query<unknown> {\n const { model, snapshots, collection, shouldCount, relationships } = src;\n\n const dest = Reflect.construct(this, [model]) as Query<unknown>;\n\n Object.assign(dest, {\n snapshots,\n collection,\n shouldCount,\n relationships\n });\n\n return dest;\n }\n}\n\nexport default Query;\nexport { RecordNotFoundError } from './errors';\n", "/**\n * @private\n */\nexport default function uniq<T>(src: T[], ...keys: string[]): T[] {\n const hasKeys = Boolean(keys.length);\n const valueAt = (obj: T, key: string): unknown =>\n (obj as unknown as Record<string, unknown>)[key];\n\n return src.filter((x, xIdx, arr) => {\n let lastIdx: number;\n\n if (hasKeys) {\n lastIdx = arr.findIndex(\n (y, yIdx) =>\n yIdx > xIdx || keys.every(key => valueAt(x, key) === valueAt(y, key))\n );\n } else {\n lastIdx = src.lastIndexOf(x);\n }\n\n return xIdx === lastIdx;\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `scopesFor` builds the dynamic scope-method machinery: each scope is a\n * variadic function forwarded to the model's scope statics via Reflect.apply,\n * so the argument list is genuinely untyped at this layer.\n */\nimport type Query from '../index';\n\nexport default function scopesFor<T>(target: Query<T>): PropertyDescriptorMap {\n return Object.keys(target.model.scopes).reduce<PropertyDescriptorMap>(\n (scopes, name) => ({\n ...scopes,\n [name]: {\n get() {\n const scope = function (...args: Array<any>) {\n const fn = Reflect.get(target.model, name);\n const { snapshots } = Reflect.apply(fn, target.model, args) as {\n snapshots: Array<Array<unknown>>;\n };\n\n Object.assign(target, {\n snapshots: [\n ...target.snapshots,\n ...snapshots.map(snapshot => [...snapshot, name])\n ]\n });\n\n return target;\n };\n\n Reflect.defineProperty(scope, 'name', {\n value: name,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n return scope;\n }\n }\n }),\n {}\n );\n}\n", "import { camelize } from 'inflection';\n\nimport type { ModelClass } from '../../interfaces';\n\n/**\n * @private\n */\nexport default function formatSelect(\n model: ModelClass,\n attrs: Array<string> = [],\n prefix: string = ''\n) {\n return attrs.map(attr => {\n const name = model.columnNameFor(attr) || 'undefined';\n\n return `${model.tableName}.${name} AS ${prefix}${camelize(name, true)}`;\n });\n}\n", "import createServerError from '../../../server/utils/create-server-error';\nimport stringify from '../../../../utils/stringify';\nimport type { ModelClass } from '../../interfaces';\n\nclass RecordNotFoundError extends Error {\n constructor({ name, primaryKey }: ModelClass, primaryKeyValue: unknown) {\n super(\n `Could not find ${name} with ${primaryKey} ${stringify(primaryKeyValue)}.`\n );\n }\n}\n\nexport default createServerError(RecordNotFoundError, 404);\n", "import type Query from '../index';\n\nexport const RUNNERS: WeakMap<\n Query<unknown>,\n () => Promise<void>\n> = new WeakMap();\n", "import isObject from '../../../../../utils/is-object';\nimport type Query from '../../index';\n\nexport default function getFindParam({\n isFind,\n snapshots,\n model: { tableName, primaryKey }\n}: Query<unknown>) {\n if (isFind) {\n const snapshot = snapshots.find(([method]) => method === 'where');\n\n if (snapshot) {\n const [, params] = snapshot;\n\n if (params && isObject(params)) {\n return Reflect.get(params, `${tableName}.${primaryKey}`);\n }\n }\n }\n\n return undefined;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The query runner assembles results from raw Knex rows and dynamically-built\n * related sub-queries (Reflect.construct/get/set over untyped column data), so\n * records, relationship descriptors and the constructed instances are genuinely\n * untyped at this layer.\n */\nimport { camelize, singularize } from 'inflection';\n\nimport type Model from '../../../model';\nimport type { ModelClass } from '../../../interfaces';\nimport entries from '../../../../../utils/entries';\nimport underscore from '../../../../../utils/underscore';\nimport promiseHash from '../../../../../utils/promise-hash';\n\n/**\n * @private\n */\nexport default async function buildResults<T extends Model>({\n model,\n records,\n relationships\n}: {\n model: ModelClass<T>;\n records: Promise<Array<Record<string, any>>>;\n relationships: Record<string, any>;\n}): Promise<Array<T>> {\n const results = await records;\n const pkPattern = new RegExp(`^.+\\\\.${model.primaryKey}$`);\n let related: Record<string, any> | undefined;\n\n if (!results.length) {\n return [];\n }\n\n if (Object.keys(relationships).length) {\n related = entries(relationships).reduce<Record<string, any>>(\n (obj, entry) => {\n const [name, relationship] = entry;\n let foreignKey = camelize(relationship.foreignKey, true);\n\n if (relationship.through) {\n const query = relationship.model.select(...relationship.attrs);\n\n const baseKey =\n `${relationship.through.tableName}.` +\n `${singularize(underscore(name))}_id`;\n\n foreignKey = `${relationship.through.tableName}.${relationship.foreignKey}`;\n\n query.snapshots.push(\n [\n 'select',\n [\n `${baseKey} as ${camelize(String(baseKey.split('.').pop()), true)}`,\n `${foreignKey} as ${camelize(String(foreignKey.split('.').pop()), true)}`\n ]\n ],\n [\n 'innerJoin',\n [\n relationship.through.tableName,\n `${relationship.model.tableName}.${relationship.model.primaryKey}`,\n '=',\n baseKey\n ]\n ],\n ['whereIn', [foreignKey, results.map(({ id }) => id)]]\n );\n\n return { ...obj, [name]: query };\n }\n\n return {\n ...obj,\n [name]: relationship.model.select(...relationship.attrs).where({\n [foreignKey]: results.map(({ id }) => id)\n })\n };\n },\n {}\n );\n\n related = await promiseHash(related);\n }\n\n return results.map(record => {\n if (related) {\n entries(related).forEach(\n ([name, relatedResults]: [string, Array<Model>]) => {\n const relationship = model.relationshipFor(name);\n\n if (relationship) {\n let { foreignKey } = relationship;\n\n foreignKey = camelize(foreignKey, true);\n\n Reflect.set(\n record,\n name,\n relatedResults.filter(({ rawColumnData }) => {\n const fk = Reflect.get(rawColumnData, foreignKey);\n const pk = Reflect.get(record, model.primaryKey);\n\n return fk === pk;\n })\n );\n }\n }\n );\n }\n\n const instance = Reflect.construct(model, [\n entries(record).reduce<Record<string, any>>((r, entry) => {\n let [key, value] = entry;\n\n if (value == null && pkPattern.test(key)) {\n return r;\n } else if (key.indexOf('.') >= 0) {\n const [a, b] = key.split('.');\n let parent: Record<string, any> = r[a];\n\n if (!parent) {\n parent = {};\n }\n\n key = a;\n value = {\n ...parent,\n [b]: value\n };\n }\n\n return {\n ...r,\n [key]: value\n };\n }, {})\n ]);\n\n instance.currentChangeSet.persist();\n\n return instance;\n });\n}\n", "import entries from './entries';\n\n/**\n * Resolves every value of an object, returning an object of the same shape with\n * each promise unwrapped.\n *\n * @private\n */\nexport default function promiseHash<T extends Record<string, unknown>>(\n promises: T\n): Promise<{ [K in keyof T]: Awaited<T[K]> }> {\n type Resolved = { [K in keyof T]: Awaited<T[K]> };\n\n if (Object.keys(promises).length) {\n return Promise.all(\n entries(promises).map(\n ([key, promise]) =>\n new Promise<Record<string, unknown>>((resolve, reject) => {\n const maybe = promise as Promise<unknown> | undefined;\n\n if (maybe && typeof maybe.then === 'function') {\n maybe.then(value => resolve({ [key]: value })).catch(reject);\n } else {\n resolve({ [key]: promise });\n }\n })\n )\n ).then(\n objects =>\n objects.reduce(\n (hash, object) => ({\n ...hash,\n ...object\n }),\n {}\n ) as Resolved\n );\n }\n\n return Promise.resolve({} as Resolved);\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The runner drives Knex query builders (`model.table()` and the reduced\n * snapshot chain) whose types Lumen does not model; `records` and the reflected\n * method calls are genuinely untyped here.\n */\nimport { RecordNotFoundError } from '../errors';\nimport { sql } from '../../../logger';\nimport type Query from '../index';\n\nimport { RUNNERS } from './constants';\nimport getFindParam from './utils/get-find-param';\nimport buildResults from './utils/build-results';\n\n/**\n * @private\n */\nexport function createRunner(\n target: Query<unknown>,\n opts: {\n resolve?: (value: any) => void;\n reject?: (error: Error) => void;\n }\n): void {\n if (opts.resolve && opts.reject) {\n const { resolve, reject } = opts;\n let didRun = false;\n\n RUNNERS.set(target, async () => {\n let results;\n const {\n model,\n isFind,\n snapshots,\n collection,\n shouldCount,\n relationships\n } = target;\n\n if (didRun) {\n return;\n }\n\n didRun = true;\n\n if (!shouldCount && !snapshots.some(([name]) => name === 'select')) {\n target.select(...target.model.attributeNames);\n }\n\n const records: any = snapshots.reduce((query, snapshot) => {\n let [name, params] = snapshot;\n\n if (!shouldCount && name === 'includeSelect') {\n name = 'select';\n }\n\n const method = Reflect.get(query, name);\n\n if (!Array.isArray(params)) {\n params = [params];\n }\n\n return Reflect.apply(method, query, params);\n }, model.table() as any);\n\n if (model.store.debug) {\n records.on('query', () => {\n setImmediate(() => model.logger.debug(sql`${records.toString()}`));\n });\n }\n\n if (shouldCount) {\n let [{ countAll: count }] = await records;\n count = parseInt(count, 10);\n\n resolve(Number.isFinite(count) ? count : 0);\n } else {\n results = await buildResults({\n model,\n records,\n relationships\n });\n\n if (collection) {\n resolve(results);\n } else {\n const [result] = results;\n\n if (!result && isFind) {\n const err = new RecordNotFoundError(model, getFindParam(target));\n\n reject(err);\n }\n\n resolve(result);\n }\n }\n });\n }\n}\n\nexport function runQuery(target: Query<unknown>): void {\n const runner = RUNNERS.get(target);\n\n if (runner) {\n runner();\n }\n}\n", "export default function mapToObject<T>(\n source: Map<string, T>\n): Record<string, T> {\n return Array.from(source).reduce<Record<string, T>>(\n (obj, [key, value]) => ({\n ...obj,\n [String(key)]: value\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * A ChangeSet stores a record's pending attribute and relationship values,\n * which are heterogeneous and dynamic (typed `any`/`Object` in the original\n * Flow). The `any` value type is what lets attribute getters/setters and the\n * relationship helpers round-trip those values.\n */\nimport type { Model } from '../index';\nimport entries from '../../../utils/entries';\nimport mapToObject from '../../../utils/map-to-object';\n\nclass ChangeSet extends Map<string, any> {\n declare isPersisted: boolean;\n\n constructor(data: Record<string, unknown> = {}) {\n super(entries(data));\n\n this.isPersisted = false;\n }\n\n override set(key: string, value: any): this {\n if (!this.isPersisted) {\n super.set(key, value);\n }\n\n return this;\n }\n\n persist(group?: Array<ChangeSet>): this {\n if (group) {\n group.forEach(changeSet => changeSet.unpersist());\n }\n\n this.isPersisted = true;\n\n return this;\n }\n\n unpersist(): this {\n this.isPersisted = false;\n return this;\n }\n\n applyTo(target: Model): ChangeSet {\n const instance = new ChangeSet(mapToObject(this));\n\n target.changeSets.unshift(instance);\n\n return instance;\n }\n}\n\nexport default ChangeSet;\n", "import { camelize } from 'inflection';\n\nimport type Model from '../model';\n\nimport { getHasOne, getHasMany, getBelongsTo } from './utils/getters';\nimport { setHasOne, setHasMany, setBelongsTo } from './utils/setters';\n\n/**\n * @private\n */\nexport function set(\n owner: Model,\n key: string,\n value?: Array<Model> | Model | null\n) {\n const opts = owner.constructor.relationshipFor(key);\n\n if (opts) {\n const { type } = opts;\n let { foreignKey } = opts;\n\n foreignKey = camelize(foreignKey, true);\n\n if (Array.isArray(value)) {\n if (type === 'hasMany') {\n setHasMany(owner, key, value, {\n ...opts,\n foreignKey\n });\n }\n } else if (type === 'hasOne') {\n setHasOne(owner, key, value, {\n ...opts,\n foreignKey\n });\n } else if (type === 'belongsTo') {\n setBelongsTo(owner, key, value, {\n ...opts,\n foreignKey\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport async function get(\n owner: Model,\n key: string\n): Promise<Array<Model> | Model | null> {\n const opts = owner.constructor.relationshipFor(key);\n let value: Array<Model> | Model | null = null;\n\n if (opts) {\n const { type } = opts;\n let { foreignKey } = opts;\n\n value = owner.currentChangeSet.get(key);\n foreignKey = camelize(foreignKey, true);\n\n if (!value) {\n switch (type) {\n case 'hasOne':\n value = await getHasOne(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n case 'hasMany':\n value = await getHasMany(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n case 'belongsTo':\n value = await getBelongsTo(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n default:\n throw new Error(`Unknown relationship type '${type}'.`);\n }\n\n set(owner, key, value);\n }\n }\n\n return value;\n}\n\nexport { default as updateRelationship } from './utils/update-relationship';\nexport type { Relationship$opts } from './interfaces';\n", "import { camelize } from 'inflection';\n\nimport type Model from '../../model';\nimport type { Relationship$opts } from '../index';\n\n/**\n * @private\n */\nasync function getHasManyThrough(\n owner: Model,\n { model, inverse, through, foreignKey: baseKey }: Relationship$opts\n): Promise<Array<Model>> {\n const inverseOpts = model.relationshipFor(inverse);\n let value: Array<Model> = [];\n\n if (through && inverseOpts) {\n const foreignKey = camelize(inverseOpts.foreignKey, true);\n const records = await through.select(baseKey, foreignKey).where({\n [baseKey]: owner.getPrimaryKey()\n });\n\n if (records.length) {\n value = await model.where({\n [model.primaryKey]: records\n .map(record => Reflect.get(record, foreignKey))\n .filter(Boolean)\n });\n }\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport function getHasOne(\n owner: Model,\n { model, foreignKey }: Relationship$opts\n) {\n return model.first().where({\n [foreignKey]: owner.getPrimaryKey()\n });\n}\n\n/**\n * @private\n */\nexport function getHasMany(owner: Model, opts: Relationship$opts) {\n const { model, through, foreignKey } = opts;\n\n return through\n ? getHasManyThrough(owner, opts)\n : model.where({\n [foreignKey]: owner.getPrimaryKey()\n });\n}\n\n/**\n * @private\n */\nexport function getBelongsTo(\n owner: Model,\n { model, foreignKey }: Relationship$opts\n) {\n const foreignValue = Reflect.get(owner, foreignKey);\n\n return foreignValue ? model.find(foreignValue) : Promise.resolve(null);\n}\n", "import type Model from '../../model';\n\n/**\n * @private\n */\nfunction unassociateOne<T extends Model | null | undefined>(\n value: T,\n foreignKey: string\n): T {\n if (value) {\n Reflect.set(value, foreignKey, null);\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport default function unassociate<T extends Model>(\n value: Array<T>,\n foreignKey: string\n): Array<T> {\n return value.map(record => unassociateOne(record, foreignKey));\n}\n", "/**\n * @private\n */\nexport default function isNull(value: unknown): value is null {\n return value === null;\n}\n", "import isNull from '../../../../utils/is-null';\nimport type { ModelClass } from '../../interfaces';\n\nfunction validateOne(model: ModelClass, value: unknown) {\n return isNull(value) || model.isInstance(value);\n}\n\nexport default function validateType(model: ModelClass, value: unknown) {\n if (Array.isArray(value)) {\n return value.every(item => validateOne(model, item));\n }\n\n return validateOne(model, value);\n}\n", "import type Model from '../../model';\nimport type { ModelClass } from '../../interfaces';\nimport type { Relationship$opts } from '../index';\n\n/**\n * @private\n */\nexport function setHasManyInverse(\n owner: Model,\n value: Array<Model>,\n {\n inverse,\n foreignKey,\n inverseModel\n }: Relationship$opts & {\n inverseModel: ModelClass;\n }\n) {\n const primaryKey = Reflect.get(owner, owner.constructor.primaryKey);\n const { type: inverseType } = inverseModel.relationshipFor(inverse)!;\n\n for (const record of value) {\n let { currentChangeSet: changeSet } = record;\n\n if (owner !== changeSet.get(inverse)) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(record);\n }\n\n changeSet.set(inverse, owner);\n\n if (inverseType === 'belongsTo') {\n Reflect.set(record, foreignKey, primaryKey);\n }\n }\n }\n}\n\n/**\n * @private\n */\nexport function setHasOneInverse(\n owner: Model,\n value: Model | null | undefined,\n {\n inverse,\n foreignKey,\n inverseModel\n }: Relationship$opts & {\n inverseModel: ModelClass;\n }\n) {\n if (value) {\n const { type: inverseType } = inverseModel.relationshipFor(inverse)!;\n let inverseValue = value.currentChangeSet.get(inverse);\n\n if (inverseType === 'hasMany') {\n if (!Array.isArray(inverseValue)) {\n inverseValue = [];\n }\n\n if (!inverseValue.includes(owner)) {\n inverseValue.push(owner);\n }\n } else if (owner !== inverseValue) {\n inverseValue = owner;\n\n if (inverseType === 'belongsTo') {\n Reflect.set(value, foreignKey, inverseValue.getPrimaryKey());\n }\n }\n\n let { currentChangeSet: changeSet } = value;\n\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(value);\n }\n\n changeSet.set(inverse, inverseValue || null);\n }\n}\n", "import type Model from '../../model';\nimport type { Relationship$opts } from '../index';\n\nimport unassociate from './unassociate';\nimport validateType from './validate-type';\nimport { setHasOneInverse, setHasManyInverse } from './inverse-setters';\n\n/**\n * @private\n */\nexport function setHasMany(\n owner: Model,\n key: string,\n value: Array<Model>,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n let { currentChangeSet: changeSet } = owner;\n\n if (validateType(model, value)) {\n let prevValue = changeSet.get(key);\n\n if (Array.isArray(prevValue)) {\n prevValue = unassociate(prevValue, foreignKey);\n\n if (Array.isArray(prevValue)) {\n prevValue\n .filter(\n prev =>\n !value.find(next => prev.getPrimaryKey() === next.getPrimaryKey())\n )\n .forEach(record => owner.prevAssociations.add(record));\n }\n }\n\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, value);\n\n setHasManyInverse(owner, value, {\n type,\n model,\n inverse,\n foreignKey,\n inverseModel: model\n });\n }\n}\n\n/**\n * @private\n */\nexport function setHasOne(\n owner: Model,\n key: string,\n value: Model | null | undefined,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n let valueToSet = value;\n\n if (value && typeof value === 'object' && !model.isInstance(value)) {\n valueToSet = Reflect.construct(model, [valueToSet]);\n }\n\n let { currentChangeSet: changeSet } = owner;\n\n if (valueToSet) {\n if (validateType(model, valueToSet)) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, valueToSet);\n }\n } else {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, null);\n }\n\n setHasOneInverse(owner, valueToSet, {\n type,\n model,\n inverse,\n foreignKey,\n inverseModel: model\n });\n}\n\n/**\n * @private\n */\nexport function setBelongsTo(\n owner: Model,\n key: string,\n value: Model | null | undefined,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n setHasOne(owner, key, value, {\n type,\n model,\n inverse,\n foreignKey\n });\n\n if (value) {\n Reflect.set(owner, foreignKey, Reflect.get(value, model.primaryKey));\n } else {\n Reflect.set(owner, foreignKey, null);\n }\n}\n", "import type Model from '../../model';\nimport type { Relationship$opts } from '../interfaces';\n\ntype Params = {\n record: Model;\n value: Model | null | undefined | Array<Model>;\n opts: Relationship$opts;\n trx: unknown;\n};\n\nfunction updateHasOne({ record, value, opts, trx }: Params): Array<unknown> {\n const recordPrimaryKey = record.getPrimaryKey();\n\n if (value) {\n if (value instanceof opts.model) {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n .whereNot(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.getPrimaryKey()\n ),\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, recordPrimaryKey)\n .where(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.getPrimaryKey()\n )\n ];\n }\n } else {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n ];\n }\n\n return [];\n}\n\nfunction updateHasMany({ record, value, opts, trx }: Params): Array<unknown> {\n const recordPrimaryKey = record.getPrimaryKey();\n\n if (Array.isArray(value) && value.length) {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n .whereNotIn(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.map(item => item.getPrimaryKey())\n ),\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, recordPrimaryKey)\n .whereIn(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.map(item => item.getPrimaryKey())\n )\n ];\n }\n\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n ];\n}\n\nfunction updateBelongsTo({ record, value, opts, trx }: Params): Array<unknown> {\n if (value instanceof opts.model) {\n const inverseOpts = opts.model.relationshipFor(opts.inverse);\n const foreignKeyValue = value.getPrimaryKey();\n\n Reflect.set(record, opts.foreignKey, foreignKeyValue);\n\n if (inverseOpts && inverseOpts.type === 'hasOne') {\n return [\n record.constructor\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(opts.foreignKey, foreignKeyValue)\n .whereNot(\n `${record.constructor.tableName}.${record.constructor.primaryKey}`,\n record.getPrimaryKey()\n )\n ];\n }\n }\n\n return [];\n}\n\n/**\n * @private\n */\nexport default function updateRelationship(\n record: Model,\n name: string,\n trx: unknown\n): Array<unknown> {\n const opts = record.constructor.relationshipFor(name);\n\n if (!opts) {\n const {\n constructor: { name: className }\n } = record;\n\n throw new Error(`Could not find relationship '${name} on '${className}`);\n }\n\n const { dirtyRelationships } = record;\n\n if (!dirtyRelationships.has(name)) {\n return [];\n }\n\n const value = dirtyRelationships.get(name) as\n Model | Array<Model> | null | undefined;\n\n switch (opts.type) {\n case 'hasOne':\n return updateHasOne({\n record,\n value,\n opts,\n trx\n });\n\n case 'hasMany':\n return updateHasMany({\n record,\n value,\n opts,\n trx\n });\n\n default:\n return updateBelongsTo({\n record,\n value,\n opts,\n trx\n });\n }\n}\n", "export default function hasOwnProperty(target: object, key: string): boolean {\n return Reflect.apply(Object.prototype.hasOwnProperty, target, [key]);\n}\n", "import hasOwnProperty from './has-own-property';\n\ntype ProxyGet<T extends object> = (\n target: T,\n key: string,\n receiver: unknown\n) => unknown;\n\n/**\n * @private\n */\nexport function trapGet<T extends object>(\n traps: Record<string, unknown>\n): ProxyGet<T> {\n return (target, key, receiver) => {\n if (key === 'unwrap') {\n return () => target;\n }\n\n if (hasOwnProperty(traps, key)) {\n const value = Reflect.get(traps, key);\n\n if (typeof value === 'function') {\n return value.bind(receiver, target);\n }\n\n return value;\n }\n\n return Reflect.get(target, key);\n };\n}\n", "import { trapGet } from '../../../utils/proxy';\nimport type { Model } from '../index';\nimport type { ModelClass } from '../interfaces';\n\nimport type { Transaction$ResultProxy } from './interfaces';\n\n/**\n * @private\n */\nexport function createStaticTransactionProxy<T extends ModelClass>(\n target: T,\n trx: unknown\n): T {\n return new Proxy(target, {\n get: trapGet({\n create(model: T, props: Record<string, unknown> = {}) {\n return model.create(props, trx);\n }\n })\n });\n}\n\n/**\n * @private\n */\nexport function createInstanceTransactionProxy<T extends Model>(\n target: T,\n trx: unknown\n): T {\n return new Proxy(target, {\n get: trapGet({\n save(model: T) {\n return model.save(trx);\n },\n\n update(model: T, props: Record<string, unknown> = {}) {\n return model.update(props, trx);\n },\n\n destroy(model: T) {\n return model.destroy(trx);\n }\n })\n });\n}\n\n/**\n * @private\n */\nexport function createTransactionResultProxy<\n T extends Model,\n U extends boolean\n>(record: T, didPersist: U): Transaction$ResultProxy<T, U> {\n return new Proxy(record, {\n get: trapGet({\n didPersist\n })\n }) as unknown as Transaction$ResultProxy<T, U>;\n}\n\nexport type { Transaction$ResultProxy } from './interfaces';\n", "/**\n * Returns a copy of `src` containing only `keys` whose values are defined.\n *\n * The result is `Partial<T>` rather than Flow's `T`: keys may be dropped, both\n * because the caller asked for a subset and because undefined values are\n * filtered out. The cast is confined to the return, where the dynamic key\n * access makes the shape unknowable to the compiler.\n *\n * @private\n */\nexport default function pick<T extends object>(\n src: T,\n ...keys: string[]\n): Partial<T> {\n return keys\n .map((key): [string, unknown] => [key, Reflect.get(src, key)])\n .filter(([, value]) => typeof value !== 'undefined')\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: value\n }),\n {}\n ) as Partial<T>;\n}\n", "/**\n * @private\n */\nexport function map<K, V>(a: Map<K, V>, b: Map<K, V>): Map<K, V> {\n return Array.from(b).reduce((result, [key, value]) => {\n if (a.get(key) !== value) {\n result.set(key, value);\n }\n\n return result;\n }, new Map<K, V>());\n}\n", "import pick from '../../../../utils/pick';\nimport entries from '../../../../utils/entries';\nimport type Model from '../index';\n\n/**\n * @private\n */\nexport default function getColumns(record: Model, only?: Array<string>) {\n let columns: Record<string, unknown> = record.constructor.attributes;\n\n if (only) {\n columns = pick(columns, ...only) as Record<string, unknown>;\n }\n\n return entries(columns).reduce<Record<string, unknown>>(\n (obj, [key, col]) => ({\n ...obj,\n [(col as { columnName: string }).columnName]: Reflect.get(record, key)\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * These build and run Knex insert/update/delete statements; the query builders\n * and the promises they return are not modeled by Lumen (they were `Object` in\n * Flow).\n */\nimport { sql } from '../../../logger';\nimport omit from '../../../../utils/omit';\nimport type Logger from '../../../logger';\nimport type Model from '../index';\n\nimport getColumns from './get-columns';\n\n/**\n * @private\n */\nexport function create(record: Model, trx: unknown): Array<any> {\n const timestamp = new Date();\n\n Object.assign(record, {\n createdAt: timestamp,\n updatedAt: timestamp\n });\n\n Object.assign(record.rawColumnData, {\n createdAt: timestamp,\n updatedAt: timestamp\n });\n\n const {\n constructor: { primaryKey }\n } = record;\n const columns = omit(getColumns(record), primaryKey);\n\n if (record.dirtyAttributes.has(primaryKey)) {\n columns[primaryKey] = record.getPrimaryKey();\n }\n\n return [\n record.constructor\n .table()\n .transacting(trx)\n .returning(record.constructor.primaryKey)\n .insert(columns)\n ];\n}\n\n/**\n * @private\n */\nexport function update(record: Model, trx: unknown): Array<any> {\n Reflect.set(record, 'updatedAt', new Date());\n\n return [\n record.constructor\n .table()\n .transacting(trx)\n .where(record.constructor.primaryKey, record.getPrimaryKey())\n .update(getColumns(record, Array.from(record.dirtyAttributes.keys())))\n ];\n}\n\n/**\n * @private\n */\nexport function destroy(record: Model, trx: unknown): Array<any> {\n return [\n record.constructor\n .table()\n .transacting(trx)\n .where(record.constructor.primaryKey, record.getPrimaryKey())\n .del()\n ];\n}\n\n/**\n * @private\n */\nexport function createRunner(\n logger: Logger,\n statements: Array<any>\n): (query: Array<any>) => Promise<Array<any>> {\n return query => {\n const promises = query.concat(statements);\n\n promises.forEach(promise => {\n promise.on('query', () => {\n setImmediate(() => {\n logger.debug(sql`${promise.toString()}`);\n });\n });\n });\n\n return Promise.all(promises);\n };\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Class initialization is pure runtime metaprogramming: it reads each model's\n * user-declared static config (attributes from the DB schema, hasOne/hasMany/\n * belongsTo/hooks/scopes/validates), and installs accessors, relationship\n * descriptors and frozen metadata onto the class and its prototype via\n * Object.defineProperties/Reflect. The config values are genuinely untyped (as\n * they were `Object` in Flow).\n */\nimport { camelize, dasherize, pluralize, singularize } from 'inflection';\n\nimport { line } from '../../logger';\nimport { createAttribute } from '../attribute';\nimport {\n get as getRelationship,\n set as setRelationship\n} from '../relationship';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\nimport type Logger from '../../logger';\nimport type Database from '../index';\nimport type { Model } from '../index';\nimport type { ModelClass } from '../interfaces';\n\nconst VALID_HOOKS = new Set([\n 'afterCreate',\n 'afterDestroy',\n 'afterSave',\n 'afterUpdate',\n 'afterValidation',\n 'beforeCreate',\n 'beforeDestroy',\n 'beforeSave',\n 'beforeUpdate',\n 'beforeValidation'\n]);\n\n/**\n * @private\n */\nfunction initializeProps(\n prototype: object,\n attributes: Record<string, any>,\n relationships: Record<string, any>\n) {\n Object.defineProperties(prototype, {\n ...entries(attributes).reduce<PropertyDescriptorMap>(\n (obj, [key, value]) => ({\n ...obj,\n [key]: createAttribute({\n key,\n ...value\n })\n }),\n {}\n ),\n\n ...Object.keys(relationships).reduce<PropertyDescriptorMap>(\n (obj, key) => ({\n ...obj,\n [key]: {\n get(this: Model) {\n return getRelationship(this, key);\n },\n set(this: Model, val: any) {\n setRelationship(this, key, val);\n }\n }\n }),\n {}\n )\n });\n}\n\n/**\n * @private\n */\nfunction initializeHooks({\n model,\n hooks,\n logger\n}: {\n model: ModelClass;\n hooks: Record<string, any>;\n logger: Logger;\n}) {\n return Object.freeze(\n entries(hooks).reduce<Record<string, any>>((obj, [key, value]) => {\n if (!VALID_HOOKS.has(key)) {\n logger.warn(line`\n Invalid hook '${key}' will not be added to Model '${model.name}'.\n Valid hooks are ${Array.from(VALID_HOOKS)\n .map(h => `'${h}'`)\n .join(', ')}.\n `);\n\n return obj;\n }\n\n return {\n ...obj,\n [key]: async (instance: Model, transaction: unknown) => {\n await Reflect.apply(value, model, [instance, transaction]);\n }\n };\n }, {})\n );\n}\n\n/**\n * @private\n */\nfunction initializeValidations(opts: {\n model: ModelClass;\n logger: Logger;\n validates: Record<string, any>;\n attributes: Record<string, any>;\n}) {\n const { model, logger, attributes } = opts;\n const attributeNames = Object.keys(attributes);\n let { validates } = opts;\n\n validates = entries(validates)\n .filter(([key, value]) => {\n let isValid = attributeNames.indexOf(key) >= 0;\n\n if (!isValid) {\n logger.warn(line`\n Invalid validation '${key}' will not be added to Model\n '${model.name}'. '${key}' is not an attribute of Model\n '${model.name}'.\n `);\n }\n\n if (typeof value !== 'function') {\n isValid = false;\n\n logger.warn(line`\n Invalid validation '${key}' will not be added to Model\n '${model.name}'. Validations must be a function.\n `);\n }\n\n return isValid;\n })\n .reduce<Record<string, any>>(\n (obj, [key, value]) => ({\n ...obj,\n [key]: value\n }),\n {}\n );\n\n return Object.freeze(validates);\n}\n\n/**\n * @private\n */\nexport default async function initializeClass<T extends ModelClass>({\n store,\n table,\n model\n}: {\n store: Database;\n table: T['table'];\n model: T;\n}): Promise<T> {\n let { hooks, scopes, validates } = model;\n const { logger } = store;\n const modelName = dasherize(underscore(model.name));\n const resourceName = pluralize(modelName);\n\n const attributes = entries(await table().columnInfo()).reduce<\n Record<string, any>\n >(\n (obj, [columnName, value]) => ({\n ...obj,\n [camelize(columnName, true)]: {\n ...(value as any),\n columnName,\n docName: dasherize(columnName)\n }\n }),\n {}\n );\n\n const belongsTo = entries(model.belongsTo || {}).reduce<Record<string, any>>(\n (obj, [relatedName, value]) => {\n const { inverse, model: relatedModel } = value as any;\n const relationship = {};\n\n Object.defineProperties(relationship, {\n model: {\n value: store.modelFor(relatedModel || relatedName),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n type: {\n value: 'belongsTo',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: `${underscore(relatedName)}_id`,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...obj,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n const hasOne = entries(model.hasOne || {}).reduce<Record<string, any>>(\n (obj, [relatedName, value]) => {\n const { inverse, model: relatedModel } = value as any;\n const relationship = {};\n\n Object.defineProperties(relationship, {\n model: {\n value: store.modelFor(relatedModel || relatedName),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n type: {\n value: 'hasOne',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: `${underscore(inverse)}_id`,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...obj,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n const hasMany = entries(model.hasMany || {}).reduce<Record<string, any>>(\n (hash, [relatedName, opts]) => {\n const { inverse } = opts as any;\n const relationship = {};\n let { through, model: relatedModel } = opts as any;\n let foreignKey;\n\n if (typeof relatedModel === 'string') {\n relatedModel = store.modelFor(relatedModel);\n } else {\n relatedModel = store.modelFor(relatedName);\n }\n\n if (typeof through === 'string') {\n through = store.modelFor(through);\n foreignKey = `${singularize(underscore(inverse))}_id`;\n } else {\n foreignKey = `${underscore(inverse)}_id`;\n }\n\n Object.defineProperties(relationship, {\n model: {\n value: relatedModel,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n through: {\n value: through,\n writable: false,\n enumerable: Boolean(through),\n configurable: false\n },\n\n type: {\n value: 'hasMany',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: foreignKey,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...hash,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n Object.freeze(hasOne);\n Object.freeze(hasMany);\n Object.freeze(belongsTo);\n\n const relationships = Object.freeze({\n ...hasOne,\n ...hasMany,\n ...belongsTo\n });\n\n if (!hooks) {\n hooks = {};\n }\n\n if (!scopes) {\n scopes = {};\n }\n\n if (!validates) {\n validates = {};\n }\n\n Object.defineProperties(model, {\n store: {\n value: store,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n table: {\n value: table,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n attributes: {\n value: Object.freeze(attributes),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n attributeNames: {\n value: Object.freeze(Object.keys(attributes)),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n hasOne: {\n value: hasOne,\n writable: false,\n enumerable: Boolean(Object.keys(hasOne).length),\n configurable: false\n },\n\n hasMany: {\n value: hasMany,\n writable: false,\n enumerable: Boolean(Object.keys(hasMany).length),\n configurable: false\n },\n\n belongsTo: {\n value: belongsTo,\n writable: false,\n enumerable: Boolean(Object.keys(belongsTo).length),\n configurable: false\n },\n\n relationships: {\n value: relationships,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n relationshipNames: {\n value: Object.freeze(Object.keys(relationships)),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n hooks: {\n value: initializeHooks({\n model,\n hooks,\n logger\n }),\n writable: false,\n enumerable: Boolean(Object.keys(hooks).length),\n configurable: false\n },\n\n scopes: {\n value: scopes,\n writable: false,\n enumerable: Boolean(Object.keys(scopes).length),\n configurable: false\n },\n\n validates: {\n value: initializeValidations({\n model,\n logger,\n validates,\n attributes\n }),\n writable: false,\n enumerable: Boolean(Object.keys(validates).length),\n configurable: false\n },\n\n modelName: {\n value: modelName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n resourceName: {\n value: resourceName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n initialized: {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n ...Object.freeze(\n entries(scopes).reduce<PropertyDescriptorMap>(\n (obj, [name, scope]) => ({\n ...obj,\n [name]: {\n value: scope,\n writable: false,\n enumerable: false,\n configurable: false\n }\n }),\n {}\n )\n )\n });\n\n initializeProps(model.prototype, attributes, {\n ...hasOne,\n ...hasMany,\n ...belongsTo\n });\n\n Object.defineProperties(model.prototype, {\n modelName: {\n value: modelName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n resourceName: {\n value: resourceName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n isModelInstance: {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return model;\n}\n", "/**\n * @private\n */\nexport default function isUndefined(value: unknown): value is undefined {\n return typeof value === 'undefined';\n}\n", "import type Model from '../../model';\nimport type { Attribute$meta } from '../index';\nimport isNull from '../../../../utils/is-null';\nimport isUndefined from '../../../../utils/is-undefined';\n\nexport default function createGetter({\n key,\n defaultValue\n}: Attribute$meta): (this: Model) => unknown {\n return function getter(this: Model) {\n let value: unknown = this.currentChangeSet.get(key);\n\n if (isNull(value) || isUndefined(value)) {\n value = defaultValue;\n }\n\n return value;\n };\n}\n", "import type Model from '../../model';\nimport isNull from '../../../../utils/is-null';\nimport isUndefined from '../../../../utils/is-undefined';\nimport type { Attribute$meta } from '../index';\n\n/**\n * @private\n */\nexport default function createSetter({\n key,\n nullable,\n normalize,\n defaultValue\n}: Attribute$meta & {\n normalize: (value: unknown) => unknown;\n}): (this: Model, value?: unknown) => void {\n return function setter(this: Model, nextValue?: unknown) {\n if (!nullable) {\n if (isNull(nextValue) || isUndefined(nextValue)) {\n return;\n }\n }\n\n let { currentChangeSet: changeSet } = this;\n const valueToSet = normalize(nextValue);\n const currentValue = changeSet.get(key) || defaultValue;\n\n if (!changeSet.has(key) || valueToSet !== currentValue) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(this);\n }\n\n changeSet.set(key, valueToSet);\n }\n };\n}\n", "const BOOLEAN_TYPE = /^(?:boolean|tinyint)$/;\n\nexport default function createNormalizer(\n type: string\n): (value: unknown) => unknown {\n let normalizer: (value: unknown) => unknown = value => value;\n\n if (BOOLEAN_TYPE.test(type)) {\n normalizer = value => {\n let normalized = value;\n\n if (typeof value === 'string') {\n normalized = Number.parseInt(value, 10);\n }\n\n return Boolean(normalized);\n };\n } else if (type === 'datetime') {\n normalizer = value => {\n let normalized = value;\n\n if (typeof value === 'number') {\n normalized = new Date(value);\n }\n\n return normalized;\n };\n }\n\n return normalizer;\n}\n", "import createGetter from './utils/create-getter';\nimport createSetter from './utils/create-setter';\nimport createNormalizer from './utils/create-normalizer';\nimport type { Attribute$meta } from './interfaces';\n\n/**\n * @private\n */\nexport function createAttribute(opts: Attribute$meta): PropertyDescriptor {\n const normalize = createNormalizer(opts.type);\n const meta = {\n ...opts,\n normalize,\n defaultValue: normalize(opts.defaultValue)\n };\n\n return {\n get: createGetter(meta),\n set: createSetter(meta)\n };\n}\n\nexport type { Attribute$meta } from './interfaces';\n", "/**\n * @private\n */\nclass ValidationError extends Error {\n constructor(key: string, value: string) {\n super(`Validation failed for ${key}: ${value}`);\n }\n}\n\nexport default ValidationError;\n", "import type { Validation$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Validation<T> {\n declare key: string;\n\n declare value: T;\n\n declare validator: (value?: T) => boolean;\n\n constructor(opts: Validation$opts<T>) {\n Object.defineProperties(this, {\n key: {\n value: opts.key,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n value: {\n value: opts.value,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n validator: {\n value: opts.validator,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n }\n\n isValid(): boolean {\n return this.validator(this.value);\n }\n}\n\nexport default Validation;\nexport { ValidationError } from './errors';\n", "import Validation, { ValidationError } from '../../validation';\nimport type { Model } from '../../index';\n\n/**\n * @private\n */\nexport default function validate(instance: Model): true {\n return Array.from(instance.dirtyAttributes)\n .map(([key, value]) => ({\n key,\n value,\n validator: Reflect.get(instance.constructor.validates, key) as (\n value?: unknown\n ) => boolean\n }))\n .filter(({ validator }) => validator)\n .map(props => new Validation(props))\n .reduce<true>((result, validation) => {\n if (!validation.isValid()) {\n throw new ValidationError(validation.key, String(validation.value));\n }\n\n return result;\n }, true);\n}\n", "import type Model from '../index';\nimport type { Model$Hook } from '../interfaces';\n\n/**\n * @private\n */\nexport default function runHooks(\n record: Model,\n trx: unknown,\n ...hooks: Array<Model$Hook | undefined>\n): Promise<unknown> {\n return hooks\n .filter((hook): hook is Model$Hook => Boolean(hook))\n .reduce<Promise<unknown>>(\n (prev, next) => prev.then(() => next(record, trx)),\n Promise.resolve()\n );\n}\n", "import type { Migration$Fn } from './interfaces';\n\n/**\n * @private\n */\nclass Migration<T extends object> {\n declare fn: Migration$Fn<T>;\n\n constructor(fn: Migration$Fn<T>) {\n this.fn = fn;\n }\n\n run(schema: T): T {\n return this.fn(schema);\n }\n}\n\nexport default Migration;\nexport { default as generateTimestamp } from './utils/generate-timestamp';\nexport type { Migration$Fn } from './interfaces';\n", "import { TYPE_ALIASES } from '../constants';\nimport type { Database$column } from '../interfaces';\n\n/**\n * @private\n */\nexport default function typeForColumn(\n column: Database$column\n): string | undefined {\n return TYPE_ALIASES.get(column.type);\n}\n", "import type { Knex } from 'knex';\n\nimport type Logger from '../logger';\n\nimport { ModelMissingError } from './errors';\nimport initialize from './initialize';\nimport normalizeModelName from './utils/normalize-model-name';\nimport type { Database$opts, ModelClass } from './interfaces';\n\n/**\n * @private\n */\nclass Database {\n declare path: string;\n\n declare debug: boolean;\n\n declare logger: Logger;\n\n declare config: Record<string, unknown>;\n\n declare schema: () => Knex.SchemaBuilder;\n\n declare connection: Knex;\n\n declare models: Map<string, ModelClass>;\n\n constructor(opts: Database$opts) {\n // Lumen databases construct asynchronously: `initialize` populates `this` and\n // resolves once the schema/migrations/models are ready, so `new Database()`\n // is awaited by callers. TS can't express a Promise-returning constructor,\n // so assert the instance type here.\n return initialize(this, opts) as unknown as Database;\n }\n\n modelFor(type: string): ModelClass {\n const model = this.models.get(normalizeModelName(type));\n\n if (!model) {\n throw new ModelMissingError(type);\n }\n\n return model;\n }\n}\n\nexport default Database;\nexport { default as Model } from './model';\nexport { default as Query } from './query';\nexport { default as Migration, generateTimestamp } from './migration';\nexport { default as connect } from './utils/connect';\nexport { default as typeForColumn } from './utils/type-for-column';\nexport { default as createMigrations } from './utils/create-migrations';\nexport { default as pendingMigrations } from './utils/pending-migrations';\n\nexport type { Database$opts, Database$config, ModelClass } from './interfaces';\n", "import { createServer } from 'http';\nimport type { Writable } from 'stream';\nimport type { IncomingMessage, Server as HTTPServer } from 'http';\n\nimport { tryCatchSync } from '../../utils/try-catch';\nimport type Logger from '../logger';\nimport type Router from '../router';\n\nimport { HAS_BODY } from './constants';\nimport { createRequest, parseRequest } from './request';\nimport { createResponse } from './response';\nimport { createResponder } from './responder';\nimport validateAccept from './utils/validate-accept';\nimport validateContentType from './utils/validate-content-type';\nimport setCORSHeaders from './utils/set-cors-headers';\nimport type { Request } from './request/interfaces';\nimport type { Response } from './response/interfaces';\nimport type { Server$opts, Server$cors } from './interfaces';\n\n/**\n * @private\n */\nclass Server {\n declare logger: Logger;\n\n declare router: Router;\n\n declare cors: Server$cors;\n\n declare instance: HTTPServer;\n\n constructor({ logger, router, cors }: Server$opts) {\n Object.defineProperties(this, {\n router: {\n value: router,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n cors: {\n value: cors,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n instance: {\n value: createServer(this.receiveRequest),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n }\n\n listen(port: number): void {\n this.instance.listen(port);\n }\n\n initializeRequest(req: IncomingMessage, res: Writable): [Request, Response] {\n const { logger, router, cors } = this;\n\n req.setEncoding('utf8');\n\n const response = createResponse(res, {\n logger\n });\n\n setCORSHeaders(response, cors);\n\n const request = createRequest(req, {\n logger,\n router\n });\n\n return [request, response];\n }\n\n validateRequest({ method, headers }: Request): true {\n let isValid = validateAccept(headers.get('accept'));\n\n if (HAS_BODY.test(method)) {\n isValid = validateContentType(headers.get('content-type'));\n }\n\n return isValid;\n }\n\n receiveRequest = (req: IncomingMessage, res: Writable): void => {\n const { logger } = this;\n const [request, response] = this.initializeRequest(req, res);\n const respond = createResponder(request, response);\n\n logger.request(request, response, {\n startTime: Date.now()\n });\n\n const isValid = tryCatchSync(() => this.validateRequest(request), respond);\n\n if (isValid) {\n parseRequest(request)\n .then(params => {\n const { route } = request;\n\n Object.assign(request, {\n params\n });\n\n if (route) {\n return route.visit(request, response);\n }\n\n return undefined;\n })\n .then(respond)\n .catch(err => {\n logger.error(err);\n respond(err);\n });\n }\n };\n}\n\nexport default Server;\nexport { REQUEST_METHODS, getDomain } from './request';\nexport { default as createServerError } from './utils/create-server-error';\n\nexport type { Server$config } from './interfaces';\n\nexport type {\n Request,\n Request$params,\n Request$method\n} from './request/interfaces';\n\nexport type { Response } from './response/interfaces';\n", "export const HAS_BODY = /^(POST|PATCH)$/;\n\nexport const STATUS_CODES = new Map([\n [100, 'Continue'],\n [101, 'Switching Protocols'],\n [102, 'Processing'],\n [200, 'OK'],\n [201, 'Created'],\n [202, 'Accepted'],\n [203, 'Non-Authoritative Information'],\n [204, 'No Content'],\n [205, 'Reset Content'],\n [206, 'Partial Content'],\n [207, 'Multi-Status'],\n [208, 'Already Reported'],\n [226, 'IM Used'],\n [300, 'Multiple Choices'],\n [301, 'Moved Permanently'],\n [302, 'Found'],\n [303, 'See Other'],\n [304, 'Not Modified'],\n [305, 'Use Proxy'],\n [307, 'Temporary Redirect'],\n [308, 'Permanent Redirect'],\n [400, 'Bad Request'],\n [401, 'Unauthorized'],\n [402, 'Payment Required'],\n [403, 'Forbidden'],\n [404, 'Not Found'],\n [405, 'Method Not Allowed'],\n [406, 'Not Acceptable'],\n [407, 'Proxy Authentication Required'],\n [408, 'Request Timeout'],\n [409, 'Conflict'],\n [410, 'Gone'],\n [411, 'Length Required'],\n [412, 'Precondition Failed'],\n [413, 'Payload Too Large'],\n [414, 'URI Too Long'],\n [415, 'Unsupported Media Type'],\n [416, 'Range Not Satisfiable'],\n [417, 'Expectation Failed'],\n [418, \"I'm a teapot\"],\n [421, 'Misdirected Request'],\n [422, 'Unprocessable Entity'],\n [423, 'Locked'],\n [424, 'Failed Dependency'],\n [425, 'Unordered Collection'],\n [426, 'Upgrade Required'],\n [428, 'Precondition Required'],\n [429, 'Too Many Requests'],\n [431, 'Request Header Fields Too Large'],\n [451, 'Unavailable For Legal Reasons'],\n [500, 'Internal Server Error'],\n [501, 'Not Implemented'],\n [502, 'Bad Gateway'],\n [503, 'Service Unavailable'],\n [504, 'Gateway Timeout'],\n [505, 'HTTP Version Not Supported'],\n [506, 'Variant Also Negotiates'],\n [507, 'Insufficient Storage'],\n [508, 'Loop Detected'],\n [509, 'Bandwidth Limit Exceeded'],\n [510, 'Not Extended'],\n [511, 'Network Authentication Required']\n]);\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createRequest` receives the raw Node `IncomingMessage` and mutates it in\n * place into the framework's `Request` shape; the parameter is genuinely\n * untyped at that boundary before the mutation completes.\n */\nimport { parse as parseURL } from 'url';\n\nimport entries from '../../../utils/entries';\n\nimport type { Request, Request$opts } from './interfaces';\n\n/**\n * @private\n */\nexport function createRequest(\n req: any,\n { logger, router }: Request$opts\n): Request {\n const url = { ...parseURL(req.url, true), params: [] };\n const headers: Map<string, string> = new Map(entries(req.headers));\n\n Object.assign(req, {\n url,\n logger,\n headers,\n params: {},\n method: headers.get('x-http-method-override') || req.method\n });\n\n const route = router.match(req);\n\n if (route) {\n Object.assign(req, {\n route,\n action: route.action,\n controller: route.controller\n });\n }\n\n return req;\n}\n\nexport { REQUEST_METHODS } from './constants';\n\nexport { parseRequest } from './parser';\nexport { default as getDomain } from './utils/get-domain';\n", "import type { Request$method } from './interfaces';\n\nexport const REQUEST_METHODS: Array<Request$method> = [\n 'GET',\n 'HEAD',\n 'POST',\n 'PATCH',\n 'DELETE',\n 'OPTIONS'\n];\n", "import entries from '../../../../../utils/entries';\n\nconst DELIMITER = /^(.+)\\[(.+)]$/g;\n\n/**\n * @private\n */\nexport default function parseNestedObject(\n source: Record<string, unknown>\n): Record<string, unknown> {\n return entries(source).reduce<Record<string, unknown>>(\n (result, [key, value]) => {\n if (DELIMITER.test(key)) {\n const parentKey = key.replace(DELIMITER, '$1');\n const parentValue = Reflect.get(result, parentKey);\n\n return {\n ...result,\n [parentKey]: {\n ...(parentValue || {}),\n [key.replace(DELIMITER, '$2')]: value\n }\n };\n }\n\n return {\n ...result,\n [key]: value\n };\n },\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Request query/body parsing coerces genuinely untyped input (nested arrays of\n * string values from the URL) into normalized param shapes; the `any` arrays\n * are confined to those raw-value positions.\n */\nimport { camelize } from 'inflection';\n\nimport { INT, NULL, BOOL, DATE, TRUE, BRACKETS } from '../constants';\nimport isNull from '../../../../../utils/is-null';\nimport entries from '../../../../../utils/entries';\nimport underscore from '../../../../../utils/underscore';\nimport { camelizeKeys } from '../../../../../utils/transform-keys';\nimport type { Request$method } from '../../interfaces';\n\n/**\n * @private\n */\nfunction makeArray(source: string | Array<string>): Array<string> {\n if (!Array.isArray(source)) {\n return source.includes(',') ? source.split(',') : [source];\n }\n\n return source;\n}\n\n/**\n * @private\n */\nfunction formatString(source: string, method: Request$method): unknown {\n if (method === 'GET') {\n if (source.indexOf(',') >= 0) {\n return source.split(',').map(str => camelize(underscore(str), true));\n } else if (INT.test(source)) {\n return Number.parseInt(source, 10);\n } else if (BOOL.test(source)) {\n return TRUE.test(source);\n } else if (NULL.test(source)) {\n return null;\n }\n }\n\n if (DATE.test(source)) {\n return new Date(source);\n }\n\n return source;\n}\n\n/**\n * @private\n */\nfunction formatObject(\n source: Record<string, unknown> | Array<any>,\n method: Request$method,\n formatter: (\n params: Record<string, unknown>,\n method: Request$method\n ) => Record<string, unknown>\n): Record<string, unknown> | Array<any> {\n if (Array.isArray(source)) {\n return source.map(value => {\n if (INT.test(value)) {\n return Number.parseInt(value, 10);\n }\n\n return value;\n });\n }\n\n return formatter(source, method);\n}\n\n/**\n * @private\n */\nexport function formatSort(sort: string): string {\n if (sort.startsWith('-')) {\n return `-${camelize(underscore(sort.substr(1)), true)}`;\n }\n\n return camelize(underscore(sort), true);\n}\n\n/**\n * @private\n */\nexport function formatFields(\n fields: Record<string, unknown>\n): Record<string, unknown> {\n return entries(fields).reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: makeArray(value as string | Array<string>)\n }),\n {}\n );\n}\n\n/**\n * @private\n */\nexport function formatInclude(include: string | Array<string>): Array<string> {\n return makeArray(include);\n}\n\n/**\n * @private\n */\nexport default function format(\n params: Record<string, unknown>,\n method: Request$method\n): Record<string, unknown> {\n const result = entries(params).reduce<Record<string, unknown>>(\n (obj, param) => {\n const [, value] = param;\n let [key] = param;\n\n key = key.replace(BRACKETS, '');\n\n switch (typeof value) {\n case 'object':\n return {\n ...obj,\n [key]: isNull(value)\n ? null\n : formatObject(\n value as Record<string, unknown> | Array<any>,\n method,\n format\n )\n };\n\n case 'string':\n return {\n ...obj,\n [key]: formatString(value, key === 'id' ? 'GET' : method)\n };\n\n default:\n return {\n ...obj,\n [key]: value\n };\n }\n },\n {}\n );\n\n return camelizeKeys(result, true);\n}\n", "export const INT = /^\\d+$/;\nexport const NULL = /^null$/;\nexport const BOOL = /^(?:true|false)$/;\nexport const DATE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(Z|\\+\\d{4})$/;\nexport const TRUE = /^true$/;\nexport const BRACKETS = /(?:\\[])/g;\n", "import { camelize, dasherize } from 'inflection';\n\nimport entries from './entries';\nimport underscore from './underscore';\n\ntype Transformer = (key: string) => string;\n\n/**\n * Rewrites an object's keys with `transformer`.\n *\n * Overloaded rather than Flow's `T -> T`, which was inaccurate: transforming\n * keys produces a differently-shaped object, so the object form returns\n * `Record<string, unknown>`. Arrays are passed through as a shallow copy (their\n * keys are not transformed), so they keep their element type.\n *\n * @private\n */\nexport function transformKeys<T>(\n source: T[],\n transformer: Transformer,\n deep?: boolean\n): T[];\nexport function transformKeys(\n source: object,\n transformer: Transformer,\n deep?: boolean\n): Record<string, unknown>;\nexport function transformKeys(\n source: object | unknown[],\n transformer: Transformer,\n deep: boolean = false\n): object | unknown[] {\n if (Array.isArray(source)) {\n return source.slice(0);\n } else if (source && typeof source === 'object') {\n return entries(source as Record<string, unknown>).reduce<\n Record<string, unknown>\n >((result, [key, value]) => {\n const recurse =\n deep &&\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date);\n\n if (recurse) {\n return {\n ...result,\n [transformer(key)]: transformKeys(value as object, transformer, true)\n };\n }\n\n return {\n ...result,\n [transformer(key)]: value\n };\n }, {});\n }\n\n return {};\n}\n\n/**\n * @private\n */\nexport function camelizeKeys<T>(source: T[], deep?: boolean): T[];\nexport function camelizeKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function camelizeKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n return transformKeys(\n source as object,\n key => camelize(underscore(key), true),\n deep\n );\n}\n\n/**\n * @private\n */\nexport function dasherizeKeys<T>(source: T[], deep?: boolean): T[];\nexport function dasherizeKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function dasherizeKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n // NOTE: the Flow original passed a second `true` argument to `dasherize`,\n // which takes only one parameter \u2014 it was silently ignored, so dropping it\n // is behaviour-preserving.\n return transformKeys(\n source as object,\n key => dasherize(underscore(key)),\n deep\n );\n}\n\n/**\n * @private\n */\nexport function underscoreKeys<T>(source: T[], deep?: boolean): T[];\nexport function underscoreKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function underscoreKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n return transformKeys(source as object, key => underscore(key), deep);\n}\n", "import isObject from '../../../../../utils/is-object';\nimport type { Request } from '../../interfaces';\n\nimport parseNestedObject from './parse-nested-object';\nimport format, { formatSort, formatFields, formatInclude } from './format';\n\n/**\n * @private\n */\nexport default function parseRead({\n method,\n url: { query }\n}: Request): Record<string, unknown> {\n const { sort, fields, include, ...params } = parseNestedObject(query);\n\n if (sort) {\n params.sort = typeof sort === 'string' ? formatSort(sort) : sort;\n }\n\n if (fields) {\n params.fields = isObject(fields) ? formatFields(fields) : fields;\n }\n\n if (include) {\n params.include = formatInclude(include as string | Array<string>);\n }\n\n return format(params, method);\n}\n", "import createServerError from '../../../utils/create-server-error';\nimport { line } from '../../../../logger';\n\n/**\n * @private\n */\nclass MalformedRequestError extends SyntaxError {\n constructor() {\n super(line`\n There was an error parsing the request body. Please make sure that the\n request body is a valid JSON API document.\n `);\n }\n}\n\nexport default createServerError(MalformedRequestError, 400);\n", "import { MalformedRequestError } from '../errors';\nimport { tryCatchSync } from '../../../../../utils/try-catch';\nimport type { Request } from '../../interfaces';\n\nimport format from './format';\n\n/**\n * @private\n */\nexport default function parseWrite(\n req: Request\n): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let body = '';\n const cleanUp = () => {\n req.removeAllListeners('end');\n req.removeAllListeners('data');\n req.removeAllListeners('error');\n };\n\n req.on('data', data => {\n body += data.toString();\n });\n\n req.once('end', () => {\n const parsed = tryCatchSync(() => JSON.parse(body));\n\n cleanUp();\n\n if (parsed) {\n resolve(format(parsed, req.method));\n } else {\n reject(new MalformedRequestError());\n }\n });\n\n req.once('error', err => {\n cleanUp();\n reject(err);\n });\n });\n}\n", "import type { Request } from '../interfaces';\n\nimport parseRead from './utils/parse-read';\nimport parseWrite from './utils/parse-write';\n\n/**\n * @private\n */\nexport function parseRequest(req: Request): Promise<Record<string, unknown>> {\n switch (req.method) {\n case 'POST':\n case 'PATCH':\n return parseWrite(req).then(params => ({\n ...parseRead(req),\n ...params\n }));\n\n default:\n return Promise.resolve(parseRead(req));\n }\n}\n", "import type { Request } from '../interfaces';\n\n/**\n * @private\n */\nexport default function getDomain({\n headers,\n\n connection: { encrypted }\n}: Request): string {\n return `http${encrypted ? 's' : ''}://${headers.get('host') || 'localhost'}`;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createResponse` receives the raw Node response object and augments it in\n * place into the framework's `Response` shape; the parameter is genuinely\n * untyped at that boundary.\n */\nimport type { Response, Response$opts } from './interfaces';\n\n/**\n * @private\n */\nexport function createResponse(res: any, opts: Response$opts): Response {\n return Object.assign(res, opts, {\n stats: []\n });\n}\n", "export const VERSION = '1.0';\nexport const MIME_TYPE = 'application/vnd.api+json';\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass NotAcceptableError extends TypeError {\n constructor(contentType: string) {\n super(line`\n Media type parameters is not supported. Try your request again\n without specifying '${contentType.replace(MIME_TYPE, '')}'.\n `);\n }\n}\n\nexport default createServerError(NotAcceptableError, 406);\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass UnsupportedMediaTypeError extends TypeError {\n constructor(contentType: string) {\n super(line`\n Media type parameters is not supported. Try your request again\n without specifying '${contentType.replace(MIME_TYPE, '')}'.\n `);\n }\n}\n\nexport default createServerError(UnsupportedMediaTypeError, 415);\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass InvalidContentTypeError extends TypeError {\n constructor(contentType: string = 'undefined') {\n super(line`\n Content-Type: '${contentType}' is not supported. Try your request again\n with Content-Type: '${MIME_TYPE}'.\n `);\n }\n}\n\nexport default createServerError(InvalidContentTypeError, 400);\n", "import { MIME_TYPE } from '../constants';\n\n/**\n * @private\n */\nexport default function isJSONAPI(value: string): boolean {\n return value.startsWith(MIME_TYPE);\n}\n", "const PATTERN = /^application\\/vnd.api\\+json;charset=.+$/;\n\n/**\n * @private\n */\nexport default function hasMediaType(value: string): boolean {\n return PATTERN.test(value);\n}\n", "const isEnv = (value: string) => (): boolean => process.env.NODE_ENV === value;\n\nexport const isDevelopment: () => boolean = isEnv('development');\nexport const isProduction: () => boolean = isEnv('production');\nexport const isTest: () => boolean = isEnv('test');\n", "import { VERSION } from '../../../jsonapi';\nimport { STATUS_CODES } from '../../constants';\nimport * as env from '../../../../utils/env';\nimport type { JSONAPI$Document, JSONAPI$ErrorObject } from '../../../jsonapi';\n\n/**\n * @private\n */\nexport default function dataFor(\n status: number,\n err?: Error\n): string | JSONAPI$Document {\n if (status < 400 || status > 599) {\n return '';\n }\n\n const title = STATUS_CODES.get(status);\n const errData: JSONAPI$ErrorObject = {\n status: status.toString()\n };\n\n if (title) {\n errData.title = title;\n }\n\n if (err && (env.isDevelopment() || /^\\[public\\]/gi.test(err.message))) {\n errData.detail = err.message.replace(/^\\[public\\]/gi, '');\n }\n\n return {\n errors: [errData],\n\n jsonapi: {\n version: VERSION\n }\n };\n}\n", "import { STATUS_CODES } from '../../constants';\nimport stringify from '../../../../utils/stringify';\n\nimport dataFor from './data-for';\n\n/**\n * @private\n */\nexport default function normalize(data?: unknown) {\n let normalized;\n let statusCode;\n\n switch (typeof data) {\n case 'boolean':\n if (data) {\n statusCode = 204;\n } else {\n statusCode = 401;\n normalized = dataFor(statusCode);\n }\n break;\n\n case 'number':\n if (STATUS_CODES.has(data)) {\n statusCode = data;\n } else {\n statusCode = 404;\n }\n normalized = dataFor(statusCode);\n break;\n\n case 'object':\n if (!data) {\n statusCode = 404;\n normalized = dataFor(statusCode);\n } else if (data instanceof Error) {\n statusCode =\n parseInt(String((data as { statusCode?: unknown }).statusCode), 10) ||\n 500;\n normalized = dataFor(statusCode, data);\n } else {\n normalized = data;\n }\n break;\n\n case 'undefined':\n statusCode = 404;\n normalized = dataFor(statusCode);\n break;\n\n default:\n normalized = data;\n }\n\n return {\n statusCode,\n data: stringify(normalized)\n };\n}\n", "import type { Response } from '../../index';\n\nexport default function hasContentType(res: Response) {\n let contentType = res.getHeader('Content-Type');\n\n if (!contentType) {\n contentType = res.getHeader('content-type');\n }\n\n return Boolean(contentType);\n}\n", "import { MIME_TYPE } from '../../jsonapi';\nimport type { Request, Response } from '../index';\n\nimport normalize from './utils/normalize';\nimport hasContentType from './utils/has-content-type';\n\n/**\n * @private\n */\nexport function createResponder(req: Request, res: Response) {\n return function respond(data?: unknown) {\n const normalized = normalize(data);\n\n if (normalized.statusCode) {\n Reflect.set(res, 'statusCode', normalized.statusCode);\n }\n\n if (res.statusCode !== 204 && !hasContentType(res)) {\n res.setHeader('Content-Type', MIME_TYPE);\n }\n\n res.end(normalized.data);\n };\n}\n", "import { hasMediaType, NotAcceptableError } from '../../jsonapi';\n\n/**\n * @private\n */\nexport default function validateAccept(contentType?: string): true {\n if (contentType && hasMediaType(contentType)) {\n throw new NotAcceptableError(contentType);\n }\n\n return true;\n}\n", "import {\n isJSONAPI,\n hasMediaType,\n InvalidContentTypeError,\n UnsupportedMediaTypeError\n} from '../../jsonapi';\n\n/**\n * @private\n */\nexport default function validateContentType(contentType?: string): true {\n if (!contentType || !isJSONAPI(contentType)) {\n throw new InvalidContentTypeError(contentType);\n } else if (hasMediaType(contentType)) {\n throw new UnsupportedMediaTypeError(contentType);\n }\n\n return true;\n}\n", "import type { Response } from '../index';\nimport type { Server$cors } from '../interfaces';\n\nexport default function setCORSHeaders(\n res: Response,\n { origin, methods, headers, enabled }: Server$cors\n) {\n if (!enabled) {\n return;\n }\n\n if (origin) {\n res.setHeader('Access-Control-Allow-Origin', origin);\n }\n\n if (methods) {\n res.setHeader('Access-Control-Allow-Methods', methods.join());\n }\n\n if (headers) {\n res.setHeader('Access-Control-Allow-Headers', headers.join());\n }\n}\n", "import entries from './entries';\nimport isObject from './is-object';\n\nfunction hasOwnProperty(target: object, key: string): boolean {\n return Reflect.apply(Object.prototype.hasOwnProperty, target, [key]);\n}\n\n/**\n * @private\n */\nexport default function merge<T extends object, U extends object>(\n dest: T,\n source: U\n): T & U {\n return entries(source as Record<string, unknown>).reduce<\n Record<string, unknown>\n >(\n (result, [key, value]) => {\n if (hasOwnProperty(result, key) && isObject(value)) {\n const currentValue = Reflect.get(result, key);\n\n if (isObject(currentValue)) {\n return {\n ...result,\n [key]: merge(currentValue, value)\n };\n }\n }\n\n return {\n ...result,\n [key]: value\n };\n },\n { ...dest } as Record<string, unknown>\n ) as T & U;\n}\n", "import omit from '../../../utils/omit';\nimport entries from '../../../utils/entries';\nimport type { ModelClass } from '../../database';\nimport type { Request$params } from '../../server';\n\ntype Controller$query = {\n id?: number | string | Buffer;\n filter?: Record<string, unknown>;\n select: Array<string>;\n page?: number;\n limit?: number;\n sort?: [string, string];\n include: Record<string, Array<string>>;\n};\n\n/**\n * @private\n */\nexport default function paramsToQuery(\n model: ModelClass,\n { id, page, sort, filter, fields, include }: Request$params\n): Controller$query {\n const relationships = entries(model.relationships);\n const includedFields = omit(fields, model.resourceName);\n\n let query: Controller$query = {\n id,\n filter,\n select: [\n model.primaryKey,\n ...(Reflect.get(fields, model.resourceName) as Array<string>)\n ],\n include: {}\n };\n\n if (page) {\n query = {\n ...query,\n page: page.number,\n limit: page.size\n };\n }\n\n if (sort) {\n if (sort.startsWith('-')) {\n query = {\n ...query,\n sort: [sort.substr(1), 'DESC']\n };\n } else {\n query = {\n ...query,\n sort: [sort, 'ASC']\n };\n }\n }\n\n const includedFieldsMap = entries(includedFields).reduce<\n Record<string, Array<string>>\n >((result, field) => {\n const [key] = field;\n const [, rawValue] = field;\n\n const [name, relationship] =\n relationships.find(\n ([, { model: related }]) => key === related.resourceName\n ) || [];\n\n if (!name || !relationship) {\n return result;\n }\n\n let value = rawValue as Array<string>;\n\n if (!value.includes(relationship.model.primaryKey)) {\n value = [relationship.model.primaryKey, ...value];\n }\n\n if (include && value.length === 1 && include.includes(name)) {\n value = [...value, ...relationship.model.serializer.attributes];\n } else if (!include && value.length > 1) {\n value = value.slice(0, 1);\n }\n\n return {\n ...result,\n [name]: value\n };\n }, {});\n\n return {\n ...query,\n include: includedFieldsMap\n };\n}\n", "import merge from '../../../utils/merge';\nimport type { Model, ModelClass, Query } from '../../database';\nimport type { Request } from '../../server';\n\nimport paramsToQuery from './params-to-query';\n\n/**\n * @private\n */\nexport default function findOne<T extends Model>(\n model: ModelClass<T>,\n req: Request\n): Query<T> {\n const params = merge(req.defaultParams, req.params);\n const { id, select, include } = paramsToQuery(model, params);\n\n return model\n .find(id)\n .select(...select)\n .include(include);\n}\n", "import merge from '../../../utils/merge';\nimport type { Model, ModelClass, Query } from '../../database';\nimport type { Request } from '../../server';\n\nimport paramsToQuery from './params-to-query';\n\n/**\n * @private\n */\nexport default function findMany<T extends Model>(\n model: ModelClass<T>,\n req: Request\n): Query<Array<Model>> {\n const params = merge(req.defaultParams, req.params);\n const { sort, page, limit, select, filter, include } = paramsToQuery(\n model,\n params\n );\n\n return model\n .select(...select)\n .include(include)\n .limit(limit)\n .page(page)\n .where(filter)\n .order(...(sort as [string, string]));\n}\n", "import entries from '../../../utils/entries';\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * @private\n */\nexport default function resolveRelationships<T extends Model>(\n model: ModelClass<T>,\n relationships: Record<string, unknown> = {}\n): Record<string, unknown> {\n return entries(relationships).reduce<Record<string, unknown>>(\n (obj, [key, value]) => {\n let { data = null } = (value as { data?: unknown } | null) || {};\n\n if (data) {\n const opts = model.relationshipFor(key);\n\n if (opts) {\n const Related = opts.model as new (attrs: unknown) => Model;\n\n if (Array.isArray(data)) {\n data = data.map(item => Reflect.construct(Related, [item]));\n } else {\n data = Reflect.construct(Related, [data]);\n }\n }\n }\n\n return {\n ...obj,\n [key]: data\n };\n },\n {}\n );\n}\n", "import type { Controller$builtIn } from './index';\n\nexport const BUILT_IN_ACTIONS: ReadonlyArray<Controller$builtIn> =\n Object.freeze(['show', 'index', 'create', 'update', 'destroy']);\n", "import { getDomain } from '../server';\nimport { freezeProps } from '../freezeable';\nimport type Serializer from '../serializer';\nimport type { Model, ModelClass, Query } from '../database';\nimport type { Request, Response } from '../server';\n\nimport findOne from './utils/find-one';\nimport findMany from './utils/find-many';\nimport resolveRelationships from './utils/resolve-relationships';\nimport type {\n Controller$opts,\n Controller$beforeAction,\n Controller$afterAction\n} from './interfaces';\n\n/**\n * ## Overview\n *\n * The Controller class is responsible for taking in requests from the outside\n * world and returning the appropriate response.\n *\n * Think of a Controller as a server at a restaurant. A client makes a request\n * to an application, that request is routed to the appropriate Controller and\n * then the Controller interprets the request and returns data relative to what\n * the client has request.\n *\n * #### Actions\n *\n * Controller actions are functions that call on a Controller in response to an\n * incoming HTTP request. The job of Controller actions are to return the data\n * that the Lumen Application will respond with.\n *\n * There is no special API for Controller actions. They are simply functions\n * that return a value. If an action returns a Query or Promise the resolved\n * value will be used rather than the immediate return value of the action.\n *\n * Below you will find a table showing the different types of responses you can\n * get from different action return values. Keep in mind, Lumen is agnostic to\n * whether or not the value is returned synchronously or resolved from a\n * Promise.\n *\n * | Return/Resolved Value | Response |\n * |------------------------------|--------------------------------------------|\n * | Array<Model> or Model | Serialized JSON String |\n * | Array or Object Literal | JSON String |\n * | String Literal | Plain Text |\n * | Number Literal | [HTTP Status Code](https://goo.gl/T2lMc7) |\n * | true | [204 No Content](https://goo.gl/GxKoqz) |\n * | false | [401 Unauthorized](https://goo.gl/60QqCW) |\n *\n * **Built-In Actions**\n *\n * Built-in actions refer to Controller actions that you get for free when\n * extending the Controller class (show, index, create, update, destroy). These\n * actions are highly optimized to load only the attributes and relationships\n * that are defined in the resolved Serializer for a Controller.\n *\n * If applicable, built-in actions support the following features described in\n * the [JSON API specification](http://jsonapi.org/):\n *\n * - [Sorting](http://jsonapi.org/format/#fetching-sorting)\n * - [Filtering](http://jsonapi.org/format/#fetching-filtering)\n * - [Pagination](http://jsonapi.org/format/#fetching-pagination)\n * - [Sparse Fieldsets](http://jsonapi.org/format/#fetching-sparse-fieldsets)\n * - [Including Related Resources](http://jsonapi.org/format/#fetching-includes)\n *\n * **Extending Built-In Actions**\n *\n * Considering the amount of functionality built-in actions provide, you will\n * rarely need to override the default behavior of a built-in action. In the\n * event that you do need to override a built-in action, you have the ability to\n * opt back into the built-in logic by calling the super class.\n *\n * Read actions such as index and show return a Query which allows us to chain\n * methods to the super call. In the following example we will extend the\n * default behavior of the index action to only match records that meet an\n * additional hard-coded set of conditions. We will still be able to use all of\n * the functionality that the built-in index action provides.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n *\n * class PostsController extends Controller {\n * index(request, response) {\n * return super.index(request, response).where({\n * isPublic: true\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * **Custom Actions**\n *\n * Sometimes it is necessary to add a custom action to a Controller. Lumen allows\n * you to do so by adding an instance method to a Controller. In the following\n * example you will see how to add a custom action with the name `check` to a\n * Controller. We are implementing this action to use as a health check for the\n * application so we want to return the `Number` literal `204`.\n *\n * ```javascript\n * // app/controllers/health.js\n * import { Controller } from 'lumen-framework';\n *\n * class HealthController extends Controller {\n * async check() {\n * return 204;\n * }\n * }\n *\n * export default HealthController;\n * ```\n *\n * The example above is nice but we can make the code a bit more concise with an\n * Arrow `Function`.\n *\n * ```javascript\n * // app/controllers/health.js\n * import { Controller } from 'lumen-framework';\n *\n * class HealthController extends Controller {\n * check = async () => 204;\n * }\n *\n * export default HealthController;\n * ```\n *\n * Using an Arrow Function instead of a traditional method Controller can be\n * useful when immediately returning a value. However, there are a few downsides\n * to using an Arrow `Function` for a Controller action, such as not being able\n * to call the `super class`. This can be an issue if you are looking to extend\n * a built-in action.\n *\n * Another use case for a custom action could be to return a specific scope of\n * data from a `Model`. Let's implement\n * a custom `drafts` route on a `PostsController`.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n * import Post from 'app/models/posts';\n *\n * class PostsController extends Controller {\n * drafts() {\n * return Post.where({\n * isPublic: false\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * While the example above works, we would have to implement all the custom\n * logic that we get for free with built-in actions. Since we aren't getting too\n * crazy with our custom action we can likely just call the `index` action and\n * chain a `.where()` to it.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n *\n * class PostsController extends Controller {\n * drafts(request, response) {\n * return this.index(request, response).where({\n * isPublic: false\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * Now we can sort, filter, and paginate our custom `drafts` route!\n *\n * #### Middleware\n *\n * Middleware can be a very powerful tool in many Node.js server frameworks. Lumen\n * is no exception. Middleware can be used to execute logic before or after a\n * Controller action is executed.\n *\n * There are two hooks where you can execute middleware functions,\n * `beforeAction` and `afterAction`. Functions added to the `beforeAction` hook\n * will execute before the Controller action and functions added to the\n * `afterAction` hook will be executed after the `Controller` action.\n *\n * **Context**\n *\n * Middleware functions will be bound to the Controller they are added to upon\n * the start of an Application.\n *\n * Due to the lexical binding of arrow functions, if you need to use the `this`\n * keyword within a middleware function, declare the middleware function using\n * the `function` keyword and not as an arrow function.\n *\n * **Scoping Middleware**\n *\n * Middleware is scoped by Controller and includes a parent Controller's\n * middleware recursively until the parent Controller is the root\n * `ApplicationController`. This allows you to implement custom logic that can\n * be executed for resources, namespaces, or an entire Application.\n *\n * Let's say we want to require authentication for every route in our\n * Application. All we have to do is move our authentication middleware function\n * from the example above to the `ApplicationController`.\n *\n * ```javascript\n * // app/controllers/application.js\n * import { Controller } from 'lumen-framework';\n *\n * class ApplicationController extends Controller {\n * beforeAction = [\n * async function authenticate(request) {\n * if (!request.currentUser) {\n * // 401 Unauthorized\n * return false;\n * }\n * }\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * **Execuation Order**\n *\n * Understanding the execution order of middleware functions and a `Controller`\n * action is essential to productivity with Lumen. Depending on what you use case\n * is, you may want your function to execute at different times in the\n * `request` / `response` cycle.\n *\n * 1. Parent `Controller` `beforeAction` hooks\n * 2. `Controller` `beforeAction` hooks\n * 3. `Controller` Action\n * 4. `Controller` `afterAction` hooks\n * 5. Parent `Controller` `afterAction` hooks\n *\n * **Modules**\n *\n * It is considered a best practice to define your middleware functions in\n * separate file and export them for use throughout an Application. Typically\n * this is done within an `app/middleware` directory.\n *\n * ```javascript\n * // app/middleware/authenticate.js\n * export default async function authenticate(request) {\n * if (!request.currentUser) {\n * // 401 Unauthorized\n * return false;\n * }\n * }\n * ```\n *\n * This keeps the Controller code clean, easier to read, and easier to modify.\n *\n * ```javascript\n * // app/controllers/application.js\n * import { Controller } from 'lumen-framework';\n * import authenticate from 'app/middleware/authenticate';\n *\n * class ApplicationController extends Controller {\n * beforeAction = [\n * authenticate\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * @class Controller\n * @public\n */\nclass Controller {\n /**\n * An array of custom query parameter keys that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * For security reasons, query parameters passed to Controller actions from an\n * incoming request other than sort, filter, and page must have their key\n * whitelisted.\n *\n * ```javascript\n * class UsersController extends Controller {\n * // Allow the following custom query parameters to be used for this\n * // Controller's actions.\n * query = [\n * 'cache'\n * ];\n * }\n * ```\n *\n * @property query\n * @type {Array}\n * @default []\n * @public\n */\n query: Array<string> = [];\n\n /**\n * An array of sort query parameter values that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property sort\n * @type {Array}\n * @default []\n * @public\n */\n sort: Array<string> = [];\n\n /**\n * An array of filter query parameter keys that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property filter\n * @type {Array}\n * @default []\n * @public\n */\n filter: Array<string> = [];\n\n /**\n * An array of parameter keys that are allowed to reach a Controller instance\n * from an incoming `POST` or `PATCH` request body.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property params\n * @type {Array}\n * @default []\n * @public\n */\n params: Array<string> = [];\n\n /**\n * Functions to execute on each request handled by a `Controller` before the\n * `Controller` action is executed.\n *\n * Functions added to the `beforeAction` hook behave similarly to `Controller`\n * actions, however, they are expected to return `undefined`. If a middleware\n * function returns a value other than `undefined` the `request` / `response`\n * cycle will end before remaining middleware and/or Controller actions are\n * executed. This makes the `beforeAction` hook a very powerful tool for\n * dealing with many common tasks, such as authentication.\n *\n * Functions called from the `beforeAction` hook will have `request` and\n * `response` objects passed as arguments.\n *\n * **Example:**\n *\n * ```javascript\n * import { Controller } from 'lumen-framework';\n *\n * const UNSAFE_METHODS = /(?:POST|PATCH|DELETE)/i;\n *\n * function isAdmin(user) {\n * if (user) {\n * return user.isAdmin;\n * }\n *\n * return false;\n * }\n *\n * async function authentication(request) {\n * const { method, currentUser } = request;\n * const isUnsafe = UNSAFE_METHODS.test(method);\n *\n * if (isUnsafe && !isAdmin(currentUser)) {\n * return false; // 401 Unauthorized if the current user is not an admin.\n * }\n * }\n *\n * class PostsController extends Controller {\n * beforeAction = [\n * authentication\n * ];\n * }\n *\n * export default PostsController;\n * ```\n *\n * @property beforeAction\n * @type {Array}\n * @default []\n * @public\n */\n beforeAction: Array<Controller$beforeAction> = [];\n\n /**\n * Functions to execute on each request handled by a `Controller` after the\n * `Controller` action is executed.\n *\n * Functions called from the `afterAction` hook will have `request` and\n * `response` objects passed as arguments as well as a third `payload`\n * argument. The `payload` argument is a reference to the resolved data of\n * the Controller action that was called within the current `request` /\n * `response` cycle. You need to explicitly return this `payload` in order for\n * the afterAction to resolve with it's data. If you return a modified value\n * from a function added to the `afterAction` hook, that value will be used\n * instead of the resolved data from the preceding Controller action.\n * Subsequent hooks called from an `afterAction` hook will will use the value\n * returned or resolved from the preceding hook. This makes `afterAction` a\n * great place to modify the data you are sending back to the client.\n *\n * **Example:**\n *\n * ```javascript\n * import { Controller } from 'lumen-framework';\n *\n * async function addCopyright(request, response, payload) {\n * const { action } = request;\n *\n * if (payload && action !== preflight) {\n * return {\n * ...payload,\n * meta: {\n * copyright: '2016 (c) Postlight'\n * }\n * };\n * }\n *\n * return payload;\n * }\n *\n * class ApplicationController extends Controller {\n * afterAction = [\n * addCopyright\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * @property afterAction\n * @type {Array}\n * @default []\n * @public\n */\n afterAction: Array<Controller$afterAction> = [];\n\n /**\n * The default amount of items to include per each response of the index\n * action if a `?page[size]` query parameter is not specified.\n *\n * @property defaultPerPage\n * @type {Number}\n * @default 25\n * @public\n */\n defaultPerPage: number = 25;\n\n /**\n * The resolved Model for a Controller instance.\n *\n * @property model\n * @type {Model}\n * @private\n */\n declare model: ModelClass<Model>;\n\n /**\n * A reference to the root Controller for the namespace that a Controller\n * instance is a member of.\n *\n * @property parent\n * @type {?Controller}\n * @private\n */\n declare parent: Controller | null;\n\n /**\n * The namespace that a Controller instance is a member of.\n *\n * @property namespace\n * @type {String}\n * @private\n */\n declare namespace: string;\n\n /**\n * The resolved Serializer for a Controller instance.\n *\n * @property serializer\n * @type {Serializer}\n * @private\n */\n declare serializer: Serializer<Model>;\n\n /**\n * A Map instance containing a reference to all the Controller within an\n * Application instance.\n *\n * @property controllers\n * @type {Map}\n * @private\n */\n declare controllers: Map<string, Controller>;\n\n /**\n * A boolean value representing whether or not a Controller instance has a\n * Model.\n *\n * @property hasModel\n * @type {Boolean}\n * @private\n */\n declare hasModel: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance is within\n * a namespace.\n *\n * @property hasNamespace\n * @type {Boolean}\n * @private\n */\n declare hasNamespace: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance has a\n * Serializer.\n *\n * @property hasSerializer\n * @type {Boolean}\n * @private\n */\n declare hasSerializer: boolean;\n\n constructor({ model, namespace, serializer }: Controller$opts) {\n Object.assign(this, {\n model,\n namespace,\n serializer,\n hasModel: Boolean(model),\n hasNamespace: Boolean(namespace),\n hasSerializer: Boolean(serializer)\n });\n\n freezeProps(this, true, 'model', 'namespace', 'serializer');\n\n freezeProps(this, false, 'hasModel', 'hasNamespace', 'hasSerializer');\n }\n\n /**\n * This method supports filtering, sorting, pagination, including\n * relationships, and sparse fieldsets via query parameters. For more\n * information, see the [fetching resources](https://goo.gl/q7FVgZ) section of\n * the JSON API specification.\n *\n * @method index\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with an array of Model instances.\n * @public\n */\n index(req: Request): Query<Array<Model>> {\n return findMany(this.model, req);\n }\n\n /**\n * This method supports including relationships, and sparse fieldsets via\n * query parameters. For more information, see the [fetching resources](\n * https://goo.gl/q7FVgZ) section of the JSON API specification.\n *\n * @method show\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with a Model instance with the id equal to the\n * id url parameter.\n * @public\n */\n show(req: Request): Query<Model> {\n return findOne(this.model, req);\n }\n\n /**\n * Create and return a single Model instance that the Controller instance\n * represents. For more information, see the [creating resources](\n * https://goo.gl/4Obc9t) section of the JSON API specification.\n *\n * @method create\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the newly created Model instance.\n * @public\n */\n async create(req: Request, res: Response): Promise<Model> {\n const { model } = this;\n\n const {\n url: { pathname },\n params: {\n data: { attributes, relationships }\n }\n } = req;\n\n const record = await model.create({\n ...attributes,\n ...resolveRelationships(model, relationships)\n });\n\n res.setHeader(\n 'Location',\n `${getDomain(req) + pathname}/${record.getPrimaryKey()}`\n );\n\n Reflect.set(res, 'statusCode', 201);\n\n return record.unwrap();\n }\n\n /**\n * Update and return a single Model instance that the Controller instance\n * represents. For more information, see the [updating resources](\n * https://goo.gl/o2ZdOR)section of the JSON API specification.\n *\n * @method update\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the updated Model if changes occur.\n * Resolves with the number `204` if no changes occur.\n * @public\n */\n update(req: Request): Promise<number | Model> {\n const { model } = this;\n\n return findOne(model, req)\n .then(record => {\n const {\n params: {\n data: { attributes, relationships }\n }\n } = req;\n\n return record.update({\n ...attributes,\n ...resolveRelationships(model, relationships)\n });\n })\n .then(record => {\n if (record.didPersist) {\n return record.unwrap();\n }\n\n return 204;\n });\n }\n\n /**\n * Destroy a single Model instance that the Controller instance represents.\n * For more information, see the [deleting resources](https://goo.gl/nUZn8t)\n * section of the JSON API specification.\n *\n * @method destroy\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the number `204`.\n * @public\n */\n destroy(req: Request): Promise<number> {\n return findOne(this.model, req)\n .then(record => record.destroy())\n .then(() => 204);\n }\n\n /**\n * Respond to HEAD or OPTIONS requests.\n *\n * @method preflight\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the number `204`.\n * @public\n */\n preflight(): Promise<number> {\n return Promise.resolve(204);\n }\n}\n\nexport default Controller;\nexport { BUILT_IN_ACTIONS } from './constants';\n\nexport type {\n Controller$opts,\n Controller$builtIn,\n Controller$beforeAction,\n Controller$afterAction\n} from './interfaces';\n", "import { dasherize } from 'inflection';\n\nimport { VERSION } from '../jsonapi';\nimport { freezeProps } from '../freezeable';\nimport uniq from '../../utils/uniq';\nimport underscore from '../../utils/underscore';\nimport promiseHash from '../../utils/promise-hash';\nimport { dasherizeKeys } from '../../utils/transform-keys';\nimport type { Model, ModelClass } from '../database';\nimport type {\n JSONAPI$Document,\n JSONAPI$DocumentLinks,\n JSONAPI$ResourceObject,\n JSONAPI$RelationshipObject\n} from '../jsonapi';\n\nimport type { Serializer$opts } from './interfaces';\n\n/**\n * ## Overview\n *\n * The Serializer class is used to describe which attributes and relationships\n * to include for a particular resource.\n *\n * The attributes and relationships you declare in a Serializer will determine\n * the attributes and relationships that will be included in the response from\n * the resource that the Serializer represents.\n *\n * #### Attributes\n *\n * You can add attributes to your serializer using an array assigned to the\n * class property `attributes` like the example below.\n *\n * ```javascript\n * class UsersSerializer extends Serializer {\n * attributes = [\n * 'name',\n * 'email',\n * 'username',\n * 'createdAt',\n * 'updatedAt'\n * ];\n * }\n * ```\n *\n * Since the attributes required for a resource are declared ahead of time in a\n * Serializer, Lumen will optimize SQL queries for the resource to only include\n * what the Serializer needs to build the response.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * The Serializer above would result in resources returned from the `/posts`\n * endpoint to only include the `body`, `title`, and `createdAt` attributes. If\n * we wanted include an additional attribute such as `isPublic`, we would have\n * to add `'isPublic'` to the `attributes` property.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * #### Associations\n *\n * Similar to `attributes` you can declare associations by adding relationship\n * names to either the `hasOne` or `hasMany` property arrays on a Serializer.\n *\n * Serializers are not concerned with ownership when it comes to associations,\n * so both `hasOne` and `belongsTo` associations can be specified in the\n * `hasOne` array property.\n *\n * ```javascript\n * import { Model } from 'lumen-framework';\n *\n * class Post extends Model {\n * static hasOne = {\n * image: {\n * inverse: 'post'\n * }\n * };\n *\n * static hasMany = {\n * tags: {\n * inverse: 'posts',\n * through: 'categorization'\n * },\n *\n * comments: {\n * inverse: 'post'\n * }\n * };\n *\n * static belongsTo = {\n * user: {\n * inverse: 'posts'\n * }\n * };\n * }\n *\n * export default Post;\n * ```\n *\n * To include the `user` and `image` associations in the response returned from\n * the `/posts` endpoint, we must specify both associations in the `hasOne`\n * property array of the Serializer.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * If we wanted to also include the `tags` and `comments` in the response, we\n * have to add a `hasMany` array property containing `'tags'` and `'comments'`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * You no longer need to specify that `tags` is a many to many relationship\n * using the `Categorization` model as a join table.\n *\n * #### Including Related Resources\n *\n * When requesting related resources for an endpoint, the included resource will\n * follow the serialization rules defined by the included resources Serializer.\n *\n * If we request that the `posts` association is included from the `/users`\n * endpoint, we will only get the `attributes` that the `PostsSerializer` has\n * defined even though the response is processed by the `UsersSerializer`.\n *\n * #### Sparse Fieldsets\n *\n * When a request specifies the fields that it would like included in the\n * response, the fields **MUST** be declared in the `attributes` property array\n * of the resources Serializer, or they will be ignored.\n *\n * #### Namespaces\n *\n * When using namespaces, you are not required to have a Serializer for each\n * resource as long as a Serializer for the given resource can be resolved\n * upstream.\n *\n * For example, if you have a `posts` resource and you decide to implement an\n * admin namespace, you only need to export an `AdminPostsSerializer` from\n * `app/serializers/admin/posts.js` if you want to specify different attributes\n * or relationships than the `PostsSerializer` exported from\n * `app/serializers/posts.js`.\n *\n * In the event that you do want to specify different attributes or\n * relationships that the `PostsSerializer` exported from\n * `app/serializers/posts.js`, you are not required to extend `PostsSerializer`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n *\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * To add the `isPublic` attribute to the response payload of requests to a\n * `/admin/posts` endpoint we can do either of the following examples:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import PostsSerializer from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * OR\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import { Serializer } from 'lumen-framework';\n *\n * class AdminPostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n *\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * Even with inheritance, the examples above are a tad repetitive. We can\n * improve this code by exporting constants from `app/serializers/posts.js`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * export const HAS_ONE = [\n * 'user',\n * 'image'\n * ];\n *\n * export const HAS_MANY = [\n * 'tags',\n * 'comments'\n * ];\n *\n * export const ATTRIBUTES = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n *\n * class PostsSerializer extends Serializer {\n * hasOne = HAS_ONE;\n * hasMany = HAS_MANY;\n * attributes = ATTRIBUTES;\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * If we choose to use inheritance, our code can look like this:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import PostsSerializer, { ATTRIBUTES } from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * attributes = [\n * ...ATTRIBUTES,\n * 'isPublic'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * If we choose not use inheritance, our code can look like this:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import { Serializer } from 'lumen-framework';\n * import { HAS_ONE, HAS_MANY, ATTRIBUTES } from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * hasOne = HAS_ONE;\n * hasMany = HAS_MANY;\n *\n * attributes = [\n * ...ATTRIBUTES,\n * 'isPublic'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * @class Serializer\n * @public\n */\nclass Serializer<T extends Model> {\n /**\n * An Array of the `hasOne` or `belongsTo` relationships on a Serializer\n * instance's Model to include in the\n * `relationships` resource object of a serialized payload.\n *\n * ```javascript\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user'\n * ];\n * }\n * ```\n *\n * @property hasOne\n * @type {Array}\n * @default []\n * @public\n */\n hasOne: Array<string> = [];\n\n /**\n * An Array of the `hasMany` relationships on a Serializer instance's Model to\n * include in the `relationships` resource object of a serialized payload.\n *\n * ```javscript\n * class PostsSerializer extends Serializer {\n * hasMany = [\n * 'comments'\n * ];\n * }\n * ```\n *\n * @property hasMany\n * @type {Array}\n * @default []\n * @public\n */\n hasMany: Array<string> = [];\n\n /**\n * An array of the `attributes` on a Serializer instance's Model to include in\n * the `attributes` resource object of a serialized payload.\n *\n * ```javscript\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title'\n * ];\n * }\n * ```\n *\n * @property attributes\n * @type {Array}\n * @default []\n * @public\n */\n attributes: Array<string> = [];\n\n /**\n * The resolved Model that a Serializer instance represents.\n *\n * @property model\n * @type {Model}\n * @private\n */\n declare model: ModelClass<T>;\n\n /**\n * A reference to the root Serializer for the namespace that a Serializer\n * instance is a member of.\n *\n * @property parent\n * @type {?Serializer}\n * @private\n */\n declare parent: Serializer<Model> | null;\n\n /**\n * The namespace that a Serializer instance is a member of.\n *\n * @property namespace\n * @type {String}\n * @private\n */\n declare namespace: string;\n\n constructor({ model, parent, namespace }: Serializer$opts<T>) {\n Object.assign(this, {\n model,\n parent,\n namespace\n });\n\n freezeProps(this, true, 'model', 'parent', 'namespace');\n }\n\n /**\n * Transform an array of Model instances or a single Model instance into a\n * [JSON API](http://jsonapi.org) document object.\n *\n * @method format\n *\n * @param {Object} options - An options object used for building the\n * returned [JSON API](http://jsonapi.org) document object.\n *\n * @param {Model|Array} options.data - The Model instance or array of\n * Model instances to transform into the returned [JSON API](\n * http://jsonapi.org) document object.\n *\n * @param {Object} options.links - An object containing links to include in\n * the top level links object of the returned [JSON API](http://jsonapi.org)\n * document object.\n *\n * @param {String} options.domain - A string used to build links included in\n * the resource and relationship objects in the returned [JSON API](\n * http://jsonapi.org) document object.\n *\n * @param {Array} options.include - An array of strings containing the\n * relationship keys that should be added to the top level included object of\n * the returned [JSON API](http://jsonapi.org) document object.\n *\n * @return {Promise} Resolves with a [JSON API](http://jsonapi.org) document\n * object.\n *\n * @private\n */\n async format({\n data,\n links,\n domain,\n include\n }: {\n data: T | Array<T>;\n links: JSONAPI$DocumentLinks;\n domain: string;\n include: Array<string>;\n }): Promise<JSONAPI$Document> {\n let serialized: Record<string, unknown> = {};\n const included: Array<JSONAPI$ResourceObject> = [];\n\n if (Array.isArray(data)) {\n serialized = {\n data: await Promise.all(\n data.map(item =>\n this.formatOne({\n item,\n domain,\n include,\n included\n })\n )\n )\n };\n } else {\n serialized = {\n data: await this.formatOne({\n domain,\n include,\n included,\n item: data,\n links: false\n })\n };\n }\n\n if (included.length) {\n serialized = {\n ...serialized,\n included: uniq(included, 'id', 'type')\n };\n }\n\n // The document is assembled from dynamic model data; its pieces are typed\n // structurally above, so assert the fully-built JSON:API shape here.\n return {\n ...serialized,\n links,\n\n jsonapi: {\n version: VERSION\n }\n } as JSONAPI$Document;\n }\n\n /**\n * Transform a single Model instance into a [JSON API](http://jsonapi.org)\n * resource object.\n *\n * @method formatOne\n *\n * @param {Object} options - An options object used for building the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Model} options.item - The Model instance to transform into the\n * returned [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Object} options.links - An object containing links to include in\n * the top level links object of the returned [JSON API](http://jsonapi.org)\n * resource object.\n *\n * @param {String} options.domain - A string used to build links included in\n * the top level links object or relationship links objects in the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Array} options.include - An array of strings containing the\n * relationship keys that should be added to the top level included object of\n * a [JSON API](http://jsonapi.org) document object.\n *\n * @param {Array} options.included - An array of [JSON API](\n * http://jsonapi.org) resource objects that will be added to the top level\n * included array of a [JSON API](http://jsonapi.org) document object.\n *\n * @param {Boolean} options.formatRelationships - Wether or not\n * relationships should be formatted and included in the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @return {Promise} Resolves with a [JSON API](http://jsonapi.org) resource\n * object.\n *\n * @private\n */\n async formatOne({\n item,\n links,\n domain,\n include,\n included,\n formatRelationships = true\n }: {\n item: T;\n links?: boolean;\n domain: string;\n include: Array<string>;\n included: Array<JSONAPI$ResourceObject>;\n formatRelationships?: boolean;\n }): Promise<JSONAPI$ResourceObject> {\n const { resourceName: type } = item;\n const id = String(item.getPrimaryKey());\n let relationships: Record<string, unknown> = {};\n\n const attributes = dasherizeKeys(\n item.getAttributes(\n ...Object.keys(item.rawColumnData).filter(key =>\n this.attributes.includes(key)\n )\n )\n );\n\n const serialized: JSONAPI$ResourceObject = {\n id,\n type,\n attributes: attributes as JSONAPI$ResourceObject['attributes']\n };\n\n if (formatRelationships) {\n relationships = await promiseHash(\n [...this.hasOne, ...this.hasMany].reduce<Record<string, unknown>>(\n (hash, name) => ({\n ...hash,\n\n [dasherize(underscore(name))]: (async () => {\n const related = (await Reflect.get(item, name)) as\n Model | Array<Model> | null | undefined;\n\n if (Array.isArray(related)) {\n return {\n data: await Promise.all(\n related.map(async relatedItem => {\n const { data: relatedData } =\n await this.formatRelationship({\n domain,\n included,\n item: relatedItem,\n include: include.includes(name)\n });\n\n return relatedData;\n })\n )\n };\n } else if (related && (related as { id?: unknown }).id != null) {\n return this.formatRelationship({\n domain,\n included,\n item: related,\n include: include.includes(name)\n });\n }\n\n return {\n data: null\n };\n })()\n }),\n {}\n )\n );\n }\n\n if (Object.keys(relationships).length) {\n serialized.relationships =\n relationships as JSONAPI$ResourceObject['relationships'];\n }\n\n if (links || typeof links !== 'boolean') {\n const { namespace } = this;\n\n if (namespace) {\n serialized.links = {\n self: `${domain}/${namespace}/${type}/${id}`\n };\n } else {\n serialized.links = {\n self: `${domain}/${type}/${id}`\n };\n }\n }\n\n return serialized;\n }\n\n /**\n * Transform a single Model instance into a [JSON API](http://jsonapi.org)\n * relationship object.\n *\n * @method formatRelationship\n *\n * @param {Object} options - An options object used for building the returned\n * [JSON API](http://jsonapi.org) relationship object.\n *\n * @param {Model} options.item - The Model instance to transform into the\n * returned [JSON API](http://jsonapi.org) relationship object.\n *\n * @param {String} options.domain - A string used to build links included in\n * the returned [JSON API](http://jsonapi.org) relationship object.\n *\n * @param {Array} options.include - An array of strings containing the\n * relationship keys that should be added to the top level included object of\n * a [JSON API](http://jsonapi.org) document object.\n *\n * @param {Array} options.included - An array of [JSON API](\n * http://jsonapi.org) resource objects that will be added to the top level\n * included array of a [JSON API](http://jsonapi.org) document object.\n *\n * @return {Promise} Resolves with a [JSON API](http://jsonapi.org)\n * relationship object.\n *\n * @private\n */\n async formatRelationship({\n item,\n domain,\n include,\n included\n }: {\n item: Model;\n domain: string;\n include: boolean;\n included: Array<JSONAPI$ResourceObject>;\n }): Promise<JSONAPI$RelationshipObject> {\n const { namespace } = this;\n const {\n resourceName: type,\n constructor: { serializer }\n } = item;\n const id = String(item.getPrimaryKey());\n let links;\n\n if (namespace) {\n links = {\n self: `${domain}/${namespace}/${type}/${id}`\n };\n } else {\n links = {\n self: `${domain}/${type}/${id}`\n };\n }\n\n if (include) {\n included.push(\n await serializer.formatOne({\n item,\n domain,\n include: [],\n included: [],\n formatRelationships: false\n })\n );\n }\n\n return {\n data: {\n id,\n type\n },\n links\n };\n }\n}\n\nexport default Serializer;\n", "import { NODE_ENV } from '../../constants';\n\nimport type { Config } from './interfaces';\n\nexport function createDefaultConfig(): Config {\n const isTestENV = NODE_ENV === 'test';\n const isProdENV = NODE_ENV === 'production';\n\n return {\n server: {\n cors: {\n enabled: false\n }\n },\n logging: {\n level: isProdENV ? 'INFO' : 'DEBUG',\n format: isProdENV ? 'json' : 'text',\n enabled: !isTestENV,\n\n filter: {\n params: []\n }\n }\n };\n}\n\nexport type { Config } from './interfaces';\n", "/**\n * @private\n */\nexport default function normalizeName(str: string): string {\n let name = str;\n\n if (name.startsWith('/')) {\n name = name.substr(1);\n }\n\n if (name.endsWith('/')) {\n name = name.substr(0, name.length - 1);\n }\n\n return name;\n}\n", "/**\n * @private\n */\nexport default function normalizePath(str: string): string {\n let path = str;\n\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n if (path.endsWith('/')) {\n path = path.substr(0, path.length - 1);\n }\n\n return path;\n}\n", "import { FreezeableSet, freezeProps } from '../../freezeable';\nimport type Controller from '../../controller';\nimport type { Route, Router$Namespace } from '../index';\n\nimport normalizeName from './utils/normalize-name';\nimport normalizePath from './utils/normalize-path';\nimport type { Namespace$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Namespace extends FreezeableSet<Route | Router$Namespace> {\n declare name: string;\n\n declare path: string;\n\n declare isRoot: boolean;\n\n declare namespace: Router$Namespace;\n\n declare controller: Controller;\n\n declare controllers: Map<string, Controller>;\n\n constructor({\n name,\n path,\n namespace,\n controller,\n controllers\n }: Namespace$opts) {\n super();\n\n Object.assign(this, {\n controller,\n controllers,\n name: normalizeName(name),\n path: normalizePath(path),\n isRoot: path === '/',\n namespace: namespace || this\n });\n\n freezeProps(this, true, 'name', 'path', 'controller', 'namespace');\n\n freezeProps(this, false, 'isRoot', 'controllers');\n }\n}\n\nexport default Namespace;\n\nexport { default as normalizeName } from './utils/normalize-name';\nexport { default as normalizePath } from './utils/normalize-path';\n\nexport type { Namespace$opts } from './interfaces';\n", "import entries from './entries';\n\n/**\n * A replacement for querystring.stringify that supports nested objects.\n *\n * @private\n */\nexport default function createQueryString(\n src: Record<string, unknown>,\n prop?: string\n): string {\n return entries(src).reduce((str, [key, value], index) => {\n let result = str;\n\n if (index > 0) {\n result += '&';\n }\n\n if (prop) {\n result += `${\n prop + encodeURIComponent('[') + key + encodeURIComponent(']')\n }=`;\n } else {\n result += `${key}=`;\n }\n\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n result += value.map(item => encodeURIComponent(String(item))).join();\n } else {\n result =\n result.substr(0, result.length - (key.length + 1)) +\n createQueryString(value as Record<string, unknown>, key);\n }\n } else if (!value && typeof value !== 'number') {\n result += 'null';\n } else {\n result += encodeURIComponent(String(value));\n }\n\n return result;\n }, '');\n}\n", "import omit from '../../../../../utils/omit';\nimport merge from '../../../../../utils/merge';\nimport createQueryString from '../../../../../utils/create-query-string';\nimport type { Request$params } from '../../../../server';\nimport type { JSONAPI$DocumentLinks } from '../../../../jsonapi';\n\nfunction createLinkTemplate({\n total,\n params,\n domain,\n pathname,\n defaultPerPage\n}: {\n total: number;\n params: Request$params;\n domain: string;\n pathname: string;\n defaultPerPage: number;\n}) {\n const { page: { size = defaultPerPage } = {} } = params;\n const baseURL = `${domain}${pathname}`;\n const queryURL = `${baseURL}?`;\n const baseParams = omit(params, 'page');\n const lastPageNum = total > 0 ? Math.ceil(total / size) : 1;\n\n if (size && size !== defaultPerPage) {\n baseParams.page = { size };\n }\n\n const hasParams = Object.keys(baseParams).length;\n\n return function linkTemplate(\n pageNum: number | 'first' | 'last'\n ): string | null {\n let normalized: number;\n\n switch (pageNum) {\n case 'first':\n normalized = 1;\n break;\n\n case 'last':\n normalized = lastPageNum;\n break;\n\n default:\n normalized = pageNum;\n }\n\n if (normalized < 1 || normalized > lastPageNum) {\n return null;\n } else if (normalized > 1) {\n const paramsForPage = merge(baseParams, {\n page: {\n number: normalized\n }\n });\n\n return (\n queryURL + createQueryString(paramsForPage as Record<string, unknown>)\n );\n }\n\n return hasParams\n ? queryURL + createQueryString(baseParams as Record<string, unknown>)\n : baseURL;\n };\n}\n\n/**\n * @private\n */\nexport default function createPageLinks(opts: {\n total: number;\n params: Request$params;\n domain: string;\n pathname: string;\n defaultPerPage: number;\n}): JSONAPI$DocumentLinks {\n const { page: { number = 1 } = {} } = opts.params;\n const linkForPage = createLinkTemplate(opts);\n\n return {\n self: linkForPage(number),\n first: linkForPage('first'),\n last: linkForPage('last'),\n prev: linkForPage(number - 1),\n next: linkForPage(number + 1)\n };\n}\n", "import { Query } from '../../../../database';\nimport { getDomain } from '../../../../server';\nimport type { Request, Response } from '../../../../server';\nimport createPageLinks from '../utils/create-page-links';\nimport type { Action } from '../interfaces';\n\n/**\n * @private\n */\nexport default function resource(action: Action<unknown>): Action<unknown> {\n const resourceAction = async function (req: Request, res: Response) {\n const {\n route: { action: actionName }\n } = req;\n const result = action(req, res);\n let links = {};\n let data;\n let total;\n\n if (actionName === 'index' && result instanceof Query) {\n [data, total] = await Promise.all([result, Query.from(result).count()]);\n } else {\n data = await result;\n }\n\n if (Array.isArray(data) || (data && data.isModelInstance)) {\n const domain = getDomain(req);\n\n const {\n params,\n url: { path, pathname },\n route: {\n controller: { namespace, serializer, defaultPerPage }\n }\n } = req;\n\n const include = params.include || [];\n\n if (actionName === 'index') {\n links = createPageLinks({\n params,\n domain,\n pathname,\n defaultPerPage,\n total: total || 0\n });\n } else if (actionName !== 'index' && namespace) {\n links = {\n self: domain.replace(`/${namespace}`, '') + path\n };\n } else if (actionName !== 'index' && !namespace) {\n links = {\n self: domain + path\n };\n }\n\n return serializer.format({\n data,\n links,\n domain,\n include\n });\n }\n\n return data;\n };\n\n Reflect.defineProperty(resourceAction, 'name', {\n value: action.name\n });\n\n return resourceAction;\n}\n", "export const FINAL_HANDLER = '__FINAL_HANDLER__';\n", "import type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function getActionName({ route: { action } }: Request): string {\n return action;\n}\n", "import type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function getControllerName({\n route: {\n controller: {\n constructor: { name }\n }\n }\n}: Request): string {\n return name;\n}\n", "import { FINAL_HANDLER } from '../constants';\nimport getActionName from '../utils/get-action-name';\nimport getControllerName from '../utils/get-controller-name';\nimport type { Request, Response } from '../../../../server';\nimport type { Action } from '../interfaces';\n\n/**\n * @private\n */\nexport default function trackPerf<T, U extends Action<T>>(\n action: U\n): Action<T> {\n const trackedAction = async function (\n req: Request,\n res: Response,\n data?: unknown\n ) {\n const start = Date.now();\n const result = await action(req, res, data);\n let { name } = action;\n let type = 'middleware';\n\n if (name === FINAL_HANDLER) {\n type = 'action';\n name = getActionName(req);\n } else if (!name) {\n name = 'anonymous';\n }\n\n res.stats.push({\n type,\n name,\n duration: Date.now() - start,\n controller: getControllerName(req)\n });\n\n return result;\n };\n\n Reflect.defineProperty(trackedAction, 'name', {\n value: action.name\n });\n\n return trackedAction;\n}\n", "import type Controller from '../../../controller';\n\nimport resource from './enhancers/resource';\nimport trackPerf from './enhancers/track-perf';\nimport type { Action } from './interfaces';\n\n/**\n * @private\n */\nexport function createAction(\n type: string,\n action: Action<unknown>,\n controller: Controller\n): Array<Action<unknown>> {\n let fn = action.bind(controller);\n\n if (type !== 'custom' && controller.hasModel && controller.hasSerializer) {\n fn = resource(fn);\n }\n\n const handlers: Array<Action<unknown>> = [\n ...controller.beforeAction,\n\n function __FINAL_HANDLER__(req, res) {\n return fn(req, res);\n },\n ...controller.afterAction\n ];\n\n return handlers.map(trackPerf);\n}\n\nexport { FINAL_HANDLER } from './constants';\nexport { default as createPageLinks } from './utils/create-page-links';\n\nexport type { Action } from './interfaces';\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterTypeError extends TypeError {\n constructor(param: ParameterLike, actual: string) {\n const { type, path } = param;\n\n super(line`\n Expected type '${type || 'undefined'}' for parameter '${path}' but got\n '${actual}'.\n `);\n }\n}\n\nexport default createServerError(ParameterTypeError, 400);\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterValueError extends TypeError {\n constructor(param: ParameterLike, actual: unknown) {\n super(line`\n Expected value for parameter '${param.path}' to be one of\n [${param.size ? Array.from(param.values()).join(', ') : ''}] but got\n ${String(actual)}.\n `);\n }\n}\n\nexport default createServerError(ParameterValueError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass InvalidParameterError extends TypeError {\n constructor(path: string) {\n super(`'${path}' is not a valid parameter for this resource.`);\n }\n}\n\nexport default createServerError(InvalidParameterError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport { line } from '../../../../logger';\n\n/**\n * @private\n */\nclass ResourceMismatchError extends TypeError {\n constructor(path: string, expected: unknown, actual: unknown) {\n let normalized = actual;\n\n if (typeof normalized === 'string') {\n normalized = `'${String(normalized)}'`;\n }\n\n super(line`\n Expected '${String(expected)}' for parameter '${path}' but got\n ${String(normalized)}.\n `);\n }\n}\n\nexport default createServerError(ResourceMismatchError, 409);\n", "import createServerError from '../../../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass ParameterRequiredError extends TypeError {\n constructor(path: string) {\n super(`Missing required parameter '${path}'.`);\n }\n}\n\nexport default createServerError(ParameterRequiredError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterNotNullableError extends TypeError {\n constructor({ path }: ParameterLike) {\n super(`Parameter '${path}' is not nullable.`);\n }\n}\n\nexport default createServerError(ParameterNotNullableError, 400);\n", "/**\n * @private\n */\nexport default function isBuffer(value: unknown): value is Buffer {\n return value instanceof Buffer;\n}\n", "import ParameterTypeError from '../errors/parameter-type-error';\nimport ParameterNotNullableError from '../errors/parameter-not-nullable-error';\nimport isNull from '../../../../../utils/is-null';\nimport isObject from '../../../../../utils/is-object';\nimport isBuffer from '../../../../../utils/is-buffer';\nimport type { Parameter, ParameterGroup } from '../index';\n\n/**\n * @private\n */\nexport default function validateType(\n param: Parameter | ParameterGroup,\n value: unknown\n): true {\n const { type, required } = param;\n const valueIsNull = isNull(value);\n\n if (required && valueIsNull) {\n throw new ParameterNotNullableError(param);\n } else if (valueIsNull || !type) {\n return true;\n }\n\n const valueType = typeof value;\n let isValid = true;\n\n switch (type) {\n case 'array':\n isValid = Array.isArray(value);\n break;\n\n case 'buffer':\n isValid = isBuffer(value);\n break;\n\n case 'object':\n isValid = isObject(value) || isNull(value);\n break;\n\n case 'date':\n isValid = value instanceof Date;\n break;\n\n default:\n isValid = type === valueType;\n }\n\n if (!isValid) {\n throw new ParameterTypeError(param, valueType);\n }\n\n return true;\n}\n", "import { ParameterRequiredError } from '../../errors';\nimport type ParameterGroup from '../index';\n\n/**\n * @private\n */\nexport default function hasRequiredParams(\n group: ParameterGroup,\n params: Record<string, unknown>\n): boolean {\n for (const [key, { path, required }] of group) {\n if (required && !Reflect.has(params, key)) {\n throw new ParameterRequiredError(path);\n }\n }\n\n return true;\n}\n", "import { FreezeableMap } from '../../../../freezeable';\nimport { InvalidParameterError } from '../errors';\nimport isNull from '../../../../../utils/is-null';\nimport entries from '../../../../../utils/entries';\nimport validateType from '../utils/validate-type';\nimport type { ParameterLike, ParameterLike$opts } from '../index';\n\nimport hasRequiredParams from './utils/has-required-params';\n\n/**\n * @private\n */\nclass ParameterGroup extends FreezeableMap<string, ParameterLike> {\n declare type: string;\n\n declare path: string;\n\n declare required: boolean;\n\n declare sanitize: boolean;\n\n constructor(\n contents: Array<[string, ParameterLike]>,\n { path, required, sanitize }: ParameterLike$opts\n ) {\n super(contents);\n\n Object.assign(this, {\n path,\n type: 'object',\n required: Boolean(required),\n sanitize: Boolean(sanitize)\n });\n\n this.freeze();\n }\n\n validate<V>(params: V): V {\n const validated = {};\n\n if (isNull(params)) {\n return params;\n }\n\n if (\n validateType(this, params) &&\n hasRequiredParams(this, params as Record<string, unknown>)\n ) {\n const { sanitize } = this;\n let { path } = this;\n\n if (path.length) {\n path = `${path}.`;\n }\n\n for (const [key, value] of entries(params as Record<string, unknown>)) {\n const match = this.get(key);\n\n if (match) {\n Reflect.set(validated, key, match.validate(value));\n } else if (!match && !sanitize) {\n throw new InvalidParameterError(`${path}${key}`);\n }\n }\n }\n\n return validated as V;\n }\n}\n\nexport default ParameterGroup;\n", "import isNull from '../../../../../../utils/is-null';\nimport { ParameterValueError, ResourceMismatchError } from '../../errors';\nimport type Parameter from '../index';\n\n/**\n * @private\n */\nfunction validateOne<V>(param: Parameter, value: V): V {\n if (!param.required && isNull(value)) {\n return value;\n }\n\n if (!param.has(value)) {\n let expected;\n\n switch (param.path) {\n case 'data.type':\n [expected] = Array.from(param.values());\n throw new ResourceMismatchError(param.path, expected, value);\n\n default:\n throw new ParameterValueError(param, value);\n }\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport default function validateValue<V>(param: Parameter, value: V): V {\n if (Array.isArray(value)) {\n if (param.sanitize) {\n return value.filter(item => param.has(item)) as V;\n }\n\n for (const item of value) {\n validateOne(param, item);\n }\n } else {\n validateOne(param, value);\n }\n\n return value;\n}\n", "import { FreezeableSet } from '../../../../freezeable';\nimport validateType from '../utils/validate-type';\n\nimport validateValue from './utils/validate-value';\nimport type { Parameter$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Parameter extends FreezeableSet<unknown> {\n declare path: string;\n\n declare type: string;\n\n declare required: boolean;\n\n declare sanitize: boolean;\n\n constructor({ path, type, values, required, sanitize }: Parameter$opts) {\n super(values);\n\n Object.assign(this, {\n path,\n type,\n required: Boolean(required),\n sanitize: Boolean(sanitize)\n });\n\n this.freeze();\n }\n\n validate<V>(value: V): V {\n validateType(this, value);\n\n if (this.size > 0) {\n return validateValue(this, value);\n }\n\n return value;\n }\n}\n\nexport default Parameter;\n", "import Parameter from '../parameter';\nimport type { ParameterLike } from '../interfaces';\n\n/**\n * @private\n */\nexport default function getURLParams(\n dynamicSegments: Array<string>\n): Array<[string, ParameterLike]> {\n return dynamicSegments.map((param): [string, ParameterLike] => [\n param,\n new Parameter({\n path: param,\n required: true\n })\n ]);\n}\n", "import Parameter from '../parameter';\nimport ParameterGroup from '../parameter-group';\nimport isNull from '../../../../../utils/is-null';\nimport { typeForColumn } from '../../../../database';\nimport type Controller from '../../../../controller';\nimport type { ParameterLike } from '../interfaces';\n\n/**\n * @private\n */\nfunction getIDParam({ model }: Controller): [string, ParameterLike] {\n const primaryKeyColumn = model.columnFor(model.primaryKey);\n let primaryKeyType: string | undefined = 'number';\n\n if (primaryKeyColumn) {\n primaryKeyType = typeForColumn(primaryKeyColumn);\n }\n\n return [\n 'id',\n new Parameter({\n type: primaryKeyType,\n path: 'data.id',\n required: true\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getTypeParam({ model }: Controller): [string, ParameterLike] {\n return [\n 'type',\n new Parameter({\n type: 'string',\n path: 'data.type',\n values: [model.resourceName],\n required: true\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getAttributesParam(\n { model, params }: Controller,\n method: 'PATCH' | 'POST'\n): [string, ParameterLike] {\n return [\n 'attributes',\n new ParameterGroup(\n params.reduce<Array<[string, ParameterLike]>>((group, param) => {\n const col = model.columnFor(param);\n\n if (col) {\n const type = typeForColumn(col);\n const path = `data.attributes.${param}`;\n const required =\n method !== 'PATCH' && !col.nullable && isNull(col.defaultValue);\n\n return [...group, [param, new Parameter({ type, path, required })]];\n }\n\n return group;\n }, []),\n {\n path: 'data.attributes',\n sanitize: true\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getRelationshipsParam({\n model,\n params\n}: Controller): [string, ParameterLike] {\n return [\n 'relationships',\n new ParameterGroup(\n params.reduce<Array<[string, ParameterLike]>>((group, param) => {\n const path = `data.relationships.${param}`;\n const opts = model.relationshipFor(param);\n\n if (!opts) {\n return group;\n }\n\n if (opts.type === 'hasMany') {\n return [\n ...group,\n\n [\n param,\n new ParameterGroup(\n [\n [\n 'data',\n new Parameter({\n type: 'array',\n path: `${path}.data`,\n required: true\n })\n ]\n ],\n {\n path\n }\n )\n ]\n ];\n }\n\n const primaryKeyColumn = opts.model.columnFor(opts.model.primaryKey);\n let primaryKeyType: string | undefined = 'number';\n\n if (primaryKeyColumn) {\n primaryKeyType = typeForColumn(primaryKeyColumn);\n }\n\n return [\n ...group,\n\n [\n param,\n new ParameterGroup(\n [\n [\n 'data',\n new ParameterGroup(\n [\n [\n 'id',\n new Parameter({\n type: primaryKeyType,\n path: `${path}.data.id`,\n required: true\n })\n ],\n\n [\n 'type',\n new Parameter({\n type: 'string',\n path: `${path}.data.type`,\n values: [opts.model.resourceName],\n required: true\n })\n ]\n ],\n {\n type: 'array',\n path: `${path}.data`,\n required: true\n }\n )\n ]\n ],\n {\n path\n }\n )\n ]\n ];\n }, []),\n {\n path: 'data.relationships'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nexport default function getDataParams(\n controller: Controller,\n method: 'PATCH' | 'POST',\n includeID: boolean\n): [string, ParameterLike] {\n let params = [getTypeParam(controller)];\n\n if (controller.hasModel) {\n params = [\n getAttributesParam(controller, method),\n getRelationshipsParam(controller),\n ...params\n ];\n\n if (includeID) {\n params = [getIDParam(controller), ...params];\n }\n }\n\n return [\n 'data',\n new ParameterGroup(params, {\n path: 'data',\n required: true\n })\n ];\n}\n", "import type Controller from '../../../../controller';\n\n/**\n * @private\n */\nexport default function getDefaultMemberParams({\n model,\n serializer: { hasOne, hasMany, attributes }\n}: Controller): Record<string, unknown> {\n return {\n fields: {\n [model.resourceName]: attributes,\n ...[...hasOne, ...hasMany].reduce<Record<string, unknown>>(\n (include, key) => {\n const opts = model.relationshipFor(key);\n\n if (!opts || model === opts.model) {\n return include;\n }\n\n return {\n ...include,\n [opts.model.resourceName]: [opts.model.primaryKey]\n };\n },\n {}\n )\n }\n };\n}\n", "import type Controller from '../../../../controller';\n\nimport getDefaultMemberParams from './get-default-member-params';\n\n/**\n * @private\n */\nfunction getDefaultCollectionParams(\n controller: Controller\n): Record<string, unknown> {\n return {\n ...getDefaultMemberParams(controller),\n filter: {},\n sort: 'createdAt',\n page: {\n size: controller.defaultPerPage,\n number: 1\n }\n };\n}\n\nexport default getDefaultCollectionParams;\n", "import Parameter from '../parameter';\nimport ParameterGroup from '../parameter-group';\nimport type Controller from '../../../../controller';\nimport type { ParameterLike } from '../interfaces';\n\n/**\n * @private\n */\nfunction getPageParam(): [string, ParameterLike] {\n return [\n 'page',\n new ParameterGroup(\n [\n ['size', new Parameter({ path: 'page.size', type: 'number' })],\n ['number', new Parameter({ path: 'page.number', type: 'number' })]\n ],\n {\n path: 'page'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getSortParam({ sort }: Controller): [string, ParameterLike] {\n return [\n 'sort',\n new Parameter({\n path: 'sort',\n type: 'string',\n\n values: [...sort, ...sort.map(value => `-${value}`)]\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getFilterParam({ filter }: Controller): [string, ParameterLike] {\n return [\n 'filter',\n new ParameterGroup(\n filter.map(param => [\n param,\n new Parameter({\n path: `filter.${param}`\n })\n ]),\n {\n path: 'filter'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getFieldsParam({\n model,\n serializer: { hasOne, hasMany, attributes }\n}: Controller): [string, ParameterLike] {\n const relationships = [...hasOne, ...hasMany];\n\n return [\n 'fields',\n new ParameterGroup(\n [\n [\n model.resourceName,\n new Parameter({\n path: `fields.${model.resourceName}`,\n type: 'array',\n values: attributes,\n sanitize: true\n })\n ],\n ...relationships.reduce<Array<[string, ParameterLike]>>(\n (result, relationship) => {\n const opts = model.relationshipFor(relationship);\n\n if (opts) {\n return [\n ...result,\n\n [\n opts.model.resourceName,\n new Parameter({\n path: `fields.${opts.model.resourceName}`,\n type: 'array',\n sanitize: true,\n\n values: [\n opts.model.primaryKey,\n ...opts.model.serializer.attributes\n ]\n })\n ]\n ];\n }\n\n return result;\n },\n []\n )\n ],\n {\n path: 'fields',\n sanitize: true\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getIncludeParam({\n serializer: { hasOne, hasMany }\n}: Controller): [string, ParameterLike] {\n const relationships = [...hasOne, ...hasMany];\n\n return [\n 'include',\n new Parameter({\n path: 'include',\n type: 'array',\n values: relationships\n })\n ];\n}\n\n/**\n * @private\n */\nexport function getCustomParams({\n query\n}: Controller): Array<[string, ParameterLike]> {\n return query.map((param): [string, ParameterLike] => [\n param,\n new Parameter({\n path: param\n })\n ]);\n}\n\n/**\n * @private\n */\nexport function getMemberQueryParams(\n controller: Controller\n): Array<[string, ParameterLike]> {\n if (controller.hasModel) {\n return [\n getFieldsParam(controller),\n getIncludeParam(controller),\n ...getCustomParams(controller)\n ];\n }\n\n return getCustomParams(controller);\n}\n\n/**\n * @private\n */\nexport function getCollectionQueryParams(\n controller: Controller\n): Array<[string, ParameterLike]> {\n if (controller.hasModel) {\n return [\n getPageParam(),\n getSortParam(controller),\n getFilterParam(controller),\n getFieldsParam(controller),\n getIncludeParam(controller),\n ...getCustomParams(controller)\n ];\n }\n\n return getCustomParams(controller);\n}\n", "import { ResourceMismatchError } from '../errors';\nimport type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function validateResourceId({\n params: {\n id,\n data: { id: resourceId }\n }\n}: Request): true {\n if (id !== resourceId) {\n throw new ResourceMismatchError('data.id', String(id), String(resourceId));\n }\n\n return true;\n}\n", "import type Controller from '../../../controller';\n\nimport ParameterGroup from './parameter-group';\nimport getURLParams from './utils/get-url-params';\nimport getDataParams from './utils/get-data-params';\nimport getDefaultMemberParams from './utils/get-default-member-params';\nimport getDefaultCollectionParams from './utils/get-default-collection-params';\nimport type { Params$opts } from './interfaces';\nimport {\n getMemberQueryParams,\n getCollectionQueryParams,\n getCustomParams\n} from './utils/get-query-params';\n\n/**\n * @private\n */\nexport function paramsFor({\n type,\n method,\n controller,\n dynamicSegments\n}: Params$opts) {\n let params = getURLParams(dynamicSegments);\n\n if (type === 'member') {\n params = [...params, ...getMemberQueryParams(controller)];\n\n if (method === 'POST' || method === 'PATCH') {\n params = [...params, getDataParams(controller, method, true)];\n }\n } else if (type === 'collection') {\n params = [...params, ...getCollectionQueryParams(controller)];\n\n if (method === 'POST' || method === 'PATCH') {\n params = [...params, getDataParams(controller, method, false)];\n }\n } else if (type === 'custom') {\n params = [...params, ...getCustomParams(controller)];\n }\n\n return new ParameterGroup(params, {\n path: '',\n required: true\n });\n}\n\n/**\n * @private\n */\nexport function defaultParamsFor({\n type,\n controller\n}: {\n type: string;\n controller: Controller;\n}): Record<string, unknown> {\n const { hasModel } = controller;\n\n if (hasModel && type === 'member') {\n return getDefaultMemberParams(controller);\n } else if (hasModel && type === 'collection') {\n return getDefaultCollectionParams(controller);\n }\n\n return {};\n}\n\nexport { default as validateResourceId } from './utils/validate-resource-id';\n\nexport type { ParameterLike, ParameterLike$opts } from './interfaces';\nexport type { default as Parameter } from './parameter';\nexport type { default as ParameterGroup } from './parameter-group';\n", "/**\n * @private\n */\nexport default function getStaticPath(\n path: string,\n dynamicSegments: Array<string>\n): string {\n let staticPath = path;\n\n if (dynamicSegments.length) {\n const pattern = new RegExp(`(${dynamicSegments.join('|')})`, 'g');\n\n staticPath = path.replace(pattern, 'dynamic');\n }\n\n return staticPath;\n}\n", "export const DYNAMIC_PATTERN = /(:\\w+)/g;\n", "import { DYNAMIC_PATTERN } from '../constants';\nimport insert from '../../../../utils/insert';\n\n/**\n * @private\n */\nexport default function getDynamicSegments(path: string): Array<string> {\n const matches = path.match(DYNAMIC_PATTERN) || [];\n const dynamicSegments: Array<string> = new Array(matches.length);\n\n insert(\n dynamicSegments,\n matches.map(part => part.substr(1))\n );\n Object.freeze(dynamicSegments);\n\n return dynamicSegments;\n}\n", "import { FreezeableSet, freezeProps, deepFreezeProps } from '../../freezeable';\nimport type Controller from '../../controller';\nimport type { Request, Response, Request$method } from '../../server';\n\nimport { FINAL_HANDLER, createAction } from './action';\nimport { paramsFor, defaultParamsFor, validateResourceId } from './params';\nimport getStaticPath from './utils/get-static-path';\nimport getDynamicSegments from './utils/get-dynamic-segments';\nimport type { Action } from './action';\nimport type { ParameterGroup } from './params';\nimport type { Route$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Route extends FreezeableSet<Action<unknown>> {\n declare type: string;\n\n declare path: string;\n\n declare action: string;\n\n declare params: ParameterGroup;\n\n declare method: Request$method;\n\n declare controller: Controller;\n\n declare staticPath: string;\n\n declare defaultParams: Record<string, unknown>;\n\n declare dynamicSegments: Array<string>;\n\n constructor({ type, path, action, method, controller }: Route$opts) {\n const dynamicSegments = getDynamicSegments(path);\n\n if (action && controller) {\n const handler = Reflect.get(controller, action);\n\n if (typeof handler === 'function') {\n const params = paramsFor({\n type,\n method,\n controller,\n dynamicSegments\n });\n\n const staticPath = getStaticPath(path, dynamicSegments);\n\n const defaultParams = defaultParamsFor({\n type,\n controller\n });\n\n super(createAction(type, handler, controller));\n\n Object.assign(this, {\n type,\n path,\n params,\n action,\n method,\n controller,\n staticPath,\n defaultParams,\n dynamicSegments\n });\n\n freezeProps(this, true, 'type', 'path');\n\n freezeProps(\n this,\n false,\n 'action',\n 'params',\n 'method',\n 'controller',\n 'staticPath'\n );\n\n deepFreezeProps(this, false, 'defaultParams', 'dynamicSegments');\n } else {\n const {\n constructor: { name: controllerName }\n } = controller;\n\n throw new TypeError(\n `Handler for ${controllerName}#${action} is not a function.`\n );\n }\n } else {\n throw new TypeError(\n 'Arguments `controller` and `action` must not be undefined'\n );\n }\n\n this.freeze();\n }\n\n parseParams(params: Array<string>): Record<string, number> {\n return params.reduce<Record<string, number>>((result, value, idx) => {\n const key = this.dynamicSegments[idx];\n\n if (key) {\n return {\n ...result,\n [key]: Number.parseInt(value, 10)\n };\n }\n\n return result;\n }, {});\n }\n\n async execHandlers(req: Request, res: Response): Promise<unknown> {\n let calledFinal = false;\n let data: unknown;\n\n for (const handler of this) {\n data = await handler(req, res, data);\n\n if (handler.name === FINAL_HANDLER) {\n calledFinal = true;\n }\n\n if (!calledFinal && typeof data !== 'undefined') {\n break;\n }\n }\n\n return data;\n }\n\n async visit(req: Request, res: Response): Promise<unknown> {\n const { defaultParams } = this;\n let params = {\n ...req.params,\n ...this.parseParams(req.url.params)\n };\n\n if (req.method !== 'OPTIONS') {\n params = this.params.validate(params);\n }\n\n Object.assign(req, {\n params,\n defaultParams\n });\n\n if (this.type === 'member' && req.method === 'PATCH') {\n validateResourceId(req);\n }\n\n return this.execHandlers(req, res);\n }\n}\n\nexport default Route;\nexport { DYNAMIC_PATTERN } from './constants';\n\nexport type { Action } from './action';\nexport type { Route$opts, Route$type } from './interfaces';\n", "import { BUILT_IN_ACTIONS, type Controller$builtIn } from '../../../controller';\n\n/**\n * @private\n */\nexport default function normalizeOnly(\n only: Array<Controller$builtIn>\n): Array<Controller$builtIn> {\n return only.filter(action => BUILT_IN_ACTIONS.indexOf(action) >= 0);\n}\n", "import Namespace from '../namespace';\nimport { FreezeableSet } from '../../freezeable';\nimport type { Controller$builtIn } from '../../controller';\n\nimport normalizeOnly from './utils/normalize-only';\nimport type { Resource$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Resource extends Namespace {\n declare only: FreezeableSet<Controller$builtIn>;\n\n constructor({ only, ...opts }: Resource$opts) {\n super(opts);\n\n Reflect.defineProperty(this, 'only', {\n value: new FreezeableSet(normalizeOnly(only)),\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n this.only.freeze();\n }\n}\n\nexport default Resource;\n\nexport type { Resource$opts } from './interfaces';\n", "/**\n * @private\n */\nclass ControllerMissingError extends ReferenceError {\n constructor(resource: string) {\n super(`Could not resolve controller by name '${resource}'`);\n }\n}\n\nexport default ControllerMissingError;\n", "import { Route } from '../../../index';\nimport { normalizeName, normalizePath } from '../../../namespace';\nimport type { Request$method } from '../../../../server';\nimport type { Router$Namespace, Route$type } from '../../../index';\n\n/**\n * @private\n */\nexport default function createDefinition({\n type,\n method,\n namespace\n}: {\n type: Route$type;\n method: Request$method;\n namespace: Router$Namespace;\n}) {\n return function define(name: string, action: string = normalizeName(name)) {\n const normalized = normalizeName(name);\n const { controller } = namespace;\n let { path } = namespace;\n\n if (type === 'member') {\n path += `/:id/${normalized}`;\n } else {\n path += `/${normalized}`;\n }\n\n path = normalizePath(path);\n\n const opts = {\n type,\n path,\n action,\n method,\n controller\n };\n\n namespace\n .add(new Route(opts))\n .add(\n new Route({\n ...opts,\n type: 'custom',\n method: 'HEAD',\n action: 'preflight'\n })\n )\n .add(\n new Route({\n ...opts,\n type: 'custom',\n method: 'OPTIONS',\n action: 'preflight'\n })\n );\n };\n}\n", "import { REQUEST_METHODS } from '../../../../server';\nimport type { Route$type, Router$Namespace } from '../../../index';\n\nimport createDefinition from './create-definition';\n\ntype DefinitionFn = (name: string, action?: string) => void;\n\n/**\n * @private\n */\nexport default function createDefinitionGroup<T extends Router$Namespace>(\n type: Route$type,\n namespace: T\n): Record<string, DefinitionFn> {\n return REQUEST_METHODS.reduce<Record<string, DefinitionFn>>(\n (methods, method) => ({\n ...methods,\n [method.toLowerCase()]: createDefinition({\n type,\n method,\n namespace\n })\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Normalizes the overloaded `resource(name, opts?, builder?)` argument forms\n * the public route DSL accepts. The input tuple is genuinely untyped until this\n * function resolves it into the structured `[opts, builder]` return shape.\n */\nimport {\n BUILT_IN_ACTIONS,\n type Controller$builtIn\n} from '../../../../controller';\n\n/**\n * @private\n */\nexport default function normalizeResourceArgs(args: Array<any>): [\n {\n name: string;\n path: string;\n only: Array<Controller$builtIn>;\n },\n () => void\n] {\n const [name] = args;\n let [, opts, builder] = args;\n\n if (!opts) {\n opts = {\n path: '',\n only: undefined\n };\n }\n\n if (typeof opts === 'function') {\n builder = opts;\n opts = {\n path: '',\n only: undefined\n };\n }\n\n if (typeof builder !== 'function') {\n builder = () => undefined;\n }\n\n opts = {\n ...opts,\n name\n };\n\n if (!opts.path) {\n opts = {\n ...opts,\n path: `/${name}`\n };\n }\n\n if (!opts.only) {\n opts = {\n ...opts,\n only: [...BUILT_IN_ACTIONS]\n };\n }\n\n return [opts, builder];\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * This is the route-definition DSL. `DefinitionContext` collects handler\n * methods with genuinely heterogeneous signatures behind a single index\n * signature, and `resource(...args)` accepts the untyped variadic argument\n * forms the public `resource()` route helper supports; both are normalized at\n * the boundary (see normalize-resource-args). Precise typing here would require\n * full variadic modeling for no real safety gain in internal code.\n */\nimport Resource from '../../resource';\nimport Namespace from '../../namespace';\nimport K from '../../../../utils/k';\nimport type { Router$Namespace } from '../../index';\nimport type { Router$DefinitionBuilder } from '../interfaces';\nimport ControllerMissingError from '../../../../errors/controller-missing-error';\n\nimport createDefinitionGroup from './utils/create-definition-group';\nimport normalizeResourceArgs from './utils/normalize-resource-args';\n\nexport type DefinitionContext = {\n [key: string]: (...args: Array<any>) => unknown;\n};\n\n/**\n * @private\n */\nexport function contextFor(build: Router$DefinitionBuilder<Router$Namespace>) {\n return {\n create(namespace: Router$Namespace): DefinitionContext {\n let context: DefinitionContext = {\n member: K,\n resource: K,\n namespace: K,\n collection: K,\n ...createDefinitionGroup('custom', namespace)\n };\n\n if (namespace instanceof Resource) {\n context = {\n ...context,\n\n member(builder: () => void) {\n const childCtx = createDefinitionGroup('member', namespace);\n\n Reflect.apply(builder, childCtx, []);\n },\n\n collection(builder: () => void) {\n const childCtx = createDefinitionGroup('collection', namespace);\n\n Reflect.apply(builder, childCtx, []);\n }\n };\n } else {\n context = {\n ...context,\n\n namespace(name: string, builder?: () => void) {\n const { isRoot, controllers } = namespace;\n let { path } = namespace;\n\n path = isRoot ? `/${name}` : `${path}/${name}`;\n\n const controllerKey = `${path.substr(1)}/application`;\n const controller = controllers.get(controllerKey);\n\n if (!controller) {\n throw new ControllerMissingError(controllerKey);\n }\n\n const child = new Namespace({\n name,\n path,\n namespace,\n controller,\n controllers\n });\n\n build(builder, child);\n namespace.add(child);\n },\n\n resource(...args: Array<any>) {\n const { controllers } = namespace;\n const [opts, builder] = normalizeResourceArgs(args);\n let path;\n\n if (namespace.isRoot) {\n path = opts.path;\n } else {\n path = namespace.path + opts.path;\n }\n\n const controllerKey = path\n .split('/')\n .filter(Boolean)\n .reduce<Array<string>>(\n (arr, str, index, parts) => [\n ...arr,\n index === parts.length - 1 ? opts.name : str\n ],\n []\n )\n .join('/');\n\n const controller = controllers.get(controllerKey);\n\n if (!controller) {\n throw new ControllerMissingError(controllerKey);\n }\n\n const child = new Resource({\n ...opts,\n path,\n namespace,\n controller,\n controllers\n });\n\n build(builder, child);\n namespace.add(child);\n }\n };\n }\n\n return context;\n }\n };\n}\n", "import Route from '../route';\nimport Resource from '../resource';\nimport type Router from '../index';\nimport type { Router$Namespace } from '../index';\n\nimport { contextFor } from './context';\nimport type { DefinitionContext } from './context';\n\n/**\n * @private\n */\nexport function build<T extends Router$Namespace>(\n builder: (() => void) | undefined,\n namespace: T\n): T {\n const context = contextFor(build).create(namespace);\n\n if (namespace instanceof Resource) {\n const { only } = namespace;\n\n context.member(function member(this: DefinitionContext) {\n if (only.has('show')) {\n this.get('/', 'show');\n }\n\n if (only.has('update')) {\n this.patch('/', 'update');\n }\n\n if (only.has('destroy')) {\n this.delete('/', 'destroy');\n }\n });\n\n context.collection(function collection(this: DefinitionContext) {\n if (only.has('index')) {\n this.get('/', 'index');\n }\n\n if (only.has('create')) {\n this.post('/', 'create');\n }\n });\n }\n\n if (builder) {\n Reflect.apply(builder, context, []);\n }\n\n return namespace;\n}\n\n/**\n * @private\n */\nexport function define<T extends Router$Namespace>(router: Router, parent: T) {\n parent.forEach(child => {\n if (child instanceof Route) {\n const { method, staticPath } = child;\n\n router.set(`${method}:${staticPath}`, child);\n } else {\n define(router, child);\n }\n });\n}\n", "import type Controller from '../../controller';\n\n/**\n * @private\n */\nexport default function createReplacer(\n controllers: Map<string, Controller>\n): RegExp {\n const names = Array.from(controllers)\n .map(([, controller]) => {\n const { model, namespace } = controller;\n\n if (model) {\n return model.resourceName;\n }\n\n let {\n constructor: { name }\n } = controller;\n\n name = name.replace(/controller/gi, '').toLowerCase();\n\n return namespace\n .split('/')\n .reduce((str, part) => str.replace(new RegExp(part, 'ig'), ''), name);\n })\n .filter((str, idx, arr) => idx === arr.lastIndexOf(str))\n .join('|');\n\n return new RegExp(`(${names})/(\\\\d+)`, 'ig');\n}\n", "import { FreezeableMap } from '../freezeable';\nimport type { Request } from '../server';\n\nimport Namespace from './namespace';\nimport Route, { DYNAMIC_PATTERN } from './route';\nimport { build, define } from './definitions';\nimport createReplacer from './utils/create-replacer';\nimport type { Router$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Router extends FreezeableMap<string, Route> {\n declare replacer: RegExp;\n\n constructor({ routes, controller, controllers }: Router$opts) {\n const definitions = build(\n routes,\n new Namespace({\n controller,\n controllers,\n path: '/',\n name: 'root'\n })\n );\n\n super();\n define(this, definitions);\n\n Reflect.defineProperty(this, 'replacer', {\n value: createReplacer(controllers),\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n this.freeze();\n }\n\n match({ method, url }: Request): void | Route {\n const params: Array<string> = [];\n const staticPath = url.pathname.replace(this.replacer, (str, g1, g2) => {\n params.push(g2);\n return `${g1}/:dynamic`;\n });\n\n Reflect.set(url, 'params', params);\n\n return this.get(`${method}:${staticPath}`);\n }\n}\n\nexport default Router;\nexport { Route, DYNAMIC_PATTERN };\n\nexport type { Router$Namespace } from './interfaces';\nexport type { Resource$opts } from './resource';\nexport type { Namespace$opts } from './namespace';\nexport type { Action, Route$opts, Route$type } from './route';\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Loads a compiled app bundle (a manifest of user modules keyed by name) and\n * normalizes it into namespaced maps; the module values are genuinely untyped\n * app code (as they were `Object`/`any` in Flow).\n */\nimport { join as joinPath } from 'path';\n\nimport { Migration } from '../../database';\nimport { FreezeableMap } from '../../freezeable';\nimport { createDefaultConfig } from '../../config';\nimport merge from '../../../utils/merge';\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\n\nimport formatKey from './format-key';\n\nconst SUFFIX_PATTERN = /^.+(Controller|Down|Serializer|Up)/;\n\ntype Bundle = {\n config: Record<string, any>;\n controllers: FreezeableMap<string, any>;\n migrations: FreezeableMap<string, any>;\n models: FreezeableMap<string, any>;\n serializers: FreezeableMap<string, any>;\n};\n\n/**\n * @private\n */\nfunction normalize(manifest: Record<string, any>): Bundle {\n return entries(manifest).reduce<Bundle>(\n (obj, [key, value]) => {\n if (SUFFIX_PATTERN.test(key)) {\n const suffix = key.replace(SUFFIX_PATTERN, '$1');\n const stripSuffix = (source: string) => source.replace(suffix, '');\n\n switch (suffix) {\n case 'Controller':\n obj.controllers.set(formatKey(key, stripSuffix), value);\n break;\n\n case 'Serializer':\n obj.serializers.set(formatKey(key, stripSuffix), value);\n break;\n\n case 'Up':\n case 'Down':\n obj.migrations.set(\n formatKey(key),\n Reflect.construct(Migration, [value])\n );\n break;\n\n default:\n break;\n }\n } else {\n switch (key) {\n case 'Application':\n case 'routes':\n case 'seed':\n Reflect.set(obj, formatKey(key), value);\n break;\n\n case 'config':\n Reflect.set(obj, 'config', {\n ...merge(createDefaultConfig(), {\n ...obj.config,\n ...value\n })\n });\n break;\n\n case 'database':\n Reflect.set(obj, 'config', {\n ...obj.config,\n database: value\n });\n break;\n\n default:\n obj.models.set(formatKey(key), value);\n break;\n }\n }\n\n return obj;\n },\n {\n config: {},\n controllers: new FreezeableMap(),\n migrations: new FreezeableMap(),\n models: new FreezeableMap(),\n serializers: new FreezeableMap()\n }\n );\n}\n\n/**\n * @private\n */\nexport default function bundleFor(path: string): FreezeableMap<string, any> {\n const manifest: Record<string, any> = Reflect.apply(require, null, [\n joinPath(path, 'dist', 'bundle')\n ]);\n\n return chain(manifest)\n .pipe(normalize)\n .pipe(entries)\n .pipe(pairs => new FreezeableMap<string, any>(pairs))\n .value()\n .freeze();\n}\n", "import { dasherize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\nconst NAMESPACE_DELIMITER = /\\$-/g;\n\n/**\n * @private\n */\nexport default function formatKey(\n key: string,\n formatter?: (source: string) => string\n) {\n return chain(key)\n .pipe(str => {\n if (formatter) {\n return formatter(str);\n }\n\n return str;\n })\n .pipe(underscore)\n .pipe(dasherize)\n .pipe(str => str.replace(NAMESPACE_DELIMITER, '/'))\n .value();\n}\n", "import { posix } from 'path';\n\nimport type { Bundle$Namespace } from '../../index';\n\nexport default function closestAncestor<T>(\n source: Bundle$Namespace<T>,\n key: string\n): T | undefined {\n const name = posix.basename(key);\n let namespace = posix.dirname(key);\n\n if (namespace === '.') {\n return source.get(name);\n }\n\n namespace = posix.dirname(namespace);\n\n const ancestor = source.get(posix.join(namespace, name));\n\n if (ancestor) {\n return ancestor;\n }\n\n return closestAncestor(source, posix.join(posix.dirname(namespace), name));\n}\n", "import { posix } from 'path';\n\nimport type { Bundle$Namespace } from '../../index';\n\nexport default function closestChild<T>(\n source: Bundle$Namespace<T>,\n key: string\n): T | undefined {\n const [[, result] = []] = Array.from(source)\n .map(([path, value]): [string, T] => [posix.basename(path), value])\n .filter(([resource]) => key === resource);\n\n return result;\n}\n", "import { FreezeableMap } from '../../freezeable';\nimport type { Bundle$Namespace, Bundle$NamespaceGroup } from '../index';\n\n/**\n * @private\n */\nexport function resolve<T>(\n group: Bundle$Namespace<T>\n): Bundle$NamespaceGroup<T> {\n return Array.from(group)\n .map(([key, value]): [string, T, string] => {\n const parts = key.split('/');\n const namespace = parts.slice(0, Math.max(parts.length - 1, 0)).join('/');\n\n if (namespace) {\n return [key.substr(namespace.length + 1), value, namespace];\n }\n\n return [key, value, 'root'];\n })\n .reduce<Bundle$NamespaceGroup<T>>((map, [key, value, namespace]) => {\n let nsValue = map.get(namespace);\n\n if (!nsValue) {\n nsValue = new FreezeableMap();\n }\n\n return map.set(namespace, nsValue.set(key, value));\n }, new FreezeableMap());\n}\n\nexport { default as closestAncestor } from './utils/closest-ancestor';\nexport { default as closestChild } from './utils/closest-child';\n", "import { posix } from 'path';\n\nimport type { Builder$Construct, Builder$ParentBuilder } from '../interfaces';\nimport type { Builder$NamespaceMeta } from '../interfaces';\n\nimport sortByNamespace from './sort-by-namespace';\n\nexport default function createParentBuilder<T>(\n construct: Builder$Construct<T>\n): Builder$ParentBuilder<T> {\n return target =>\n Array.from(target)\n .sort(sortByNamespace)\n .reduce<Array<Builder$NamespaceMeta<T>>>((result, [key, value]) => {\n const parentClass = value.get('application') || null;\n let parent: T | null = null;\n\n if (parentClass) {\n let grandparent: T | null = null;\n\n if (key !== 'root') {\n const found = result.find(namespace => {\n const dirname = posix.dirname(key);\n\n if (namespace.key === 'root') {\n return dirname === '.';\n }\n\n return dirname === namespace.key;\n });\n\n if (found) {\n grandparent = found.parent;\n }\n }\n\n parent = construct(`${key}/application`, parentClass, grandparent);\n }\n\n return [\n ...result,\n {\n key,\n value,\n parent\n }\n ];\n }, []);\n}\n", "import type { Bundle$Namespace } from '../../index';\n\n/**\n * @private\n */\nexport default function sortByNamespace<T>(\n [a]: [string, Bundle$Namespace<T>],\n [b]: [string, Bundle$Namespace<T>]\n): number {\n if (a === 'root') {\n return -1;\n } else if (b === 'root') {\n return 1;\n }\n\n return Math.min(Math.max(a.length - b.length, -1), 1);\n}\n", "import type { Builder$Construct, Builder$ChildrenBuilder } from '../interfaces';\n\nexport default function createChildrenBuilder<T>(\n construct: Builder$Construct<T>\n): Builder$ChildrenBuilder<T> {\n return target =>\n target.map(({ key, value, parent }) =>\n Array.from(value).map(([name, constructor]): [string, T] => {\n const normalized = key === 'root' ? name : `${key}/${name}`;\n\n if (parent && normalized.endsWith('application')) {\n return [normalized, parent];\n }\n\n return [normalized, construct(normalized, constructor, parent)];\n })\n );\n}\n", "import { FreezeableMap } from '../../freezeable';\nimport { resolve } from '../resolver';\nimport chain from '../../../utils/chain';\nimport type { Bundle$Namespace } from '../index';\n\nimport createParentBuilder from './utils/create-parent-builder';\nimport createChildrenBuilder from './utils/create-children-builder';\nimport type { Builder$Class, Builder$Construct } from './interfaces';\n\n/**\n * @private\n */\nexport function build<T>(\n group: Bundle$Namespace<Builder$Class<T>>,\n construct: Builder$Construct<T>\n): Bundle$Namespace<T> {\n return chain(group)\n .pipe(resolve)\n .pipe(createParentBuilder(construct))\n .pipe(createChildrenBuilder(construct))\n .pipe(arr =>\n arr.reduce<Array<[string, T]>>(\n (result, value) => [...result, ...value],\n []\n )\n )\n .pipe(pairs => new FreezeableMap(pairs))\n .value();\n}\n", "import bundleFor from './utils/bundle-for';\nimport type { Loader } from './interfaces';\n\n/**\n * @private\n */\nexport function createLoader(path: string): Loader {\n let bundle: ReturnType<typeof bundleFor> | undefined;\n\n return function load(type) {\n if (!bundle) {\n bundle = bundleFor(path);\n }\n\n return bundle.get(type);\n };\n}\n\nexport { build } from './builder';\nexport { closestAncestor, closestChild } from './resolver';\n\nexport type {\n Loader,\n Bundle$Namespace,\n Bundle$NamespaceGroup\n} from './interfaces';\n", "/**\n * @private\n */\nexport default function normalizePort(port?: string | number): number {\n switch (typeof port) {\n case 'string':\n return Number.parseInt(port, 10);\n\n case 'number':\n return Math.abs(port);\n\n default:\n return 4000;\n }\n}\n", "import { posix } from 'path';\n\nimport { deepFreezeProps } from '../../freezeable';\nimport { closestAncestor } from '../../loader';\nimport { tryCatchSync } from '../../../utils/try-catch';\nimport type Database from '../../database';\nimport type { Model, ModelClass } from '../../database';\nimport type Controller from '../../controller';\nimport type Serializer from '../../serializer';\nimport type { Bundle$Namespace } from '../../loader';\nimport type { Application$Class } from '../index';\n\nexport default function createController<T extends Controller>(\n constructor: Application$Class<T>,\n opts: {\n key: string;\n store: Database;\n parent?: Controller | null;\n serializers: Bundle$Namespace<Serializer<Model>>;\n }\n): T {\n const { key, store, serializers } = opts;\n const namespace = posix.dirname(key).replace('.', '');\n let { parent } = opts;\n let model: ModelClass | null | undefined = tryCatchSync(() =>\n store.modelFor(posix.basename(key))\n );\n let serializer = serializers.get(key);\n\n if (!model) {\n model = null;\n }\n\n if (!parent) {\n parent = null;\n }\n\n if (!serializer) {\n serializer = closestAncestor(serializers, key);\n }\n\n const instance: T = Reflect.construct(constructor, [\n {\n model,\n namespace,\n serializer\n }\n ]);\n\n if (serializer) {\n if (!instance.filter.length) {\n instance.filter = [...serializer.attributes];\n }\n\n if (!instance.sort.length) {\n instance.sort = [...serializer.attributes];\n }\n }\n\n if (parent) {\n instance.beforeAction = [\n ...parent.beforeAction.map(fn => fn.bind(parent)),\n ...instance.beforeAction.map(fn => fn.bind(instance))\n ];\n\n instance.afterAction = [\n ...instance.afterAction.map(fn => fn.bind(instance)),\n ...parent.afterAction.map(fn => fn.bind(parent))\n ];\n }\n\n Reflect.defineProperty(instance, 'parent', {\n value: parent,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n return deepFreezeProps(\n instance,\n true,\n 'query',\n 'sort',\n 'filter',\n 'params',\n 'beforeAction',\n 'afterAction'\n );\n}\n", "import { posix } from 'path';\n\nimport { deepFreezeProps } from '../../freezeable';\nimport { tryCatchSync } from '../../../utils/try-catch';\nimport type Serializer from '../../serializer';\nimport type { Model, ModelClass } from '../../database';\nimport type { Application$Class, Application$factoryOpts } from '../index';\n\nexport default function createSerializer<T extends Serializer<Model>>(\n constructor: Application$Class<T>,\n opts: Application$factoryOpts<T>\n): T {\n const { key, store } = opts;\n const namespace = posix.dirname(key).replace('.', '');\n let { parent } = opts;\n let model: ModelClass | null | undefined = tryCatchSync(() =>\n store.modelFor(posix.basename(key))\n );\n\n if (!model) {\n model = null;\n }\n\n if (!parent) {\n parent = null;\n }\n\n const instance: T = Reflect.construct(constructor, [\n {\n model,\n parent,\n namespace\n }\n ]);\n\n Reflect.defineProperty(instance, 'parent', {\n value: parent,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n return deepFreezeProps(instance, true, 'hasOne', 'hasMany', 'attributes');\n}\n", "import { LUMEN_CONSOLE } from '../../constants';\nimport Database from '../database';\nimport Logger from '../logger';\nimport Router from '../router';\nimport Server from '../server';\nimport { build, createLoader, closestChild } from '../loader';\nimport { freezeProps, deepFreezeProps } from '../freezeable';\nimport ControllerMissingError from '../../errors/controller-missing-error';\n\nimport normalizePort from './utils/normalize-port';\nimport createController from './utils/create-controller';\nimport createSerializer from './utils/create-serializer';\n\nimport type Controller from '../controller';\nimport type Serializer from '../serializer';\nimport type { Model, ModelClass } from '../database';\nimport type Application from './index';\nimport type { Application$opts } from './index';\n\n/**\n * @private\n */\nexport default async function initialize<T extends Application>(\n app: T,\n { path, port, logging, database, server: serverConfig }: Application$opts\n): Promise<T> {\n const load = createLoader(path);\n const routes = load('routes');\n const models = load('models');\n const logger = new Logger(logging);\n const normalizedPort = normalizePort(port);\n\n const store = await new Database({\n path,\n models,\n logger,\n config: database,\n checkMigrations: true\n });\n\n const serializers = build<Serializer<Model>>(\n load('serializers'),\n (key, value, parent) =>\n createSerializer(value, {\n key,\n store,\n parent\n })\n );\n\n models.forEach((model: ModelClass) => {\n Reflect.defineProperty(model, 'serializer', {\n value: closestChild(serializers, model.resourceName),\n writable: false,\n enumerable: false,\n configurable: false\n });\n });\n\n const controllers = build<Controller>(\n load('controllers'),\n (key, value, parent) =>\n createController(value, {\n key,\n store,\n parent,\n serializers\n })\n );\n\n controllers.forEach((controller: Controller) => {\n Reflect.defineProperty(controller, 'controllers', {\n value: controllers,\n writable: true,\n enumerable: false,\n configurable: false\n });\n });\n\n const ApplicationController = controllers.get('application');\n\n if (!ApplicationController) {\n throw new ControllerMissingError('application');\n }\n\n const router = new Router({\n routes,\n controllers,\n controller: ApplicationController\n });\n\n const server = new Server({\n router,\n logger,\n ...serverConfig\n });\n\n if (!LUMEN_CONSOLE) {\n server.instance.listen(normalizedPort).once('listening', () => {\n if (typeof process.send === 'function') {\n process.send('ready');\n } else {\n // 'ready' is a custom lifecycle event, not one of Process's typed\n // emit overloads.\n (process as NodeJS.EventEmitter).emit('ready');\n }\n });\n }\n\n Object.assign(app, {\n logger,\n models,\n controllers,\n serializers\n });\n\n deepFreezeProps(app, true, 'logger', 'models', 'controllers', 'serializers');\n\n Object.assign(app, {\n path,\n store,\n router,\n server,\n port: normalizedPort\n });\n\n freezeProps(app, false, 'path', 'port', 'store', 'router', 'server');\n\n Object.freeze(app);\n\n return app;\n}\n", "import { createDefaultConfig } from '../config';\nimport merge from '../../utils/merge';\nimport type Logger from '../logger';\nimport type Router from '../router';\nimport type Server from '../server';\nimport type Controller from '../controller';\nimport type Serializer from '../serializer';\nimport type Database from '../database';\nimport type { Model, ModelClass } from '../database';\nimport type { FreezeableMap } from '../freezeable';\n\nimport initialize from './initialize';\nimport type { Application$opts } from './interfaces';\n\n/**\n * @class Application\n * @public\n */\nclass Application {\n /**\n * The path of `Application` instance.\n *\n * @property path\n * @type {String}\n * @public\n */\n declare path: string;\n\n /**\n * The port that an `Application` instance is listening for incomming HTTP\n * requests.\n *\n * @property port\n * @type {Number}\n * @public\n */\n declare port: number;\n\n /**\n * A reference to the `Database` instance.\n *\n * @property store\n * @type {Database}\n * @private\n */\n declare store: Database;\n\n /**\n * A reference to the `Logger` instance.\n *\n * @property logger\n * @type {Logger}\n * @private\n */\n declare logger: Logger;\n\n /**\n * A reference to the `Router` instance.\n *\n * @property router\n * @type {Router}\n * @private\n */\n declare router: Router;\n\n /**\n * A reference to the `Server` instance.\n *\n * @property server\n * @type {Server}\n * @private\n */\n declare server: Server;\n\n /**\n * A map containing each `Model` class.\n *\n * @property models\n * @type {Map}\n * @private\n */\n declare models: FreezeableMap<string, ModelClass>;\n\n /**\n * A map containing each `Controller` instance.\n *\n * @property controllers\n * @type {Map}\n * @private\n */\n declare controllers: FreezeableMap<string, Controller>;\n\n /**\n * A map containing each `Serializer` instance.\n *\n * @property serializers\n * @type {Map}\n * @private\n */\n declare serializers: FreezeableMap<string, Serializer<Model>>;\n\n /**\n * @method constructor\n * @param {Object} config\n * @return {Promise}\n * @public\n */\n constructor(opts: Application$opts) {\n // Applications construct asynchronously (see Database/Watcher); `new\n // Application()` resolves to the ready instance, and TS cannot type a\n // Promise-returning constructor.\n return initialize(\n this,\n merge(createDefaultConfig(), opts)\n ) as unknown as Application;\n }\n}\n\nexport default Application;\nexport type {\n Application$opts,\n Application$Class,\n Application$factoryOpts\n} from './interfaces';\n", "import type { Response } from '../../server';\n\n/**\n * Create a Proxy that will trap typical node middleware callback invocations\n * and route them to the appropriate Promise callback (resolve or reject).\n *\n * @private\n */\nexport default function createResponseProxy(\n res: Response,\n resolve: (result: unknown) => void\n): Response {\n return new Proxy(res, {\n get(target, key) {\n switch (key) {\n case 'end':\n case 'send':\n case 'json':\n return resolve;\n\n default:\n return Reflect.get(target, key);\n }\n }\n });\n}\n", "import type { Action } from '../router';\nimport type { Request, Response } from '../server';\n\nimport createResponseProxy from './utils/create-response-proxy';\n\n/**\n * Convert traditional node HTTP server middleware into a lumen compatible\n * function for use in Controller#beforeAction.\n *\n * @module lumen-framework\n * @namespace Lumen\n * @function lumenify\n */\nexport default function lumenify(\n middleware: (req: Request, res: Response, next: (err?: Error) => void) => void\n): Action<unknown> {\n const result = function (req: Request, res: Response) {\n return new Promise<unknown>((resolve, reject) => {\n Reflect.apply(middleware, null, [\n req,\n createResponseProxy(res, resolve),\n (err?: Error) => {\n if (err && err instanceof Error) {\n reject(err);\n } else {\n resolve(undefined);\n }\n }\n ]);\n });\n };\n\n Reflect.defineProperty(result, 'name', {\n value: middleware.name\n });\n\n return result;\n}\n"],
5
- "mappings": "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",
6
- "names": ["yellow", "format", "format", "yellow", "yellow", "stat", "format", "yellow", "green", "yellow", "yellow", "green", "Client", "resolve", "resolve", "initialize", "pluralize", "camelize", "camelize", "singularize", "resolve", "camelize", "singularize", "resolve", "resolve", "camelize", "camelize", "camelize", "camelize", "createRunner", "camelize", "dasherize", "singularize", "normalize", "normalize", "dasherize", "camelize", "singularize", "initialize", "createRunner", "resolve", "pluralize", "initialize", "camelize", "camelize", "dasherize", "camelize", "dasherize", "camelize", "resolve", "PATTERN", "hasOwnProperty", "dasherize", "dasherize", "validateType", "validateType", "validateOne", "validateType", "resource", "define", "build", "joinPath", "dasherize", "dasherize", "normalize", "joinPath", "posix", "resource", "map", "posix", "posix", "build", "posix", "posix", "posix", "posix", "initialize", "build", "initialize", "resolve", "resolve"]
3
+ "sources": ["../src/packages/database/errors/invalid-driver-error.ts", "../src/packages/database/constants.ts", "../src/constants.ts", "../src/utils/k.ts", "../src/packages/freezeable/constants.ts", "../src/utils/insert.ts", "../src/utils/is-object.ts", "../src/packages/freezeable/utils/freeze.ts", "../src/packages/freezeable/utils/is-frozen.ts", "../src/packages/freezeable/map/index.ts", "../src/packages/freezeable/set/index.ts", "../src/packages/logger/constants.ts", "../src/packages/logger/writer/index.ts", "../src/utils/entries.ts", "../src/utils/omit.ts", "../src/packages/logger/writer/constants.ts", "../src/utils/stringify.ts", "../src/packages/logger/writer/utils/format-message.ts", "../src/packages/logger/request-logger/utils/log-text.ts", "../src/packages/logger/request-logger/templates.ts", "../src/packages/template/utils/insert-values.ts", "../src/packages/logger/utils/line.ts", "../src/packages/logger/request-logger/utils/filter-params.ts", "../src/packages/logger/request-logger/utils/log-json.ts", "../src/packages/logger/request-logger/index.ts", "../src/packages/logger/utils/sql.ts", "../src/packages/logger/index.ts", "../src/packages/database/errors/model-missing-error.ts", "../src/packages/database/errors/migrations-pending-error.ts", "../src/packages/server/utils/create-server-error.ts", "../src/packages/database/errors/unique-constraint-error.ts", "../src/packages/database/errors/config-missing-error.ts", "../src/packages/database/initialize.ts", "../src/packages/database/utils/connect.ts", "../src/packages/database/utils/create-migrations.ts", "../src/packages/fs/index.ts", "../src/packages/fs/watcher/index.ts", "../src/packages/fs/watcher/initialize.ts", "../src/utils/try-catch.ts", "../src/packages/fs/utils/create-resolver.ts", "../src/utils/chain.ts", "../src/packages/database/utils/pending-migrations.ts", "../src/packages/database/utils/normalize-model-name.ts", "../src/utils/compose.ts", "../src/utils/underscore.ts", "../src/packages/database/model/index.ts", "../src/packages/database/query/index.ts", "../src/utils/uniq.ts", "../src/packages/database/query/utils/scopes-for.ts", "../src/packages/database/query/utils/format-select.ts", "../src/packages/database/query/errors/record-not-found-error.ts", "../src/packages/database/query/runner/constants.ts", "../src/packages/database/query/runner/utils/get-find-param.ts", "../src/packages/database/query/runner/utils/build-results.ts", "../src/utils/promise-hash.ts", "../src/packages/database/query/runner/index.ts", "../src/utils/map-to-object.ts", "../src/packages/database/change-set/index.ts", "../src/packages/database/relationship/index.ts", "../src/packages/database/relationship/utils/getters.ts", "../src/packages/database/relationship/utils/unassociate.ts", "../src/utils/is-null.ts", "../src/packages/database/relationship/utils/validate-type.ts", "../src/packages/database/relationship/utils/inverse-setters.ts", "../src/packages/database/relationship/utils/setters.ts", "../src/packages/database/relationship/utils/update-relationship.ts", "../src/utils/has-own-property.ts", "../src/utils/proxy.ts", "../src/packages/database/transaction/index.ts", "../src/utils/pick.ts", "../src/utils/diff.ts", "../src/packages/database/model/utils/get-columns.ts", "../src/packages/database/model/utils/persistence.ts", "../src/packages/database/model/initialize-class.ts", "../src/utils/is-undefined.ts", "../src/packages/database/attribute/utils/create-getter.ts", "../src/packages/database/attribute/utils/create-setter.ts", "../src/packages/database/attribute/utils/create-normalizer.ts", "../src/packages/database/attribute/index.ts", "../src/packages/database/validation/errors/validation-error.ts", "../src/packages/database/validation/index.ts", "../src/packages/database/model/utils/validate.ts", "../src/packages/database/model/utils/run-hooks.ts", "../src/packages/database/migration/index.ts", "../src/packages/database/utils/type-for-column.ts", "../src/packages/database/index.ts", "../src/packages/server/index.ts", "../src/packages/server/constants.ts", "../src/packages/server/request/index.ts", "../src/packages/server/request/constants.ts", "../src/packages/server/request/parser/utils/parse-nested-object.ts", "../src/packages/server/request/parser/utils/format.ts", "../src/packages/server/request/parser/constants.ts", "../src/utils/transform-keys.ts", "../src/packages/server/request/parser/utils/parse-read.ts", "../src/packages/server/request/parser/errors/malformed-request-error.ts", "../src/packages/server/request/parser/utils/parse-write.ts", "../src/packages/server/request/parser/index.ts", "../src/packages/server/request/utils/get-domain.ts", "../src/packages/server/response/index.ts", "../src/packages/jsonapi/constants.ts", "../src/packages/jsonapi/errors/not-acceptable-error.ts", "../src/packages/jsonapi/errors/unsupported-media-type-error.ts", "../src/packages/jsonapi/errors/invalid-content-type-error.ts", "../src/packages/jsonapi/utils/media-type.ts", "../src/packages/jsonapi/utils/is-jsonapi.ts", "../src/packages/jsonapi/utils/has-media-type-params.ts", "../src/utils/env.ts", "../src/packages/server/responder/utils/data-for.ts", "../src/packages/server/responder/utils/normalize.ts", "../src/packages/server/responder/utils/has-content-type.ts", "../src/packages/server/responder/index.ts", "../src/packages/server/utils/validate-accept.ts", "../src/packages/server/utils/validate-content-type.ts", "../src/packages/server/utils/set-cors-headers.ts", "../src/utils/merge.ts", "../src/packages/controller/utils/params-to-query.ts", "../src/packages/controller/utils/find-one.ts", "../src/packages/controller/utils/find-many.ts", "../src/packages/controller/utils/resolve-relationships.ts", "../src/packages/controller/constants.ts", "../src/packages/controller/index.ts", "../src/packages/serializer/index.ts", "../src/packages/config/index.ts", "../src/packages/router/namespace/utils/normalize-name.ts", "../src/packages/router/namespace/utils/normalize-path.ts", "../src/packages/router/namespace/index.ts", "../src/utils/create-query-string.ts", "../src/packages/router/route/action/utils/create-page-links.ts", "../src/packages/router/route/action/enhancers/resource.ts", "../src/packages/router/route/action/constants.ts", "../src/packages/router/route/action/utils/get-action-name.ts", "../src/packages/router/route/action/utils/get-controller-name.ts", "../src/packages/router/route/action/enhancers/track-perf.ts", "../src/packages/router/route/action/index.ts", "../src/packages/router/route/params/errors/parameter-type-error.ts", "../src/packages/router/route/params/errors/parameter-value-error.ts", "../src/packages/router/route/params/errors/invalid-parameter-error.ts", "../src/packages/router/route/params/errors/resource-mismatch-error.ts", "../src/packages/router/route/params/errors/parameter-required-error.ts", "../src/packages/router/route/params/errors/parameter-not-nullable-error.ts", "../src/utils/is-buffer.ts", "../src/packages/router/route/params/utils/validate-type.ts", "../src/packages/router/route/params/parameter-group/utils/has-required-params.ts", "../src/packages/router/route/params/parameter-group/index.ts", "../src/packages/router/route/params/parameter/utils/validate-value.ts", "../src/packages/router/route/params/parameter/index.ts", "../src/packages/router/route/params/utils/get-url-params.ts", "../src/packages/router/route/params/utils/get-data-params.ts", "../src/packages/router/route/params/utils/get-default-member-params.ts", "../src/packages/router/route/params/utils/get-default-collection-params.ts", "../src/packages/router/route/params/utils/get-query-params.ts", "../src/packages/router/route/params/utils/validate-resource-id.ts", "../src/packages/router/route/params/index.ts", "../src/packages/router/route/utils/get-static-path.ts", "../src/packages/router/route/constants.ts", "../src/packages/router/route/utils/get-dynamic-segments.ts", "../src/packages/router/route/index.ts", "../src/packages/router/resource/utils/normalize-only.ts", "../src/packages/router/resource/index.ts", "../src/errors/controller-missing-error.ts", "../src/packages/router/definitions/context/utils/create-definition.ts", "../src/packages/router/definitions/context/utils/create-definition-group.ts", "../src/packages/router/definitions/context/utils/normalize-resource-args.ts", "../src/packages/router/definitions/context/index.ts", "../src/packages/router/definitions/index.ts", "../src/packages/router/utils/create-replacer.ts", "../src/packages/router/index.ts", "../src/packages/loader/utils/bundle-for.ts", "../src/packages/loader/utils/format-key.ts", "../src/packages/loader/resolver/utils/closest-ancestor.ts", "../src/packages/loader/resolver/utils/closest-child.ts", "../src/packages/loader/resolver/index.ts", "../src/packages/loader/builder/utils/create-parent-builder.ts", "../src/packages/loader/builder/utils/sort-by-namespace.ts", "../src/packages/loader/builder/utils/create-children-builder.ts", "../src/packages/loader/builder/index.ts", "../src/packages/loader/index.ts", "../src/packages/application/utils/normalize-port.ts", "../src/packages/application/utils/create-controller.ts", "../src/packages/application/utils/create-serializer.ts", "../src/packages/application/initialize.ts", "../src/packages/application/index.ts", "../src/packages/lumenify/utils/create-response-proxy.ts", "../src/packages/lumenify/index.ts"],
4
+ "sourcesContent": ["import { green, yellow } from 'chalk';\n\nimport { VALID_DRIVERS } from '../constants';\nimport { line } from '../../logger';\n\n/**\n * @private\n */\nclass InvalidDriverError extends Error {\n constructor(driver: string) {\n super(line`\n Invalid database driver ${yellow(driver)} in ./config/database.js.\n Please use one of the following database drivers:\n ${VALID_DRIVERS.map(str => green(str)).join(', ')}.\n `);\n }\n}\n\nexport default InvalidDriverError;\n", "export const UNIQUE_CONSTRAINT = /UNIQUE\\sCONSTRAINT/gi;\n\nexport const VALID_DRIVERS = [\n 'pg',\n 'sqlite3',\n 'mssql',\n 'mysql',\n 'mysql2',\n 'mariasql',\n 'strong-oracle',\n 'oracle'\n];\n\nexport const TYPE_ALIASES = new Map([\n ['enu', 'array'],\n ['enum', 'array'],\n\n ['json', 'object'],\n ['jsonb', 'object'],\n\n ['binary', 'buffer'],\n\n ['bool', 'boolean'],\n ['boolean', 'boolean'],\n\n ['time', 'date'],\n ['date', 'date'],\n ['datetime', 'date'],\n\n ['text', 'string'],\n ['uuid', 'string'],\n ['string', 'string'],\n ['varchar', 'string'],\n\n ['int', 'number'],\n ['float', 'number'],\n ['integer', 'number'],\n ['decimal', 'number'],\n ['floating', 'number'],\n ['bigInteger', 'number']\n]);\n", "import { platform } from 'os';\n\nconst { env: ENV } = process;\n\nexport const CWD = process.cwd();\n\n// NOTE: the Flow original derived this via a `cluster.worker.pid` check, but\n// Node's `Worker` has no `pid` property \u2014 the pid lives at\n// `worker.process.pid` \u2014 so `typeof worker.pid === 'number'` was always false\n// and the branch never ran. It was a no-op either way: inside a worker process\n// `worker.process.pid` *is* `process.pid`. Simplified rather than preserving\n// dead code; behaviour is unchanged.\nexport const PID = process.pid;\n\n// `ENV.PORT` is `string | undefined`; `parseInt(undefined)` yields NaN, which\n// the `||` below turns into the default. Cast rather than `??` so the emitted\n// bundle stays parseable by the Babel 6 stages that still consume it.\nexport const PORT = parseInt(ENV.PORT as string, 10) || 4000;\nexport const NODE_ENV = ENV.NODE_ENV || 'development';\nexport const DATABASE_URL = ENV.DATABASE_URL;\nexport const LUMEN_CONSOLE = ENV.LUMEN_CONSOLE || false;\nexport const PLATFORM = platform();\n", "/**\n * A utility function that always returns `this` based on it's current\n * context.\n *\n * A common use case for the K function is a default parameter for optional\n * callback functions or general function arguments.\n *\n * @private\n */\nexport default function K(this: unknown): unknown {\n return this;\n}\n", "export const FREEZER = new WeakSet<object>();\n", "/**\n * @private\n */\nexport default function insert<T, U extends T[]>(target: U, items: T[]): U {\n for (let i = 0; i < items.length; i += 1) {\n target.splice(i, 1, items[i]);\n }\n\n return target;\n}\n", "/**\n * Determine wether or not a value is an Object.\n *\n * @example\n * const a = null;\n * const b = [];\n * const c = {};\n *\n * console.log(typeof a, typeof b, typeof c);\n * // => 'object', 'object', 'object' \uD83D\uDC4E\n *\n * console.log(isObject(a), isObject(b), isObject(c));\n * // => false, false, true \uD83D\uDC4D\n *\n * @private\n */\nexport default function isObject(\n value: unknown\n): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n", "import { FREEZER } from '../constants';\nimport insert from '../../../utils/insert';\nimport isObject from '../../../utils/is-object';\n\n/**\n * Anything exposing a `freeze` method \u2014 in practice FreezeableMap/FreezeableSet.\n *\n * @private\n */\ninterface Freezeable {\n freeze(deep?: boolean): unknown;\n}\n\nfunction isFreezeable(value: unknown): value is Freezeable {\n return Boolean(value) && typeof (value as Freezeable).freeze === 'function';\n}\n\n/**\n * @private\n */\nexport default function freeze<T extends object>(value: T): T {\n FREEZER.add(value);\n return value;\n}\n\n/**\n * @private\n */\nexport function freezeArray<T>(target: T[]): readonly T[] {\n const result = insert(new Array<T>(target.length), target);\n\n return Object.freeze(result);\n}\n\n/**\n * @private\n */\nexport function freezeValue<T>(value: T): T {\n if (isFreezeable(value)) {\n return Object.freeze(value).freeze(true) as T;\n } else if (isObject(value)) {\n return Object.freeze(value) as T;\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport function freezeProps<T extends object>(\n target: T,\n makePublic: boolean,\n ...props: string[]\n): T {\n Object.defineProperties(\n target,\n props.reduce<PropertyDescriptorMap>(\n (obj, key) => ({\n ...obj,\n [key]: {\n value: Reflect.get(target, key),\n writable: false,\n enumerable: makePublic,\n configurable: false\n }\n }),\n {}\n )\n );\n\n return target;\n}\n\n/**\n * @private\n */\nexport function deepFreezeProps<T extends object>(\n target: T,\n makePublic: boolean,\n ...props: string[]\n): T {\n Object.defineProperties(\n target,\n props.reduce<PropertyDescriptorMap>((obj, key) => {\n let value: unknown = Reflect.get(target, key);\n\n if (Array.isArray(value)) {\n value = freezeArray(value);\n } else {\n value = freezeValue(value);\n }\n\n return {\n ...obj,\n [key]: {\n value,\n writable: false,\n enumerable: makePublic,\n configurable: false\n }\n };\n }, {})\n );\n\n return target;\n}\n", "import { FREEZER } from '../constants';\n\n/**\n * @private\n */\nexport default function isFrozen(value: unknown): boolean {\n // `WeakSet#has` returns false for non-objects rather than throwing, so this\n // keeps the original behaviour of accepting any value.\n return FREEZER.has(value as object);\n}\n", "import freeze from '../utils/freeze';\nimport isFrozen from '../utils/is-frozen';\n\n/**\n * @private\n */\nclass FreezeableMap<K, V> extends Map<K, V> {\n override set(key: K, value: V): this {\n if (!this.isFrozen()) {\n super.set(key, value);\n }\n\n return this;\n }\n\n override clear(): void {\n if (!this.isFrozen()) {\n super.clear();\n }\n }\n\n override delete(key: K): boolean {\n return this.isFrozen() ? false : super.delete(key);\n }\n\n freeze(deep?: boolean): this {\n if (deep) {\n this.forEach(Object.freeze);\n }\n\n return freeze(this);\n }\n\n isFrozen(): boolean {\n return isFrozen(this);\n }\n}\n\nexport default FreezeableMap;\n", "import freeze from '../utils/freeze';\nimport isFrozen from '../utils/is-frozen';\n\n/**\n * @private\n */\nclass FreezeableSet<T> extends Set<T> {\n override add(value: T): this {\n if (!this.isFrozen()) {\n super.add(value);\n }\n\n return this;\n }\n\n override clear(): void {\n if (!this.isFrozen()) {\n super.clear();\n }\n }\n\n override delete(value: T): boolean {\n return this.isFrozen() ? false : super.delete(value);\n }\n\n freeze(deep?: boolean): this {\n if (deep) {\n this.forEach(Object.freeze);\n }\n\n return freeze(this);\n }\n\n isFrozen(): boolean {\n return isFrozen(this);\n }\n}\n\nexport default FreezeableSet;\n", "import { FreezeableMap, FreezeableSet } from '../freezeable';\n\nimport type { Logger$level, Logger$format } from './interfaces';\n\nexport const DEBUG = 'DEBUG';\nexport const INFO = 'INFO';\nexport const WARN = 'WARN';\nexport const ERROR = 'ERROR';\n\nexport const FORMATS: FreezeableSet<Logger$format> =\n new FreezeableSet<Logger$format>(['text', 'json']);\n\nFORMATS.freeze();\n\nexport const LEVELS: FreezeableMap<Logger$level, number> = new FreezeableMap<\n Logger$level,\n number\n>([\n [DEBUG, 0],\n [INFO, 1],\n [WARN, 2],\n [ERROR, 3]\n]);\n\nLEVELS.freeze();\n", "import { WriteStream } from 'tty';\n\nimport { dim, red, yellow } from 'chalk';\n\nimport { WARN, ERROR } from '../constants';\nimport omit from '../../../utils/omit';\nimport type { Logger$format } from '../interfaces';\n\nimport { STDOUT, STDERR } from './constants';\nimport formatMessage from './utils/format-message';\nimport type { Logger$Writer } from './interfaces';\n\n/**\n * A logged message that is itself an object carrying its own `message` field,\n * which the JSON writer hoists to the top level.\n */\nfunction isMessageObject(value: unknown): value is { message?: unknown } {\n return Boolean(value) && typeof value === 'object';\n}\n\n/**\n * @private\n */\nexport function createWriter(format: Logger$format): Logger$Writer {\n return function write(data) {\n const { level, ...etc } = data;\n let { message, timestamp } = etc;\n let output: unknown;\n\n if (format === 'json') {\n output = {};\n\n if (isMessageObject(message) && message.message) {\n output = {\n timestamp,\n level,\n message: message.message,\n ...omit(message, 'message')\n };\n } else {\n // The Flow original spread `...etc` here too, but `etc` is just\n // `{ message, timestamp }` \u2014 both already listed above with the same\n // values \u2014 so the spread only re-wrote them. Dropping it keeps the\n // identical key order and values.\n output = {\n timestamp,\n level,\n message\n };\n }\n\n output = formatMessage(output, 'json');\n } else {\n let columns = 0;\n\n if (process.stdout instanceof WriteStream) {\n columns = process.stdout.columns;\n }\n\n message = formatMessage(message, 'text');\n\n switch (level) {\n case WARN:\n timestamp = yellow(`[${timestamp}]`);\n break;\n\n case ERROR:\n timestamp = red(`[${timestamp}]`);\n break;\n\n default:\n timestamp = dim(`[${timestamp}]`);\n break;\n }\n\n output = `${timestamp} ${message}\\n\\n${dim('-').repeat(columns)}\\n`;\n }\n\n if (STDOUT.test(level)) {\n process.stdout.write(`${output}\\n`);\n } else if (STDERR.test(level)) {\n process.stderr.write(`${output}\\n`);\n }\n };\n}\n", "/**\n * @private\n */\nexport default function entries<T>(\n source: Record<string, T>\n): Array<[string, T]> {\n return Object.entries(source);\n}\n", "import entries from './entries';\n\n/**\n * Returns a copy of `src` without `omitted` keys.\n *\n * Typed as `Partial<T>` rather than Flow's `T`, since the omitted keys are by\n * definition absent from the result.\n *\n * @private\n */\nexport default function omit<T extends object>(\n src: T,\n ...omitted: string[]\n): Partial<T> {\n return entries(src as Record<string, unknown>)\n .filter(([key]) => omitted.indexOf(key) < 0)\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: value\n }),\n {}\n ) as Partial<T>;\n}\n", "import ansiRegex from 'ansi-regex';\n\nexport const ANSI = ansiRegex();\nexport const STDOUT = /^(DEBUG|INFO)$/;\nexport const STDERR = /^(WARN|ERROR)$/;\n", "import isObject from './is-object';\n\n/**\n * @private\n */\nexport default function stringify(value?: unknown, spaces?: number): string {\n if (isObject(value) || Array.isArray(value)) {\n return JSON.stringify(value, null, spaces);\n }\n\n return String(value);\n}\n", "import { ANSI } from '../constants';\nimport stringify from '../../../../utils/stringify';\nimport type { Logger$format } from '../../interfaces';\n\n/**\n * Returns `string | undefined` because `Error#stack` is optional \u2014 the Flow\n * original had the same behaviour, it just did not say so.\n *\n * `data` is required here; Flow allowed it to be declared optional ahead of a\n * required parameter, which TypeScript does not (and every caller passes both).\n */\nexport default function formatMessage(\n data: unknown,\n format: Logger$format\n): string | undefined {\n if (data instanceof Error) {\n return data.stack;\n } else if (format === 'json') {\n return stringify(data).replace(ANSI, '');\n }\n\n return stringify(data, 2);\n}\n", "import chalk from 'chalk';\n\nimport { DEBUG } from '../../constants';\nimport { infoTemplate, debugTemplate } from '../templates';\nimport type Logger from '../../index';\nimport type { Request, Response } from '../../../server';\n\nimport filterParams from './filter-params';\n\n/**\n * @private\n */\nexport default function logText(\n logger: Logger,\n {\n startTime,\n request: req,\n response: res\n }: {\n request: Request;\n response: Response;\n startTime: number;\n }\n): void {\n res.once('finish', () => {\n const endTime = Date.now();\n\n const {\n route,\n method,\n\n url: { path },\n\n connection: { remoteAddress }\n } = req;\n\n const { stats, statusCode, statusMessage } = res;\n const params = filterParams(req.params, ...logger.filter.params);\n const statusColor = statusCode >= 200 && statusCode < 400 ? 'green' : 'red';\n\n let colorStr: (source: string) => string = Reflect.get(chalk, statusColor);\n\n if (typeof colorStr === 'undefined') {\n colorStr = (str: string) => str;\n }\n\n const templateData = {\n path,\n stats,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode: statusCode.toString(),\n statusMessage,\n remoteAddress\n };\n\n if (logger.level === DEBUG) {\n logger.debug(debugTemplate(templateData));\n } else {\n logger.info(infoTemplate(templateData));\n }\n });\n}\n", "import { blue, cyan, magenta, yellow } from 'chalk';\n\nimport line from '../utils/line';\n\nimport type { RequestLogger$templateData } from './interfaces';\n\n/**\n * @private\n */\nfunction countDigits(num: number) {\n const digits = Math.floor(Math.log10(num) + 1);\n\n return digits > 0 && Number.isFinite(digits) ? digits : 1;\n}\n\n/**\n * @private\n */\nfunction pad(startTime: number, endTime: number, duration: number) {\n const maxLength = countDigits(endTime - startTime);\n\n return ' '.repeat(maxLength - countDigits(duration)) + duration;\n}\n\n/**\n * @private\n */\nexport const debugTemplate = ({\n path,\n stats,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode,\n statusMessage,\n remoteAddress\n}: RequestLogger$templateData) => `\\\n${line`\n Processed ${cyan(`${method}`)} \"${path}\" from ${remoteAddress}\n with ${Reflect.apply(colorStr, null, [`${statusCode}`])}\n ${Reflect.apply(colorStr, null, [`${statusMessage}`])} by ${\n route\n ? `${yellow(route.controller.constructor.name)}#${blue(route.action)}`\n : null\n }\n`}\n\n${magenta('Params')}\n\n${JSON.stringify(params, null, 2)}\n\n${magenta('Stats')}\n\n${stats\n .map(stat => {\n const { type, duration, controller } = stat;\n let { name } = stat;\n\n name = blue(name);\n\n if (type === 'action') {\n name = `${yellow(controller)}#${name}`;\n }\n\n return `${pad(startTime, endTime, duration)} ms ${name}`;\n })\n .join('\\n')}\n${pad(\n startTime,\n endTime,\n stats.reduce((total, { duration }) => total + duration, 0)\n)} ms Total\n${(endTime - startTime).toString()} ms Actual\\\n`;\n\n/**\n * @private\n */\nexport const infoTemplate = ({\n path,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode,\n statusMessage,\n remoteAddress\n}: RequestLogger$templateData) => line`\nProcessed ${cyan(`${method}`)} \"${path}\" ${magenta('Params')} ${JSON.stringify(\n params\n)} from ${remoteAddress} in ${(endTime - startTime).toString()} ms with ${Reflect.apply(\n colorStr,\n null,\n [`${statusCode}`]\n)} ${Reflect.apply(colorStr, null, [`${statusMessage}`])} by ${\n route\n ? `${yellow(route.controller.constructor.name)}#${blue(route.action)}`\n : null\n}\n`;\n", "/**\n * @private\n */\nexport default function insertValues(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n if (values.length) {\n return strings.reduce((result, part, idx): string => {\n const raw: unknown = values[idx];\n let value = '';\n\n if (\n raw &&\n typeof (raw as { toString?: unknown }).toString === 'function'\n ) {\n value = (raw as { toString(): string }).toString();\n }\n\n return result + part + value;\n }, '');\n }\n\n return strings.join('');\n}\n", "import { insertValues } from '../../template';\n\n/**\n * @private\n */\nexport default function line(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n return insertValues(strings, ...values)\n .replace(/(\\r\\n|\\n|\\r|)/gm, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n", "import entries from '../../../../utils/entries';\n\n/**\n * @private\n */\nexport default function filterParams(\n params: Record<string, unknown>,\n ...filtered: string[]\n): Record<string, unknown> {\n return entries(params)\n .map(([key, value]): [string, unknown] => [\n key,\n filtered.indexOf(key) >= 0 ? '[FILTERED]' : value\n ])\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]:\n value && typeof value === 'object' && !Array.isArray(value)\n ? filterParams(value as Record<string, unknown>, ...filtered)\n : value\n }),\n {}\n );\n}\n", "import type Logger from '../../index';\nimport type { Request, Response } from '../../../server';\n\nimport filterParams from './filter-params';\n\nconst MESSAGE = 'Processed Request';\n\n/**\n * @private\n */\nexport default function logJSON(\n logger: Logger,\n {\n request: req,\n response: res\n }: {\n startTime: number;\n request: Request;\n response: Response;\n }\n): void {\n res.once('finish', () => {\n const {\n method,\n headers,\n httpVersion,\n\n url: { path },\n\n connection: { remoteAddress }\n } = req;\n\n const { statusCode: status } = res;\n const userAgent = headers.get('user-agent');\n const protocol = `HTTP/${httpVersion}`;\n const params = filterParams(req.params, ...logger.filter.params);\n\n logger.info({\n message: MESSAGE,\n\n method,\n path,\n params,\n status,\n protocol,\n userAgent,\n remoteAddress\n });\n });\n}\n", "import type Logger from '../index';\n\nimport logText from './utils/log-text';\nimport logJSON from './utils/log-json';\nimport type { Logger$RequestLogger } from './interfaces';\n\n/**\n * @private\n */\nexport function createRequestLogger(logger: Logger): Logger$RequestLogger {\n return function request(req, res, { startTime }: { startTime: number }) {\n if (logger.format === 'json') {\n logJSON(logger, {\n startTime,\n request: req,\n response: res\n });\n } else {\n logText(logger, {\n startTime,\n request: req,\n response: res\n });\n }\n };\n}\n", "import { insertValues } from '../../template';\n\nconst PATTERN = /(?:,?`|'|\").+(?:`|'|\"),?/;\n\n/**\n * @private\n */\nexport default function sql(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n return insertValues(strings, ...values)\n .split(' ')\n .map(part => {\n if (PATTERN.test(part)) {\n return part;\n }\n\n return part.toUpperCase();\n })\n .join(' ');\n}\n", "import { LUMEN_CONSOLE } from '../../constants';\nimport K from '../../utils/k';\n\nimport { LEVELS } from './constants';\nimport { createWriter } from './writer';\nimport { createRequestLogger } from './request-logger';\nimport type { Logger$Writer } from './writer/interfaces';\nimport type { Logger$RequestLogger } from './request-logger/interfaces';\nimport type {\n Logger$config,\n Logger$format,\n Logger$level,\n Logger$logFn,\n Logger$filter\n} from './interfaces';\n\n/**\n * @class Logger\n * @public\n */\nclass Logger {\n /**\n * The level your application should log (DEBUG, INFO, WARN, or ERROR).\n *\n * @property level\n * @type {String}\n * @public\n */\n declare level: Logger$level;\n\n /**\n * The output format of log data (text or json).\n *\n * @property format\n * @type {String}\n * @public\n */\n declare format: Logger$format;\n\n /**\n * Hackers love logs. It's easy to get sensitive user information from log\n * data if your server has been breached. To prevent leaking sensitive\n * information in a potential attack, blacklist certain keys that should be\n * filtered out of the logs.\n *\n * ```javascript\n * // config/environments/development.js\n * export default {\n * logging: {\n * level: 'DEBUG',\n * format: 'text',\n * enabled: true,\n * filter: {\n * params: ['password']\n * }\n * }\n * };\n * ```\n *\n * Now that we've added password to the array of parameters we want to filter\n * out of the logs, let's try to create a new user.\n *\n * ```http\n * POST /users HTTP/1.1\n * Content-Type: application/vnd.api+json\n * Host: 127.0.0.1:4000\n * Connection: close\n * User-Agent: Paw/3.0.14 (Macintosh; OS X/10.12.1) GCDHTTPRequest\n * Content-Length: 188\n *\n * {\n * \"data\": {\n * \"type\": \"users\",\n * \"attributes\": {\n * \"name\": \"Zachary Golba\",\n * \"email\": \"zachary.golba@postlight.com\",\n * \"password\": \"vcZxniFYyfnFDcLn%nhe8Vrt\"\n * }\n * }\n * }\n * ```\n *\n * The request above will yield the following log message.\n *\n * ```text\n * [2016-12-10T18:28:04.610Z] Processed POST \"/users\" from ::ffff:127.0.0.1\n * with 201 Created by UsersController#create\n *\n * Params\n *\n * {\n * \"data\": {\n * \"type\": \"users\",\n * \"attributes\": {\n * \"name\": \"Zachary Golba\",\n * \"email\": \"zachary.golba@postlight.com\",\n * \"password\": \"[FILTERED]\"\n * }\n * }\n * }\n * ```\n *\n * It worked! The password value did not leak into the log message.\n *\n * @property filter\n * @type {Object}\n * @public\n */\n declare filter: Logger$filter;\n\n /**\n * A boolean flag that determines whether or not the logger is enabled.\n *\n * @property enabled\n * @type {Boolean}\n * @public\n */\n declare enabled: boolean;\n\n /**\n * Log a message at the DEBUG level.\n *\n * ```javascript\n * logger.debug('Hello World!');\n * // => [6/4/16 5:46:53 PM] Hello World!\n * ```\n *\n * @method debug\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare debug: Logger$logFn;\n\n /**\n * Log a message at the INFO level.\n *\n * ```javascript\n * logger.info('Hello World!');\n * // => [6/4/16 5:46:53 PM] Hello World!\n * ```\n *\n * @method info\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare info: Logger$logFn;\n\n /**\n * Log a message at the WARN level.\n *\n * ```javascript\n * logger.warn('Good Bye World!');\n * // => [6/4/16 5:46:53 PM] Good Bye World!\n * ```\n *\n * @method warn\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare warn: Logger$logFn;\n\n /**\n * Log a message at the ERROR level.\n *\n * ```javascript\n * logger.warn('HELP!');\n * // => [6/4/16 5:46:53 PM] HELP!\n * ```\n *\n * @method error\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare error: Logger$logFn;\n\n /**\n * Internal method used for logging requests.\n *\n * @method request\n * @param {Request} request\n * @param {Response} response\n * @param {Object} opts - An options object.\n * @param {Number} opts.startTime - The timestamp from when the request was\n * received.\n * @return {void}\n * @private\n */\n declare request: Logger$RequestLogger;\n\n constructor({ level, format, filter, enabled }: Logger$config) {\n let write: Logger$Writer = K;\n let request: Logger$RequestLogger = K;\n\n if (!LUMEN_CONSOLE && enabled) {\n write = createWriter(format);\n request = createRequestLogger(this);\n }\n\n Object.defineProperties(this, {\n level: {\n value: level,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n format: {\n value: format,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n filter: {\n value: filter,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n enabled: {\n value: Boolean(enabled),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n request: {\n value: request,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n const levelNum = LEVELS.get(level) || 0;\n\n LEVELS.forEach((val, key: Logger$level) => {\n Reflect.defineProperty(this, key.toLowerCase(), {\n writable: false,\n enumerable: false,\n configurable: false,\n\n value:\n val >= levelNum\n ? (message?: unknown) => {\n write({\n message,\n level: key,\n timestamp: this.getTimestamp()\n });\n }\n : K\n });\n });\n }\n\n /**\n * @method getTimestamp\n * @return {String} The current time as an ISO8601 string.\n * @private\n */\n getTimestamp() {\n return new Date().toISOString();\n }\n}\n\nexport default Logger;\nexport { default as line } from './utils/line';\nexport { default as sql } from './utils/sql';\n\nexport type { Logger$config } from './interfaces';\n", "/**\n * @private\n */\nclass ModelMissingError extends Error {\n constructor(name: string) {\n super(`Could not resolve model by name '${name}'`);\n }\n}\n\nexport default ModelMissingError;\n", "import { green, yellow } from 'chalk';\n\nimport { line } from '../../logger';\n\n/**\n * @private\n */\nclass MigrationsPendingError extends Error {\n constructor(migrations: Array<string> = []) {\n const pending = migrations\n .map(str => yellow(str.substr(0, str.length - 3)))\n .join(', ');\n\n super(line`\n The following migrations are pending ${pending}.\n Please run ${green('lumen db:migrate')} before starting your application.\n `);\n }\n}\n\nexport default MigrationsPendingError;\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createServerError` wraps an arbitrary error class whose constructor accepts\n * arbitrary arguments; `new (...args: any[])` is required so that error classes\n * with any constructor signature remain assignable to `Constructor<T>`.\n */\nimport type { Server$Error } from '../interfaces';\n\ntype Constructor<T> = new (...args: Array<any>) => T;\n\n/**\n * @private\n */\nexport default function createServerError<T extends object>(\n Target: Constructor<T>,\n statusCode: number\n): Constructor<T & Server$Error> {\n const ServerError = class extends (Target as Constructor<object>) {\n declare statusCode: number;\n\n constructor(...args: Array<unknown>) {\n super(...args);\n this.statusCode = statusCode;\n }\n };\n\n Reflect.defineProperty(ServerError, 'name', {\n value: Target.name\n });\n\n return ServerError as unknown as Constructor<T & Server$Error>;\n}\n", "import createServerError from '../../server/utils/create-server-error';\n\nclass UniqueConstraintError extends Error {}\n\nexport default createServerError(UniqueConstraintError, 409);\n", "class ConfigMissingError extends Error {\n constructor(environment: string) {\n super(`Database config not found for environment ${environment}.`);\n }\n}\n\nexport default ConfigMissingError;\n", "import cluster from 'cluster';\n\nimport { NODE_ENV } from '../../constants';\n\nimport { ConfigMissingError, MigrationsPendingError } from './errors';\nimport connect from './utils/connect';\nimport createMigrations from './utils/create-migrations';\nimport pendingMigrations from './utils/pending-migrations';\nimport type Database from './index';\nimport type { Database$opts } from './index';\n\n/**\n * @private\n */\nexport default async function initialize<T extends Database>(\n instance: T,\n opts: Database$opts\n): Promise<T> {\n const { path, models, logger, checkMigrations } = opts;\n const config = Reflect.get(opts.config, NODE_ENV);\n\n if (!config) {\n throw new ConfigMissingError(NODE_ENV);\n }\n\n const { debug = NODE_ENV === 'development' } = config;\n\n Object.defineProperties(instance, {\n path: {\n value: path,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n debug: {\n value: debug,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n models: {\n value: models,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n config: {\n value: config,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n schema: {\n value: () => instance.connection.schema,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n connection: {\n value: connect(path, config),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n if (cluster.isMaster || (cluster.worker && cluster.worker.id === 1)) {\n await createMigrations(instance.schema);\n\n if (checkMigrations) {\n const pending = await pendingMigrations(path, () =>\n instance.connection('migrations')\n );\n\n if (pending.length) {\n throw new MigrationsPendingError(pending);\n }\n }\n }\n\n await Promise.all(\n Array.from(models.values()).map(model =>\n model.initialize(instance, () => instance.connection(model.tableName))\n )\n );\n\n return instance;\n}\n", "import { join as joinPath } from 'path';\n\nimport type { Knex } from 'knex';\n\nimport { NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { VALID_DRIVERS } from '../constants';\nimport { InvalidDriverError } from '../errors';\nimport type { Database$environment } from '../interfaces';\n\n/**\n * @private\n */\nexport default function connect(\n path: string,\n config: Database$environment\n): Knex {\n let { pool } = config;\n\n const { host, socket, driver, database, username, password, port, ssl, url } =\n config;\n\n if (VALID_DRIVERS.indexOf(driver) < 0) {\n throw new InvalidDriverError(driver);\n }\n\n if (pool && typeof pool === 'number') {\n pool = {\n min: pool > 1 ? 2 : 1,\n max: pool\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const knex = require(joinPath(path, 'node_modules', 'knex'));\n const usingSQLite = driver === 'sqlite3';\n\n const connection = DATABASE_URL ||\n url || {\n host,\n database,\n password,\n port,\n ssl,\n user: username,\n socketPath: socket,\n filename: usingSQLite\n ? joinPath(path, 'db', `${database || 'default'}_${NODE_ENV}.sqlite`)\n : undefined\n };\n\n return knex({\n pool,\n connection,\n debug: false,\n client: driver,\n useNullAsDefault: usingSQLite\n });\n}\n", "import type Database from '../index';\n\n/**\n * @private\n */\nexport default async function createMigrations(\n schema: Database['schema']\n): Promise<boolean> {\n const hasTable: boolean = await schema().hasTable('migrations');\n\n if (!hasTable) {\n await schema().createTable('migrations', table => {\n table.string('version', 16).primary();\n });\n }\n\n return true;\n}\n", "import fs from 'fs';\nimport { join as joinPath, resolve as resolvePath } from 'path';\nimport type { Stats } from 'fs';\n\nimport Watcher from './watcher';\nimport createResolver from './utils/create-resolver';\nimport createPathRemover from './utils/create-path-remover';\nimport type { fs$readOpts, fs$writeOpts } from './interfaces';\n\nexport { default as rmrf } from './utils/rmrf';\nexport { default as exists } from './utils/exists';\nexport { default as isJSFile } from './utils/is-js-file';\nexport { default as parsePath } from './utils/parse-path';\n\nexport type { fs$ParsedPath } from './interfaces';\n\n/**\n * @private\n */\nexport function watch(path: string): Promise<Watcher> {\n return new Watcher(path) as unknown as Promise<Watcher>;\n}\n\n/**\n * @private\n */\nexport function stat(path: string): Promise<Stats> {\n return new Promise((resolve, reject) => {\n fs.stat(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function mkdir(path: string, mode: number = 511): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n fs.mkdir(path, mode, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function mkdirRec(path: string, mode: number = 511): Promise<void> {\n const parent = resolvePath(path, '..');\n\n return stat(parent)\n .catch(err => {\n if (err.code === 'ENOENT') {\n return mkdirRec(parent, mode);\n }\n\n return Promise.reject(err);\n })\n .then(() => mkdir(path, mode))\n .catch(err => {\n if (err.code !== 'EEXIST') {\n return Promise.reject(err);\n }\n\n return Promise.resolve();\n });\n}\n\n/**\n * @private\n */\nexport function rmdir(path: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.rmdir(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function readdir(\n path: string,\n // opts is accepted for signature parity with readdirRec but unused here.\n opts?: fs$readOpts // eslint-disable-line @typescript-eslint/no-unused-vars\n): Promise<Array<string>> {\n return new Promise((resolve, reject) => {\n fs.readdir(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function readdirRec(\n path: string,\n opts?: fs$readOpts\n): Promise<Array<string>> {\n const stripPath = createPathRemover(path);\n\n return readdir(path, opts)\n .then(files =>\n Promise.all(\n files.map(file => {\n const filePath = joinPath(path, file);\n\n return Promise.all([filePath, stat(filePath)]);\n })\n )\n )\n .then(files =>\n Promise.all(\n files.map(([file, stats]) =>\n Promise.all([file, stats.isDirectory() ? readdirRec(file) : []])\n )\n )\n )\n .then(files =>\n files.reduce<Array<string>>((arr, [file, children]) => {\n const basename = stripPath(file);\n\n return [\n ...arr,\n basename,\n ...children.map(child => joinPath(basename, stripPath(child)))\n ];\n }, [])\n );\n}\n\n/**\n * @private\n */\nexport function readFile(\n path: string,\n opts?: fs$readOpts\n): Promise<string | Buffer> {\n return new Promise((resolve, reject) => {\n fs.readFile(\n path,\n (typeof opts === 'object' ? opts : {}) as fs.ObjectEncodingOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function writeFile(\n path: string,\n data: string | Buffer,\n opts?: fs$writeOpts\n): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.writeFile(\n path,\n data,\n (opts || {}) as fs.WriteFileOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function appendFile(\n path: string,\n data: string | Buffer,\n opts?: fs$writeOpts\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n fs.appendFile(\n path,\n data,\n (typeof opts === 'object' ? opts : {}) as fs.WriteFileOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function unlink(path: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.unlink(path, createResolver(resolve, reject));\n });\n}\n", "import EventEmitter from 'events';\nimport type { FSWatcher } from 'fs';\n\nimport { Client } from 'fb-watchman';\n\nimport initialize from './initialize';\n\n/**\n * @private\n */\nclass Watcher extends EventEmitter {\n declare path: string;\n\n declare client: Client | FSWatcher;\n\n constructor(path: string, useWatchman: boolean = true) {\n super();\n // Watchers initialize asynchronously; `initialize` populates `this` and\n // resolves once the watchman/native watcher is wired up, so `new Watcher()`\n // is awaited by callers. TS can't type a Promise-returning constructor.\n return initialize(this, path, useWatchman) as unknown as Watcher;\n }\n\n destroy() {\n const { client } = this;\n\n if (client instanceof Client) {\n client.end();\n } else {\n client.close();\n }\n }\n}\n\nexport default Watcher;\n", "import { join as joinPath } from 'path';\nimport { watch as nativeWatch } from 'fs';\nimport type { FSWatcher } from 'fs';\n\nimport { Client } from 'fb-watchman';\n\nimport exec from '../../../utils/exec';\nimport tryCatch from '../../../utils/try-catch';\nimport isJSFile from '../utils/is-js-file';\nimport { freezeProps } from '../../freezeable';\n\nimport type Watcher from './index';\n\nconst SUBSCRIPTION_NAME = 'lumen-watcher';\n\n/**\n * @private\n */\nfunction fallback(instance: Watcher, path: string): FSWatcher {\n return nativeWatch(\n path,\n {\n recursive: true\n },\n (type, name) => {\n if (typeof name === 'string' && isJSFile(name)) {\n instance.emit('change', [{ name, type }]);\n }\n }\n );\n}\n\n/**\n * @private\n */\nfunction setupWatchmen(instance: Watcher, path: string): Promise<Client> {\n return new Promise((resolve, reject) => {\n const client = new Client();\n\n client.capabilityCheck({}, capabilityErr => {\n if (capabilityErr) {\n reject(capabilityErr);\n return;\n }\n\n client.command(\n ['watch-project', path],\n (watchErr, { watch, relative_path: relativePath } = {}) => {\n if (watchErr) {\n reject(watchErr);\n return;\n }\n\n client.command(['clock', watch], (clockErr, { clock: since }) => {\n if (clockErr) {\n reject(clockErr);\n return;\n }\n\n client.command(\n [\n 'subscribe',\n watch,\n SUBSCRIPTION_NAME,\n {\n since,\n relative_root: relativePath,\n\n fields: ['name', 'size', 'exists', 'type'],\n\n expression: ['allof', ['match', '*.js']]\n }\n ],\n subscribeErr => {\n if (subscribeErr) {\n reject(subscribeErr);\n return;\n }\n\n client.on('subscription', ({ files, subscription }) => {\n if (subscription === SUBSCRIPTION_NAME) {\n instance.emit('change', files);\n }\n });\n\n resolve(client);\n }\n );\n });\n }\n );\n });\n });\n}\n\n/**\n * @private\n */\nexport default async function initialize<T extends Watcher>(\n instance: T,\n path: string,\n useWatchman: boolean\n): Promise<T> {\n const appPath = joinPath(path, 'app');\n let client;\n\n if (useWatchman) {\n await tryCatch(async () => {\n await exec('which watchman');\n client = await setupWatchmen(instance, appPath);\n });\n }\n\n Object.assign(instance, {\n path: appPath,\n client: client || fallback(instance, appPath)\n });\n\n freezeProps(instance, true, 'path', 'client');\n\n return instance;\n}\n", "import K from './k';\n\n/**\n * A utility function used for wrapping async code that would otherwise need a\n * try-catch block.\n *\n * V8 deoptimizes functions when running into try-catch catch due to the\n * unpredictable nature of the code. The `tryCatch` utility function is a way\n * to \"have your cake and eat it too\". Since the inner function (`fn`) will not\n * become deoptimized by V8 for including a standard try-catch block, we don't\n * have to sacrifice as much perf for error handling expensive computations.\n *\n * The `tryCatch` utility is also very useful when you want to perform a noop\n * when an error is thrown as the catch argument (`rescue`) is optional unlike\n * a traditional try-catch block.\n *\n * @example\n * tryCatch(() => {\n * const n = Math.floor(Math.random() * 6);\n *\n * if (n >= 4) {\n * throw new Error('You lose!');\n * } else {\n * return Promise.resolve(n);\n * }\n * }, err => {\n * console.error(err);\n * }).then(luckyNumber => {\n * console.log(`Your lucky number is ${luckyNumber}.`);\n * });\n *\n * @private\n */\nexport default async function tryCatch<T>(\n fn: () => Promise<T>,\n rescue: (err: unknown) => unknown = K\n): Promise<T | undefined> {\n let result: T | undefined;\n\n try {\n result = await fn();\n } catch (err) {\n // `rescue` is a caller-supplied handler with no contract on its return\n // value; when it returns something meaningful it stands in for `fn`'s.\n result = (await rescue(err)) as T | undefined;\n }\n\n return result;\n}\n\n/**\n * A syncronous implementation of the `tryCatch` utility.\n *\n * @example\n * const luckyNumber = tryCatchSync(() => {\n * const n = Math.floor(Math.random() * 6);\n *\n * if (n >= 4) {\n * throw new Error('You lose!');\n * } else {\n * return n;\n * }\n * }, err => {\n * console.error(err);\n * });\n *\n * if (luckyNumber) {\n * console.log(`Your lucky number is ${luckyNumber}.`);\n * }\n *\n * @private\n */\nexport function tryCatchSync<T>(\n fn: () => T,\n rescue: (err: unknown) => unknown = K\n): T | undefined {\n let result: T | undefined;\n\n try {\n result = fn();\n } catch (err) {\n result = rescue(err) as T | undefined;\n }\n\n return result;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Adapts Node's error-first callbacks to Promise settlers; the resolved data\n * varies by fs operation (Stats, string[], Buffer, void), so it is `any` at\n * this adapter boundary.\n */\n\n/**\n * @private\n */\nexport default function createResolver(\n resolve: (data: any) => void,\n reject: (err: Error) => void\n): (err: Error | null, ...args: Array<any>) => void {\n return function fsResolver(err: Error | null, ...args: Array<any>) {\n const [data] = args;\n\n if (err) {\n reject(err);\n return;\n }\n\n resolve(args.length > 1 ? args : data);\n };\n}\n", "import type { Chain } from '../interfaces';\n\n/**\n * @private\n */\nexport default function chain<T>(source: T): Chain<T> {\n return {\n pipe<U>(handler: (value: T) => U): Chain<U> {\n return chain(handler(source));\n },\n\n value(): T {\n return source;\n },\n\n construct<U>(constructor: new (value: T) => U): Chain<U> {\n return chain(Reflect.construct(constructor, [source]) as U);\n }\n };\n}\n", "import { readdir } from '../../fs';\n\n/**\n * @private\n */\nexport default async function pendingMigrations(\n appPath: string,\n table: () => any // eslint-disable-line @typescript-eslint/no-explicit-any\n): Promise<Array<string>> {\n const migrations: Array<string> = await readdir(`${appPath}/db/migrate`);\n const versions: Array<string> = await table()\n .select()\n .then((data: Array<{ version: string }>) =>\n data.map(({ version }) => version)\n );\n\n return migrations.filter(\n migration => versions.indexOf(migration.replace(/^(\\d{16})-.+$/g, '$1')) < 0\n );\n}\n", "import { dasherize, singularize } from 'inflection';\n\nimport { compose } from '../../../utils/compose';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default compose(singularize, dasherize, underscore);\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The intermediate stages of a composed pipeline are genuinely untyped: only\n * the pipeline's input and output are knowable without full variadic typing,\n * which would cost far more than it buys for an internal helper. The `any`s\n * are confined to those intermediate positions \u2014 the exported signatures keep\n * precise `T` -> `U` types.\n */\n\n/**\n * A single stage of a composed pipeline.\n *\n * @private\n */\ntype Stage = (value: any) => any;\n\n/**\n * @private\n */\nexport function tap<T>(input: T): T {\n console.log(input);\n return input;\n}\n\n/**\n * @private\n */\nexport function compose<T, U>(\n main: (input: any) => U,\n ...etc: Stage[]\n): (input: T) => U {\n return input => main(etc.reduceRight<any>((value, fn) => fn(value), input));\n}\n\n/**\n * @private\n */\nexport function composeAsync<T, U>(\n main: (input: any) => Promise<U>,\n ...etc: Stage[]\n): (input: T | Promise<T>) => Promise<U> {\n return input =>\n etc\n .reduceRight<Promise<any>>(\n (value, fn) => Promise.resolve(value).then(fn),\n Promise.resolve(input)\n )\n .then(main);\n}\n", "import { underscore as _ } from 'inflection';\n\n/**\n * @private\n */\nexport default function underscore(\n source: string = '',\n upper: boolean = false\n): string {\n return _(source, upper).replace(/-/g, '_');\n}\n", "import { pluralize } from 'inflection';\n\nimport Query from '../query';\nimport ChangeSet from '../change-set';\nimport { updateRelationship } from '../relationship';\nimport {\n createTransactionResultProxy,\n createStaticTransactionProxy,\n createInstanceTransactionProxy\n} from '../transaction';\nimport pick from '../../../utils/pick';\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\nimport { map as diffMap } from '../../../utils/diff';\nimport mapToObject from '../../../utils/map-to-object';\nimport type Logger from '../../logger';\nimport type Database from '../../database';\nimport type Serializer from '../../serializer';\n\nimport type { Relationship$opts } from '../relationship';\nimport type { ModelClass, Database$column } from '../interfaces';\nimport type { Transaction$ResultProxy } from '../transaction';\n\nimport { create, update, destroy, createRunner } from './utils/persistence';\nimport initializeClass from './initialize-class';\nimport validate from './utils/validate';\nimport runHooks from './utils/run-hooks';\nimport type { Model$Hooks } from './interfaces';\n\n/**\n * @class Model\n * @public\n */\nclass Model {\n // The instance's static side is a `ModelClass`; declaring it lets instance\n // code reach the model class's statics (`this.constructor.relationshipFor`,\n // `.serializer`, `.primaryKey`, ...) with proper types.\n declare ['constructor']: ModelClass;\n\n /**\n * The name of the corresponding database table for a `Model` instance's\n * constructor.\n *\n * @property tableName\n * @type {String}\n * @public\n */\n declare tableName: string;\n\n /**\n * The canonical name of a `Model`'s constructor.\n *\n * @property modelName\n * @type {String}\n * @public\n */\n declare modelName: string;\n\n /**\n * The name of the API resource a `Model` instance's constructor represents.\n *\n * @property resourceName\n * @type {String}\n * @public\n */\n declare resourceName: string;\n\n /**\n * A timestamp representing when the Model instance was created.\n *\n * @property createdAt\n * @type {Date}\n * @public\n */\n declare createdAt: Date;\n\n /**\n * A timestamp representing the last time the Model instance was updated.\n *\n * @property updatedAt\n * @type {Date}\n * @public\n */\n declare updatedAt: Date;\n\n /**\n * @property initialized\n * @type {Boolean}\n * @private\n */\n declare initialized: boolean;\n\n /**\n * @property rawColumnData\n * @type {Object}\n * @private\n */\n declare rawColumnData: Record<string, unknown>;\n\n /**\n * @property isModelInstance\n * @type {Boolean}\n * @private\n */\n declare isModelInstance: boolean;\n\n /**\n * @property prevAssociations\n * @type {Set}\n * @private\n */\n declare prevAssociations: Set<Model>;\n\n /**\n * @property changeSets\n * @type {Array}\n * @private\n */\n declare changeSets: Array<ChangeSet>;\n\n /**\n * An object where you declare `hasOne` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class User extends Model {\n * static hasOne = {\n * profile: {\n * inverse: 'user'\n * // The line above lets Lumen know that this relationship is accessible\n * // on profile instances via `profile.user`.\n * }\n * };\n * }\n *\n * class Profile extends Model {\n * static belongsTo = {\n * user: {\n * inverse: 'profile'\n * // The line above lets Lumen know that this relationship is accessible\n * // on user instances via `user.profile`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Profile extends Model {\n * static belongsTo = {\n * owner: {\n * inverse: 'profile',\n * model: 'user'\n * // The line above lets Lumen know that this is a relationship with the\n * // `User` model and not a non-existent `Owner` model.\n * }\n * };\n * }\n * ```\n *\n * @property hasOne\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hasOne: Record<string, unknown>;\n\n /**\n * An object where you declare `hasMany` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class Author extends Model {\n * static hasMany = {\n * books: {\n * inverse: 'author'\n * // The line above lets Lumen know that this relationship is accessible\n * // on book instances via `book.author`.\n * }\n * };\n * }\n *\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books'\n * // The line above lets Lumen know that this relationship is accessible\n * // on author instances via `author.books`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Author extends Model {\n * static hasMany = {\n * publications: {\n * inverse: 'author',\n * model: 'book'\n * // The line above lets Lumen know that this is a relationship with the\n * // `Book` model and not a non-existent `Publication` model.\n * }\n * };\n * }\n * ```\n *\n * ##### Many to Many\n *\n * In the examples above there is only one owner of relationship. Sometimes we\n * need to express a many to many relationship. Typically in relational\n * databases, this is done with a join table. When declaring a many to many\n * relationship that uses a join table, you must specify the join model.\n *\n * ```javascript\n * class Categorization extends Model {\n * static belongsTo = {\n * tag: {\n * inverse: 'categorization'\n * },\n * post: {\n * inverse: 'categorization'\n * }\n * }\n * }\n *\n * class Tag extends Model {\n * static hasMany = {\n * posts: {\n * inverse: 'tags',\n * through: 'categorizations'\n * }\n * };\n * }\n *\n * class Post extends Model {\n * static hasMany = {\n * tags: {\n * inverse: 'posts',\n * through: 'categorizations'\n * }\n * };\n * }\n * ```\n *\n * @property hasMany\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hasMany: Record<string, unknown>;\n\n /**\n * An object where you declare `belongsTo` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books'\n * // The line above lets Lumen know that this relationship is accessible\n * // on author instances via `author.books`.\n * }\n * };\n * }\n *\n * class Author extends Model {\n * static hasMany = {\n * books: {\n * inverse: 'book'\n * // The line above lets Lumen know that this relationship is accessible\n * // on book instances via `book.author`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * writer: {\n * inverse: 'books',\n * model: 'author'\n * // The line above lets Lumen know that this is a relationship with the\n * // `Author` model and not a non-existent `Writer` model.\n * }\n * };\n * }\n * ```\n *\n * Sometimes our foreign keys in the database do not follow conventions (i.e\n * `author_id`). You have the option to manually specify foreign keys when a\n * situation like this occurs.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books',\n * foreignKey: 'SoMe_UnCoNvEnTiOnAl_FoReIgN_KeY'\n * }\n * };\n * }\n * ```\n *\n * @property belongsTo\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static belongsTo: Record<string, unknown>;\n\n /**\n * An object where you declare validations for an instance's attributes.\n *\n * Before a model instance is saved, validations declared in this block are\n * executed. To declare a validation for a model attribute, simply add the\n * attribute name as a key to the validates object. The value for the\n * attribute key should be a function that takes a single argument (the value\n * to validate against) and return a boolean value represent whether or not\n * the attribute is valid.\n *\n * ```javascript\n * class User extends Model {\n * static validates {\n * username: value => /^\\w{2,30}$/.test(value),\n * password: value => String(value).length >= 8\n * };\n * }\n * ```\n *\n * In the spirit of have a small api surface area, Lumen provides no validation\n * helper functions. You can roll your own helpers with or use one of the many\n * excellent validation libraries like [validator](https://goo.gl/LWaHBB).\n *\n * ```javascript\n * import { isEmail } from 'validator';\n *\n * class User extends Model {\n * static validates {\n * email: isEmail\n * };\n * }\n * ```\n *\n * @property validates\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static validates: Record<string, unknown>;\n\n /**\n * An object where you declare custom query scopes for the model.\n *\n * Scopes allow you to DRY up query logic by chaining custom set's of queries\n * with built-in query method such as `where`, `not`, `page`, etc. To declare\n * a scope, add it as a method on the scopes object.\n *\n * ```javascript\n * class Post extends Model {\n * static hasMany = {\n * tags: {\n * inverse: 'posts'\n * },\n * comments: {\n * inverse: 'post'\n * }\n * };\n *\n * static belongsTo = {\n * user: {\n * inverse: 'posts'\n * }\n * };\n *\n * static scopes = {\n * isPublic() {\n * return this.where({\n * isPublic: true\n * });\n * },\n *\n * byUser(user) {\n * return this.where({\n * userId: user.id\n * });\n * },\n *\n * withEverything() {\n * return this.includes('tags', 'user', 'comments');\n * }\n * };\n * }\n * ```\n *\n * Given the scopes declared in the example above, here is how we could return\n * all the public posts with relationships eager loaded for the user with the\n * id of 1.\n *\n * ```javascript\n * const user = await User.find(1);\n *\n * return Post\n * .byUser(user)\n * .isPublic()\n * .withEverything();\n * ```\n *\n * Since scopes can be chained with built-in query methods, we can easily\n * paginate this collection.\n *\n * ```javascript\n * const user = await User.find(1);\n *\n * return Post\n * .byUser(user)\n * .isPublic()\n * .withEverything()\n * .page(1);\n * ```\n *\n * @property scopes\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static scopes: Record<string, unknown>;\n\n /**\n * An object where you declare hooks to execute at certain times in a model\n * instance's lifecycle.\n *\n * There are many lifecycle hooks that are executed through out a model\n * instance's lifetime. The have many use cases such as sanitization of\n * attributes, creating dependent relationships, hashing passwords, and much\n * more.\n *\n * ##### Execution Order\n *\n * When creating a record.\n *\n * 1. beforeValidation\n * 2. afterValidation\n * 3. beforeCreate\n * 4. beforeSave\n * 5. afterCreate\n * 6. afterSave\n *\n * When updating a record.\n *\n * 1. beforeValidation\n * 2. afterValidation\n * 3. beforeUpdate\n * 4. beforeSave\n * 5. afterUpdate\n * 6. afterSave\n *\n * When deleting a record.\n *\n * 1. beforeDestroy\n * 2. afterDestroy\n *\n * ##### Anatomy\n *\n * Hooks are async functions that are called with two arguments. The first\n * argument is the record that the hook applies to and the second argument is\n * the transaction object relevant to the method from which the hook was\n * called.\n *\n * The only time you will need to use the transaction object is if you are\n * creating, updating, or deleting different record(s) within the hook. Using\n * the transaction object when modifying the database in a hook ensures that\n * any modifications made within the hook will be rolled back if the function\n * that initiated the transaction fails.\n *\n * ```javascript\n * import Notification from 'app/models/notification';\n *\n * class Comment extends Model {\n * static belongsTo = {\n * post: {\n * inverse: 'comments'\n * },\n * user: {\n * inverse: 'comments'\n * }\n * };\n *\n * static hooks = {\n * async afterCreate(comment, trx) {\n * let [post, commenter] = await Promise.all([\n * comment.post,\n * comment.user\n * ]);\n *\n * const commentee = await post.user;\n *\n * post = post.title;\n * commenter = commenter.name;\n *\n * // Calling .transacting(trx) prevents the commentee from getting a\n * // notification if the comment fails to be persisted in the database.\n * await Notification\n * .transacting(trx)\n * .create({\n * user: commentee,\n * message: `${commenter} commented on your post \"${post}\"`\n * });\n * },\n *\n * async afterSave() {\n * // Good thing you called transacting in afterCreate.\n * throw new Error('Fatal Error');\n * }\n * };\n * }\n * ```\n *\n * @property hooks\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hooks: Model$Hooks;\n\n /**\n * A reference to the application's logger.\n *\n * @property logger\n * @type {Logger}\n * @static\n * @public\n */\n declare static logger: Logger;\n\n /**\n * The name of the corresponding database table for the model.\n *\n * @property tableName\n * @type {String}\n * @static\n * @public\n */\n declare static tableName: string;\n\n /**\n * The canonical name of the model.\n *\n * @property modelName\n * @type {String}\n * @static\n * @public\n */\n declare static modelName: string;\n\n /**\n * The name of the resource the model represents.\n *\n * @property resourceName\n * @type {String}\n * @static\n * @public\n */\n declare static resourceName: string;\n\n /**\n * The column name to use for a model's primary key.\n *\n * @property primaryKey\n * @type {String}\n * @default 'id'\n * @static\n * @public\n */\n static primaryKey: string = 'id';\n\n /**\n * @property table\n * @type {Function}\n * @static\n * @private\n */\n declare static table: () => unknown;\n\n /**\n * @property store\n * @type {Database}\n * @static\n * @private\n */\n declare static store: Database;\n\n /**\n * @property initialized\n * @type {Boolean}\n * @static\n * @private\n */\n declare static initialized: boolean;\n\n /**\n * @property serializer\n * @type {Serializer}\n * @static\n * @private\n */\n declare static serializer: Serializer<Model>;\n\n /**\n * @property attributes\n * @type {Object}\n * @static\n * @private\n */\n declare static attributes: Record<string, unknown>;\n\n /**\n * @property attributeNames\n * @type {Array}\n * @static\n * @private\n */\n declare static attributeNames: Array<string>;\n\n /**\n * @property relationships\n * @type {Object}\n * @static\n * @private\n */\n declare static relationships: Record<string, Relationship$opts>;\n\n /**\n * @property relationshipNames\n * @type {Array}\n * @static\n * @private\n */\n declare static relationshipNames: Array<string>;\n\n constructor(attrs: Record<string, unknown> = {}, initialize: boolean = true) {\n Object.defineProperties(this, {\n changeSets: {\n value: [new ChangeSet()],\n writable: false,\n enumerable: false,\n configurable: false\n },\n rawColumnData: {\n value: attrs,\n writable: false,\n enumerable: false,\n configurable: false\n },\n prevAssociations: {\n value: new Set(),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n const {\n constructor: { attributeNames, relationshipNames }\n } = this;\n const props = pick(attrs, ...attributeNames.concat(relationshipNames));\n\n Object.assign(this, props);\n\n if (initialize) {\n Reflect.defineProperty(this, 'initialized', {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n return this;\n }\n\n /**\n * Indicates if the model is new.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * let post = new Post({\n * body: '',\n * title: 'New Post',\n * isPublic: false\n * });\n *\n * post.isNew;\n * // => true\n *\n * Post.create({\n * body: '',\n * title: 'New Post',\n * isPublic: false\n * }).then(post => {\n * post.isNew;\n * // => false;\n * });\n * ```\n *\n * @property isNew\n * @type {Boolean}\n * @public\n */\n get isNew(): boolean {\n return !this.persistedChangeSet;\n }\n\n /**\n * Indicates if the model is dirty.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * Post\n * .find(1)\n * .then(post => {\n * post.isDirty;\n * // => false\n *\n * post.isPublic = true;\n *\n * post.isDirty;\n * // => true\n *\n * return post.save();\n * })\n * .then(post => {\n * post.isDirty;\n * // => false\n * });\n * ```\n *\n * @property isDirty\n * @type {Boolean}\n * @public\n */\n get isDirty(): boolean {\n return Boolean(this.dirtyProperties.size);\n }\n\n /**\n * Indicates if the model is persisted.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * Post\n * .find(1)\n * .then(post => {\n * post.persisted;\n * // => true\n *\n * post.isPublic = true;\n *\n * post.persisted;\n * // => false\n *\n * return post.save();\n * })\n * .then(post => {\n * post.persisted;\n * // => true\n * });\n * ```\n *\n * @property persisted\n * @type {Boolean}\n * @public\n */\n get persisted(): boolean {\n return !this.isNew && !this.isDirty;\n }\n\n /**\n * @property dirtyAttributes\n * @type {Map}\n * @public\n */\n get dirtyAttributes(): Map<string, unknown> {\n const {\n dirtyProperties,\n constructor: { relationshipNames }\n } = this;\n\n Array.from(dirtyProperties.keys()).forEach(key => {\n if (relationshipNames.indexOf(key) >= 0) {\n dirtyProperties.delete(key);\n }\n });\n\n return dirtyProperties;\n }\n\n /**\n * @property dirtyRelationships\n * @type {Map}\n * @public\n */\n get dirtyRelationships(): Map<string, unknown> {\n const {\n dirtyProperties,\n constructor: { attributeNames }\n } = this;\n\n Array.from(dirtyProperties.keys()).forEach(key => {\n if (attributeNames.indexOf(key) >= 0) {\n dirtyProperties.delete(key);\n }\n });\n\n return dirtyProperties;\n }\n\n /**\n * @property dirtyProperties\n * @type {Map}\n * @private\n */\n get dirtyProperties(): Map<string, unknown> {\n const { currentChangeSet, persistedChangeSet } = this;\n\n if (!persistedChangeSet) {\n return new Map(currentChangeSet);\n }\n\n return diffMap(persistedChangeSet, currentChangeSet);\n }\n\n /**\n * @property currentChangeSet\n * @type {ChangeSet}\n * @private\n */\n get currentChangeSet(): ChangeSet {\n return this.changeSets[0];\n }\n\n /**\n * @property currentChangeSet\n * @type {void | ChangeSet}\n * @private\n */\n get persistedChangeSet(): ChangeSet | undefined {\n return this.changeSets.find(({ isPersisted }) => isPersisted);\n }\n\n /**\n * Specify the transaction object to use for following save, update, or\n * destroy method calls.\n *\n * When you call a method like update or destroy, lumen will create a\n * transaction and wrap the internals of the method and other downstream\n * method calls like model hooks within. In some edge cases it can be more\n * useful to manually initiate the transaction. Bulk updating or destroying\n * are good examples of this. When you manually begin a transaction, you can\n * call this method to specify the transaction object that you would like to\n * use for subsequent mutation methods (save, update, destroy, etc.) so lumen\n * knows not to automatically begin a new transaction if/when a mutation\n * method is called.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * // This call to update uses the transaction that lumen will initiate.\n * await post.update({\n * // updates to post...\n * });\n *\n * await post.transaction(trx => {\n * // This call to update uses the transaction that we created with the\n * // call to the transaction method.\n * return post\n * .transacting(trx)\n * .update({\n * // updates to post...\n * });\n * });\n * ```\n *\n * @method transacting\n * @param {Transaction} transaction - A transaction object to forward to save,\n * update, or destroy method calls.\n * @return {Model} - Returns a proxied version of `this` that delagates the\n * transaction param to subsquent save, update, or destroy method calls.\n * @public\n */\n transacting(trx: unknown): this {\n return createInstanceTransactionProxy(this, trx);\n }\n\n /**\n * Manually begin a new transaction.\n *\n * Most of the time, you don't need to start transactions yourself. However,\n * if you need to do something like implement bulk updating of related records\n * the transaction method can be useful.\n *\n * ```javascript\n * const post = await Post.first().include('user');\n * const user = await post.user;\n *\n * await post.transaction(trx => {\n * return Promise.all([\n * post.transacting(trx).update({\n * // updates to post...\n * }),\n * user.transacting(trx).update({\n * // updates to user...\n * })\n * ]);\n * });\n * ```\n *\n * @method transaction\n * @param {Function} fn - The function used for executing the tranasction.\n * This function is called with a new transaction object as it's only argument\n * and is expected to return a promise.\n * @return {Promise} Resolves with the resolved value of the fn param.\n * @public\n */\n transaction<T>(fn: (...args: Array<unknown>) => Promise<T>): Promise<T> {\n return this.constructor.transaction(fn);\n }\n\n /**\n * Persist any unsaved changes to the database.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * console.log(post.title, post.isDirty);\n * // => 'New Post' false\n *\n * post.title = 'How to Save a Lumen Model';\n *\n * console.log(post.title, post.isDirty);\n * // => 'How to Update a Lumen Model' true\n *\n * await post.save();\n *\n * console.log(post.title, post.isDirty);\n * // => 'How to Save a Lumen Model' false\n * ```\n *\n * @method save\n * @return {Promise} Resolves with `this`.\n * @public\n */\n save(transaction?: unknown): Promise<Transaction$ResultProxy<this, boolean>> {\n return this.update(mapToObject(this.dirtyProperties), transaction);\n }\n\n /**\n * Assign values to the instance and persist any changes to the database.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * console.log(post.title, post.isPublic, post.isDirty);\n * // => 'New Post' false false\n *\n * await post.update({\n * title: 'How to Update a Lumen Model',\n * isPublic: true\n * });\n *\n * console.log(post.title, post.isPublic, post.isDirty);\n * // => 'How to Update a Lumen Model' true false\n * ```\n *\n * @method update\n * @param {Object} properties - An object containing key, value pairs of the\n * attributes and/or relationships you would like to assign to the instance.\n * @return {Promise} Resolves with `this`.\n * @public\n */\n update(\n props: Record<string, unknown> = {},\n transaction?: unknown\n ): Promise<Transaction$ResultProxy<this, boolean>> {\n const run = async (trx: unknown) => {\n const {\n constructor: { hooks, logger }\n } = this;\n let statements: Array<unknown> = [];\n let promise: Array<unknown> | Promise<Array<unknown>> = Promise.resolve(\n []\n );\n let hadDirtyAttrs = false;\n let hadDirtyAssoc = false;\n\n const associations = Object.keys(props).filter(key =>\n Boolean(this.constructor.relationshipFor(key))\n );\n\n Object.assign(this, props);\n\n if (associations.length) {\n hadDirtyAssoc = true;\n statements = associations.reduce<Array<unknown>>(\n (arr, key) => [...arr, ...updateRelationship(this, key, trx)],\n []\n );\n }\n\n if (this.isDirty) {\n hadDirtyAttrs = true;\n\n await runHooks(this, trx, hooks.beforeValidation);\n\n validate(this);\n\n await runHooks(\n this,\n trx,\n hooks.afterValidation,\n hooks.beforeUpdate,\n hooks.beforeSave\n );\n\n promise = update(this, trx);\n }\n\n await createRunner(logger, statements)(await promise);\n\n this.prevAssociations.clear();\n this.currentChangeSet.persist(this.changeSets);\n\n if (hadDirtyAttrs) {\n await runHooks(this, trx, hooks.afterUpdate, hooks.afterSave);\n }\n\n return createTransactionResultProxy(this, hadDirtyAttrs || hadDirtyAssoc);\n };\n\n if (transaction) {\n return run(transaction);\n }\n\n return this.transaction(run);\n }\n\n /**\n * Permanently delete the instance from the database.\n *\n * @method destroy\n * @return {Promise} Resolves with `this`.\n * @public\n */\n destroy(transaction?: unknown): Promise<Transaction$ResultProxy<this, true>> {\n const run = async (trx: unknown) => {\n const {\n constructor: { hooks, logger }\n } = this;\n\n await runHooks(this, trx, hooks.beforeDestroy);\n await createRunner(logger, [])(await destroy(this, trx));\n await runHooks(this, trx, hooks.afterDestroy);\n\n return createTransactionResultProxy(this, true);\n };\n\n if (transaction) {\n return run(transaction);\n }\n\n return this.transaction(run);\n }\n\n /**\n * Reload the record from the database.\n *\n * @method reload\n * @return {Promise} Resolves with `this`.\n * @public\n */\n reload(): Promise<Model> {\n if (this.isNew) {\n return Promise.resolve(this);\n }\n\n return this.constructor.find(this.getPrimaryKey());\n }\n\n /**\n * Rollback attributes and relationships to the last known persisted set of\n * values.\n *\n * @method rollback\n * @return {Model} Returns `this`.\n * @public\n */\n rollback(): this {\n const { persistedChangeSet } = this;\n\n if (persistedChangeSet && !this.currentChangeSet.isPersisted) {\n persistedChangeSet.applyTo(this).persist(this.changeSets);\n }\n\n return this;\n }\n\n /**\n * @method getAttributes\n * @param {String} [...keys] - The keys of the properties to return.\n * @return {Object} An object containing keys that were passed in as agruments\n * and their associated values.\n * @private\n */\n getAttributes(...keys: Array<string>): Record<string, unknown> {\n return pick(this, ...keys);\n }\n\n /**\n * @method getPrimaryKey\n * @return {Number} The value of the primary key for the instance.\n * @private\n */\n getPrimaryKey(): number {\n return Reflect.get(this, this.constructor.primaryKey) as number;\n }\n\n /**\n * Create and persist a new instance of the model.\n *\n * @method create\n * @param {Object} properties - An object containing key, value pairs of the\n * attributes and/or relationships you would like to assign to the instance.\n * @return {Promise} Resolves with the newly created model.\n * @static\n * @public\n */\n static create(\n props: Record<string, unknown> = {},\n transaction?: unknown\n ): Promise<Transaction$ResultProxy<Model, true>> {\n const run = async (trx: unknown) => {\n const { hooks, logger, primaryKey } = this;\n const instance = Reflect.construct(this, [props, false]);\n\n await runHooks(instance, trx, hooks.beforeValidation);\n\n validate(instance);\n\n await runHooks(\n instance,\n trx,\n hooks.afterValidation,\n hooks.beforeCreate,\n hooks.beforeSave\n );\n\n const runner = createRunner(logger, []);\n const [[firstRow]] = await runner(await create(instance, trx));\n\n // `insert().returning(pk)` yields a scalar `[1]` on knex 0.16 but an\n // object `[{ id: 1 }]` on knex >= 1 (once `RETURNING` reached sqlite).\n // Normalize both so the primary key stays a scalar.\n const primaryKeyValue =\n firstRow !== null && typeof firstRow === 'object'\n ? Reflect.get(firstRow, primaryKey)\n : firstRow;\n\n Reflect.set(instance, primaryKey, primaryKeyValue);\n Reflect.set(instance.rawColumnData, primaryKey, primaryKeyValue);\n\n let statements: Array<unknown> = [];\n const associations = Object.keys(props).filter(key =>\n Boolean(this.relationshipFor(key))\n );\n\n if (associations.length) {\n statements = associations.reduce<Array<unknown>>(\n (arr, key) => [...arr, ...updateRelationship(instance, key, trx)],\n []\n );\n }\n\n await Promise.all(statements);\n\n Reflect.defineProperty(instance, 'initialized', {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n instance.currentChangeSet.persist(instance.changeSets);\n\n await runHooks(instance, trx, hooks.afterCreate, hooks.afterSave);\n\n return createTransactionResultProxy(instance, true);\n };\n\n if (transaction) {\n return run(transaction);\n }\n\n return this.transaction(run);\n }\n\n /**\n * Specify the transaction object to use for following save, update, or\n * destroy method calls.\n *\n * When you call a method like update or destroy, lumen will create a\n * transaction and wrap the internals of the method and other downstream\n * method calls like model hooks within. In some edge cases it can be more\n * useful to manually initiate the transaction. Bulk updating or destroying\n * are good examples of this. When you manually begin a transaction, you can\n * call this method to specify the transaction object that you would like to\n * use for calls to the static create method so lumen knows not to automatically\n * begin a new transaction if/when the static create method is called.\n *\n * ```javascript\n * // This call to create uses the transaction that lumen will initiate.\n * await Post.create();\n *\n * await Post.transaction(trx => {\n * // This call to create uses the transaction that we created with the\n * // call to the transaction method.\n * return Post\n * .transacting(trx)\n * .create();\n * });\n * ```\n *\n * @method transacting\n * @param {Transaction} transaction - A transaction object to forward to\n * create method calls.\n * @return {Model} - Returns a proxied version of `this` that delagates the\n * transaction param to subsquent create method calls.\n * @static\n * @public\n */\n static transacting(trx: unknown): ModelClass {\n return createStaticTransactionProxy(this, trx);\n }\n\n /**\n * Manually begin a new transaction.\n *\n * Most of the time, you don't need to start transactions yourself. However,\n * the transaction method can be useful if you need to do something like\n * bulk creating records.\n *\n * ```javascript\n * await Post.transaction(trx => {\n * return Promise.all([\n * Post.transacting(trx).create({\n * // ...props\n * }),\n * Post.transacting(trx).create({\n * // ...props\n * })\n * ]);\n * });\n * ```\n *\n * @method transaction\n * @param {Function} fn - The function used for executing the tranasction.\n * This function is called with a new transaction object as it's only argument\n * and is expected to return a promise.\n * @return {Promise} Resolves with the resolved value of the fn param.\n * @static\n * @public\n */\n static transaction<T>(\n fn: (...args: Array<unknown>) => Promise<T>\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const {\n store: { connection }\n } = this;\n let result: T;\n\n connection\n .transaction(trx => {\n fn(trx)\n .then(data => {\n result = data;\n return trx.commit();\n })\n .catch(trx.rollback);\n })\n .then(() => {\n resolve(result);\n })\n .catch(err => {\n reject(err);\n });\n });\n }\n\n static all(): Query<Array<Model>> {\n return new Query(this).all();\n }\n\n static find(primaryKey: unknown): Query<Model> {\n return new Query(this).find(primaryKey);\n }\n\n static page(num: number): Query<Array<Model>> {\n return new Query(this).page(num);\n }\n\n static limit(amount: number): Query<Array<Model>> {\n return new Query(this).limit(amount);\n }\n\n static offset(amount: number): Query<Array<Model>> {\n return new Query(this).offset(amount);\n }\n\n static count(): Query<number> {\n return new Query(this).count();\n }\n\n static order(attr: string, direction?: string): Query<Array<Model>> {\n return new Query(this).order(attr, direction);\n }\n\n static where(conditions: Record<string, unknown>): Query<Array<Model>> {\n return new Query(this).where(conditions);\n }\n\n static whereBetween(\n conditions: Record<string, unknown>\n ): Query<Array<Model>> {\n return new Query(this).whereBetween(conditions);\n }\n\n static whereRaw(\n query: string,\n bindings: Array<unknown> = []\n ): Query<Array<Model>> {\n return new Query(this).whereRaw(query, bindings);\n }\n\n static not(conditions: Record<string, unknown>): Query<Array<Model>> {\n return new Query(this).not(conditions);\n }\n\n static first(): Query<Model> {\n return new Query(this).first();\n }\n\n static last(): Query<Model> {\n return new Query(this).last();\n }\n\n static select(...params: Array<string>): Query<Array<Model>> {\n return new Query(this).select(...params);\n }\n\n static distinct(...params: Array<string>): Query<Array<Model>> {\n return new Query(this).distinct(...params);\n }\n\n static include(\n ...relationships: Array<string | Record<string, unknown>>\n ): Query<Array<Model>> {\n return new Query(this).include(...relationships);\n }\n\n static unscope(...scopes: Array<string>): Query<Array<Model>> {\n return new Query(this).unscope(...scopes);\n }\n\n /**\n * Check if a model has a scope.\n *\n * @method hasScope\n * @param {String} name - The name of the scope to look for.\n * @return {Boolean}\n * @static\n * @public\n */\n static hasScope(name: string): boolean {\n return Boolean(Reflect.get(this.scopes, name));\n }\n\n /**\n * Check if a value is an instance of a model.\n *\n * @method isInstance\n * @param {any} value - The value in question.\n * @return {Boolean}\n * @static\n * @public\n */\n static isInstance(value: unknown): boolean {\n return value instanceof this;\n }\n\n /**\n * Bind the model's connection to the database and get inferred data from the\n * schema upon application boot.\n *\n * @method initialize\n * @param {Database} store - A reference of the applications database\n * instance.\n * @param {Table} table - A function that returns a knex query builder bound\n * to the model's table name.\n * @return {Promise} Resolves with the model class.\n * @static\n * @private\n */\n static initialize(\n store: Database,\n table: () => unknown\n ): Promise<ModelClass> {\n if (this.initialized) {\n return Promise.resolve(this);\n }\n\n if (!this.tableName) {\n const getTableName = compose(pluralize, underscore);\n const tableName = getTableName(this.name);\n\n Reflect.defineProperty(this, 'tableName', {\n value: tableName,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n Reflect.defineProperty(this.prototype, 'tableName', {\n value: tableName,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n return initializeClass({\n store,\n table,\n model: this\n });\n }\n\n /**\n * @method columnFor\n * @param {String} key - The respective attribute name of the column.\n * @return {void | Object} An object containing metadata about the column if a\n * match is found.\n * @static\n * @private\n */\n static columnFor(key: string): Database$column | undefined {\n return Reflect.get(this.attributes, key) as Database$column | undefined;\n }\n\n /**\n * @method columnNameFor\n * @param {String} key - The respective attribute name of the column.\n * @return {void | String} The name of the column in the database if a match\n * is found.\n * @static\n * @private\n */\n static columnNameFor(key: string): string | undefined {\n const column = this.columnFor(key);\n\n return column ? column.columnName : undefined;\n }\n\n /**\n * @method relationshipFor\n * @param {String} key - The name of the relationship to match against.\n * @return {void | Object} An object containing relationship metadata if a\n * match is found.\n * @static\n * @private\n */\n static relationshipFor(key: string): Relationship$opts | undefined {\n return Reflect.get(this.relationships, key);\n }\n}\n\nexport default Model;\nexport type { Model$Hook, Model$Hooks } from './interfaces';\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `Query` is the chainable query builder. Its snapshot tuples (method name +\n * arbitrary Knex arguments), where/include condition objects, and the values it\n * ultimately resolves are genuinely dynamic; the original Flow typed them\n * `any`/`Object` for the same reason. The generic `T` still types what a query\n * resolves to for callers.\n */\nimport { camelize } from 'inflection';\n\nimport entries from '../../../utils/entries';\nimport uniq from '../../../utils/uniq';\nimport type { ModelClass } from '../interfaces';\n\nimport scopesFor from './utils/scopes-for';\nimport formatSelect from './utils/format-select';\nimport { runQuery, createRunner } from './runner';\n\n/**\n * @class Query\n * @extends Promise\n * @private\n */\nclass Query<T = any> extends Promise<T> {\n declare model: ModelClass;\n\n declare isFind: boolean;\n\n declare snapshots: Array<Array<any>>;\n\n declare collection: boolean;\n\n declare shouldCount: boolean;\n\n declare relationships: Record<string, any>;\n\n constructor(model: ModelClass) {\n let resolve;\n let reject;\n\n super((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n createRunner(this, {\n resolve,\n reject\n });\n\n Object.defineProperties(this, {\n model: {\n value: model,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n collection: {\n value: true,\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n snapshots: {\n value: [],\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n shouldCount: {\n value: false,\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n relationships: {\n value: {},\n writable: true,\n enumerable: false,\n configurable: false\n }\n });\n\n Object.defineProperties(this, scopesFor(this));\n }\n\n static override get [Symbol.species]() {\n return Promise;\n }\n\n all(): this {\n return this;\n }\n\n not(conditions: Record<string, any> = {}): this {\n return this.where(conditions, true);\n }\n\n find(primaryKey: any): this {\n Object.assign(this, {\n isFind: true,\n collection: false\n });\n\n this.where({\n [this.model.primaryKey]: primaryKey\n });\n\n if (!this.shouldCount) {\n this.limit(1);\n }\n\n return this;\n }\n\n page(num?: number): this {\n if (this.shouldCount) {\n return this;\n }\n\n let limit: any = this.snapshots.find(([name]) => name === 'limit');\n\n if (limit) {\n [, limit] = limit;\n }\n\n if (typeof limit !== 'number') {\n limit = 25;\n }\n\n this.limit(limit);\n\n return this.offset(Math.max(parseInt(String(num), 10) - 1, 0) * limit);\n }\n\n limit(amount?: number): this {\n if (!this.shouldCount) {\n this.snapshots.push(['limit', amount]);\n }\n\n return this;\n }\n\n order(attr: string, direction: string = 'ASC'): this {\n if (!this.shouldCount) {\n const columnName = this.model.columnNameFor(attr);\n\n if (columnName) {\n this.snapshots = this.snapshots\n .filter(([method]) => method !== 'orderByRaw')\n .concat([\n [\n 'orderByRaw',\n uniq([columnName, this.model.primaryKey])\n .map(key => `${this.model.tableName}.${key} ${direction}`)\n .join(', ')\n ]\n ]);\n }\n }\n\n return this;\n }\n\n where(conditions: Record<string, any> = {}, not: boolean = false): this {\n const {\n model: { tableName }\n } = this;\n\n const where = entries(conditions).reduce<Record<string, any>>(\n (obj, condition) => {\n let [key, value] = condition;\n const columnName = this.model.columnNameFor(key);\n\n if (columnName) {\n key = `${tableName}.${columnName}`;\n\n if (typeof value === 'undefined') {\n value = null;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 1) {\n return {\n ...obj,\n [key]: value[0]\n };\n }\n\n this.snapshots.push([not ? 'whereNotIn' : 'whereIn', [key, value]]);\n } else if (value === null) {\n this.snapshots.push([not ? 'whereNotNull' : 'whereNull', [key]]);\n } else {\n return {\n ...obj,\n [key]: value\n };\n }\n }\n\n return obj;\n },\n {}\n );\n\n if (Object.keys(where).length) {\n this.snapshots.push([not ? 'whereNot' : 'where', where]);\n }\n\n return this;\n }\n\n whereBetween(conditions: Record<string, any>, not: boolean = false): this {\n const {\n model: { tableName }\n } = this;\n\n entries(conditions).forEach(condition => {\n let [key] = condition;\n const [, value] = condition;\n const columnName = this.model.columnNameFor(key);\n\n if (columnName) {\n key = `${tableName}.${columnName}`;\n\n if (Array.isArray(value)) {\n this.snapshots.push([\n `where${not ? 'NotBetween' : 'Between'}`,\n [key, value]\n ]);\n }\n }\n });\n\n return this;\n }\n\n whereRaw(query: string, bindings: Array<any> = []): this {\n this.snapshots.push(['whereRaw', [query, bindings]]);\n return this;\n }\n\n first(): this {\n if (!this.shouldCount) {\n const willSort = this.snapshots.some(\n ([method]) => method === 'orderByRaw'\n );\n\n this.collection = false;\n\n if (!willSort) {\n this.order(this.model.primaryKey, 'ASC');\n }\n\n this.limit(1);\n }\n\n return this;\n }\n\n last(): this {\n if (!this.shouldCount) {\n const willSort = this.snapshots.some(\n ([method]) => method === 'orderByRaw'\n );\n\n this.collection = false;\n\n if (!willSort) {\n this.order(this.model.primaryKey, 'DESC');\n }\n\n this.limit(1);\n }\n\n return this;\n }\n\n count(): Query<number> {\n const validName = /^(where(((Not)?(In)?)|(Raw)|(Between)))$/g;\n\n Object.assign(this, {\n shouldCount: true,\n\n snapshots: [\n ['count', '* as countAll'],\n ...this.snapshots.filter(([name]) => validName.test(name))\n ]\n });\n\n return this as unknown as Query<number>;\n }\n\n offset(amount: number): this {\n if (!this.shouldCount) {\n this.snapshots.push(['offset', amount]);\n }\n\n return this;\n }\n\n select(...attrs: Array<string>): this {\n if (!this.shouldCount) {\n this.snapshots.push(['select', formatSelect(this.model, attrs)]);\n }\n\n return this;\n }\n\n distinct(...attrs: Array<string>): this {\n if (!this.shouldCount) {\n this.snapshots.push(['distinct', formatSelect(this.model, attrs)]);\n }\n\n return this.select();\n }\n\n include(...relationships: Array<Record<string, any> | string>): this {\n let included: Array<any>;\n\n if (!this.shouldCount) {\n if (relationships.length === 1 && typeof relationships[0] === 'object') {\n included = entries(relationships[0]).reduce<Array<any>>(\n (arr, relationship) => {\n const [name] = relationship;\n const opts = this.model.relationshipFor(name);\n let [, attrs] = relationship;\n\n if (opts) {\n if (!attrs.length) {\n attrs = opts.model.attributeNames;\n }\n\n return [...arr, { name, attrs, relationship: opts }];\n }\n\n return arr;\n },\n []\n );\n } else {\n included = relationships.reduce<Array<any>>((arr, name) => {\n let str = name;\n\n if (typeof str !== 'string') {\n str = String(str);\n }\n\n const opts = this.model.relationshipFor(str);\n\n if (opts) {\n const attrs = opts.model.attributeNames;\n\n return [...arr, { attrs, name: str, relationship: opts }];\n }\n\n return arr;\n }, []);\n }\n\n const willInclude = included\n .filter(opts => {\n const { name, relationship } = opts;\n let { attrs } = opts;\n\n if (relationship.type === 'hasMany') {\n attrs = relationship.through\n ? attrs\n : [...attrs, camelize(relationship.foreignKey, true)];\n\n this.relationships[name] = {\n attrs,\n type: 'hasMany',\n model: relationship.model,\n through: relationship.through,\n foreignKey: relationship.foreignKey\n };\n\n return false;\n }\n\n return true;\n })\n .reduce<Array<any>>((arr, { name, attrs, relationship }) => {\n arr.push([\n 'includeSelect',\n formatSelect(relationship.model, attrs, `${name}.`)\n ]);\n\n if (relationship.type === 'belongsTo') {\n arr.push([\n 'leftOuterJoin',\n [\n relationship.model.tableName,\n `${this.model.tableName}.${relationship.foreignKey}`,\n '=',\n `${relationship.model.tableName}.${relationship.model.primaryKey}`\n ]\n ]);\n } else if (relationship.type === 'hasOne') {\n arr.push([\n 'leftOuterJoin',\n [\n relationship.model.tableName,\n `${this.model.tableName}.${this.model.primaryKey}`,\n '=',\n `${relationship.model.tableName}.${relationship.foreignKey}`\n ]\n ]);\n }\n\n return arr;\n }, []);\n\n this.snapshots.push(...willInclude);\n }\n\n return this;\n }\n\n unscope(...scopes: Array<string>): this {\n if (scopes.length) {\n const keys = scopes.map(scope => {\n if (scope === 'order') {\n return 'orderByRaw';\n }\n\n return scope;\n });\n\n this.snapshots = this.snapshots.filter(([, , scope]) => {\n if (typeof scope === 'string') {\n return keys.indexOf(scope) < 0;\n }\n\n return true;\n });\n } else {\n this.snapshots = this.snapshots.filter(([, , scope]) => !scope);\n }\n\n return this;\n }\n\n override then<TResult1 = T, TResult2 = never>(\n onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onRejected?: ((error: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n runQuery(this);\n return super.then(onFulfilled, onRejected);\n }\n\n override catch<TResult = never>(\n onRejected?: ((error: unknown) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n runQuery(this);\n return super.catch(onRejected);\n }\n\n static from(src: any): Query<unknown> {\n const { model, snapshots, collection, shouldCount, relationships } = src;\n\n const dest = Reflect.construct(this, [model]) as Query<unknown>;\n\n Object.assign(dest, {\n snapshots,\n collection,\n shouldCount,\n relationships\n });\n\n return dest;\n }\n}\n\nexport default Query;\nexport { RecordNotFoundError } from './errors';\n", "/**\n * @private\n */\nexport default function uniq<T>(src: T[], ...keys: string[]): T[] {\n const hasKeys = Boolean(keys.length);\n const valueAt = (obj: T, key: string): unknown =>\n (obj as unknown as Record<string, unknown>)[key];\n\n return src.filter((x, xIdx, arr) => {\n let lastIdx: number;\n\n if (hasKeys) {\n lastIdx = arr.findIndex(\n (y, yIdx) =>\n yIdx > xIdx || keys.every(key => valueAt(x, key) === valueAt(y, key))\n );\n } else {\n lastIdx = src.lastIndexOf(x);\n }\n\n return xIdx === lastIdx;\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `scopesFor` builds the dynamic scope-method machinery: each scope is a\n * variadic function forwarded to the model's scope statics via Reflect.apply,\n * so the argument list is genuinely untyped at this layer.\n */\nimport type Query from '../index';\n\nexport default function scopesFor<T>(target: Query<T>): PropertyDescriptorMap {\n return Object.keys(target.model.scopes).reduce<PropertyDescriptorMap>(\n (scopes, name) => ({\n ...scopes,\n [name]: {\n get() {\n const scope = function (...args: Array<any>) {\n const fn = Reflect.get(target.model, name);\n const { snapshots } = Reflect.apply(fn, target.model, args) as {\n snapshots: Array<Array<unknown>>;\n };\n\n Object.assign(target, {\n snapshots: [\n ...target.snapshots,\n ...snapshots.map(snapshot => [...snapshot, name])\n ]\n });\n\n return target;\n };\n\n Reflect.defineProperty(scope, 'name', {\n value: name,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n return scope;\n }\n }\n }),\n {}\n );\n}\n", "import { camelize } from 'inflection';\n\nimport type { ModelClass } from '../../interfaces';\n\n/**\n * @private\n */\nexport default function formatSelect(\n model: ModelClass,\n attrs: Array<string> = [],\n prefix: string = ''\n) {\n return attrs.map(attr => {\n const name = model.columnNameFor(attr) || 'undefined';\n\n return `${model.tableName}.${name} AS ${prefix}${camelize(name, true)}`;\n });\n}\n", "import createServerError from '../../../server/utils/create-server-error';\nimport stringify from '../../../../utils/stringify';\nimport type { ModelClass } from '../../interfaces';\n\nclass RecordNotFoundError extends Error {\n constructor({ name, primaryKey }: ModelClass, primaryKeyValue: unknown) {\n super(\n `Could not find ${name} with ${primaryKey} ${stringify(primaryKeyValue)}.`\n );\n }\n}\n\nexport default createServerError(RecordNotFoundError, 404);\n", "import type Query from '../index';\n\nexport const RUNNERS: WeakMap<\n Query<unknown>,\n () => Promise<void>\n> = new WeakMap();\n", "import isObject from '../../../../../utils/is-object';\nimport type Query from '../../index';\n\nexport default function getFindParam({\n isFind,\n snapshots,\n model: { tableName, primaryKey }\n}: Query<unknown>) {\n if (isFind) {\n const snapshot = snapshots.find(([method]) => method === 'where');\n\n if (snapshot) {\n const [, params] = snapshot;\n\n if (params && isObject(params)) {\n return Reflect.get(params, `${tableName}.${primaryKey}`);\n }\n }\n }\n\n return undefined;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The query runner assembles results from raw Knex rows and dynamically-built\n * related sub-queries (Reflect.construct/get/set over untyped column data), so\n * records, relationship descriptors and the constructed instances are genuinely\n * untyped at this layer.\n */\nimport { camelize, singularize } from 'inflection';\n\nimport type Model from '../../../model';\nimport type { ModelClass } from '../../../interfaces';\nimport entries from '../../../../../utils/entries';\nimport underscore from '../../../../../utils/underscore';\nimport promiseHash from '../../../../../utils/promise-hash';\n\n/**\n * @private\n */\nexport default async function buildResults<T extends Model>({\n model,\n records,\n relationships\n}: {\n model: ModelClass<T>;\n records: Promise<Array<Record<string, any>>>;\n relationships: Record<string, any>;\n}): Promise<Array<T>> {\n const results = await records;\n const pkPattern = new RegExp(`^.+\\\\.${model.primaryKey}$`);\n let related: Record<string, any> | undefined;\n\n if (!results.length) {\n return [];\n }\n\n if (Object.keys(relationships).length) {\n related = entries(relationships).reduce<Record<string, any>>(\n (obj, entry) => {\n const [name, relationship] = entry;\n let foreignKey = camelize(relationship.foreignKey, true);\n\n if (relationship.through) {\n const query = relationship.model.select(...relationship.attrs);\n\n const baseKey =\n `${relationship.through.tableName}.` +\n `${singularize(underscore(name))}_id`;\n\n foreignKey = `${relationship.through.tableName}.${relationship.foreignKey}`;\n\n query.snapshots.push(\n [\n 'select',\n [\n `${baseKey} as ${camelize(String(baseKey.split('.').pop()), true)}`,\n `${foreignKey} as ${camelize(String(foreignKey.split('.').pop()), true)}`\n ]\n ],\n [\n 'innerJoin',\n [\n relationship.through.tableName,\n `${relationship.model.tableName}.${relationship.model.primaryKey}`,\n '=',\n baseKey\n ]\n ],\n ['whereIn', [foreignKey, results.map(({ id }) => id)]]\n );\n\n return { ...obj, [name]: query };\n }\n\n return {\n ...obj,\n [name]: relationship.model.select(...relationship.attrs).where({\n [foreignKey]: results.map(({ id }) => id)\n })\n };\n },\n {}\n );\n\n related = await promiseHash(related);\n }\n\n return results.map(record => {\n if (related) {\n entries(related).forEach(\n ([name, relatedResults]: [string, Array<Model>]) => {\n const relationship = model.relationshipFor(name);\n\n if (relationship) {\n let { foreignKey } = relationship;\n\n foreignKey = camelize(foreignKey, true);\n\n Reflect.set(\n record,\n name,\n relatedResults.filter(({ rawColumnData }) => {\n const fk = Reflect.get(rawColumnData, foreignKey);\n const pk = Reflect.get(record, model.primaryKey);\n\n return fk === pk;\n })\n );\n }\n }\n );\n }\n\n const instance = Reflect.construct(model, [\n entries(record).reduce<Record<string, any>>((r, entry) => {\n let [key, value] = entry;\n\n if (value == null && pkPattern.test(key)) {\n return r;\n } else if (key.indexOf('.') >= 0) {\n const [a, b] = key.split('.');\n let parent: Record<string, any> = r[a];\n\n if (!parent) {\n parent = {};\n }\n\n key = a;\n value = {\n ...parent,\n [b]: value\n };\n }\n\n return {\n ...r,\n [key]: value\n };\n }, {})\n ]);\n\n instance.currentChangeSet.persist();\n\n return instance;\n });\n}\n", "import entries from './entries';\n\n/**\n * Resolves every value of an object, returning an object of the same shape with\n * each promise unwrapped.\n *\n * @private\n */\nexport default function promiseHash<T extends Record<string, unknown>>(\n promises: T\n): Promise<{ [K in keyof T]: Awaited<T[K]> }> {\n type Resolved = { [K in keyof T]: Awaited<T[K]> };\n\n if (Object.keys(promises).length) {\n return Promise.all(\n entries(promises).map(\n ([key, promise]) =>\n new Promise<Record<string, unknown>>((resolve, reject) => {\n const maybe = promise as Promise<unknown> | undefined;\n\n if (maybe && typeof maybe.then === 'function') {\n maybe.then(value => resolve({ [key]: value })).catch(reject);\n } else {\n resolve({ [key]: promise });\n }\n })\n )\n ).then(\n objects =>\n objects.reduce(\n (hash, object) => ({\n ...hash,\n ...object\n }),\n {}\n ) as Resolved\n );\n }\n\n return Promise.resolve({} as Resolved);\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The runner drives Knex query builders (`model.table()` and the reduced\n * snapshot chain) whose types Lumen does not model; `records` and the reflected\n * method calls are genuinely untyped here.\n */\nimport { RecordNotFoundError } from '../errors';\nimport { sql } from '../../../logger';\nimport type Query from '../index';\n\nimport { RUNNERS } from './constants';\nimport getFindParam from './utils/get-find-param';\nimport buildResults from './utils/build-results';\n\n/**\n * @private\n */\nexport function createRunner(\n target: Query<unknown>,\n opts: {\n resolve?: (value: any) => void;\n reject?: (error: Error) => void;\n }\n): void {\n if (opts.resolve && opts.reject) {\n const { resolve, reject } = opts;\n let didRun = false;\n\n RUNNERS.set(target, async () => {\n let results;\n const {\n model,\n isFind,\n snapshots,\n collection,\n shouldCount,\n relationships\n } = target;\n\n if (didRun) {\n return;\n }\n\n didRun = true;\n\n if (!shouldCount && !snapshots.some(([name]) => name === 'select')) {\n target.select(...target.model.attributeNames);\n }\n\n const records: any = snapshots.reduce((query, snapshot) => {\n let [name, params] = snapshot;\n\n if (!shouldCount && name === 'includeSelect') {\n name = 'select';\n }\n\n const method = Reflect.get(query, name);\n\n if (!Array.isArray(params)) {\n params = [params];\n }\n\n return Reflect.apply(method, query, params);\n }, model.table() as any);\n\n if (model.store.debug) {\n records.on('query', () => {\n setImmediate(() => model.logger.debug(sql`${records.toString()}`));\n });\n }\n\n if (shouldCount) {\n let [{ countAll: count }] = await records;\n count = parseInt(count, 10);\n\n resolve(Number.isFinite(count) ? count : 0);\n } else {\n results = await buildResults({\n model,\n records,\n relationships\n });\n\n if (collection) {\n resolve(results);\n } else {\n const [result] = results;\n\n if (!result && isFind) {\n const err = new RecordNotFoundError(model, getFindParam(target));\n\n reject(err);\n }\n\n resolve(result);\n }\n }\n });\n }\n}\n\nexport function runQuery(target: Query<unknown>): void {\n const runner = RUNNERS.get(target);\n\n if (runner) {\n runner();\n }\n}\n", "export default function mapToObject<T>(\n source: Map<string, T>\n): Record<string, T> {\n return Array.from(source).reduce<Record<string, T>>(\n (obj, [key, value]) => ({\n ...obj,\n [String(key)]: value\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * A ChangeSet stores a record's pending attribute and relationship values,\n * which are heterogeneous and dynamic (typed `any`/`Object` in the original\n * Flow). The `any` value type is what lets attribute getters/setters and the\n * relationship helpers round-trip those values.\n */\nimport type { Model } from '../index';\nimport entries from '../../../utils/entries';\nimport mapToObject from '../../../utils/map-to-object';\n\nclass ChangeSet extends Map<string, any> {\n declare isPersisted: boolean;\n\n constructor(data: Record<string, unknown> = {}) {\n super(entries(data));\n\n this.isPersisted = false;\n }\n\n override set(key: string, value: any): this {\n if (!this.isPersisted) {\n super.set(key, value);\n }\n\n return this;\n }\n\n persist(group?: Array<ChangeSet>): this {\n if (group) {\n group.forEach(changeSet => changeSet.unpersist());\n }\n\n this.isPersisted = true;\n\n return this;\n }\n\n unpersist(): this {\n this.isPersisted = false;\n return this;\n }\n\n applyTo(target: Model): ChangeSet {\n const instance = new ChangeSet(mapToObject(this));\n\n target.changeSets.unshift(instance);\n\n return instance;\n }\n}\n\nexport default ChangeSet;\n", "import { camelize } from 'inflection';\n\nimport type Model from '../model';\n\nimport { getHasOne, getHasMany, getBelongsTo } from './utils/getters';\nimport { setHasOne, setHasMany, setBelongsTo } from './utils/setters';\n\n/**\n * @private\n */\nexport function set(\n owner: Model,\n key: string,\n value?: Array<Model> | Model | null\n) {\n const opts = owner.constructor.relationshipFor(key);\n\n if (opts) {\n const { type } = opts;\n let { foreignKey } = opts;\n\n foreignKey = camelize(foreignKey, true);\n\n if (Array.isArray(value)) {\n if (type === 'hasMany') {\n setHasMany(owner, key, value, {\n ...opts,\n foreignKey\n });\n }\n } else if (type === 'hasOne') {\n setHasOne(owner, key, value, {\n ...opts,\n foreignKey\n });\n } else if (type === 'belongsTo') {\n setBelongsTo(owner, key, value, {\n ...opts,\n foreignKey\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport async function get(\n owner: Model,\n key: string\n): Promise<Array<Model> | Model | null> {\n const opts = owner.constructor.relationshipFor(key);\n let value: Array<Model> | Model | null = null;\n\n if (opts) {\n const { type } = opts;\n let { foreignKey } = opts;\n\n value = owner.currentChangeSet.get(key);\n foreignKey = camelize(foreignKey, true);\n\n if (!value) {\n switch (type) {\n case 'hasOne':\n value = await getHasOne(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n case 'hasMany':\n value = await getHasMany(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n case 'belongsTo':\n value = await getBelongsTo(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n default:\n throw new Error(`Unknown relationship type '${type}'.`);\n }\n\n set(owner, key, value);\n }\n }\n\n return value;\n}\n\nexport { default as updateRelationship } from './utils/update-relationship';\nexport type { Relationship$opts } from './interfaces';\n", "import { camelize } from 'inflection';\n\nimport type Model from '../../model';\nimport type { Relationship$opts } from '../index';\n\n/**\n * @private\n */\nasync function getHasManyThrough(\n owner: Model,\n { model, inverse, through, foreignKey: baseKey }: Relationship$opts\n): Promise<Array<Model>> {\n const inverseOpts = model.relationshipFor(inverse);\n let value: Array<Model> = [];\n\n if (through && inverseOpts) {\n const foreignKey = camelize(inverseOpts.foreignKey, true);\n const records = await through.select(baseKey, foreignKey).where({\n [baseKey]: owner.getPrimaryKey()\n });\n\n if (records.length) {\n value = await model.where({\n [model.primaryKey]: records\n .map(record => Reflect.get(record, foreignKey))\n .filter(Boolean)\n });\n }\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport function getHasOne(\n owner: Model,\n { model, foreignKey }: Relationship$opts\n) {\n return model.first().where({\n [foreignKey]: owner.getPrimaryKey()\n });\n}\n\n/**\n * @private\n */\nexport function getHasMany(owner: Model, opts: Relationship$opts) {\n const { model, through, foreignKey } = opts;\n\n return through\n ? getHasManyThrough(owner, opts)\n : model.where({\n [foreignKey]: owner.getPrimaryKey()\n });\n}\n\n/**\n * @private\n */\nexport function getBelongsTo(\n owner: Model,\n { model, foreignKey }: Relationship$opts\n) {\n const foreignValue = Reflect.get(owner, foreignKey);\n\n return foreignValue ? model.find(foreignValue) : Promise.resolve(null);\n}\n", "import type Model from '../../model';\n\n/**\n * @private\n */\nfunction unassociateOne<T extends Model | null | undefined>(\n value: T,\n foreignKey: string\n): T {\n if (value) {\n Reflect.set(value, foreignKey, null);\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport default function unassociate<T extends Model>(\n value: Array<T>,\n foreignKey: string\n): Array<T> {\n return value.map(record => unassociateOne(record, foreignKey));\n}\n", "/**\n * @private\n */\nexport default function isNull(value: unknown): value is null {\n return value === null;\n}\n", "import isNull from '../../../../utils/is-null';\nimport type { ModelClass } from '../../interfaces';\n\nfunction validateOne(model: ModelClass, value: unknown) {\n return isNull(value) || model.isInstance(value);\n}\n\nexport default function validateType(model: ModelClass, value: unknown) {\n if (Array.isArray(value)) {\n return value.every(item => validateOne(model, item));\n }\n\n return validateOne(model, value);\n}\n", "import type Model from '../../model';\nimport type { ModelClass } from '../../interfaces';\nimport type { Relationship$opts } from '../index';\n\n/**\n * @private\n */\nexport function setHasManyInverse(\n owner: Model,\n value: Array<Model>,\n {\n inverse,\n foreignKey,\n inverseModel\n }: Relationship$opts & {\n inverseModel: ModelClass;\n }\n) {\n const primaryKey = Reflect.get(owner, owner.constructor.primaryKey);\n const { type: inverseType } = inverseModel.relationshipFor(inverse)!;\n\n for (const record of value) {\n let { currentChangeSet: changeSet } = record;\n\n if (owner !== changeSet.get(inverse)) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(record);\n }\n\n changeSet.set(inverse, owner);\n\n if (inverseType === 'belongsTo') {\n Reflect.set(record, foreignKey, primaryKey);\n }\n }\n }\n}\n\n/**\n * @private\n */\nexport function setHasOneInverse(\n owner: Model,\n value: Model | null | undefined,\n {\n inverse,\n foreignKey,\n inverseModel\n }: Relationship$opts & {\n inverseModel: ModelClass;\n }\n) {\n if (value) {\n const { type: inverseType } = inverseModel.relationshipFor(inverse)!;\n let inverseValue = value.currentChangeSet.get(inverse);\n\n if (inverseType === 'hasMany') {\n if (!Array.isArray(inverseValue)) {\n inverseValue = [];\n }\n\n if (!inverseValue.includes(owner)) {\n inverseValue.push(owner);\n }\n } else if (owner !== inverseValue) {\n inverseValue = owner;\n\n if (inverseType === 'belongsTo') {\n Reflect.set(value, foreignKey, inverseValue.getPrimaryKey());\n }\n }\n\n let { currentChangeSet: changeSet } = value;\n\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(value);\n }\n\n changeSet.set(inverse, inverseValue || null);\n }\n}\n", "import type Model from '../../model';\nimport type { Relationship$opts } from '../index';\n\nimport unassociate from './unassociate';\nimport validateType from './validate-type';\nimport { setHasOneInverse, setHasManyInverse } from './inverse-setters';\n\n/**\n * @private\n */\nexport function setHasMany(\n owner: Model,\n key: string,\n value: Array<Model>,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n let { currentChangeSet: changeSet } = owner;\n\n if (validateType(model, value)) {\n let prevValue = changeSet.get(key);\n\n if (Array.isArray(prevValue)) {\n prevValue = unassociate(prevValue, foreignKey);\n\n if (Array.isArray(prevValue)) {\n prevValue\n .filter(\n prev =>\n !value.find(next => prev.getPrimaryKey() === next.getPrimaryKey())\n )\n .forEach(record => owner.prevAssociations.add(record));\n }\n }\n\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, value);\n\n setHasManyInverse(owner, value, {\n type,\n model,\n inverse,\n foreignKey,\n inverseModel: model\n });\n }\n}\n\n/**\n * @private\n */\nexport function setHasOne(\n owner: Model,\n key: string,\n value: Model | null | undefined,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n let valueToSet = value;\n\n if (value && typeof value === 'object' && !model.isInstance(value)) {\n valueToSet = Reflect.construct(model, [valueToSet]);\n }\n\n let { currentChangeSet: changeSet } = owner;\n\n if (valueToSet) {\n if (validateType(model, valueToSet)) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, valueToSet);\n }\n } else {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, null);\n }\n\n setHasOneInverse(owner, valueToSet, {\n type,\n model,\n inverse,\n foreignKey,\n inverseModel: model\n });\n}\n\n/**\n * @private\n */\nexport function setBelongsTo(\n owner: Model,\n key: string,\n value: Model | null | undefined,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n setHasOne(owner, key, value, {\n type,\n model,\n inverse,\n foreignKey\n });\n\n if (value) {\n Reflect.set(owner, foreignKey, Reflect.get(value, model.primaryKey));\n } else {\n Reflect.set(owner, foreignKey, null);\n }\n}\n", "import type Model from '../../model';\nimport type { Relationship$opts } from '../interfaces';\n\ntype Params = {\n record: Model;\n value: Model | null | undefined | Array<Model>;\n opts: Relationship$opts;\n trx: unknown;\n};\n\nfunction updateHasOne({ record, value, opts, trx }: Params): Array<unknown> {\n const recordPrimaryKey = record.getPrimaryKey();\n\n if (value) {\n if (value instanceof opts.model) {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n .whereNot(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.getPrimaryKey()\n ),\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, recordPrimaryKey)\n .where(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.getPrimaryKey()\n )\n ];\n }\n } else {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n ];\n }\n\n return [];\n}\n\nfunction updateHasMany({ record, value, opts, trx }: Params): Array<unknown> {\n const recordPrimaryKey = record.getPrimaryKey();\n\n if (Array.isArray(value) && value.length) {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n .whereNotIn(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.map(item => item.getPrimaryKey())\n ),\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, recordPrimaryKey)\n .whereIn(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.map(item => item.getPrimaryKey())\n )\n ];\n }\n\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n ];\n}\n\nfunction updateBelongsTo({ record, value, opts, trx }: Params): Array<unknown> {\n if (value instanceof opts.model) {\n const inverseOpts = opts.model.relationshipFor(opts.inverse);\n const foreignKeyValue = value.getPrimaryKey();\n\n Reflect.set(record, opts.foreignKey, foreignKeyValue);\n\n if (inverseOpts && inverseOpts.type === 'hasOne') {\n return [\n record.constructor\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(opts.foreignKey, foreignKeyValue)\n .whereNot(\n `${record.constructor.tableName}.${record.constructor.primaryKey}`,\n record.getPrimaryKey()\n )\n ];\n }\n }\n\n return [];\n}\n\n/**\n * @private\n */\nexport default function updateRelationship(\n record: Model,\n name: string,\n trx: unknown\n): Array<unknown> {\n const opts = record.constructor.relationshipFor(name);\n\n if (!opts) {\n const {\n constructor: { name: className }\n } = record;\n\n throw new Error(`Could not find relationship '${name} on '${className}`);\n }\n\n const { dirtyRelationships } = record;\n\n if (!dirtyRelationships.has(name)) {\n return [];\n }\n\n const value = dirtyRelationships.get(name) as\n Model | Array<Model> | null | undefined;\n\n switch (opts.type) {\n case 'hasOne':\n return updateHasOne({\n record,\n value,\n opts,\n trx\n });\n\n case 'hasMany':\n return updateHasMany({\n record,\n value,\n opts,\n trx\n });\n\n default:\n return updateBelongsTo({\n record,\n value,\n opts,\n trx\n });\n }\n}\n", "export default function hasOwnProperty(target: object, key: string): boolean {\n return Reflect.apply(Object.prototype.hasOwnProperty, target, [key]);\n}\n", "import hasOwnProperty from './has-own-property';\n\ntype ProxyGet<T extends object> = (\n target: T,\n key: string,\n receiver: unknown\n) => unknown;\n\n/**\n * @private\n */\nexport function trapGet<T extends object>(\n traps: Record<string, unknown>\n): ProxyGet<T> {\n return (target, key, receiver) => {\n if (key === 'unwrap') {\n return () => target;\n }\n\n if (hasOwnProperty(traps, key)) {\n const value = Reflect.get(traps, key);\n\n if (typeof value === 'function') {\n return value.bind(receiver, target);\n }\n\n return value;\n }\n\n return Reflect.get(target, key);\n };\n}\n", "import { trapGet } from '../../../utils/proxy';\nimport type { Model } from '../index';\nimport type { ModelClass } from '../interfaces';\n\nimport type { Transaction$ResultProxy } from './interfaces';\n\n/**\n * @private\n */\nexport function createStaticTransactionProxy<T extends ModelClass>(\n target: T,\n trx: unknown\n): T {\n return new Proxy(target, {\n get: trapGet({\n create(model: T, props: Record<string, unknown> = {}) {\n return model.create(props, trx);\n }\n })\n });\n}\n\n/**\n * @private\n */\nexport function createInstanceTransactionProxy<T extends Model>(\n target: T,\n trx: unknown\n): T {\n return new Proxy(target, {\n get: trapGet({\n save(model: T) {\n return model.save(trx);\n },\n\n update(model: T, props: Record<string, unknown> = {}) {\n return model.update(props, trx);\n },\n\n destroy(model: T) {\n return model.destroy(trx);\n }\n })\n });\n}\n\n/**\n * @private\n */\nexport function createTransactionResultProxy<\n T extends Model,\n U extends boolean\n>(record: T, didPersist: U): Transaction$ResultProxy<T, U> {\n return new Proxy(record, {\n get: trapGet({\n didPersist\n })\n }) as unknown as Transaction$ResultProxy<T, U>;\n}\n\nexport type { Transaction$ResultProxy } from './interfaces';\n", "/**\n * Returns a copy of `src` containing only `keys` whose values are defined.\n *\n * The result is `Partial<T>` rather than Flow's `T`: keys may be dropped, both\n * because the caller asked for a subset and because undefined values are\n * filtered out. The cast is confined to the return, where the dynamic key\n * access makes the shape unknowable to the compiler.\n *\n * @private\n */\nexport default function pick<T extends object>(\n src: T,\n ...keys: string[]\n): Partial<T> {\n return keys\n .map((key): [string, unknown] => [key, Reflect.get(src, key)])\n .filter(([, value]) => typeof value !== 'undefined')\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: value\n }),\n {}\n ) as Partial<T>;\n}\n", "/**\n * @private\n */\nexport function map<K, V>(a: Map<K, V>, b: Map<K, V>): Map<K, V> {\n return Array.from(b).reduce((result, [key, value]) => {\n if (a.get(key) !== value) {\n result.set(key, value);\n }\n\n return result;\n }, new Map<K, V>());\n}\n", "import pick from '../../../../utils/pick';\nimport entries from '../../../../utils/entries';\nimport type Model from '../index';\n\n/**\n * @private\n */\nexport default function getColumns(record: Model, only?: Array<string>) {\n let columns: Record<string, unknown> = record.constructor.attributes;\n\n if (only) {\n columns = pick(columns, ...only) as Record<string, unknown>;\n }\n\n return entries(columns).reduce<Record<string, unknown>>(\n (obj, [key, col]) => ({\n ...obj,\n [(col as { columnName: string }).columnName]: Reflect.get(record, key)\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * These build and run Knex insert/update/delete statements; the query builders\n * and the promises they return are not modeled by Lumen (they were `Object` in\n * Flow).\n */\nimport { sql } from '../../../logger';\nimport omit from '../../../../utils/omit';\nimport type Logger from '../../../logger';\nimport type Model from '../index';\n\nimport getColumns from './get-columns';\n\n/**\n * @private\n */\nexport function create(record: Model, trx: unknown): Array<any> {\n const timestamp = new Date();\n\n Object.assign(record, {\n createdAt: timestamp,\n updatedAt: timestamp\n });\n\n Object.assign(record.rawColumnData, {\n createdAt: timestamp,\n updatedAt: timestamp\n });\n\n const {\n constructor: { primaryKey }\n } = record;\n const columns = omit(getColumns(record), primaryKey);\n\n if (record.dirtyAttributes.has(primaryKey)) {\n columns[primaryKey] = record.getPrimaryKey();\n }\n\n return [\n record.constructor\n .table()\n .transacting(trx)\n .returning(record.constructor.primaryKey)\n .insert(columns)\n ];\n}\n\n/**\n * @private\n */\nexport function update(record: Model, trx: unknown): Array<any> {\n Reflect.set(record, 'updatedAt', new Date());\n\n return [\n record.constructor\n .table()\n .transacting(trx)\n .where(record.constructor.primaryKey, record.getPrimaryKey())\n .update(getColumns(record, Array.from(record.dirtyAttributes.keys())))\n ];\n}\n\n/**\n * @private\n */\nexport function destroy(record: Model, trx: unknown): Array<any> {\n return [\n record.constructor\n .table()\n .transacting(trx)\n .where(record.constructor.primaryKey, record.getPrimaryKey())\n .del()\n ];\n}\n\n/**\n * @private\n */\nexport function createRunner(\n logger: Logger,\n statements: Array<any>\n): (query: Array<any>) => Promise<Array<any>> {\n return query => {\n const promises = query.concat(statements);\n\n promises.forEach(promise => {\n promise.on('query', () => {\n setImmediate(() => {\n logger.debug(sql`${promise.toString()}`);\n });\n });\n });\n\n return Promise.all(promises);\n };\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Class initialization is pure runtime metaprogramming: it reads each model's\n * user-declared static config (attributes from the DB schema, hasOne/hasMany/\n * belongsTo/hooks/scopes/validates), and installs accessors, relationship\n * descriptors and frozen metadata onto the class and its prototype via\n * Object.defineProperties/Reflect. The config values are genuinely untyped (as\n * they were `Object` in Flow).\n */\nimport { camelize, dasherize, pluralize, singularize } from 'inflection';\n\nimport { line } from '../../logger';\nimport { createAttribute } from '../attribute';\nimport {\n get as getRelationship,\n set as setRelationship\n} from '../relationship';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\nimport type Logger from '../../logger';\nimport type Database from '../index';\nimport type { Model } from '../index';\nimport type { ModelClass } from '../interfaces';\n\nconst VALID_HOOKS = new Set([\n 'afterCreate',\n 'afterDestroy',\n 'afterSave',\n 'afterUpdate',\n 'afterValidation',\n 'beforeCreate',\n 'beforeDestroy',\n 'beforeSave',\n 'beforeUpdate',\n 'beforeValidation'\n]);\n\n/**\n * @private\n */\nfunction initializeProps(\n prototype: object,\n attributes: Record<string, any>,\n relationships: Record<string, any>\n) {\n Object.defineProperties(prototype, {\n ...entries(attributes).reduce<PropertyDescriptorMap>(\n (obj, [key, value]) => ({\n ...obj,\n [key]: createAttribute({\n key,\n ...value\n })\n }),\n {}\n ),\n\n ...Object.keys(relationships).reduce<PropertyDescriptorMap>(\n (obj, key) => ({\n ...obj,\n [key]: {\n get(this: Model) {\n return getRelationship(this, key);\n },\n set(this: Model, val: any) {\n setRelationship(this, key, val);\n }\n }\n }),\n {}\n )\n });\n}\n\n/**\n * @private\n */\nfunction initializeHooks({\n model,\n hooks,\n logger\n}: {\n model: ModelClass;\n hooks: Record<string, any>;\n logger: Logger;\n}) {\n return Object.freeze(\n entries(hooks).reduce<Record<string, any>>((obj, [key, value]) => {\n if (!VALID_HOOKS.has(key)) {\n logger.warn(line`\n Invalid hook '${key}' will not be added to Model '${model.name}'.\n Valid hooks are ${Array.from(VALID_HOOKS)\n .map(h => `'${h}'`)\n .join(', ')}.\n `);\n\n return obj;\n }\n\n return {\n ...obj,\n [key]: async (instance: Model, transaction: unknown) => {\n await Reflect.apply(value, model, [instance, transaction]);\n }\n };\n }, {})\n );\n}\n\n/**\n * @private\n */\nfunction initializeValidations(opts: {\n model: ModelClass;\n logger: Logger;\n validates: Record<string, any>;\n attributes: Record<string, any>;\n}) {\n const { model, logger, attributes } = opts;\n const attributeNames = Object.keys(attributes);\n let { validates } = opts;\n\n validates = entries(validates)\n .filter(([key, value]) => {\n let isValid = attributeNames.indexOf(key) >= 0;\n\n if (!isValid) {\n logger.warn(line`\n Invalid validation '${key}' will not be added to Model\n '${model.name}'. '${key}' is not an attribute of Model\n '${model.name}'.\n `);\n }\n\n if (typeof value !== 'function') {\n isValid = false;\n\n logger.warn(line`\n Invalid validation '${key}' will not be added to Model\n '${model.name}'. Validations must be a function.\n `);\n }\n\n return isValid;\n })\n .reduce<Record<string, any>>(\n (obj, [key, value]) => ({\n ...obj,\n [key]: value\n }),\n {}\n );\n\n return Object.freeze(validates);\n}\n\n/**\n * @private\n */\nexport default async function initializeClass<T extends ModelClass>({\n store,\n table,\n model\n}: {\n store: Database;\n table: T['table'];\n model: T;\n}): Promise<T> {\n let { hooks, scopes, validates } = model;\n const { logger } = store;\n const modelName = dasherize(underscore(model.name));\n const resourceName = pluralize(modelName);\n\n const attributes = entries(await table().columnInfo()).reduce<\n Record<string, any>\n >(\n (obj, [columnName, value]) => ({\n ...obj,\n [camelize(columnName, true)]: {\n ...(value as any),\n columnName,\n docName: dasherize(columnName)\n }\n }),\n {}\n );\n\n const belongsTo = entries(model.belongsTo || {}).reduce<Record<string, any>>(\n (obj, [relatedName, value]) => {\n const { inverse, model: relatedModel } = value as any;\n const relationship = {};\n\n Object.defineProperties(relationship, {\n model: {\n value: store.modelFor(relatedModel || relatedName),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n type: {\n value: 'belongsTo',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: `${underscore(relatedName)}_id`,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...obj,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n const hasOne = entries(model.hasOne || {}).reduce<Record<string, any>>(\n (obj, [relatedName, value]) => {\n const { inverse, model: relatedModel } = value as any;\n const relationship = {};\n\n Object.defineProperties(relationship, {\n model: {\n value: store.modelFor(relatedModel || relatedName),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n type: {\n value: 'hasOne',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: `${underscore(inverse)}_id`,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...obj,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n const hasMany = entries(model.hasMany || {}).reduce<Record<string, any>>(\n (hash, [relatedName, opts]) => {\n const { inverse } = opts as any;\n const relationship = {};\n let { through, model: relatedModel } = opts as any;\n let foreignKey;\n\n if (typeof relatedModel === 'string') {\n relatedModel = store.modelFor(relatedModel);\n } else {\n relatedModel = store.modelFor(relatedName);\n }\n\n if (typeof through === 'string') {\n through = store.modelFor(through);\n foreignKey = `${singularize(underscore(inverse))}_id`;\n } else {\n foreignKey = `${underscore(inverse)}_id`;\n }\n\n Object.defineProperties(relationship, {\n model: {\n value: relatedModel,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n through: {\n value: through,\n writable: false,\n enumerable: Boolean(through),\n configurable: false\n },\n\n type: {\n value: 'hasMany',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: foreignKey,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...hash,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n Object.freeze(hasOne);\n Object.freeze(hasMany);\n Object.freeze(belongsTo);\n\n const relationships = Object.freeze({\n ...hasOne,\n ...hasMany,\n ...belongsTo\n });\n\n if (!hooks) {\n hooks = {};\n }\n\n if (!scopes) {\n scopes = {};\n }\n\n if (!validates) {\n validates = {};\n }\n\n Object.defineProperties(model, {\n store: {\n value: store,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n table: {\n value: table,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n attributes: {\n value: Object.freeze(attributes),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n attributeNames: {\n value: Object.freeze(Object.keys(attributes)),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n hasOne: {\n value: hasOne,\n writable: false,\n enumerable: Boolean(Object.keys(hasOne).length),\n configurable: false\n },\n\n hasMany: {\n value: hasMany,\n writable: false,\n enumerable: Boolean(Object.keys(hasMany).length),\n configurable: false\n },\n\n belongsTo: {\n value: belongsTo,\n writable: false,\n enumerable: Boolean(Object.keys(belongsTo).length),\n configurable: false\n },\n\n relationships: {\n value: relationships,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n relationshipNames: {\n value: Object.freeze(Object.keys(relationships)),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n hooks: {\n value: initializeHooks({\n model,\n hooks,\n logger\n }),\n writable: false,\n enumerable: Boolean(Object.keys(hooks).length),\n configurable: false\n },\n\n scopes: {\n value: scopes,\n writable: false,\n enumerable: Boolean(Object.keys(scopes).length),\n configurable: false\n },\n\n validates: {\n value: initializeValidations({\n model,\n logger,\n validates,\n attributes\n }),\n writable: false,\n enumerable: Boolean(Object.keys(validates).length),\n configurable: false\n },\n\n modelName: {\n value: modelName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n resourceName: {\n value: resourceName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n initialized: {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n ...Object.freeze(\n entries(scopes).reduce<PropertyDescriptorMap>(\n (obj, [name, scope]) => ({\n ...obj,\n [name]: {\n value: scope,\n writable: false,\n enumerable: false,\n configurable: false\n }\n }),\n {}\n )\n )\n });\n\n initializeProps(model.prototype, attributes, {\n ...hasOne,\n ...hasMany,\n ...belongsTo\n });\n\n Object.defineProperties(model.prototype, {\n modelName: {\n value: modelName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n resourceName: {\n value: resourceName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n isModelInstance: {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return model;\n}\n", "/**\n * @private\n */\nexport default function isUndefined(value: unknown): value is undefined {\n return typeof value === 'undefined';\n}\n", "import type Model from '../../model';\nimport type { Attribute$meta } from '../index';\nimport isNull from '../../../../utils/is-null';\nimport isUndefined from '../../../../utils/is-undefined';\n\nexport default function createGetter({\n key,\n defaultValue\n}: Attribute$meta): (this: Model) => unknown {\n return function getter(this: Model) {\n let value: unknown = this.currentChangeSet.get(key);\n\n if (isNull(value) || isUndefined(value)) {\n value = defaultValue;\n }\n\n return value;\n };\n}\n", "import type Model from '../../model';\nimport isNull from '../../../../utils/is-null';\nimport isUndefined from '../../../../utils/is-undefined';\nimport type { Attribute$meta } from '../index';\n\n/**\n * @private\n */\nexport default function createSetter({\n key,\n nullable,\n normalize,\n defaultValue\n}: Attribute$meta & {\n normalize: (value: unknown) => unknown;\n}): (this: Model, value?: unknown) => void {\n return function setter(this: Model, nextValue?: unknown) {\n if (!nullable) {\n if (isNull(nextValue) || isUndefined(nextValue)) {\n return;\n }\n }\n\n let { currentChangeSet: changeSet } = this;\n const valueToSet = normalize(nextValue);\n const currentValue = changeSet.get(key) || defaultValue;\n\n if (!changeSet.has(key) || valueToSet !== currentValue) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(this);\n }\n\n changeSet.set(key, valueToSet);\n }\n };\n}\n", "const BOOLEAN_TYPE = /^(?:boolean|tinyint)$/;\n\nexport default function createNormalizer(\n type: string\n): (value: unknown) => unknown {\n let normalizer: (value: unknown) => unknown = value => value;\n\n if (BOOLEAN_TYPE.test(type)) {\n normalizer = value => {\n let normalized = value;\n\n if (typeof value === 'string') {\n normalized = Number.parseInt(value, 10);\n }\n\n return Boolean(normalized);\n };\n } else if (type === 'datetime') {\n normalizer = value => {\n let normalized = value;\n\n if (typeof value === 'number') {\n normalized = new Date(value);\n }\n\n return normalized;\n };\n }\n\n return normalizer;\n}\n", "import createGetter from './utils/create-getter';\nimport createSetter from './utils/create-setter';\nimport createNormalizer from './utils/create-normalizer';\nimport type { Attribute$meta } from './interfaces';\n\n/**\n * @private\n */\nexport function createAttribute(opts: Attribute$meta): PropertyDescriptor {\n const normalize = createNormalizer(opts.type);\n const meta = {\n ...opts,\n normalize,\n defaultValue: normalize(opts.defaultValue)\n };\n\n return {\n get: createGetter(meta),\n set: createSetter(meta)\n };\n}\n\nexport type { Attribute$meta } from './interfaces';\n", "/**\n * @private\n */\nclass ValidationError extends Error {\n constructor(key: string, value: string) {\n super(`Validation failed for ${key}: ${value}`);\n }\n}\n\nexport default ValidationError;\n", "import type { Validation$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Validation<T> {\n declare key: string;\n\n declare value: T;\n\n declare validator: (value?: T) => boolean;\n\n constructor(opts: Validation$opts<T>) {\n Object.defineProperties(this, {\n key: {\n value: opts.key,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n value: {\n value: opts.value,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n validator: {\n value: opts.validator,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n }\n\n isValid(): boolean {\n return this.validator(this.value);\n }\n}\n\nexport default Validation;\nexport { ValidationError } from './errors';\n", "import Validation, { ValidationError } from '../../validation';\nimport type { Model } from '../../index';\n\n/**\n * @private\n */\nexport default function validate(instance: Model): true {\n return Array.from(instance.dirtyAttributes)\n .map(([key, value]) => ({\n key,\n value,\n validator: Reflect.get(instance.constructor.validates, key) as (\n value?: unknown\n ) => boolean\n }))\n .filter(({ validator }) => validator)\n .map(props => new Validation(props))\n .reduce<true>((result, validation) => {\n if (!validation.isValid()) {\n throw new ValidationError(validation.key, String(validation.value));\n }\n\n return result;\n }, true);\n}\n", "import type Model from '../index';\nimport type { Model$Hook } from '../interfaces';\n\n/**\n * @private\n */\nexport default function runHooks(\n record: Model,\n trx: unknown,\n ...hooks: Array<Model$Hook | undefined>\n): Promise<unknown> {\n return hooks\n .filter((hook): hook is Model$Hook => Boolean(hook))\n .reduce<Promise<unknown>>(\n (prev, next) => prev.then(() => next(record, trx)),\n Promise.resolve()\n );\n}\n", "import type { Migration$Fn } from './interfaces';\n\n/**\n * @private\n */\nclass Migration<T extends object> {\n declare fn: Migration$Fn<T>;\n\n constructor(fn: Migration$Fn<T>) {\n this.fn = fn;\n }\n\n run(schema: T): T {\n return this.fn(schema);\n }\n}\n\nexport default Migration;\nexport { default as generateTimestamp } from './utils/generate-timestamp';\nexport type { Migration$Fn } from './interfaces';\n", "import { TYPE_ALIASES } from '../constants';\nimport type { Database$column } from '../interfaces';\n\n/**\n * @private\n */\nexport default function typeForColumn(\n column: Database$column\n): string | undefined {\n return TYPE_ALIASES.get(column.type);\n}\n", "import type { Knex } from 'knex';\n\nimport type Logger from '../logger';\n\nimport { ModelMissingError } from './errors';\nimport initialize from './initialize';\nimport normalizeModelName from './utils/normalize-model-name';\nimport type { Database$opts, ModelClass } from './interfaces';\n\n/**\n * @private\n */\nclass Database {\n declare path: string;\n\n declare debug: boolean;\n\n declare logger: Logger;\n\n declare config: Record<string, unknown>;\n\n declare schema: () => Knex.SchemaBuilder;\n\n declare connection: Knex;\n\n declare models: Map<string, ModelClass>;\n\n constructor(opts: Database$opts) {\n // Lumen databases construct asynchronously: `initialize` populates `this` and\n // resolves once the schema/migrations/models are ready, so `new Database()`\n // is awaited by callers. TS can't express a Promise-returning constructor,\n // so assert the instance type here.\n return initialize(this, opts) as unknown as Database;\n }\n\n modelFor(type: string): ModelClass {\n const model = this.models.get(normalizeModelName(type));\n\n if (!model) {\n throw new ModelMissingError(type);\n }\n\n return model;\n }\n}\n\nexport default Database;\nexport { default as Model } from './model';\nexport { default as Query } from './query';\nexport { default as Migration, generateTimestamp } from './migration';\nexport { default as connect } from './utils/connect';\nexport { default as typeForColumn } from './utils/type-for-column';\nexport { default as createMigrations } from './utils/create-migrations';\nexport { default as pendingMigrations } from './utils/pending-migrations';\n\nexport type { Database$opts, Database$config, ModelClass } from './interfaces';\n", "import { createServer } from 'http';\nimport type { Writable } from 'stream';\nimport type { IncomingMessage, Server as HTTPServer } from 'http';\n\nimport { tryCatchSync } from '../../utils/try-catch';\nimport type Logger from '../logger';\nimport type Router from '../router';\n\nimport { HAS_BODY } from './constants';\nimport { createRequest, parseRequest } from './request';\nimport { createResponse } from './response';\nimport { createResponder } from './responder';\nimport validateAccept from './utils/validate-accept';\nimport validateContentType from './utils/validate-content-type';\nimport setCORSHeaders from './utils/set-cors-headers';\nimport type { Request } from './request/interfaces';\nimport type { Response } from './response/interfaces';\nimport type { Server$opts, Server$cors } from './interfaces';\n\n/**\n * @private\n */\nclass Server {\n declare logger: Logger;\n\n declare router: Router;\n\n declare cors: Server$cors;\n\n declare instance: HTTPServer;\n\n constructor({ logger, router, cors }: Server$opts) {\n Object.defineProperties(this, {\n router: {\n value: router,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n cors: {\n value: cors,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n instance: {\n value: createServer(this.receiveRequest),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n }\n\n listen(port: number): void {\n this.instance.listen(port);\n }\n\n initializeRequest(req: IncomingMessage, res: Writable): [Request, Response] {\n const { logger, router, cors } = this;\n\n req.setEncoding('utf8');\n\n const response = createResponse(res, {\n logger\n });\n\n setCORSHeaders(response, cors);\n\n const request = createRequest(req, {\n logger,\n router\n });\n\n return [request, response];\n }\n\n validateRequest({ method, headers }: Request): true {\n let isValid = validateAccept(headers.get('accept'));\n\n if (HAS_BODY.test(method)) {\n isValid = validateContentType(headers.get('content-type'));\n }\n\n return isValid;\n }\n\n receiveRequest = (req: IncomingMessage, res: Writable): void => {\n const { logger } = this;\n const [request, response] = this.initializeRequest(req, res);\n const respond = createResponder(request, response);\n\n logger.request(request, response, {\n startTime: Date.now()\n });\n\n const isValid = tryCatchSync(() => this.validateRequest(request), respond);\n\n if (isValid) {\n parseRequest(request)\n .then(params => {\n const { route } = request;\n\n Object.assign(request, {\n params\n });\n\n if (route) {\n return route.visit(request, response);\n }\n\n return undefined;\n })\n .then(respond)\n .catch(err => {\n logger.error(err);\n respond(err);\n });\n }\n };\n}\n\nexport default Server;\nexport { REQUEST_METHODS, getDomain } from './request';\nexport { default as createServerError } from './utils/create-server-error';\n\nexport type { Server$config } from './interfaces';\n\nexport type {\n Request,\n Request$params,\n Request$method\n} from './request/interfaces';\n\nexport type { Response } from './response/interfaces';\n", "export const HAS_BODY = /^(POST|PATCH)$/;\n\nexport const STATUS_CODES = new Map([\n [100, 'Continue'],\n [101, 'Switching Protocols'],\n [102, 'Processing'],\n [200, 'OK'],\n [201, 'Created'],\n [202, 'Accepted'],\n [203, 'Non-Authoritative Information'],\n [204, 'No Content'],\n [205, 'Reset Content'],\n [206, 'Partial Content'],\n [207, 'Multi-Status'],\n [208, 'Already Reported'],\n [226, 'IM Used'],\n [300, 'Multiple Choices'],\n [301, 'Moved Permanently'],\n [302, 'Found'],\n [303, 'See Other'],\n [304, 'Not Modified'],\n [305, 'Use Proxy'],\n [307, 'Temporary Redirect'],\n [308, 'Permanent Redirect'],\n [400, 'Bad Request'],\n [401, 'Unauthorized'],\n [402, 'Payment Required'],\n [403, 'Forbidden'],\n [404, 'Not Found'],\n [405, 'Method Not Allowed'],\n [406, 'Not Acceptable'],\n [407, 'Proxy Authentication Required'],\n [408, 'Request Timeout'],\n [409, 'Conflict'],\n [410, 'Gone'],\n [411, 'Length Required'],\n [412, 'Precondition Failed'],\n [413, 'Payload Too Large'],\n [414, 'URI Too Long'],\n [415, 'Unsupported Media Type'],\n [416, 'Range Not Satisfiable'],\n [417, 'Expectation Failed'],\n [418, \"I'm a teapot\"],\n [421, 'Misdirected Request'],\n [422, 'Unprocessable Entity'],\n [423, 'Locked'],\n [424, 'Failed Dependency'],\n [425, 'Unordered Collection'],\n [426, 'Upgrade Required'],\n [428, 'Precondition Required'],\n [429, 'Too Many Requests'],\n [431, 'Request Header Fields Too Large'],\n [451, 'Unavailable For Legal Reasons'],\n [500, 'Internal Server Error'],\n [501, 'Not Implemented'],\n [502, 'Bad Gateway'],\n [503, 'Service Unavailable'],\n [504, 'Gateway Timeout'],\n [505, 'HTTP Version Not Supported'],\n [506, 'Variant Also Negotiates'],\n [507, 'Insufficient Storage'],\n [508, 'Loop Detected'],\n [509, 'Bandwidth Limit Exceeded'],\n [510, 'Not Extended'],\n [511, 'Network Authentication Required']\n]);\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createRequest` receives the raw Node `IncomingMessage` and mutates it in\n * place into the framework's `Request` shape; the parameter is genuinely\n * untyped at that boundary before the mutation completes.\n */\nimport { parse as parseURL } from 'url';\n\nimport entries from '../../../utils/entries';\n\nimport type { Request, Request$opts } from './interfaces';\n\n/**\n * @private\n */\nexport function createRequest(\n req: any,\n { logger, router }: Request$opts\n): Request {\n const url = { ...parseURL(req.url, true), params: [] };\n const headers: Map<string, string> = new Map(entries(req.headers));\n\n Object.assign(req, {\n url,\n logger,\n headers,\n params: {},\n method: headers.get('x-http-method-override') || req.method\n });\n\n const route = router.match(req);\n\n if (route) {\n Object.assign(req, {\n route,\n action: route.action,\n controller: route.controller\n });\n }\n\n return req;\n}\n\nexport { REQUEST_METHODS } from './constants';\n\nexport { parseRequest } from './parser';\nexport { default as getDomain } from './utils/get-domain';\n", "import type { Request$method } from './interfaces';\n\nexport const REQUEST_METHODS: Array<Request$method> = [\n 'GET',\n 'HEAD',\n 'POST',\n 'PATCH',\n 'DELETE',\n 'OPTIONS'\n];\n", "import entries from '../../../../../utils/entries';\n\nconst DELIMITER = /^(.+)\\[(.+)]$/g;\n\n/**\n * @private\n */\nexport default function parseNestedObject(\n source: Record<string, unknown>\n): Record<string, unknown> {\n return entries(source).reduce<Record<string, unknown>>(\n (result, [key, value]) => {\n if (DELIMITER.test(key)) {\n const parentKey = key.replace(DELIMITER, '$1');\n const parentValue = Reflect.get(result, parentKey);\n\n return {\n ...result,\n [parentKey]: {\n ...(parentValue || {}),\n [key.replace(DELIMITER, '$2')]: value\n }\n };\n }\n\n return {\n ...result,\n [key]: value\n };\n },\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Request query/body parsing coerces genuinely untyped input (nested arrays of\n * string values from the URL) into normalized param shapes; the `any` arrays\n * are confined to those raw-value positions.\n */\nimport { camelize } from 'inflection';\n\nimport { INT, NULL, BOOL, DATE, TRUE, BRACKETS } from '../constants';\nimport isNull from '../../../../../utils/is-null';\nimport entries from '../../../../../utils/entries';\nimport underscore from '../../../../../utils/underscore';\nimport { camelizeKeys } from '../../../../../utils/transform-keys';\nimport type { Request$method } from '../../interfaces';\n\n/**\n * @private\n */\nfunction makeArray(source: string | Array<string>): Array<string> {\n if (!Array.isArray(source)) {\n return source.includes(',') ? source.split(',') : [source];\n }\n\n return source;\n}\n\n/**\n * @private\n */\nfunction formatString(source: string, method: Request$method): unknown {\n if (method === 'GET') {\n if (source.indexOf(',') >= 0) {\n return source.split(',').map(str => camelize(underscore(str), true));\n } else if (INT.test(source)) {\n return Number.parseInt(source, 10);\n } else if (BOOL.test(source)) {\n return TRUE.test(source);\n } else if (NULL.test(source)) {\n return null;\n }\n }\n\n if (DATE.test(source)) {\n return new Date(source);\n }\n\n return source;\n}\n\n/**\n * @private\n */\nfunction formatObject(\n source: Record<string, unknown> | Array<any>,\n method: Request$method,\n formatter: (\n params: Record<string, unknown>,\n method: Request$method\n ) => Record<string, unknown>\n): Record<string, unknown> | Array<any> {\n if (Array.isArray(source)) {\n return source.map(value => {\n if (INT.test(value)) {\n return Number.parseInt(value, 10);\n }\n\n return value;\n });\n }\n\n return formatter(source, method);\n}\n\n/**\n * @private\n */\nexport function formatSort(sort: string): string {\n if (sort.startsWith('-')) {\n return `-${camelize(underscore(sort.substr(1)), true)}`;\n }\n\n return camelize(underscore(sort), true);\n}\n\n/**\n * @private\n */\nexport function formatFields(\n fields: Record<string, unknown>\n): Record<string, unknown> {\n return entries(fields).reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: makeArray(value as string | Array<string>)\n }),\n {}\n );\n}\n\n/**\n * @private\n */\nexport function formatInclude(include: string | Array<string>): Array<string> {\n return makeArray(include);\n}\n\n/**\n * @private\n */\nexport default function format(\n params: Record<string, unknown>,\n method: Request$method\n): Record<string, unknown> {\n const result = entries(params).reduce<Record<string, unknown>>(\n (obj, param) => {\n const [, value] = param;\n let [key] = param;\n\n key = key.replace(BRACKETS, '');\n\n switch (typeof value) {\n case 'object':\n return {\n ...obj,\n [key]: isNull(value)\n ? null\n : formatObject(\n value as Record<string, unknown> | Array<any>,\n method,\n format\n )\n };\n\n case 'string':\n return {\n ...obj,\n [key]: formatString(value, key === 'id' ? 'GET' : method)\n };\n\n default:\n return {\n ...obj,\n [key]: value\n };\n }\n },\n {}\n );\n\n return camelizeKeys(result, true);\n}\n", "export const INT = /^\\d+$/;\nexport const NULL = /^null$/;\nexport const BOOL = /^(?:true|false)$/;\nexport const DATE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(Z|\\+\\d{4})$/;\nexport const TRUE = /^true$/;\nexport const BRACKETS = /(?:\\[])/g;\n", "import { camelize, dasherize } from 'inflection';\n\nimport entries from './entries';\nimport underscore from './underscore';\n\ntype Transformer = (key: string) => string;\n\n/**\n * Rewrites an object's keys with `transformer`.\n *\n * Overloaded rather than Flow's `T -> T`, which was inaccurate: transforming\n * keys produces a differently-shaped object, so the object form returns\n * `Record<string, unknown>`. Arrays are passed through as a shallow copy (their\n * keys are not transformed), so they keep their element type.\n *\n * @private\n */\nexport function transformKeys<T>(\n source: T[],\n transformer: Transformer,\n deep?: boolean\n): T[];\nexport function transformKeys(\n source: object,\n transformer: Transformer,\n deep?: boolean\n): Record<string, unknown>;\nexport function transformKeys(\n source: object | unknown[],\n transformer: Transformer,\n deep: boolean = false\n): object | unknown[] {\n if (Array.isArray(source)) {\n return source.slice(0);\n } else if (source && typeof source === 'object') {\n return entries(source as Record<string, unknown>).reduce<\n Record<string, unknown>\n >((result, [key, value]) => {\n const recurse =\n deep &&\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date);\n\n if (recurse) {\n return {\n ...result,\n [transformer(key)]: transformKeys(value as object, transformer, true)\n };\n }\n\n return {\n ...result,\n [transformer(key)]: value\n };\n }, {});\n }\n\n return {};\n}\n\n/**\n * @private\n */\nexport function camelizeKeys<T>(source: T[], deep?: boolean): T[];\nexport function camelizeKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function camelizeKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n return transformKeys(\n source as object,\n key => camelize(underscore(key), true),\n deep\n );\n}\n\n/**\n * @private\n */\nexport function dasherizeKeys<T>(source: T[], deep?: boolean): T[];\nexport function dasherizeKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function dasherizeKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n // NOTE: the Flow original passed a second `true` argument to `dasherize`,\n // which takes only one parameter \u2014 it was silently ignored, so dropping it\n // is behaviour-preserving.\n return transformKeys(\n source as object,\n key => dasherize(underscore(key)),\n deep\n );\n}\n\n/**\n * @private\n */\nexport function underscoreKeys<T>(source: T[], deep?: boolean): T[];\nexport function underscoreKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function underscoreKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n return transformKeys(source as object, key => underscore(key), deep);\n}\n", "import isObject from '../../../../../utils/is-object';\nimport type { Request } from '../../interfaces';\n\nimport parseNestedObject from './parse-nested-object';\nimport format, { formatSort, formatFields, formatInclude } from './format';\n\n/**\n * @private\n */\nexport default function parseRead({\n method,\n url: { query }\n}: Request): Record<string, unknown> {\n const { sort, fields, include, ...params } = parseNestedObject(query);\n\n if (sort) {\n params.sort = typeof sort === 'string' ? formatSort(sort) : sort;\n }\n\n if (fields) {\n params.fields = isObject(fields) ? formatFields(fields) : fields;\n }\n\n if (include) {\n params.include = formatInclude(include as string | Array<string>);\n }\n\n return format(params, method);\n}\n", "import createServerError from '../../../utils/create-server-error';\nimport { line } from '../../../../logger';\n\n/**\n * @private\n */\nclass MalformedRequestError extends SyntaxError {\n constructor() {\n super(line`\n There was an error parsing the request body. Please make sure that the\n request body is a valid JSON API document.\n `);\n }\n}\n\nexport default createServerError(MalformedRequestError, 400);\n", "import { MalformedRequestError } from '../errors';\nimport { tryCatchSync } from '../../../../../utils/try-catch';\nimport type { Request } from '../../interfaces';\n\nimport format from './format';\n\n/**\n * @private\n */\nexport default function parseWrite(\n req: Request\n): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let body = '';\n const cleanUp = () => {\n req.removeAllListeners('end');\n req.removeAllListeners('data');\n req.removeAllListeners('error');\n };\n\n req.on('data', data => {\n body += data.toString();\n });\n\n req.once('end', () => {\n const parsed = tryCatchSync(() => JSON.parse(body));\n\n cleanUp();\n\n if (parsed) {\n resolve(format(parsed, req.method));\n } else {\n reject(new MalformedRequestError());\n }\n });\n\n req.once('error', err => {\n cleanUp();\n reject(err);\n });\n });\n}\n", "import type { Request } from '../interfaces';\n\nimport parseRead from './utils/parse-read';\nimport parseWrite from './utils/parse-write';\n\n/**\n * @private\n */\nexport function parseRequest(req: Request): Promise<Record<string, unknown>> {\n switch (req.method) {\n case 'POST':\n case 'PATCH':\n return parseWrite(req).then(params => ({\n ...parseRead(req),\n ...params\n }));\n\n default:\n return Promise.resolve(parseRead(req));\n }\n}\n", "import type { Request } from '../interfaces';\n\n/**\n * @private\n */\nexport default function getDomain({\n headers,\n\n connection: { encrypted }\n}: Request): string {\n return `http${encrypted ? 's' : ''}://${headers.get('host') || 'localhost'}`;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createResponse` receives the raw Node response object and augments it in\n * place into the framework's `Response` shape; the parameter is genuinely\n * untyped at that boundary.\n */\nimport type { Response, Response$opts } from './interfaces';\n\n/**\n * @private\n */\nexport function createResponse(res: any, opts: Response$opts): Response {\n return Object.assign(res, opts, {\n stats: []\n });\n}\n", "export const VERSION = '1.0';\nexport const MIME_TYPE = 'application/vnd.api+json';\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass NotAcceptableError extends TypeError {\n constructor(accept: string) {\n super(line`\n Every '${MIME_TYPE}' in Accept: '${accept}' has media type parameters,\n which are not supported. Try your request again with '${MIME_TYPE}'\n without parameters.\n `);\n }\n}\n\nexport default createServerError(NotAcceptableError, 406);\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass UnsupportedMediaTypeError extends TypeError {\n constructor(contentType: string) {\n super(line`\n Media type parameters are not supported in Content-Type:\n '${contentType}'. Try your request again with Content-Type:\n '${MIME_TYPE}' without parameters.\n `);\n }\n}\n\nexport default createServerError(UnsupportedMediaTypeError, 415);\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass InvalidContentTypeError extends TypeError {\n constructor(contentType: string = 'undefined') {\n super(line`\n Content-Type: '${contentType}' is not supported. Try your request again\n with Content-Type: '${MIME_TYPE}'.\n `);\n }\n}\n\nexport default createServerError(InvalidContentTypeError, 415);\n", "export type MediaType = {\n // `type/subtype`, lowercased \u2014 media types are case-insensitive.\n type: string;\n\n // Media type parameters as written (`name=value`), trimmed.\n params: Array<string>;\n};\n\nconst QUALITY = /^q\\s*=/i;\n\n/**\n * Split `value` on `delimiter`, ignoring delimiters inside quoted strings\n * (parameter values may be quoted and contain `,` or `;`).\n *\n * @private\n */\nfunction splitUnquoted(value: string, delimiter: string): Array<string> {\n const parts: Array<string> = [];\n let current = '';\n let quoted = false;\n let escaped = false;\n\n for (const char of value) {\n if (escaped) {\n escaped = false;\n } else if (quoted && char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n quoted = !quoted;\n } else if (!quoted && char === delimiter) {\n parts.push(current);\n current = '';\n continue;\n }\n\n current += char;\n }\n\n return [...parts, current];\n}\n\n/**\n * Parse a single media type, e.g. a `Content-Type` header value.\n *\n * @private\n */\nexport function parseMediaType(value: string): MediaType {\n const [type = '', ...params] = splitUnquoted(value, ';').map(part =>\n part.trim()\n );\n\n return {\n type: type.toLowerCase(),\n params: params.filter(Boolean)\n };\n}\n\n/**\n * Parse an `Accept` header into its media ranges.\n *\n * Per RFC 7231 \u00A75.3.2 the `q` weight (and any accept-extension after it) is\n * not a media type parameter, so it is not reported in `params`.\n *\n * @private\n */\nexport function parseAccept(value: string): Array<MediaType> {\n return splitUnquoted(value, ',')\n .map(range => {\n const { type, params } = parseMediaType(range);\n const quality = params.findIndex(param => QUALITY.test(param));\n\n return {\n type,\n params: quality === -1 ? params : params.slice(0, quality)\n };\n })\n .filter(({ type }) => type.length > 0);\n}\n", "import { MIME_TYPE } from '../constants';\n\nimport { parseMediaType } from './media-type';\n\n/**\n * Whether a media type is the JSON:API media type, ignoring parameters.\n *\n * @private\n */\nexport default function isJSONAPI(value: string): boolean {\n return parseMediaType(value).type === MIME_TYPE;\n}\n", "import { parseMediaType } from './media-type';\n\n/**\n * Whether a media type (e.g. a `Content-Type` value) carries parameters.\n *\n * @private\n */\nexport default function hasMediaTypeParams(value: string): boolean {\n return parseMediaType(value).params.length > 0;\n}\n", "const isEnv = (value: string) => (): boolean => process.env.NODE_ENV === value;\n\nexport const isDevelopment: () => boolean = isEnv('development');\nexport const isProduction: () => boolean = isEnv('production');\nexport const isTest: () => boolean = isEnv('test');\n", "import { VERSION } from '../../../jsonapi';\nimport { STATUS_CODES } from '../../constants';\nimport * as env from '../../../../utils/env';\nimport type { JSONAPI$Document, JSONAPI$ErrorObject } from '../../../jsonapi';\n\n/**\n * @private\n */\nexport default function dataFor(\n status: number,\n err?: Error\n): string | JSONAPI$Document {\n if (status < 400 || status > 599) {\n return '';\n }\n\n const title = STATUS_CODES.get(status);\n const errData: JSONAPI$ErrorObject = {\n status: status.toString()\n };\n\n if (title) {\n errData.title = title;\n }\n\n if (err && (env.isDevelopment() || /^\\[public\\]/gi.test(err.message))) {\n errData.detail = err.message.replace(/^\\[public\\]/gi, '');\n }\n\n return {\n errors: [errData],\n\n jsonapi: {\n version: VERSION\n }\n };\n}\n", "import { STATUS_CODES } from '../../constants';\nimport stringify from '../../../../utils/stringify';\n\nimport dataFor from './data-for';\n\n/**\n * @private\n */\nexport default function normalize(data?: unknown) {\n let normalized;\n let statusCode;\n\n switch (typeof data) {\n case 'boolean':\n if (data) {\n statusCode = 204;\n } else {\n statusCode = 401;\n normalized = dataFor(statusCode);\n }\n break;\n\n case 'number':\n if (STATUS_CODES.has(data)) {\n statusCode = data;\n } else {\n statusCode = 404;\n }\n normalized = dataFor(statusCode);\n break;\n\n case 'object':\n if (!data) {\n statusCode = 404;\n normalized = dataFor(statusCode);\n } else if (data instanceof Error) {\n statusCode =\n parseInt(String((data as { statusCode?: unknown }).statusCode), 10) ||\n 500;\n normalized = dataFor(statusCode, data);\n } else {\n normalized = data;\n }\n break;\n\n case 'undefined':\n statusCode = 404;\n normalized = dataFor(statusCode);\n break;\n\n default:\n normalized = data;\n }\n\n return {\n statusCode,\n data: stringify(normalized)\n };\n}\n", "import type { Response } from '../../index';\n\nexport default function hasContentType(res: Response) {\n let contentType = res.getHeader('Content-Type');\n\n if (!contentType) {\n contentType = res.getHeader('content-type');\n }\n\n return Boolean(contentType);\n}\n", "import { MIME_TYPE } from '../../jsonapi';\nimport type { Request, Response } from '../index';\n\nimport normalize from './utils/normalize';\nimport hasContentType from './utils/has-content-type';\n\n/**\n * @private\n */\nexport function createResponder(req: Request, res: Response) {\n return function respond(data?: unknown) {\n const normalized = normalize(data);\n\n if (normalized.statusCode) {\n Reflect.set(res, 'statusCode', normalized.statusCode);\n }\n\n if (res.statusCode !== 204 && !hasContentType(res)) {\n res.setHeader('Content-Type', MIME_TYPE);\n }\n\n res.end(normalized.data);\n };\n}\n", "import { MIME_TYPE, parseAccept, NotAcceptableError } from '../../jsonapi';\n\n/**\n * JSON:API 1.0: respond 406 if the Accept header contains the JSON:API media\n * type and *all* instances of it are modified with media type parameters.\n * An Accept header without the JSON:API media type is left alone.\n *\n * @private\n */\nexport default function validateAccept(accept?: string): true {\n if (accept) {\n const ranges = parseAccept(accept).filter(({ type }) => type === MIME_TYPE);\n\n if (ranges.length && ranges.every(({ params }) => params.length)) {\n throw new NotAcceptableError(accept);\n }\n }\n\n return true;\n}\n", "import {\n isJSONAPI,\n hasMediaTypeParams,\n InvalidContentTypeError,\n UnsupportedMediaTypeError\n} from '../../jsonapi';\n\n/**\n * JSON:API 1.0: respond 415 if the Content-Type is the JSON:API media type\n * with any media type parameters. A missing or different Content-Type is\n * also answered with 415, since that is the only type the server accepts.\n *\n * @private\n */\nexport default function validateContentType(contentType?: string): true {\n if (!contentType || !isJSONAPI(contentType)) {\n throw new InvalidContentTypeError(contentType);\n } else if (hasMediaTypeParams(contentType)) {\n throw new UnsupportedMediaTypeError(contentType);\n }\n\n return true;\n}\n", "import type { Response } from '../index';\nimport type { Server$cors } from '../interfaces';\n\nexport default function setCORSHeaders(\n res: Response,\n { origin, methods, headers, enabled }: Server$cors\n) {\n if (!enabled) {\n return;\n }\n\n if (origin) {\n res.setHeader('Access-Control-Allow-Origin', origin);\n }\n\n if (methods) {\n res.setHeader('Access-Control-Allow-Methods', methods.join());\n }\n\n if (headers) {\n res.setHeader('Access-Control-Allow-Headers', headers.join());\n }\n}\n", "import entries from './entries';\nimport isObject from './is-object';\n\nfunction hasOwnProperty(target: object, key: string): boolean {\n return Reflect.apply(Object.prototype.hasOwnProperty, target, [key]);\n}\n\n/**\n * @private\n */\nexport default function merge<T extends object, U extends object>(\n dest: T,\n source: U\n): T & U {\n return entries(source as Record<string, unknown>).reduce<\n Record<string, unknown>\n >(\n (result, [key, value]) => {\n if (hasOwnProperty(result, key) && isObject(value)) {\n const currentValue = Reflect.get(result, key);\n\n if (isObject(currentValue)) {\n return {\n ...result,\n [key]: merge(currentValue, value)\n };\n }\n }\n\n return {\n ...result,\n [key]: value\n };\n },\n { ...dest } as Record<string, unknown>\n ) as T & U;\n}\n", "import omit from '../../../utils/omit';\nimport entries from '../../../utils/entries';\nimport type { ModelClass } from '../../database';\nimport type { Request$params } from '../../server';\n\ntype Controller$query = {\n id?: number | string | Buffer;\n filter?: Record<string, unknown>;\n select: Array<string>;\n page?: number;\n limit?: number;\n sort?: [string, string];\n include: Record<string, Array<string>>;\n};\n\n/**\n * @private\n */\nexport default function paramsToQuery(\n model: ModelClass,\n { id, page, sort, filter, fields, include }: Request$params\n): Controller$query {\n const relationships = entries(model.relationships);\n const includedFields = omit(fields, model.resourceName);\n\n let query: Controller$query = {\n id,\n filter,\n select: [\n model.primaryKey,\n ...(Reflect.get(fields, model.resourceName) as Array<string>)\n ],\n include: {}\n };\n\n if (page) {\n query = {\n ...query,\n page: page.number,\n limit: page.size\n };\n }\n\n if (sort) {\n if (sort.startsWith('-')) {\n query = {\n ...query,\n sort: [sort.substr(1), 'DESC']\n };\n } else {\n query = {\n ...query,\n sort: [sort, 'ASC']\n };\n }\n }\n\n const includedFieldsMap = entries(includedFields).reduce<\n Record<string, Array<string>>\n >((result, field) => {\n const [key] = field;\n const [, rawValue] = field;\n\n const [name, relationship] =\n relationships.find(\n ([, { model: related }]) => key === related.resourceName\n ) || [];\n\n if (!name || !relationship) {\n return result;\n }\n\n let value = rawValue as Array<string>;\n\n if (!value.includes(relationship.model.primaryKey)) {\n value = [relationship.model.primaryKey, ...value];\n }\n\n if (include && value.length === 1 && include.includes(name)) {\n value = [...value, ...relationship.model.serializer.attributes];\n } else if (!include && value.length > 1) {\n value = value.slice(0, 1);\n }\n\n return {\n ...result,\n [name]: value\n };\n }, {});\n\n return {\n ...query,\n include: includedFieldsMap\n };\n}\n", "import merge from '../../../utils/merge';\nimport type { Model, ModelClass, Query } from '../../database';\nimport type { Request } from '../../server';\n\nimport paramsToQuery from './params-to-query';\n\n/**\n * @private\n */\nexport default function findOne<T extends Model>(\n model: ModelClass<T>,\n req: Request\n): Query<T> {\n const params = merge(req.defaultParams, req.params);\n const { id, select, include } = paramsToQuery(model, params);\n\n return model\n .find(id)\n .select(...select)\n .include(include);\n}\n", "import merge from '../../../utils/merge';\nimport type { Model, ModelClass, Query } from '../../database';\nimport type { Request } from '../../server';\n\nimport paramsToQuery from './params-to-query';\n\n/**\n * @private\n */\nexport default function findMany<T extends Model>(\n model: ModelClass<T>,\n req: Request\n): Query<Array<Model>> {\n const params = merge(req.defaultParams, req.params);\n const { sort, page, limit, select, filter, include } = paramsToQuery(\n model,\n params\n );\n\n return model\n .select(...select)\n .include(include)\n .limit(limit)\n .page(page)\n .where(filter)\n .order(...(sort as [string, string]));\n}\n", "import entries from '../../../utils/entries';\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * @private\n */\nexport default function resolveRelationships<T extends Model>(\n model: ModelClass<T>,\n relationships: Record<string, unknown> = {}\n): Record<string, unknown> {\n return entries(relationships).reduce<Record<string, unknown>>(\n (obj, [key, value]) => {\n let { data = null } = (value as { data?: unknown } | null) || {};\n\n if (data) {\n const opts = model.relationshipFor(key);\n\n if (opts) {\n const Related = opts.model as new (attrs: unknown) => Model;\n\n if (Array.isArray(data)) {\n data = data.map(item => Reflect.construct(Related, [item]));\n } else {\n data = Reflect.construct(Related, [data]);\n }\n }\n }\n\n return {\n ...obj,\n [key]: data\n };\n },\n {}\n );\n}\n", "import type { Controller$builtIn } from './index';\n\nexport const BUILT_IN_ACTIONS: ReadonlyArray<Controller$builtIn> =\n Object.freeze(['show', 'index', 'create', 'update', 'destroy']);\n", "import { getDomain } from '../server';\nimport { freezeProps } from '../freezeable';\nimport type Serializer from '../serializer';\nimport type { Model, ModelClass, Query } from '../database';\nimport type { Request, Response } from '../server';\n\nimport findOne from './utils/find-one';\nimport findMany from './utils/find-many';\nimport resolveRelationships from './utils/resolve-relationships';\nimport type {\n Controller$opts,\n Controller$beforeAction,\n Controller$afterAction\n} from './interfaces';\n\n/**\n * ## Overview\n *\n * The Controller class is responsible for taking in requests from the outside\n * world and returning the appropriate response.\n *\n * Think of a Controller as a server at a restaurant. A client makes a request\n * to an application, that request is routed to the appropriate Controller and\n * then the Controller interprets the request and returns data relative to what\n * the client has request.\n *\n * #### Actions\n *\n * Controller actions are functions that call on a Controller in response to an\n * incoming HTTP request. The job of Controller actions are to return the data\n * that the Lumen Application will respond with.\n *\n * There is no special API for Controller actions. They are simply functions\n * that return a value. If an action returns a Query or Promise the resolved\n * value will be used rather than the immediate return value of the action.\n *\n * Below you will find a table showing the different types of responses you can\n * get from different action return values. Keep in mind, Lumen is agnostic to\n * whether or not the value is returned synchronously or resolved from a\n * Promise.\n *\n * | Return/Resolved Value | Response |\n * |------------------------------|--------------------------------------------|\n * | Array<Model> or Model | Serialized JSON String |\n * | Array or Object Literal | JSON String |\n * | String Literal | Plain Text |\n * | Number Literal | [HTTP Status Code](https://goo.gl/T2lMc7) |\n * | true | [204 No Content](https://goo.gl/GxKoqz) |\n * | false | [401 Unauthorized](https://goo.gl/60QqCW) |\n *\n * **Built-In Actions**\n *\n * Built-in actions refer to Controller actions that you get for free when\n * extending the Controller class (show, index, create, update, destroy). These\n * actions are highly optimized to load only the attributes and relationships\n * that are defined in the resolved Serializer for a Controller.\n *\n * If applicable, built-in actions support the following features described in\n * the [JSON API specification](http://jsonapi.org/):\n *\n * - [Sorting](http://jsonapi.org/format/#fetching-sorting)\n * - [Filtering](http://jsonapi.org/format/#fetching-filtering)\n * - [Pagination](http://jsonapi.org/format/#fetching-pagination)\n * - [Sparse Fieldsets](http://jsonapi.org/format/#fetching-sparse-fieldsets)\n * - [Including Related Resources](http://jsonapi.org/format/#fetching-includes)\n *\n * **Extending Built-In Actions**\n *\n * Considering the amount of functionality built-in actions provide, you will\n * rarely need to override the default behavior of a built-in action. In the\n * event that you do need to override a built-in action, you have the ability to\n * opt back into the built-in logic by calling the super class.\n *\n * Read actions such as index and show return a Query which allows us to chain\n * methods to the super call. In the following example we will extend the\n * default behavior of the index action to only match records that meet an\n * additional hard-coded set of conditions. We will still be able to use all of\n * the functionality that the built-in index action provides.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n *\n * class PostsController extends Controller {\n * index(request, response) {\n * return super.index(request, response).where({\n * isPublic: true\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * **Custom Actions**\n *\n * Sometimes it is necessary to add a custom action to a Controller. Lumen allows\n * you to do so by adding an instance method to a Controller. In the following\n * example you will see how to add a custom action with the name `check` to a\n * Controller. We are implementing this action to use as a health check for the\n * application so we want to return the `Number` literal `204`.\n *\n * ```javascript\n * // app/controllers/health.js\n * import { Controller } from 'lumen-framework';\n *\n * class HealthController extends Controller {\n * async check() {\n * return 204;\n * }\n * }\n *\n * export default HealthController;\n * ```\n *\n * The example above is nice but we can make the code a bit more concise with an\n * Arrow `Function`.\n *\n * ```javascript\n * // app/controllers/health.js\n * import { Controller } from 'lumen-framework';\n *\n * class HealthController extends Controller {\n * check = async () => 204;\n * }\n *\n * export default HealthController;\n * ```\n *\n * Using an Arrow Function instead of a traditional method Controller can be\n * useful when immediately returning a value. However, there are a few downsides\n * to using an Arrow `Function` for a Controller action, such as not being able\n * to call the `super class`. This can be an issue if you are looking to extend\n * a built-in action.\n *\n * Another use case for a custom action could be to return a specific scope of\n * data from a `Model`. Let's implement\n * a custom `drafts` route on a `PostsController`.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n * import Post from 'app/models/posts';\n *\n * class PostsController extends Controller {\n * drafts() {\n * return Post.where({\n * isPublic: false\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * While the example above works, we would have to implement all the custom\n * logic that we get for free with built-in actions. Since we aren't getting too\n * crazy with our custom action we can likely just call the `index` action and\n * chain a `.where()` to it.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n *\n * class PostsController extends Controller {\n * drafts(request, response) {\n * return this.index(request, response).where({\n * isPublic: false\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * Now we can sort, filter, and paginate our custom `drafts` route!\n *\n * #### Middleware\n *\n * Middleware can be a very powerful tool in many Node.js server frameworks. Lumen\n * is no exception. Middleware can be used to execute logic before or after a\n * Controller action is executed.\n *\n * There are two hooks where you can execute middleware functions,\n * `beforeAction` and `afterAction`. Functions added to the `beforeAction` hook\n * will execute before the Controller action and functions added to the\n * `afterAction` hook will be executed after the `Controller` action.\n *\n * **Context**\n *\n * Middleware functions will be bound to the Controller they are added to upon\n * the start of an Application.\n *\n * Due to the lexical binding of arrow functions, if you need to use the `this`\n * keyword within a middleware function, declare the middleware function using\n * the `function` keyword and not as an arrow function.\n *\n * **Scoping Middleware**\n *\n * Middleware is scoped by Controller and includes a parent Controller's\n * middleware recursively until the parent Controller is the root\n * `ApplicationController`. This allows you to implement custom logic that can\n * be executed for resources, namespaces, or an entire Application.\n *\n * Let's say we want to require authentication for every route in our\n * Application. All we have to do is move our authentication middleware function\n * from the example above to the `ApplicationController`.\n *\n * ```javascript\n * // app/controllers/application.js\n * import { Controller } from 'lumen-framework';\n *\n * class ApplicationController extends Controller {\n * beforeAction = [\n * async function authenticate(request) {\n * if (!request.currentUser) {\n * // 401 Unauthorized\n * return false;\n * }\n * }\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * **Execuation Order**\n *\n * Understanding the execution order of middleware functions and a `Controller`\n * action is essential to productivity with Lumen. Depending on what you use case\n * is, you may want your function to execute at different times in the\n * `request` / `response` cycle.\n *\n * 1. Parent `Controller` `beforeAction` hooks\n * 2. `Controller` `beforeAction` hooks\n * 3. `Controller` Action\n * 4. `Controller` `afterAction` hooks\n * 5. Parent `Controller` `afterAction` hooks\n *\n * **Modules**\n *\n * It is considered a best practice to define your middleware functions in\n * separate file and export them for use throughout an Application. Typically\n * this is done within an `app/middleware` directory.\n *\n * ```javascript\n * // app/middleware/authenticate.js\n * export default async function authenticate(request) {\n * if (!request.currentUser) {\n * // 401 Unauthorized\n * return false;\n * }\n * }\n * ```\n *\n * This keeps the Controller code clean, easier to read, and easier to modify.\n *\n * ```javascript\n * // app/controllers/application.js\n * import { Controller } from 'lumen-framework';\n * import authenticate from 'app/middleware/authenticate';\n *\n * class ApplicationController extends Controller {\n * beforeAction = [\n * authenticate\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * @class Controller\n * @public\n */\nclass Controller {\n /**\n * An array of custom query parameter keys that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * For security reasons, query parameters passed to Controller actions from an\n * incoming request other than sort, filter, and page must have their key\n * whitelisted.\n *\n * ```javascript\n * class UsersController extends Controller {\n * // Allow the following custom query parameters to be used for this\n * // Controller's actions.\n * query = [\n * 'cache'\n * ];\n * }\n * ```\n *\n * @property query\n * @type {Array}\n * @default []\n * @public\n */\n query: Array<string> = [];\n\n /**\n * An array of sort query parameter values that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property sort\n * @type {Array}\n * @default []\n * @public\n */\n sort: Array<string> = [];\n\n /**\n * An array of filter query parameter keys that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property filter\n * @type {Array}\n * @default []\n * @public\n */\n filter: Array<string> = [];\n\n /**\n * An array of parameter keys that are allowed to reach a Controller instance\n * from an incoming `POST` or `PATCH` request body.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property params\n * @type {Array}\n * @default []\n * @public\n */\n params: Array<string> = [];\n\n /**\n * Functions to execute on each request handled by a `Controller` before the\n * `Controller` action is executed.\n *\n * Functions added to the `beforeAction` hook behave similarly to `Controller`\n * actions, however, they are expected to return `undefined`. If a middleware\n * function returns a value other than `undefined` the `request` / `response`\n * cycle will end before remaining middleware and/or Controller actions are\n * executed. This makes the `beforeAction` hook a very powerful tool for\n * dealing with many common tasks, such as authentication.\n *\n * Functions called from the `beforeAction` hook will have `request` and\n * `response` objects passed as arguments.\n *\n * **Example:**\n *\n * ```javascript\n * import { Controller } from 'lumen-framework';\n *\n * const UNSAFE_METHODS = /(?:POST|PATCH|DELETE)/i;\n *\n * function isAdmin(user) {\n * if (user) {\n * return user.isAdmin;\n * }\n *\n * return false;\n * }\n *\n * async function authentication(request) {\n * const { method, currentUser } = request;\n * const isUnsafe = UNSAFE_METHODS.test(method);\n *\n * if (isUnsafe && !isAdmin(currentUser)) {\n * return false; // 401 Unauthorized if the current user is not an admin.\n * }\n * }\n *\n * class PostsController extends Controller {\n * beforeAction = [\n * authentication\n * ];\n * }\n *\n * export default PostsController;\n * ```\n *\n * @property beforeAction\n * @type {Array}\n * @default []\n * @public\n */\n beforeAction: Array<Controller$beforeAction> = [];\n\n /**\n * Functions to execute on each request handled by a `Controller` after the\n * `Controller` action is executed.\n *\n * Functions called from the `afterAction` hook will have `request` and\n * `response` objects passed as arguments as well as a third `payload`\n * argument. The `payload` argument is a reference to the resolved data of\n * the Controller action that was called within the current `request` /\n * `response` cycle. You need to explicitly return this `payload` in order for\n * the afterAction to resolve with it's data. If you return a modified value\n * from a function added to the `afterAction` hook, that value will be used\n * instead of the resolved data from the preceding Controller action.\n * Subsequent hooks called from an `afterAction` hook will will use the value\n * returned or resolved from the preceding hook. This makes `afterAction` a\n * great place to modify the data you are sending back to the client.\n *\n * **Example:**\n *\n * ```javascript\n * import { Controller } from 'lumen-framework';\n *\n * async function addCopyright(request, response, payload) {\n * const { action } = request;\n *\n * if (payload && action !== preflight) {\n * return {\n * ...payload,\n * meta: {\n * copyright: '2016 (c) Postlight'\n * }\n * };\n * }\n *\n * return payload;\n * }\n *\n * class ApplicationController extends Controller {\n * afterAction = [\n * addCopyright\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * @property afterAction\n * @type {Array}\n * @default []\n * @public\n */\n afterAction: Array<Controller$afterAction> = [];\n\n /**\n * The default amount of items to include per each response of the index\n * action if a `?page[size]` query parameter is not specified.\n *\n * @property defaultPerPage\n * @type {Number}\n * @default 25\n * @public\n */\n defaultPerPage: number = 25;\n\n /**\n * The resolved Model for a Controller instance.\n *\n * @property model\n * @type {Model}\n * @private\n */\n declare model: ModelClass<Model>;\n\n /**\n * A reference to the root Controller for the namespace that a Controller\n * instance is a member of.\n *\n * @property parent\n * @type {?Controller}\n * @private\n */\n declare parent: Controller | null;\n\n /**\n * The namespace that a Controller instance is a member of.\n *\n * @property namespace\n * @type {String}\n * @private\n */\n declare namespace: string;\n\n /**\n * The resolved Serializer for a Controller instance.\n *\n * @property serializer\n * @type {Serializer}\n * @private\n */\n declare serializer: Serializer<Model>;\n\n /**\n * A Map instance containing a reference to all the Controller within an\n * Application instance.\n *\n * @property controllers\n * @type {Map}\n * @private\n */\n declare controllers: Map<string, Controller>;\n\n /**\n * A boolean value representing whether or not a Controller instance has a\n * Model.\n *\n * @property hasModel\n * @type {Boolean}\n * @private\n */\n declare hasModel: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance is within\n * a namespace.\n *\n * @property hasNamespace\n * @type {Boolean}\n * @private\n */\n declare hasNamespace: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance has a\n * Serializer.\n *\n * @property hasSerializer\n * @type {Boolean}\n * @private\n */\n declare hasSerializer: boolean;\n\n constructor({ model, namespace, serializer }: Controller$opts) {\n Object.assign(this, {\n model,\n namespace,\n serializer,\n hasModel: Boolean(model),\n hasNamespace: Boolean(namespace),\n hasSerializer: Boolean(serializer)\n });\n\n freezeProps(this, true, 'model', 'namespace', 'serializer');\n\n freezeProps(this, false, 'hasModel', 'hasNamespace', 'hasSerializer');\n }\n\n /**\n * This method supports filtering, sorting, pagination, including\n * relationships, and sparse fieldsets via query parameters. For more\n * information, see the [fetching resources](https://goo.gl/q7FVgZ) section of\n * the JSON API specification.\n *\n * @method index\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with an array of Model instances.\n * @public\n */\n index(req: Request): Query<Array<Model>> {\n return findMany(this.model, req);\n }\n\n /**\n * This method supports including relationships, and sparse fieldsets via\n * query parameters. For more information, see the [fetching resources](\n * https://goo.gl/q7FVgZ) section of the JSON API specification.\n *\n * @method show\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with a Model instance with the id equal to the\n * id url parameter.\n * @public\n */\n show(req: Request): Query<Model> {\n return findOne(this.model, req);\n }\n\n /**\n * Create and return a single Model instance that the Controller instance\n * represents. For more information, see the [creating resources](\n * https://goo.gl/4Obc9t) section of the JSON API specification.\n *\n * @method create\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the newly created Model instance.\n * @public\n */\n async create(req: Request, res: Response): Promise<Model> {\n const { model } = this;\n\n const {\n url: { pathname },\n params: {\n data: { attributes, relationships }\n }\n } = req;\n\n const record = await model.create({\n ...attributes,\n ...resolveRelationships(model, relationships)\n });\n\n res.setHeader(\n 'Location',\n `${getDomain(req) + pathname}/${record.getPrimaryKey()}`\n );\n\n Reflect.set(res, 'statusCode', 201);\n\n return record.unwrap();\n }\n\n /**\n * Update and return a single Model instance that the Controller instance\n * represents. For more information, see the [updating resources](\n * https://goo.gl/o2ZdOR)section of the JSON API specification.\n *\n * @method update\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the updated Model if changes occur.\n * Resolves with the number `204` if no changes occur.\n * @public\n */\n update(req: Request): Promise<number | Model> {\n const { model } = this;\n\n return findOne(model, req)\n .then(record => {\n const {\n params: {\n data: { attributes, relationships }\n }\n } = req;\n\n return record.update({\n ...attributes,\n ...resolveRelationships(model, relationships)\n });\n })\n .then(record => {\n if (record.didPersist) {\n return record.unwrap();\n }\n\n return 204;\n });\n }\n\n /**\n * Destroy a single Model instance that the Controller instance represents.\n * For more information, see the [deleting resources](https://goo.gl/nUZn8t)\n * section of the JSON API specification.\n *\n * @method destroy\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the number `204`.\n * @public\n */\n destroy(req: Request): Promise<number> {\n return findOne(this.model, req)\n .then(record => record.destroy())\n .then(() => 204);\n }\n\n /**\n * Respond to HEAD or OPTIONS requests.\n *\n * @method preflight\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the number `204`.\n * @public\n */\n preflight(): Promise<number> {\n return Promise.resolve(204);\n }\n}\n\nexport default Controller;\nexport { BUILT_IN_ACTIONS } from './constants';\n\nexport type {\n Controller$opts,\n Controller$builtIn,\n Controller$beforeAction,\n Controller$afterAction\n} from './interfaces';\n", "import { dasherize } from 'inflection';\n\nimport { VERSION } from '../jsonapi';\nimport { freezeProps } from '../freezeable';\nimport uniq from '../../utils/uniq';\nimport underscore from '../../utils/underscore';\nimport promiseHash from '../../utils/promise-hash';\nimport { dasherizeKeys } from '../../utils/transform-keys';\nimport type { Model, ModelClass } from '../database';\nimport type {\n JSONAPI$Document,\n JSONAPI$DocumentLinks,\n JSONAPI$ResourceObject,\n JSONAPI$RelationshipObject\n} from '../jsonapi';\n\nimport type { Serializer$opts } from './interfaces';\n\n/**\n * ## Overview\n *\n * The Serializer class is used to describe which attributes and relationships\n * to include for a particular resource.\n *\n * The attributes and relationships you declare in a Serializer will determine\n * the attributes and relationships that will be included in the response from\n * the resource that the Serializer represents.\n *\n * #### Attributes\n *\n * You can add attributes to your serializer using an array assigned to the\n * class property `attributes` like the example below.\n *\n * ```javascript\n * class UsersSerializer extends Serializer {\n * attributes = [\n * 'name',\n * 'email',\n * 'username',\n * 'createdAt',\n * 'updatedAt'\n * ];\n * }\n * ```\n *\n * Since the attributes required for a resource are declared ahead of time in a\n * Serializer, Lumen will optimize SQL queries for the resource to only include\n * what the Serializer needs to build the response.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * The Serializer above would result in resources returned from the `/posts`\n * endpoint to only include the `body`, `title`, and `createdAt` attributes. If\n * we wanted include an additional attribute such as `isPublic`, we would have\n * to add `'isPublic'` to the `attributes` property.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * #### Associations\n *\n * Similar to `attributes` you can declare associations by adding relationship\n * names to either the `hasOne` or `hasMany` property arrays on a Serializer.\n *\n * Serializers are not concerned with ownership when it comes to associations,\n * so both `hasOne` and `belongsTo` associations can be specified in the\n * `hasOne` array property.\n *\n * ```javascript\n * import { Model } from 'lumen-framework';\n *\n * class Post extends Model {\n * static hasOne = {\n * image: {\n * inverse: 'post'\n * }\n * };\n *\n * static hasMany = {\n * tags: {\n * inverse: 'posts',\n * through: 'categorization'\n * },\n *\n * comments: {\n * inverse: 'post'\n * }\n * };\n *\n * static belongsTo = {\n * user: {\n * inverse: 'posts'\n * }\n * };\n * }\n *\n * export default Post;\n * ```\n *\n * To include the `user` and `image` associations in the response returned from\n * the `/posts` endpoint, we must specify both associations in the `hasOne`\n * property array of the Serializer.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * If we wanted to also include the `tags` and `comments` in the response, we\n * have to add a `hasMany` array property containing `'tags'` and `'comments'`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * You no longer need to specify that `tags` is a many to many relationship\n * using the `Categorization` model as a join table.\n *\n * #### Including Related Resources\n *\n * When requesting related resources for an endpoint, the included resource will\n * follow the serialization rules defined by the included resources Serializer.\n *\n * If we request that the `posts` association is included from the `/users`\n * endpoint, we will only get the `attributes` that the `PostsSerializer` has\n * defined even though the response is processed by the `UsersSerializer`.\n *\n * #### Sparse Fieldsets\n *\n * When a request specifies the fields that it would like included in the\n * response, the fields **MUST** be declared in the `attributes` property array\n * of the resources Serializer, or they will be ignored.\n *\n * #### Namespaces\n *\n * When using namespaces, you are not required to have a Serializer for each\n * resource as long as a Serializer for the given resource can be resolved\n * upstream.\n *\n * For example, if you have a `posts` resource and you decide to implement an\n * admin namespace, you only need to export an `AdminPostsSerializer` from\n * `app/serializers/admin/posts.js` if you want to specify different attributes\n * or relationships than the `PostsSerializer` exported from\n * `app/serializers/posts.js`.\n *\n * In the event that you do want to specify different attributes or\n * relationships that the `PostsSerializer` exported from\n * `app/serializers/posts.js`, you are not required to extend `PostsSerializer`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n *\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * To add the `isPublic` attribute to the response payload of requests to a\n * `/admin/posts` endpoint we can do either of the following examples:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import PostsSerializer from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * OR\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import { Serializer } from 'lumen-framework';\n *\n * class AdminPostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n *\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * Even with inheritance, the examples above are a tad repetitive. We can\n * improve this code by exporting constants from `app/serializers/posts.js`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * export const HAS_ONE = [\n * 'user',\n * 'image'\n * ];\n *\n * export const HAS_MANY = [\n * 'tags',\n * 'comments'\n * ];\n *\n * export const ATTRIBUTES = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n *\n * class PostsSerializer extends Serializer {\n * hasOne = HAS_ONE;\n * hasMany = HAS_MANY;\n * attributes = ATTRIBUTES;\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * If we choose to use inheritance, our code can look like this:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import PostsSerializer, { ATTRIBUTES } from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * attributes = [\n * ...ATTRIBUTES,\n * 'isPublic'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * If we choose not use inheritance, our code can look like this:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import { Serializer } from 'lumen-framework';\n * import { HAS_ONE, HAS_MANY, ATTRIBUTES } from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * hasOne = HAS_ONE;\n * hasMany = HAS_MANY;\n *\n * attributes = [\n * ...ATTRIBUTES,\n * 'isPublic'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * @class Serializer\n * @public\n */\nclass Serializer<T extends Model> {\n /**\n * An Array of the `hasOne` or `belongsTo` relationships on a Serializer\n * instance's Model to include in the\n * `relationships` resource object of a serialized payload.\n *\n * ```javascript\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user'\n * ];\n * }\n * ```\n *\n * @property hasOne\n * @type {Array}\n * @default []\n * @public\n */\n hasOne: Array<string> = [];\n\n /**\n * An Array of the `hasMany` relationships on a Serializer instance's Model to\n * include in the `relationships` resource object of a serialized payload.\n *\n * ```javscript\n * class PostsSerializer extends Serializer {\n * hasMany = [\n * 'comments'\n * ];\n * }\n * ```\n *\n * @property hasMany\n * @type {Array}\n * @default []\n * @public\n */\n hasMany: Array<string> = [];\n\n /**\n * An array of the `attributes` on a Serializer instance's Model to include in\n * the `attributes` resource object of a serialized payload.\n *\n * ```javscript\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title'\n * ];\n * }\n * ```\n *\n * @property attributes\n * @type {Array}\n * @default []\n * @public\n */\n attributes: Array<string> = [];\n\n /**\n * The resolved Model that a Serializer instance represents.\n *\n * @property model\n * @type {Model}\n * @private\n */\n declare model: ModelClass<T>;\n\n /**\n * A reference to the root Serializer for the namespace that a Serializer\n * instance is a member of.\n *\n * @property parent\n * @type {?Serializer}\n * @private\n */\n declare parent: Serializer<Model> | null;\n\n /**\n * The namespace that a Serializer instance is a member of.\n *\n * @property namespace\n * @type {String}\n * @private\n */\n declare namespace: string;\n\n constructor({ model, parent, namespace }: Serializer$opts<T>) {\n Object.assign(this, {\n model,\n parent,\n namespace\n });\n\n freezeProps(this, true, 'model', 'parent', 'namespace');\n }\n\n /**\n * Transform an array of Model instances or a single Model instance into a\n * [JSON API](http://jsonapi.org) document object.\n *\n * @method format\n *\n * @param {Object} options - An options object used for building the\n * returned [JSON API](http://jsonapi.org) document object.\n *\n * @param {Model|Array} options.data - The Model instance or array of\n * Model instances to transform into the returned [JSON API](\n * http://jsonapi.org) document object.\n *\n * @param {Object} options.links - An object containing links to include in\n * the top level links object of the returned [JSON API](http://jsonapi.org)\n * document object.\n *\n * @param {String} options.domain - A string used to build links included in\n * the resource and relationship objects in the returned [JSON API](\n * http://jsonapi.org) document object.\n *\n * @param {Array} options.include - An array of strings containing the\n * relationship keys that should be added to the top level included object of\n * the returned [JSON API](http://jsonapi.org) document object.\n *\n * @return {Promise} Resolves with a [JSON API](http://jsonapi.org) document\n * object.\n *\n * @private\n */\n async format({\n data,\n links,\n domain,\n include\n }: {\n data: T | Array<T>;\n links: JSONAPI$DocumentLinks;\n domain: string;\n include: Array<string>;\n }): Promise<JSONAPI$Document> {\n let serialized: Record<string, unknown> = {};\n const included: Array<JSONAPI$ResourceObject> = [];\n\n if (Array.isArray(data)) {\n serialized = {\n data: await Promise.all(\n data.map(item =>\n this.formatOne({\n item,\n domain,\n include,\n included\n })\n )\n )\n };\n } else {\n serialized = {\n data: await this.formatOne({\n domain,\n include,\n included,\n item: data,\n links: false\n })\n };\n }\n\n if (included.length) {\n serialized = {\n ...serialized,\n included: uniq(included, 'id', 'type')\n };\n }\n\n // The document is assembled from dynamic model data; its pieces are typed\n // structurally above, so assert the fully-built JSON:API shape here.\n return {\n ...serialized,\n links,\n\n jsonapi: {\n version: VERSION\n }\n } as JSONAPI$Document;\n }\n\n /**\n * Transform a single Model instance into a [JSON API](http://jsonapi.org)\n * resource object.\n *\n * @method formatOne\n *\n * @param {Object} options - An options object used for building the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Model} options.item - The Model instance to transform into the\n * returned [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Object} options.links - An object containing links to include in\n * the top level links object of the returned [JSON API](http://jsonapi.org)\n * resource object.\n *\n * @param {String} options.domain - A string used to build links included in\n * the top level links object or relationship links objects in the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Array} options.include - An array of strings containing the\n * relationship keys that should be added to the top level included object of\n * a [JSON API](http://jsonapi.org) document object.\n *\n * @param {Array} options.included - An array of [JSON API](\n * http://jsonapi.org) resource objects that will be added to the top level\n * included array of a [JSON API](http://jsonapi.org) document object.\n *\n * @param {Boolean} options.formatRelationships - Wether or not\n * relationships should be formatted and included in the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @return {Promise} Resolves with a [JSON API](http://jsonapi.org) resource\n * object.\n *\n * @private\n */\n async formatOne({\n item,\n links,\n domain,\n include,\n included,\n formatRelationships = true\n }: {\n item: T;\n links?: boolean;\n domain: string;\n include: Array<string>;\n included: Array<JSONAPI$ResourceObject>;\n formatRelationships?: boolean;\n }): Promise<JSONAPI$ResourceObject> {\n const { resourceName: type } = item;\n const id = String(item.getPrimaryKey());\n let relationships: Record<string, unknown> = {};\n\n const attributes = dasherizeKeys(\n item.getAttributes(\n ...Object.keys(item.rawColumnData).filter(key =>\n this.attributes.includes(key)\n )\n )\n );\n\n const serialized: JSONAPI$ResourceObject = {\n id,\n type,\n attributes: attributes as JSONAPI$ResourceObject['attributes']\n };\n\n if (formatRelationships) {\n relationships = await promiseHash(\n [...this.hasOne, ...this.hasMany].reduce<Record<string, unknown>>(\n (hash, name) => ({\n ...hash,\n\n [dasherize(underscore(name))]: (async () => {\n const related = (await Reflect.get(item, name)) as\n Model | Array<Model> | null | undefined;\n\n if (Array.isArray(related)) {\n return {\n data: await Promise.all(\n related.map(async relatedItem => {\n const { data: relatedData } =\n await this.formatRelationship({\n domain,\n included,\n item: relatedItem,\n include: include.includes(name)\n });\n\n return relatedData;\n })\n )\n };\n } else if (related && (related as { id?: unknown }).id != null) {\n return this.formatRelationship({\n domain,\n included,\n item: related,\n include: include.includes(name)\n });\n }\n\n return {\n data: null\n };\n })()\n }),\n {}\n )\n );\n }\n\n if (Object.keys(relationships).length) {\n serialized.relationships =\n relationships as JSONAPI$ResourceObject['relationships'];\n }\n\n if (links || typeof links !== 'boolean') {\n const { namespace } = this;\n\n if (namespace) {\n serialized.links = {\n self: `${domain}/${namespace}/${type}/${id}`\n };\n } else {\n serialized.links = {\n self: `${domain}/${type}/${id}`\n };\n }\n }\n\n return serialized;\n }\n\n /**\n * Transform a single Model instance into a [JSON API](http://jsonapi.org)\n * relationship object.\n *\n * @method formatRelationship\n *\n * @param {Object} options - An options object used for building the returned\n * [JSON API](http://jsonapi.org) relationship object.\n *\n * @param {Model} options.item - The Model instance to transform into the\n * returned [JSON API](http://jsonapi.org) relationship object.\n *\n * @param {String} options.domain - A string used to build links included in\n * the returned [JSON API](http://jsonapi.org) relationship object.\n *\n * @param {Array} options.include - An array of strings containing the\n * relationship keys that should be added to the top level included object of\n * a [JSON API](http://jsonapi.org) document object.\n *\n * @param {Array} options.included - An array of [JSON API](\n * http://jsonapi.org) resource objects that will be added to the top level\n * included array of a [JSON API](http://jsonapi.org) document object.\n *\n * @return {Promise} Resolves with a [JSON API](http://jsonapi.org)\n * relationship object.\n *\n * @private\n */\n async formatRelationship({\n item,\n domain,\n include,\n included\n }: {\n item: Model;\n domain: string;\n include: boolean;\n included: Array<JSONAPI$ResourceObject>;\n }): Promise<JSONAPI$RelationshipObject> {\n const { namespace } = this;\n const {\n resourceName: type,\n constructor: { serializer }\n } = item;\n const id = String(item.getPrimaryKey());\n let links;\n\n if (namespace) {\n links = {\n self: `${domain}/${namespace}/${type}/${id}`\n };\n } else {\n links = {\n self: `${domain}/${type}/${id}`\n };\n }\n\n if (include) {\n included.push(\n await serializer.formatOne({\n item,\n domain,\n include: [],\n included: [],\n formatRelationships: false\n })\n );\n }\n\n return {\n data: {\n id,\n type\n },\n links\n };\n }\n}\n\nexport default Serializer;\n", "import { NODE_ENV } from '../../constants';\n\nimport type { Config } from './interfaces';\n\nexport function createDefaultConfig(): Config {\n const isTestENV = NODE_ENV === 'test';\n const isProdENV = NODE_ENV === 'production';\n\n return {\n server: {\n cors: {\n enabled: false\n }\n },\n logging: {\n level: isProdENV ? 'INFO' : 'DEBUG',\n format: isProdENV ? 'json' : 'text',\n enabled: !isTestENV,\n\n filter: {\n params: []\n }\n }\n };\n}\n\nexport type { Config } from './interfaces';\n", "/**\n * @private\n */\nexport default function normalizeName(str: string): string {\n let name = str;\n\n if (name.startsWith('/')) {\n name = name.substr(1);\n }\n\n if (name.endsWith('/')) {\n name = name.substr(0, name.length - 1);\n }\n\n return name;\n}\n", "/**\n * @private\n */\nexport default function normalizePath(str: string): string {\n let path = str;\n\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n if (path.endsWith('/')) {\n path = path.substr(0, path.length - 1);\n }\n\n return path;\n}\n", "import { FreezeableSet, freezeProps } from '../../freezeable';\nimport type Controller from '../../controller';\nimport type { Route, Router$Namespace } from '../index';\n\nimport normalizeName from './utils/normalize-name';\nimport normalizePath from './utils/normalize-path';\nimport type { Namespace$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Namespace extends FreezeableSet<Route | Router$Namespace> {\n declare name: string;\n\n declare path: string;\n\n declare isRoot: boolean;\n\n declare namespace: Router$Namespace;\n\n declare controller: Controller;\n\n declare controllers: Map<string, Controller>;\n\n constructor({\n name,\n path,\n namespace,\n controller,\n controllers\n }: Namespace$opts) {\n super();\n\n Object.assign(this, {\n controller,\n controllers,\n name: normalizeName(name),\n path: normalizePath(path),\n isRoot: path === '/',\n namespace: namespace || this\n });\n\n freezeProps(this, true, 'name', 'path', 'controller', 'namespace');\n\n freezeProps(this, false, 'isRoot', 'controllers');\n }\n}\n\nexport default Namespace;\n\nexport { default as normalizeName } from './utils/normalize-name';\nexport { default as normalizePath } from './utils/normalize-path';\n\nexport type { Namespace$opts } from './interfaces';\n", "import entries from './entries';\n\n/**\n * A replacement for querystring.stringify that supports nested objects.\n *\n * @private\n */\nexport default function createQueryString(\n src: Record<string, unknown>,\n prop?: string\n): string {\n return entries(src).reduce((str, [key, value], index) => {\n let result = str;\n\n if (index > 0) {\n result += '&';\n }\n\n if (prop) {\n result += `${\n prop + encodeURIComponent('[') + key + encodeURIComponent(']')\n }=`;\n } else {\n result += `${key}=`;\n }\n\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n result += value.map(item => encodeURIComponent(String(item))).join();\n } else {\n result =\n result.substr(0, result.length - (key.length + 1)) +\n createQueryString(value as Record<string, unknown>, key);\n }\n } else if (!value && typeof value !== 'number') {\n result += 'null';\n } else {\n result += encodeURIComponent(String(value));\n }\n\n return result;\n }, '');\n}\n", "import omit from '../../../../../utils/omit';\nimport merge from '../../../../../utils/merge';\nimport createQueryString from '../../../../../utils/create-query-string';\nimport type { Request$params } from '../../../../server';\nimport type { JSONAPI$DocumentLinks } from '../../../../jsonapi';\n\nfunction createLinkTemplate({\n total,\n params,\n domain,\n pathname,\n defaultPerPage\n}: {\n total: number;\n params: Request$params;\n domain: string;\n pathname: string;\n defaultPerPage: number;\n}) {\n const { page: { size = defaultPerPage } = {} } = params;\n const baseURL = `${domain}${pathname}`;\n const queryURL = `${baseURL}?`;\n const baseParams = omit(params, 'page');\n const lastPageNum = total > 0 ? Math.ceil(total / size) : 1;\n\n if (size && size !== defaultPerPage) {\n baseParams.page = { size };\n }\n\n const hasParams = Object.keys(baseParams).length;\n\n return function linkTemplate(\n pageNum: number | 'first' | 'last'\n ): string | null {\n let normalized: number;\n\n switch (pageNum) {\n case 'first':\n normalized = 1;\n break;\n\n case 'last':\n normalized = lastPageNum;\n break;\n\n default:\n normalized = pageNum;\n }\n\n if (normalized < 1 || normalized > lastPageNum) {\n return null;\n } else if (normalized > 1) {\n const paramsForPage = merge(baseParams, {\n page: {\n number: normalized\n }\n });\n\n return (\n queryURL + createQueryString(paramsForPage as Record<string, unknown>)\n );\n }\n\n return hasParams\n ? queryURL + createQueryString(baseParams as Record<string, unknown>)\n : baseURL;\n };\n}\n\n/**\n * @private\n */\nexport default function createPageLinks(opts: {\n total: number;\n params: Request$params;\n domain: string;\n pathname: string;\n defaultPerPage: number;\n}): JSONAPI$DocumentLinks {\n const { page: { number = 1 } = {} } = opts.params;\n const linkForPage = createLinkTemplate(opts);\n\n return {\n self: linkForPage(number),\n first: linkForPage('first'),\n last: linkForPage('last'),\n prev: linkForPage(number - 1),\n next: linkForPage(number + 1)\n };\n}\n", "import { Query } from '../../../../database';\nimport { getDomain } from '../../../../server';\nimport type { Request, Response } from '../../../../server';\nimport createPageLinks from '../utils/create-page-links';\nimport type { Action } from '../interfaces';\n\n/**\n * @private\n */\nexport default function resource(action: Action<unknown>): Action<unknown> {\n const resourceAction = async function (req: Request, res: Response) {\n const {\n route: { action: actionName }\n } = req;\n const result = action(req, res);\n let links = {};\n let data;\n let total;\n\n if (actionName === 'index' && result instanceof Query) {\n [data, total] = await Promise.all([result, Query.from(result).count()]);\n } else {\n data = await result;\n }\n\n if (Array.isArray(data) || (data && data.isModelInstance)) {\n const domain = getDomain(req);\n\n const {\n params,\n url: { path, pathname },\n route: {\n controller: { namespace, serializer, defaultPerPage }\n }\n } = req;\n\n const include = params.include || [];\n\n if (actionName === 'index') {\n links = createPageLinks({\n params,\n domain,\n pathname,\n defaultPerPage,\n total: total || 0\n });\n } else if (actionName !== 'index' && namespace) {\n links = {\n self: domain.replace(`/${namespace}`, '') + path\n };\n } else if (actionName !== 'index' && !namespace) {\n links = {\n self: domain + path\n };\n }\n\n return serializer.format({\n data,\n links,\n domain,\n include\n });\n }\n\n return data;\n };\n\n Reflect.defineProperty(resourceAction, 'name', {\n value: action.name\n });\n\n return resourceAction;\n}\n", "export const FINAL_HANDLER = '__FINAL_HANDLER__';\n", "import type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function getActionName({ route: { action } }: Request): string {\n return action;\n}\n", "import type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function getControllerName({\n route: {\n controller: {\n constructor: { name }\n }\n }\n}: Request): string {\n return name;\n}\n", "import { FINAL_HANDLER } from '../constants';\nimport getActionName from '../utils/get-action-name';\nimport getControllerName from '../utils/get-controller-name';\nimport type { Request, Response } from '../../../../server';\nimport type { Action } from '../interfaces';\n\n/**\n * @private\n */\nexport default function trackPerf<T, U extends Action<T>>(\n action: U\n): Action<T> {\n const trackedAction = async function (\n req: Request,\n res: Response,\n data?: unknown\n ) {\n const start = Date.now();\n const result = await action(req, res, data);\n let { name } = action;\n let type = 'middleware';\n\n if (name === FINAL_HANDLER) {\n type = 'action';\n name = getActionName(req);\n } else if (!name) {\n name = 'anonymous';\n }\n\n res.stats.push({\n type,\n name,\n duration: Date.now() - start,\n controller: getControllerName(req)\n });\n\n return result;\n };\n\n Reflect.defineProperty(trackedAction, 'name', {\n value: action.name\n });\n\n return trackedAction;\n}\n", "import type Controller from '../../../controller';\n\nimport resource from './enhancers/resource';\nimport trackPerf from './enhancers/track-perf';\nimport type { Action } from './interfaces';\n\n/**\n * @private\n */\nexport function createAction(\n type: string,\n action: Action<unknown>,\n controller: Controller\n): Array<Action<unknown>> {\n let fn = action.bind(controller);\n\n if (type !== 'custom' && controller.hasModel && controller.hasSerializer) {\n fn = resource(fn);\n }\n\n const handlers: Array<Action<unknown>> = [\n ...controller.beforeAction,\n\n function __FINAL_HANDLER__(req, res) {\n return fn(req, res);\n },\n ...controller.afterAction\n ];\n\n return handlers.map(trackPerf);\n}\n\nexport { FINAL_HANDLER } from './constants';\nexport { default as createPageLinks } from './utils/create-page-links';\n\nexport type { Action } from './interfaces';\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterTypeError extends TypeError {\n constructor(param: ParameterLike, actual: string) {\n const { type, path } = param;\n\n super(line`\n Expected type '${type || 'undefined'}' for parameter '${path}' but got\n '${actual}'.\n `);\n }\n}\n\nexport default createServerError(ParameterTypeError, 400);\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterValueError extends TypeError {\n constructor(param: ParameterLike, actual: unknown) {\n super(line`\n Expected value for parameter '${param.path}' to be one of\n [${param.size ? Array.from(param.values()).join(', ') : ''}] but got\n ${String(actual)}.\n `);\n }\n}\n\nexport default createServerError(ParameterValueError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass InvalidParameterError extends TypeError {\n constructor(path: string) {\n super(`'${path}' is not a valid parameter for this resource.`);\n }\n}\n\nexport default createServerError(InvalidParameterError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport { line } from '../../../../logger';\n\n/**\n * @private\n */\nclass ResourceMismatchError extends TypeError {\n constructor(path: string, expected: unknown, actual: unknown) {\n let normalized = actual;\n\n if (typeof normalized === 'string') {\n normalized = `'${String(normalized)}'`;\n }\n\n super(line`\n Expected '${String(expected)}' for parameter '${path}' but got\n ${String(normalized)}.\n `);\n }\n}\n\nexport default createServerError(ResourceMismatchError, 409);\n", "import createServerError from '../../../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass ParameterRequiredError extends TypeError {\n constructor(path: string) {\n super(`Missing required parameter '${path}'.`);\n }\n}\n\nexport default createServerError(ParameterRequiredError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterNotNullableError extends TypeError {\n constructor({ path }: ParameterLike) {\n super(`Parameter '${path}' is not nullable.`);\n }\n}\n\nexport default createServerError(ParameterNotNullableError, 400);\n", "/**\n * @private\n */\nexport default function isBuffer(value: unknown): value is Buffer {\n return value instanceof Buffer;\n}\n", "import ParameterTypeError from '../errors/parameter-type-error';\nimport ParameterNotNullableError from '../errors/parameter-not-nullable-error';\nimport isNull from '../../../../../utils/is-null';\nimport isObject from '../../../../../utils/is-object';\nimport isBuffer from '../../../../../utils/is-buffer';\nimport type { Parameter, ParameterGroup } from '../index';\n\n/**\n * @private\n */\nexport default function validateType(\n param: Parameter | ParameterGroup,\n value: unknown\n): true {\n const { type, required } = param;\n const valueIsNull = isNull(value);\n\n if (required && valueIsNull) {\n throw new ParameterNotNullableError(param);\n } else if (valueIsNull || !type) {\n return true;\n }\n\n const valueType = typeof value;\n let isValid = true;\n\n switch (type) {\n case 'array':\n isValid = Array.isArray(value);\n break;\n\n case 'buffer':\n isValid = isBuffer(value);\n break;\n\n case 'object':\n isValid = isObject(value) || isNull(value);\n break;\n\n case 'date':\n isValid = value instanceof Date;\n break;\n\n default:\n isValid = type === valueType;\n }\n\n if (!isValid) {\n throw new ParameterTypeError(param, valueType);\n }\n\n return true;\n}\n", "import { ParameterRequiredError } from '../../errors';\nimport type ParameterGroup from '../index';\n\n/**\n * @private\n */\nexport default function hasRequiredParams(\n group: ParameterGroup,\n params: Record<string, unknown>\n): boolean {\n for (const [key, { path, required }] of group) {\n if (required && !Reflect.has(params, key)) {\n throw new ParameterRequiredError(path);\n }\n }\n\n return true;\n}\n", "import { FreezeableMap } from '../../../../freezeable';\nimport { InvalidParameterError } from '../errors';\nimport isNull from '../../../../../utils/is-null';\nimport entries from '../../../../../utils/entries';\nimport validateType from '../utils/validate-type';\nimport type { ParameterLike, ParameterLike$opts } from '../index';\n\nimport hasRequiredParams from './utils/has-required-params';\n\n/**\n * @private\n */\nclass ParameterGroup extends FreezeableMap<string, ParameterLike> {\n declare type: string;\n\n declare path: string;\n\n declare required: boolean;\n\n declare sanitize: boolean;\n\n constructor(\n contents: Array<[string, ParameterLike]>,\n { path, required, sanitize }: ParameterLike$opts\n ) {\n super(contents);\n\n Object.assign(this, {\n path,\n type: 'object',\n required: Boolean(required),\n sanitize: Boolean(sanitize)\n });\n\n this.freeze();\n }\n\n validate<V>(params: V): V {\n const validated = {};\n\n if (isNull(params)) {\n return params;\n }\n\n if (\n validateType(this, params) &&\n hasRequiredParams(this, params as Record<string, unknown>)\n ) {\n const { sanitize } = this;\n let { path } = this;\n\n if (path.length) {\n path = `${path}.`;\n }\n\n for (const [key, value] of entries(params as Record<string, unknown>)) {\n const match = this.get(key);\n\n if (match) {\n Reflect.set(validated, key, match.validate(value));\n } else if (!match && !sanitize) {\n throw new InvalidParameterError(`${path}${key}`);\n }\n }\n }\n\n return validated as V;\n }\n}\n\nexport default ParameterGroup;\n", "import isNull from '../../../../../../utils/is-null';\nimport { ParameterValueError, ResourceMismatchError } from '../../errors';\nimport type Parameter from '../index';\n\n/**\n * @private\n */\nfunction validateOne<V>(param: Parameter, value: V): V {\n if (!param.required && isNull(value)) {\n return value;\n }\n\n if (!param.has(value)) {\n let expected;\n\n switch (param.path) {\n case 'data.type':\n [expected] = Array.from(param.values());\n throw new ResourceMismatchError(param.path, expected, value);\n\n default:\n throw new ParameterValueError(param, value);\n }\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport default function validateValue<V>(param: Parameter, value: V): V {\n if (Array.isArray(value)) {\n if (param.sanitize) {\n return value.filter(item => param.has(item)) as V;\n }\n\n for (const item of value) {\n validateOne(param, item);\n }\n } else {\n validateOne(param, value);\n }\n\n return value;\n}\n", "import { FreezeableSet } from '../../../../freezeable';\nimport validateType from '../utils/validate-type';\n\nimport validateValue from './utils/validate-value';\nimport type { Parameter$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Parameter extends FreezeableSet<unknown> {\n declare path: string;\n\n declare type: string;\n\n declare required: boolean;\n\n declare sanitize: boolean;\n\n constructor({ path, type, values, required, sanitize }: Parameter$opts) {\n super(values);\n\n Object.assign(this, {\n path,\n type,\n required: Boolean(required),\n sanitize: Boolean(sanitize)\n });\n\n this.freeze();\n }\n\n validate<V>(value: V): V {\n validateType(this, value);\n\n if (this.size > 0) {\n return validateValue(this, value);\n }\n\n return value;\n }\n}\n\nexport default Parameter;\n", "import Parameter from '../parameter';\nimport type { ParameterLike } from '../interfaces';\n\n/**\n * @private\n */\nexport default function getURLParams(\n dynamicSegments: Array<string>\n): Array<[string, ParameterLike]> {\n return dynamicSegments.map((param): [string, ParameterLike] => [\n param,\n new Parameter({\n path: param,\n required: true\n })\n ]);\n}\n", "import Parameter from '../parameter';\nimport ParameterGroup from '../parameter-group';\nimport isNull from '../../../../../utils/is-null';\nimport { typeForColumn } from '../../../../database';\nimport type Controller from '../../../../controller';\nimport type { ParameterLike } from '../interfaces';\n\n/**\n * @private\n */\nfunction getIDParam({ model }: Controller): [string, ParameterLike] {\n const primaryKeyColumn = model.columnFor(model.primaryKey);\n let primaryKeyType: string | undefined = 'number';\n\n if (primaryKeyColumn) {\n primaryKeyType = typeForColumn(primaryKeyColumn);\n }\n\n return [\n 'id',\n new Parameter({\n type: primaryKeyType,\n path: 'data.id',\n required: true\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getTypeParam({ model }: Controller): [string, ParameterLike] {\n return [\n 'type',\n new Parameter({\n type: 'string',\n path: 'data.type',\n values: [model.resourceName],\n required: true\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getAttributesParam(\n { model, params }: Controller,\n method: 'PATCH' | 'POST'\n): [string, ParameterLike] {\n return [\n 'attributes',\n new ParameterGroup(\n params.reduce<Array<[string, ParameterLike]>>((group, param) => {\n const col = model.columnFor(param);\n\n if (col) {\n const type = typeForColumn(col);\n const path = `data.attributes.${param}`;\n const required =\n method !== 'PATCH' && !col.nullable && isNull(col.defaultValue);\n\n return [...group, [param, new Parameter({ type, path, required })]];\n }\n\n return group;\n }, []),\n {\n path: 'data.attributes',\n sanitize: true\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getRelationshipsParam({\n model,\n params\n}: Controller): [string, ParameterLike] {\n return [\n 'relationships',\n new ParameterGroup(\n params.reduce<Array<[string, ParameterLike]>>((group, param) => {\n const path = `data.relationships.${param}`;\n const opts = model.relationshipFor(param);\n\n if (!opts) {\n return group;\n }\n\n if (opts.type === 'hasMany') {\n return [\n ...group,\n\n [\n param,\n new ParameterGroup(\n [\n [\n 'data',\n new Parameter({\n type: 'array',\n path: `${path}.data`,\n required: true\n })\n ]\n ],\n {\n path\n }\n )\n ]\n ];\n }\n\n const primaryKeyColumn = opts.model.columnFor(opts.model.primaryKey);\n let primaryKeyType: string | undefined = 'number';\n\n if (primaryKeyColumn) {\n primaryKeyType = typeForColumn(primaryKeyColumn);\n }\n\n return [\n ...group,\n\n [\n param,\n new ParameterGroup(\n [\n [\n 'data',\n new ParameterGroup(\n [\n [\n 'id',\n new Parameter({\n type: primaryKeyType,\n path: `${path}.data.id`,\n required: true\n })\n ],\n\n [\n 'type',\n new Parameter({\n type: 'string',\n path: `${path}.data.type`,\n values: [opts.model.resourceName],\n required: true\n })\n ]\n ],\n {\n type: 'array',\n path: `${path}.data`,\n required: true\n }\n )\n ]\n ],\n {\n path\n }\n )\n ]\n ];\n }, []),\n {\n path: 'data.relationships'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nexport default function getDataParams(\n controller: Controller,\n method: 'PATCH' | 'POST',\n includeID: boolean\n): [string, ParameterLike] {\n let params = [getTypeParam(controller)];\n\n if (controller.hasModel) {\n params = [\n getAttributesParam(controller, method),\n getRelationshipsParam(controller),\n ...params\n ];\n\n if (includeID) {\n params = [getIDParam(controller), ...params];\n }\n }\n\n return [\n 'data',\n new ParameterGroup(params, {\n path: 'data',\n required: true\n })\n ];\n}\n", "import type Controller from '../../../../controller';\n\n/**\n * @private\n */\nexport default function getDefaultMemberParams({\n model,\n serializer: { hasOne, hasMany, attributes }\n}: Controller): Record<string, unknown> {\n return {\n fields: {\n [model.resourceName]: attributes,\n ...[...hasOne, ...hasMany].reduce<Record<string, unknown>>(\n (include, key) => {\n const opts = model.relationshipFor(key);\n\n if (!opts || model === opts.model) {\n return include;\n }\n\n return {\n ...include,\n [opts.model.resourceName]: [opts.model.primaryKey]\n };\n },\n {}\n )\n }\n };\n}\n", "import type Controller from '../../../../controller';\n\nimport getDefaultMemberParams from './get-default-member-params';\n\n/**\n * @private\n */\nfunction getDefaultCollectionParams(\n controller: Controller\n): Record<string, unknown> {\n return {\n ...getDefaultMemberParams(controller),\n filter: {},\n sort: 'createdAt',\n page: {\n size: controller.defaultPerPage,\n number: 1\n }\n };\n}\n\nexport default getDefaultCollectionParams;\n", "import Parameter from '../parameter';\nimport ParameterGroup from '../parameter-group';\nimport type Controller from '../../../../controller';\nimport type { ParameterLike } from '../interfaces';\n\n/**\n * @private\n */\nfunction getPageParam(): [string, ParameterLike] {\n return [\n 'page',\n new ParameterGroup(\n [\n ['size', new Parameter({ path: 'page.size', type: 'number' })],\n ['number', new Parameter({ path: 'page.number', type: 'number' })]\n ],\n {\n path: 'page'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getSortParam({ sort }: Controller): [string, ParameterLike] {\n return [\n 'sort',\n new Parameter({\n path: 'sort',\n type: 'string',\n\n values: [...sort, ...sort.map(value => `-${value}`)]\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getFilterParam({ filter }: Controller): [string, ParameterLike] {\n return [\n 'filter',\n new ParameterGroup(\n filter.map(param => [\n param,\n new Parameter({\n path: `filter.${param}`\n })\n ]),\n {\n path: 'filter'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getFieldsParam({\n model,\n serializer: { hasOne, hasMany, attributes }\n}: Controller): [string, ParameterLike] {\n const relationships = [...hasOne, ...hasMany];\n\n return [\n 'fields',\n new ParameterGroup(\n [\n [\n model.resourceName,\n new Parameter({\n path: `fields.${model.resourceName}`,\n type: 'array',\n values: attributes,\n sanitize: true\n })\n ],\n ...relationships.reduce<Array<[string, ParameterLike]>>(\n (result, relationship) => {\n const opts = model.relationshipFor(relationship);\n\n if (opts) {\n return [\n ...result,\n\n [\n opts.model.resourceName,\n new Parameter({\n path: `fields.${opts.model.resourceName}`,\n type: 'array',\n sanitize: true,\n\n values: [\n opts.model.primaryKey,\n ...opts.model.serializer.attributes\n ]\n })\n ]\n ];\n }\n\n return result;\n },\n []\n )\n ],\n {\n path: 'fields',\n sanitize: true\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getIncludeParam({\n serializer: { hasOne, hasMany }\n}: Controller): [string, ParameterLike] {\n const relationships = [...hasOne, ...hasMany];\n\n return [\n 'include',\n new Parameter({\n path: 'include',\n type: 'array',\n values: relationships\n })\n ];\n}\n\n/**\n * @private\n */\nexport function getCustomParams({\n query\n}: Controller): Array<[string, ParameterLike]> {\n return query.map((param): [string, ParameterLike] => [\n param,\n new Parameter({\n path: param\n })\n ]);\n}\n\n/**\n * @private\n */\nexport function getMemberQueryParams(\n controller: Controller\n): Array<[string, ParameterLike]> {\n if (controller.hasModel) {\n return [\n getFieldsParam(controller),\n getIncludeParam(controller),\n ...getCustomParams(controller)\n ];\n }\n\n return getCustomParams(controller);\n}\n\n/**\n * @private\n */\nexport function getCollectionQueryParams(\n controller: Controller\n): Array<[string, ParameterLike]> {\n if (controller.hasModel) {\n return [\n getPageParam(),\n getSortParam(controller),\n getFilterParam(controller),\n getFieldsParam(controller),\n getIncludeParam(controller),\n ...getCustomParams(controller)\n ];\n }\n\n return getCustomParams(controller);\n}\n", "import { ResourceMismatchError } from '../errors';\nimport type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function validateResourceId({\n params: {\n id,\n data: { id: resourceId }\n }\n}: Request): true {\n if (id !== resourceId) {\n throw new ResourceMismatchError('data.id', String(id), String(resourceId));\n }\n\n return true;\n}\n", "import type Controller from '../../../controller';\n\nimport ParameterGroup from './parameter-group';\nimport getURLParams from './utils/get-url-params';\nimport getDataParams from './utils/get-data-params';\nimport getDefaultMemberParams from './utils/get-default-member-params';\nimport getDefaultCollectionParams from './utils/get-default-collection-params';\nimport type { Params$opts } from './interfaces';\nimport {\n getMemberQueryParams,\n getCollectionQueryParams,\n getCustomParams\n} from './utils/get-query-params';\n\n/**\n * @private\n */\nexport function paramsFor({\n type,\n method,\n controller,\n dynamicSegments\n}: Params$opts) {\n let params = getURLParams(dynamicSegments);\n\n if (type === 'member') {\n params = [...params, ...getMemberQueryParams(controller)];\n\n if (method === 'POST' || method === 'PATCH') {\n params = [...params, getDataParams(controller, method, true)];\n }\n } else if (type === 'collection') {\n params = [...params, ...getCollectionQueryParams(controller)];\n\n if (method === 'POST' || method === 'PATCH') {\n params = [...params, getDataParams(controller, method, false)];\n }\n } else if (type === 'custom') {\n params = [...params, ...getCustomParams(controller)];\n }\n\n return new ParameterGroup(params, {\n path: '',\n required: true\n });\n}\n\n/**\n * @private\n */\nexport function defaultParamsFor({\n type,\n controller\n}: {\n type: string;\n controller: Controller;\n}): Record<string, unknown> {\n const { hasModel } = controller;\n\n if (hasModel && type === 'member') {\n return getDefaultMemberParams(controller);\n } else if (hasModel && type === 'collection') {\n return getDefaultCollectionParams(controller);\n }\n\n return {};\n}\n\nexport { default as validateResourceId } from './utils/validate-resource-id';\n\nexport type { ParameterLike, ParameterLike$opts } from './interfaces';\nexport type { default as Parameter } from './parameter';\nexport type { default as ParameterGroup } from './parameter-group';\n", "/**\n * @private\n */\nexport default function getStaticPath(\n path: string,\n dynamicSegments: Array<string>\n): string {\n let staticPath = path;\n\n if (dynamicSegments.length) {\n const pattern = new RegExp(`(${dynamicSegments.join('|')})`, 'g');\n\n staticPath = path.replace(pattern, 'dynamic');\n }\n\n return staticPath;\n}\n", "export const DYNAMIC_PATTERN = /(:\\w+)/g;\n", "import { DYNAMIC_PATTERN } from '../constants';\nimport insert from '../../../../utils/insert';\n\n/**\n * @private\n */\nexport default function getDynamicSegments(path: string): Array<string> {\n const matches = path.match(DYNAMIC_PATTERN) || [];\n const dynamicSegments: Array<string> = new Array(matches.length);\n\n insert(\n dynamicSegments,\n matches.map(part => part.substr(1))\n );\n Object.freeze(dynamicSegments);\n\n return dynamicSegments;\n}\n", "import { FreezeableSet, freezeProps, deepFreezeProps } from '../../freezeable';\nimport type Controller from '../../controller';\nimport type { Request, Response, Request$method } from '../../server';\n\nimport { FINAL_HANDLER, createAction } from './action';\nimport { paramsFor, defaultParamsFor, validateResourceId } from './params';\nimport getStaticPath from './utils/get-static-path';\nimport getDynamicSegments from './utils/get-dynamic-segments';\nimport type { Action } from './action';\nimport type { ParameterGroup } from './params';\nimport type { Route$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Route extends FreezeableSet<Action<unknown>> {\n declare type: string;\n\n declare path: string;\n\n declare action: string;\n\n declare params: ParameterGroup;\n\n declare method: Request$method;\n\n declare controller: Controller;\n\n declare staticPath: string;\n\n declare defaultParams: Record<string, unknown>;\n\n declare dynamicSegments: Array<string>;\n\n constructor({ type, path, action, method, controller }: Route$opts) {\n const dynamicSegments = getDynamicSegments(path);\n\n if (action && controller) {\n const handler = Reflect.get(controller, action);\n\n if (typeof handler === 'function') {\n const params = paramsFor({\n type,\n method,\n controller,\n dynamicSegments\n });\n\n const staticPath = getStaticPath(path, dynamicSegments);\n\n const defaultParams = defaultParamsFor({\n type,\n controller\n });\n\n super(createAction(type, handler, controller));\n\n Object.assign(this, {\n type,\n path,\n params,\n action,\n method,\n controller,\n staticPath,\n defaultParams,\n dynamicSegments\n });\n\n freezeProps(this, true, 'type', 'path');\n\n freezeProps(\n this,\n false,\n 'action',\n 'params',\n 'method',\n 'controller',\n 'staticPath'\n );\n\n deepFreezeProps(this, false, 'defaultParams', 'dynamicSegments');\n } else {\n const {\n constructor: { name: controllerName }\n } = controller;\n\n throw new TypeError(\n `Handler for ${controllerName}#${action} is not a function.`\n );\n }\n } else {\n throw new TypeError(\n 'Arguments `controller` and `action` must not be undefined'\n );\n }\n\n this.freeze();\n }\n\n parseParams(params: Array<string>): Record<string, number> {\n return params.reduce<Record<string, number>>((result, value, idx) => {\n const key = this.dynamicSegments[idx];\n\n if (key) {\n return {\n ...result,\n [key]: Number.parseInt(value, 10)\n };\n }\n\n return result;\n }, {});\n }\n\n async execHandlers(req: Request, res: Response): Promise<unknown> {\n let calledFinal = false;\n let data: unknown;\n\n for (const handler of this) {\n data = await handler(req, res, data);\n\n if (handler.name === FINAL_HANDLER) {\n calledFinal = true;\n }\n\n if (!calledFinal && typeof data !== 'undefined') {\n break;\n }\n }\n\n return data;\n }\n\n async visit(req: Request, res: Response): Promise<unknown> {\n const { defaultParams } = this;\n let params = {\n ...req.params,\n ...this.parseParams(req.url.params)\n };\n\n if (req.method !== 'OPTIONS') {\n params = this.params.validate(params);\n }\n\n Object.assign(req, {\n params,\n defaultParams\n });\n\n if (this.type === 'member' && req.method === 'PATCH') {\n validateResourceId(req);\n }\n\n return this.execHandlers(req, res);\n }\n}\n\nexport default Route;\nexport { DYNAMIC_PATTERN } from './constants';\n\nexport type { Action } from './action';\nexport type { Route$opts, Route$type } from './interfaces';\n", "import { BUILT_IN_ACTIONS, type Controller$builtIn } from '../../../controller';\n\n/**\n * @private\n */\nexport default function normalizeOnly(\n only: Array<Controller$builtIn>\n): Array<Controller$builtIn> {\n return only.filter(action => BUILT_IN_ACTIONS.indexOf(action) >= 0);\n}\n", "import Namespace from '../namespace';\nimport { FreezeableSet } from '../../freezeable';\nimport type { Controller$builtIn } from '../../controller';\n\nimport normalizeOnly from './utils/normalize-only';\nimport type { Resource$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Resource extends Namespace {\n declare only: FreezeableSet<Controller$builtIn>;\n\n constructor({ only, ...opts }: Resource$opts) {\n super(opts);\n\n Reflect.defineProperty(this, 'only', {\n value: new FreezeableSet(normalizeOnly(only)),\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n this.only.freeze();\n }\n}\n\nexport default Resource;\n\nexport type { Resource$opts } from './interfaces';\n", "/**\n * @private\n */\nclass ControllerMissingError extends ReferenceError {\n constructor(resource: string) {\n super(`Could not resolve controller by name '${resource}'`);\n }\n}\n\nexport default ControllerMissingError;\n", "import { Route } from '../../../index';\nimport { normalizeName, normalizePath } from '../../../namespace';\nimport type { Request$method } from '../../../../server';\nimport type { Router$Namespace, Route$type } from '../../../index';\n\n/**\n * @private\n */\nexport default function createDefinition({\n type,\n method,\n namespace\n}: {\n type: Route$type;\n method: Request$method;\n namespace: Router$Namespace;\n}) {\n return function define(name: string, action: string = normalizeName(name)) {\n const normalized = normalizeName(name);\n const { controller } = namespace;\n let { path } = namespace;\n\n if (type === 'member') {\n path += `/:id/${normalized}`;\n } else {\n path += `/${normalized}`;\n }\n\n path = normalizePath(path);\n\n const opts = {\n type,\n path,\n action,\n method,\n controller\n };\n\n namespace\n .add(new Route(opts))\n .add(\n new Route({\n ...opts,\n type: 'custom',\n method: 'HEAD',\n action: 'preflight'\n })\n )\n .add(\n new Route({\n ...opts,\n type: 'custom',\n method: 'OPTIONS',\n action: 'preflight'\n })\n );\n };\n}\n", "import { REQUEST_METHODS } from '../../../../server';\nimport type { Route$type, Router$Namespace } from '../../../index';\n\nimport createDefinition from './create-definition';\n\ntype DefinitionFn = (name: string, action?: string) => void;\n\n/**\n * @private\n */\nexport default function createDefinitionGroup<T extends Router$Namespace>(\n type: Route$type,\n namespace: T\n): Record<string, DefinitionFn> {\n return REQUEST_METHODS.reduce<Record<string, DefinitionFn>>(\n (methods, method) => ({\n ...methods,\n [method.toLowerCase()]: createDefinition({\n type,\n method,\n namespace\n })\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Normalizes the overloaded `resource(name, opts?, builder?)` argument forms\n * the public route DSL accepts. The input tuple is genuinely untyped until this\n * function resolves it into the structured `[opts, builder]` return shape.\n */\nimport {\n BUILT_IN_ACTIONS,\n type Controller$builtIn\n} from '../../../../controller';\n\n/**\n * @private\n */\nexport default function normalizeResourceArgs(args: Array<any>): [\n {\n name: string;\n path: string;\n only: Array<Controller$builtIn>;\n },\n () => void\n] {\n const [name] = args;\n let [, opts, builder] = args;\n\n if (!opts) {\n opts = {\n path: '',\n only: undefined\n };\n }\n\n if (typeof opts === 'function') {\n builder = opts;\n opts = {\n path: '',\n only: undefined\n };\n }\n\n if (typeof builder !== 'function') {\n builder = () => undefined;\n }\n\n opts = {\n ...opts,\n name\n };\n\n if (!opts.path) {\n opts = {\n ...opts,\n path: `/${name}`\n };\n }\n\n if (!opts.only) {\n opts = {\n ...opts,\n only: [...BUILT_IN_ACTIONS]\n };\n }\n\n return [opts, builder];\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * This is the route-definition DSL. `DefinitionContext` collects handler\n * methods with genuinely heterogeneous signatures behind a single index\n * signature, and `resource(...args)` accepts the untyped variadic argument\n * forms the public `resource()` route helper supports; both are normalized at\n * the boundary (see normalize-resource-args). Precise typing here would require\n * full variadic modeling for no real safety gain in internal code.\n */\nimport Resource from '../../resource';\nimport Namespace from '../../namespace';\nimport K from '../../../../utils/k';\nimport type { Router$Namespace } from '../../index';\nimport type { Router$DefinitionBuilder } from '../interfaces';\nimport ControllerMissingError from '../../../../errors/controller-missing-error';\n\nimport createDefinitionGroup from './utils/create-definition-group';\nimport normalizeResourceArgs from './utils/normalize-resource-args';\n\nexport type DefinitionContext = {\n [key: string]: (...args: Array<any>) => unknown;\n};\n\n/**\n * @private\n */\nexport function contextFor(build: Router$DefinitionBuilder<Router$Namespace>) {\n return {\n create(namespace: Router$Namespace): DefinitionContext {\n let context: DefinitionContext = {\n member: K,\n resource: K,\n namespace: K,\n collection: K,\n ...createDefinitionGroup('custom', namespace)\n };\n\n if (namespace instanceof Resource) {\n context = {\n ...context,\n\n member(builder: () => void) {\n const childCtx = createDefinitionGroup('member', namespace);\n\n Reflect.apply(builder, childCtx, []);\n },\n\n collection(builder: () => void) {\n const childCtx = createDefinitionGroup('collection', namespace);\n\n Reflect.apply(builder, childCtx, []);\n }\n };\n } else {\n context = {\n ...context,\n\n namespace(name: string, builder?: () => void) {\n const { isRoot, controllers } = namespace;\n let { path } = namespace;\n\n path = isRoot ? `/${name}` : `${path}/${name}`;\n\n const controllerKey = `${path.substr(1)}/application`;\n const controller = controllers.get(controllerKey);\n\n if (!controller) {\n throw new ControllerMissingError(controllerKey);\n }\n\n const child = new Namespace({\n name,\n path,\n namespace,\n controller,\n controllers\n });\n\n build(builder, child);\n namespace.add(child);\n },\n\n resource(...args: Array<any>) {\n const { controllers } = namespace;\n const [opts, builder] = normalizeResourceArgs(args);\n let path;\n\n if (namespace.isRoot) {\n path = opts.path;\n } else {\n path = namespace.path + opts.path;\n }\n\n const controllerKey = path\n .split('/')\n .filter(Boolean)\n .reduce<Array<string>>(\n (arr, str, index, parts) => [\n ...arr,\n index === parts.length - 1 ? opts.name : str\n ],\n []\n )\n .join('/');\n\n const controller = controllers.get(controllerKey);\n\n if (!controller) {\n throw new ControllerMissingError(controllerKey);\n }\n\n const child = new Resource({\n ...opts,\n path,\n namespace,\n controller,\n controllers\n });\n\n build(builder, child);\n namespace.add(child);\n }\n };\n }\n\n return context;\n }\n };\n}\n", "import Route from '../route';\nimport Resource from '../resource';\nimport type Router from '../index';\nimport type { Router$Namespace } from '../index';\n\nimport { contextFor } from './context';\nimport type { DefinitionContext } from './context';\n\n/**\n * @private\n */\nexport function build<T extends Router$Namespace>(\n builder: (() => void) | undefined,\n namespace: T\n): T {\n const context = contextFor(build).create(namespace);\n\n if (namespace instanceof Resource) {\n const { only } = namespace;\n\n context.member(function member(this: DefinitionContext) {\n if (only.has('show')) {\n this.get('/', 'show');\n }\n\n if (only.has('update')) {\n this.patch('/', 'update');\n }\n\n if (only.has('destroy')) {\n this.delete('/', 'destroy');\n }\n });\n\n context.collection(function collection(this: DefinitionContext) {\n if (only.has('index')) {\n this.get('/', 'index');\n }\n\n if (only.has('create')) {\n this.post('/', 'create');\n }\n });\n }\n\n if (builder) {\n Reflect.apply(builder, context, []);\n }\n\n return namespace;\n}\n\n/**\n * @private\n */\nexport function define<T extends Router$Namespace>(router: Router, parent: T) {\n parent.forEach(child => {\n if (child instanceof Route) {\n const { method, staticPath } = child;\n\n router.set(`${method}:${staticPath}`, child);\n } else {\n define(router, child);\n }\n });\n}\n", "import type Controller from '../../controller';\n\n/**\n * @private\n */\nexport default function createReplacer(\n controllers: Map<string, Controller>\n): RegExp {\n const names = Array.from(controllers)\n .map(([, controller]) => {\n const { model, namespace } = controller;\n\n if (model) {\n return model.resourceName;\n }\n\n let {\n constructor: { name }\n } = controller;\n\n name = name.replace(/controller/gi, '').toLowerCase();\n\n return namespace\n .split('/')\n .reduce((str, part) => str.replace(new RegExp(part, 'ig'), ''), name);\n })\n .filter((str, idx, arr) => idx === arr.lastIndexOf(str))\n .join('|');\n\n return new RegExp(`(${names})/(\\\\d+)`, 'ig');\n}\n", "import { FreezeableMap } from '../freezeable';\nimport type { Request } from '../server';\n\nimport Namespace from './namespace';\nimport Route, { DYNAMIC_PATTERN } from './route';\nimport { build, define } from './definitions';\nimport createReplacer from './utils/create-replacer';\nimport type { Router$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Router extends FreezeableMap<string, Route> {\n declare replacer: RegExp;\n\n constructor({ routes, controller, controllers }: Router$opts) {\n const definitions = build(\n routes,\n new Namespace({\n controller,\n controllers,\n path: '/',\n name: 'root'\n })\n );\n\n super();\n define(this, definitions);\n\n Reflect.defineProperty(this, 'replacer', {\n value: createReplacer(controllers),\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n this.freeze();\n }\n\n match({ method, url }: Request): void | Route {\n const params: Array<string> = [];\n const staticPath = url.pathname.replace(this.replacer, (str, g1, g2) => {\n params.push(g2);\n return `${g1}/:dynamic`;\n });\n\n Reflect.set(url, 'params', params);\n\n return this.get(`${method}:${staticPath}`);\n }\n}\n\nexport default Router;\nexport { Route, DYNAMIC_PATTERN };\n\nexport type { Router$Namespace } from './interfaces';\nexport type { Resource$opts } from './resource';\nexport type { Namespace$opts } from './namespace';\nexport type { Action, Route$opts, Route$type } from './route';\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Loads a compiled app bundle (a manifest of user modules keyed by name) and\n * normalizes it into namespaced maps; the module values are genuinely untyped\n * app code (as they were `Object`/`any` in Flow).\n */\nimport { join as joinPath } from 'path';\n\nimport { Migration } from '../../database';\nimport { FreezeableMap } from '../../freezeable';\nimport { createDefaultConfig } from '../../config';\nimport merge from '../../../utils/merge';\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\n\nimport formatKey from './format-key';\n\nconst SUFFIX_PATTERN = /^.+(Controller|Down|Serializer|Up)/;\n\ntype Bundle = {\n config: Record<string, any>;\n controllers: FreezeableMap<string, any>;\n migrations: FreezeableMap<string, any>;\n models: FreezeableMap<string, any>;\n serializers: FreezeableMap<string, any>;\n};\n\n/**\n * @private\n */\nfunction normalize(manifest: Record<string, any>): Bundle {\n return entries(manifest).reduce<Bundle>(\n (obj, [key, value]) => {\n if (SUFFIX_PATTERN.test(key)) {\n const suffix = key.replace(SUFFIX_PATTERN, '$1');\n const stripSuffix = (source: string) => source.replace(suffix, '');\n\n switch (suffix) {\n case 'Controller':\n obj.controllers.set(formatKey(key, stripSuffix), value);\n break;\n\n case 'Serializer':\n obj.serializers.set(formatKey(key, stripSuffix), value);\n break;\n\n case 'Up':\n case 'Down':\n obj.migrations.set(\n formatKey(key),\n Reflect.construct(Migration, [value])\n );\n break;\n\n default:\n break;\n }\n } else {\n switch (key) {\n case 'Application':\n case 'routes':\n case 'seed':\n Reflect.set(obj, formatKey(key), value);\n break;\n\n case 'config':\n Reflect.set(obj, 'config', {\n ...merge(createDefaultConfig(), {\n ...obj.config,\n ...value\n })\n });\n break;\n\n case 'database':\n Reflect.set(obj, 'config', {\n ...obj.config,\n database: value\n });\n break;\n\n default:\n obj.models.set(formatKey(key), value);\n break;\n }\n }\n\n return obj;\n },\n {\n config: {},\n controllers: new FreezeableMap(),\n migrations: new FreezeableMap(),\n models: new FreezeableMap(),\n serializers: new FreezeableMap()\n }\n );\n}\n\n/**\n * @private\n */\nexport default function bundleFor(path: string): FreezeableMap<string, any> {\n const manifest: Record<string, any> = Reflect.apply(require, null, [\n joinPath(path, 'dist', 'bundle')\n ]);\n\n return chain(manifest)\n .pipe(normalize)\n .pipe(entries)\n .pipe(pairs => new FreezeableMap<string, any>(pairs))\n .value()\n .freeze();\n}\n", "import { dasherize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\nconst NAMESPACE_DELIMITER = /\\$-/g;\n\n/**\n * @private\n */\nexport default function formatKey(\n key: string,\n formatter?: (source: string) => string\n) {\n return chain(key)\n .pipe(str => {\n if (formatter) {\n return formatter(str);\n }\n\n return str;\n })\n .pipe(underscore)\n .pipe(dasherize)\n .pipe(str => str.replace(NAMESPACE_DELIMITER, '/'))\n .value();\n}\n", "import { posix } from 'path';\n\nimport type { Bundle$Namespace } from '../../index';\n\nexport default function closestAncestor<T>(\n source: Bundle$Namespace<T>,\n key: string\n): T | undefined {\n const name = posix.basename(key);\n let namespace = posix.dirname(key);\n\n if (namespace === '.') {\n return source.get(name);\n }\n\n namespace = posix.dirname(namespace);\n\n const ancestor = source.get(posix.join(namespace, name));\n\n if (ancestor) {\n return ancestor;\n }\n\n return closestAncestor(source, posix.join(posix.dirname(namespace), name));\n}\n", "import { posix } from 'path';\n\nimport type { Bundle$Namespace } from '../../index';\n\nexport default function closestChild<T>(\n source: Bundle$Namespace<T>,\n key: string\n): T | undefined {\n const [[, result] = []] = Array.from(source)\n .map(([path, value]): [string, T] => [posix.basename(path), value])\n .filter(([resource]) => key === resource);\n\n return result;\n}\n", "import { FreezeableMap } from '../../freezeable';\nimport type { Bundle$Namespace, Bundle$NamespaceGroup } from '../index';\n\n/**\n * @private\n */\nexport function resolve<T>(\n group: Bundle$Namespace<T>\n): Bundle$NamespaceGroup<T> {\n return Array.from(group)\n .map(([key, value]): [string, T, string] => {\n const parts = key.split('/');\n const namespace = parts.slice(0, Math.max(parts.length - 1, 0)).join('/');\n\n if (namespace) {\n return [key.substr(namespace.length + 1), value, namespace];\n }\n\n return [key, value, 'root'];\n })\n .reduce<Bundle$NamespaceGroup<T>>((map, [key, value, namespace]) => {\n let nsValue = map.get(namespace);\n\n if (!nsValue) {\n nsValue = new FreezeableMap();\n }\n\n return map.set(namespace, nsValue.set(key, value));\n }, new FreezeableMap());\n}\n\nexport { default as closestAncestor } from './utils/closest-ancestor';\nexport { default as closestChild } from './utils/closest-child';\n", "import { posix } from 'path';\n\nimport type { Builder$Construct, Builder$ParentBuilder } from '../interfaces';\nimport type { Builder$NamespaceMeta } from '../interfaces';\n\nimport sortByNamespace from './sort-by-namespace';\n\nexport default function createParentBuilder<T>(\n construct: Builder$Construct<T>\n): Builder$ParentBuilder<T> {\n return target =>\n Array.from(target)\n .sort(sortByNamespace)\n .reduce<Array<Builder$NamespaceMeta<T>>>((result, [key, value]) => {\n const parentClass = value.get('application') || null;\n let parent: T | null = null;\n\n if (parentClass) {\n let grandparent: T | null = null;\n\n if (key !== 'root') {\n const found = result.find(namespace => {\n const dirname = posix.dirname(key);\n\n if (namespace.key === 'root') {\n return dirname === '.';\n }\n\n return dirname === namespace.key;\n });\n\n if (found) {\n grandparent = found.parent;\n }\n }\n\n parent = construct(`${key}/application`, parentClass, grandparent);\n }\n\n return [\n ...result,\n {\n key,\n value,\n parent\n }\n ];\n }, []);\n}\n", "import type { Bundle$Namespace } from '../../index';\n\n/**\n * @private\n */\nexport default function sortByNamespace<T>(\n [a]: [string, Bundle$Namespace<T>],\n [b]: [string, Bundle$Namespace<T>]\n): number {\n if (a === 'root') {\n return -1;\n } else if (b === 'root') {\n return 1;\n }\n\n return Math.min(Math.max(a.length - b.length, -1), 1);\n}\n", "import type { Builder$Construct, Builder$ChildrenBuilder } from '../interfaces';\n\nexport default function createChildrenBuilder<T>(\n construct: Builder$Construct<T>\n): Builder$ChildrenBuilder<T> {\n return target =>\n target.map(({ key, value, parent }) =>\n Array.from(value).map(([name, constructor]): [string, T] => {\n const normalized = key === 'root' ? name : `${key}/${name}`;\n\n if (parent && normalized.endsWith('application')) {\n return [normalized, parent];\n }\n\n return [normalized, construct(normalized, constructor, parent)];\n })\n );\n}\n", "import { FreezeableMap } from '../../freezeable';\nimport { resolve } from '../resolver';\nimport chain from '../../../utils/chain';\nimport type { Bundle$Namespace } from '../index';\n\nimport createParentBuilder from './utils/create-parent-builder';\nimport createChildrenBuilder from './utils/create-children-builder';\nimport type { Builder$Class, Builder$Construct } from './interfaces';\n\n/**\n * @private\n */\nexport function build<T>(\n group: Bundle$Namespace<Builder$Class<T>>,\n construct: Builder$Construct<T>\n): Bundle$Namespace<T> {\n return chain(group)\n .pipe(resolve)\n .pipe(createParentBuilder(construct))\n .pipe(createChildrenBuilder(construct))\n .pipe(arr =>\n arr.reduce<Array<[string, T]>>(\n (result, value) => [...result, ...value],\n []\n )\n )\n .pipe(pairs => new FreezeableMap(pairs))\n .value();\n}\n", "import bundleFor from './utils/bundle-for';\nimport type { Loader } from './interfaces';\n\n/**\n * @private\n */\nexport function createLoader(path: string): Loader {\n let bundle: ReturnType<typeof bundleFor> | undefined;\n\n return function load(type) {\n if (!bundle) {\n bundle = bundleFor(path);\n }\n\n return bundle.get(type);\n };\n}\n\nexport { build } from './builder';\nexport { closestAncestor, closestChild } from './resolver';\n\nexport type {\n Loader,\n Bundle$Namespace,\n Bundle$NamespaceGroup\n} from './interfaces';\n", "/**\n * @private\n */\nexport default function normalizePort(port?: string | number): number {\n switch (typeof port) {\n case 'string':\n return Number.parseInt(port, 10);\n\n case 'number':\n return Math.abs(port);\n\n default:\n return 4000;\n }\n}\n", "import { posix } from 'path';\n\nimport { deepFreezeProps } from '../../freezeable';\nimport { closestAncestor } from '../../loader';\nimport { tryCatchSync } from '../../../utils/try-catch';\nimport type Database from '../../database';\nimport type { Model, ModelClass } from '../../database';\nimport type Controller from '../../controller';\nimport type Serializer from '../../serializer';\nimport type { Bundle$Namespace } from '../../loader';\nimport type { Application$Class } from '../index';\n\nexport default function createController<T extends Controller>(\n constructor: Application$Class<T>,\n opts: {\n key: string;\n store: Database;\n parent?: Controller | null;\n serializers: Bundle$Namespace<Serializer<Model>>;\n }\n): T {\n const { key, store, serializers } = opts;\n const namespace = posix.dirname(key).replace('.', '');\n let { parent } = opts;\n let model: ModelClass | null | undefined = tryCatchSync(() =>\n store.modelFor(posix.basename(key))\n );\n let serializer = serializers.get(key);\n\n if (!model) {\n model = null;\n }\n\n if (!parent) {\n parent = null;\n }\n\n if (!serializer) {\n serializer = closestAncestor(serializers, key);\n }\n\n const instance: T = Reflect.construct(constructor, [\n {\n model,\n namespace,\n serializer\n }\n ]);\n\n if (serializer) {\n if (!instance.filter.length) {\n instance.filter = [...serializer.attributes];\n }\n\n if (!instance.sort.length) {\n instance.sort = [...serializer.attributes];\n }\n }\n\n if (parent) {\n instance.beforeAction = [\n ...parent.beforeAction.map(fn => fn.bind(parent)),\n ...instance.beforeAction.map(fn => fn.bind(instance))\n ];\n\n instance.afterAction = [\n ...instance.afterAction.map(fn => fn.bind(instance)),\n ...parent.afterAction.map(fn => fn.bind(parent))\n ];\n }\n\n Reflect.defineProperty(instance, 'parent', {\n value: parent,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n return deepFreezeProps(\n instance,\n true,\n 'query',\n 'sort',\n 'filter',\n 'params',\n 'beforeAction',\n 'afterAction'\n );\n}\n", "import { posix } from 'path';\n\nimport { deepFreezeProps } from '../../freezeable';\nimport { tryCatchSync } from '../../../utils/try-catch';\nimport type Serializer from '../../serializer';\nimport type { Model, ModelClass } from '../../database';\nimport type { Application$Class, Application$factoryOpts } from '../index';\n\nexport default function createSerializer<T extends Serializer<Model>>(\n constructor: Application$Class<T>,\n opts: Application$factoryOpts<T>\n): T {\n const { key, store } = opts;\n const namespace = posix.dirname(key).replace('.', '');\n let { parent } = opts;\n let model: ModelClass | null | undefined = tryCatchSync(() =>\n store.modelFor(posix.basename(key))\n );\n\n if (!model) {\n model = null;\n }\n\n if (!parent) {\n parent = null;\n }\n\n const instance: T = Reflect.construct(constructor, [\n {\n model,\n parent,\n namespace\n }\n ]);\n\n Reflect.defineProperty(instance, 'parent', {\n value: parent,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n return deepFreezeProps(instance, true, 'hasOne', 'hasMany', 'attributes');\n}\n", "import { LUMEN_CONSOLE } from '../../constants';\nimport Database from '../database';\nimport Logger from '../logger';\nimport Router from '../router';\nimport Server from '../server';\nimport { build, createLoader, closestChild } from '../loader';\nimport { freezeProps, deepFreezeProps } from '../freezeable';\nimport ControllerMissingError from '../../errors/controller-missing-error';\n\nimport normalizePort from './utils/normalize-port';\nimport createController from './utils/create-controller';\nimport createSerializer from './utils/create-serializer';\n\nimport type Controller from '../controller';\nimport type Serializer from '../serializer';\nimport type { Model, ModelClass } from '../database';\nimport type Application from './index';\nimport type { Application$opts } from './index';\n\n/**\n * @private\n */\nexport default async function initialize<T extends Application>(\n app: T,\n { path, port, logging, database, server: serverConfig }: Application$opts\n): Promise<T> {\n const load = createLoader(path);\n const routes = load('routes');\n const models = load('models');\n const logger = new Logger(logging);\n const normalizedPort = normalizePort(port);\n\n const store = await new Database({\n path,\n models,\n logger,\n config: database,\n checkMigrations: true\n });\n\n const serializers = build<Serializer<Model>>(\n load('serializers'),\n (key, value, parent) =>\n createSerializer(value, {\n key,\n store,\n parent\n })\n );\n\n models.forEach((model: ModelClass) => {\n Reflect.defineProperty(model, 'serializer', {\n value: closestChild(serializers, model.resourceName),\n writable: false,\n enumerable: false,\n configurable: false\n });\n });\n\n const controllers = build<Controller>(\n load('controllers'),\n (key, value, parent) =>\n createController(value, {\n key,\n store,\n parent,\n serializers\n })\n );\n\n controllers.forEach((controller: Controller) => {\n Reflect.defineProperty(controller, 'controllers', {\n value: controllers,\n writable: true,\n enumerable: false,\n configurable: false\n });\n });\n\n const ApplicationController = controllers.get('application');\n\n if (!ApplicationController) {\n throw new ControllerMissingError('application');\n }\n\n const router = new Router({\n routes,\n controllers,\n controller: ApplicationController\n });\n\n const server = new Server({\n router,\n logger,\n ...serverConfig\n });\n\n if (!LUMEN_CONSOLE) {\n server.instance.listen(normalizedPort).once('listening', () => {\n if (typeof process.send === 'function') {\n process.send('ready');\n } else {\n // 'ready' is a custom lifecycle event, not one of Process's typed\n // emit overloads.\n (process as NodeJS.EventEmitter).emit('ready');\n }\n });\n }\n\n Object.assign(app, {\n logger,\n models,\n controllers,\n serializers\n });\n\n deepFreezeProps(app, true, 'logger', 'models', 'controllers', 'serializers');\n\n Object.assign(app, {\n path,\n store,\n router,\n server,\n port: normalizedPort\n });\n\n freezeProps(app, false, 'path', 'port', 'store', 'router', 'server');\n\n Object.freeze(app);\n\n return app;\n}\n", "import { createDefaultConfig } from '../config';\nimport merge from '../../utils/merge';\nimport type Logger from '../logger';\nimport type Router from '../router';\nimport type Server from '../server';\nimport type Controller from '../controller';\nimport type Serializer from '../serializer';\nimport type Database from '../database';\nimport type { Model, ModelClass } from '../database';\nimport type { FreezeableMap } from '../freezeable';\n\nimport initialize from './initialize';\nimport type { Application$opts } from './interfaces';\n\n/**\n * @class Application\n * @public\n */\nclass Application {\n /**\n * The path of `Application` instance.\n *\n * @property path\n * @type {String}\n * @public\n */\n declare path: string;\n\n /**\n * The port that an `Application` instance is listening for incomming HTTP\n * requests.\n *\n * @property port\n * @type {Number}\n * @public\n */\n declare port: number;\n\n /**\n * A reference to the `Database` instance.\n *\n * @property store\n * @type {Database}\n * @private\n */\n declare store: Database;\n\n /**\n * A reference to the `Logger` instance.\n *\n * @property logger\n * @type {Logger}\n * @private\n */\n declare logger: Logger;\n\n /**\n * A reference to the `Router` instance.\n *\n * @property router\n * @type {Router}\n * @private\n */\n declare router: Router;\n\n /**\n * A reference to the `Server` instance.\n *\n * @property server\n * @type {Server}\n * @private\n */\n declare server: Server;\n\n /**\n * A map containing each `Model` class.\n *\n * @property models\n * @type {Map}\n * @private\n */\n declare models: FreezeableMap<string, ModelClass>;\n\n /**\n * A map containing each `Controller` instance.\n *\n * @property controllers\n * @type {Map}\n * @private\n */\n declare controllers: FreezeableMap<string, Controller>;\n\n /**\n * A map containing each `Serializer` instance.\n *\n * @property serializers\n * @type {Map}\n * @private\n */\n declare serializers: FreezeableMap<string, Serializer<Model>>;\n\n /**\n * @method constructor\n * @param {Object} config\n * @return {Promise}\n * @public\n */\n constructor(opts: Application$opts) {\n // Applications construct asynchronously (see Database/Watcher); `new\n // Application()` resolves to the ready instance, and TS cannot type a\n // Promise-returning constructor.\n return initialize(\n this,\n merge(createDefaultConfig(), opts)\n ) as unknown as Application;\n }\n}\n\nexport default Application;\nexport type {\n Application$opts,\n Application$Class,\n Application$factoryOpts\n} from './interfaces';\n", "import type { Response } from '../../server';\n\n/**\n * Create a Proxy that will trap typical node middleware callback invocations\n * and route them to the appropriate Promise callback (resolve or reject).\n *\n * @private\n */\nexport default function createResponseProxy(\n res: Response,\n resolve: (result: unknown) => void\n): Response {\n return new Proxy(res, {\n get(target, key) {\n switch (key) {\n case 'end':\n case 'send':\n case 'json':\n return resolve;\n\n default:\n return Reflect.get(target, key);\n }\n }\n });\n}\n", "import type { Action } from '../router';\nimport type { Request, Response } from '../server';\n\nimport createResponseProxy from './utils/create-response-proxy';\n\n/**\n * Convert traditional node HTTP server middleware into a lumen compatible\n * function for use in Controller#beforeAction.\n *\n * @module lumen-framework\n * @namespace Lumen\n * @function lumenify\n */\nexport default function lumenify(\n middleware: (req: Request, res: Response, next: (err?: Error) => void) => void\n): Action<unknown> {\n const result = function (req: Request, res: Response) {\n return new Promise<unknown>((resolve, reject) => {\n Reflect.apply(middleware, null, [\n req,\n createResponseProxy(res, resolve),\n (err?: Error) => {\n if (err && err instanceof Error) {\n reject(err);\n } else {\n resolve(undefined);\n }\n }\n ]);\n });\n };\n\n Reflect.defineProperty(result, 'name', {\n value: middleware.name\n });\n\n return result;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["yellow", "format", "format", "yellow", "yellow", "stat", "format", "yellow", "green", "yellow", "yellow", "green", "Client", "resolve", "resolve", "initialize", "pluralize", "camelize", "camelize", "singularize", "resolve", "camelize", "singularize", "resolve", "resolve", "camelize", "camelize", "camelize", "camelize", "createRunner", "camelize", "dasherize", "singularize", "normalize", "normalize", "dasherize", "camelize", "singularize", "initialize", "createRunner", "resolve", "pluralize", "initialize", "camelize", "camelize", "dasherize", "camelize", "dasherize", "camelize", "resolve", "hasOwnProperty", "dasherize", "dasherize", "validateType", "validateType", "validateOne", "validateType", "resource", "define", "build", "joinPath", "dasherize", "dasherize", "normalize", "joinPath", "posix", "resource", "map", "posix", "posix", "build", "posix", "posix", "posix", "posix", "initialize", "build", "initialize", "resolve", "resolve"]
7
7
  }