lumen-framework 3.0.3 → 3.1.0

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.
Files changed (40) hide show
  1. package/dist/cli.cjs +70 -38
  2. package/dist/cli.cjs.map +4 -4
  3. package/dist/index.js +916 -257
  4. package/dist/index.js.map +4 -4
  5. package/dist/index.mjs +907 -248
  6. package/dist/index.mjs.map +4 -4
  7. package/dist/types/errors/namespaced-serializer-missing-error.d.ts +15 -0
  8. package/dist/types/packages/application/utils/validate-namespaced-serializers.d.ts +15 -0
  9. package/dist/types/packages/controller/errors/index.d.ts +1 -0
  10. package/dist/types/packages/controller/errors/related-record-not-found-error.d.ts +14 -0
  11. package/dist/types/packages/controller/index.d.ts +65 -0
  12. package/dist/types/packages/controller/utils/find-many.d.ts +2 -1
  13. package/dist/types/packages/controller/utils/find-one.d.ts +2 -1
  14. package/dist/types/packages/controller/utils/params-to-query.d.ts +7 -2
  15. package/dist/types/packages/controller/utils/validate-relationships.d.ts +8 -0
  16. package/dist/types/packages/database/constants.d.ts +1 -0
  17. package/dist/types/packages/database/model/index.d.ts +11 -0
  18. package/dist/types/packages/database/model/utils/process-write-error.d.ts +9 -1
  19. package/dist/types/packages/database/validation/errors/validation-error.d.ts +11 -2
  20. package/dist/types/packages/jsonapi/interfaces.d.ts +1 -1
  21. package/dist/types/packages/router/route/params/errors/client-generated-id-error.d.ts +13 -0
  22. package/dist/types/packages/router/route/params/errors/forbidden-parameter-error.d.ts +14 -0
  23. package/dist/types/packages/router/route/params/errors/index.d.ts +2 -0
  24. package/dist/types/packages/router/route/params/errors/invalid-parameter-error.d.ts +2 -0
  25. package/dist/types/packages/router/route/params/errors/parameter-not-nullable-error.d.ts +2 -0
  26. package/dist/types/packages/router/route/params/errors/parameter-required-error.d.ts +2 -0
  27. package/dist/types/packages/router/route/params/errors/parameter-type-error.d.ts +2 -0
  28. package/dist/types/packages/router/route/params/errors/parameter-value-error.d.ts +2 -0
  29. package/dist/types/packages/router/route/params/errors/resource-mismatch-error.d.ts +2 -0
  30. package/dist/types/packages/router/route/params/index.d.ts +1 -0
  31. package/dist/types/packages/router/route/params/parameter/forbidden-parameter.d.ts +12 -0
  32. package/dist/types/packages/router/route/params/parameter/index.d.ts +8 -0
  33. package/dist/types/packages/router/route/params/utils/validate-client-id.d.ts +8 -0
  34. package/dist/types/packages/serializer/index.d.ts +111 -36
  35. package/dist/types/packages/serializer/utils/include-tree.d.ts +29 -0
  36. package/dist/types/packages/serializer/utils/load-linkage.d.ts +22 -0
  37. package/dist/types/packages/server/index.d.ts +2 -1
  38. package/dist/types/packages/server/interfaces.d.ts +5 -0
  39. package/dist/types/packages/server/utils/source-for.d.ts +10 -0
  40. package/package.json +1 -1
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../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": ["export { Model } from './packages/database';\nexport { default as Logger } from './packages/logger';\nexport { default as Controller } from './packages/controller';\nexport { default as Serializer } from './packages/serializer';\nexport { default as Application } from './packages/application';\nexport { default as lumenify } from './packages/lumenify';\n", "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": ["import_chalk", "ansiRegex", "format", "format", "import_chalk", "import_chalk", "stat", "chalk", "format", "import_chalk", "joinPath", "import_fb_watchman", "resolve", "resolve", "fs", "initialize", "cluster", "import_inflection", "_", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "resolve", "resolve", "resolve", "import_inflection", "import_inflection", "createRunner", "import_inflection", "normalize", "normalize", "initialize", "createRunner", "resolve", "initialize", "import_inflection", "import_inflection", "resolve", "parseURL", "hasOwnProperty", "import_inflection", "validateType", "validateType", "validateOne", "validateType", "resource", "define", "build", "import_path", "import_inflection", "normalize", "joinPath", "import_path", "import_path", "resource", "map", "import_path", "build", "import_path", "import_path", "initialize", "build", "initialize", "resolve", "resolve"]
3
+ "sources": ["../src/index.ts", "../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/server/utils/source-for.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/process-write-error.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/errors/related-record-not-found-error.ts", "../src/packages/controller/utils/validate-relationships.ts", "../src/packages/controller/constants.ts", "../src/packages/controller/index.ts", "../src/packages/serializer/index.ts", "../src/packages/loader/resolver/utils/closest-ancestor.ts", "../src/packages/serializer/utils/load-linkage.ts", "../src/packages/serializer/utils/include-tree.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/client-generated-id-error.ts", "../src/packages/router/route/params/errors/forbidden-parameter-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/parameter/forbidden-parameter.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-client-id.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-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/utils/validate-namespaced-serializers.ts", "../src/errors/namespaced-serializer-missing-error.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": ["export { Model } from './packages/database';\nexport { default as Logger } from './packages/logger';\nexport { default as Controller } from './packages/controller';\nexport { default as Serializer } from './packages/serializer';\nexport { default as Application } from './packages/application';\nexport { default as lumenify } from './packages/lumenify';\n", "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", "// Driver error codes and messages for a unique-constraint violation: pg\n// (`23505`, \"duplicate key value violates unique constraint\"), mysql\n// (`ER_DUP_ENTRY`), sqlite (\"UNIQUE constraint failed\") and mssql\n// (\"Violation of UNIQUE KEY constraint\"). No `g` flag \u2014 `.test()` on a\n// global regex is stateful and would miss every other match.\nexport const UNIQUE_CONSTRAINT_CODES = new Set(['23505', 'ER_DUP_ENTRY']);\nexport const UNIQUE_CONSTRAINT = /unique(\\s+key)?\\s+constraint|duplicate key/i;\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 { rethrowWriteError } from './utils/process-write-error';\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 * Names of `hasOne` relationships that were eager-loaded (joined) and found\n * to have no related record. Lets the relationship getter answer `null`\n * without a per-record query. Kept outside of the change sets so it never\n * counts as a change to the record.\n *\n * @property absentRelationships\n * @type {Set}\n * @private\n */\n declare absentRelationships: Set<string>;\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 absentRelationships: {\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).catch(rethrowWriteError);\n }\n\n return this.transaction(run).catch(rethrowWriteError);\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).catch(rethrowWriteError);\n }\n\n return this.transaction(run).catch(rethrowWriteError);\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 // A left-joined relationship with no match comes back as a row of nulls.\n // Drop all of its columns, not just its primary key: otherwise a record\n // is built from the remaining nulls, and the model fills in its column\n // defaults \u2014 on Postgres the primary key becomes the literal\n // `nextval('<table>_id_seq'::regclass)`, i.e. a phantom related record.\n const missing = new Set(\n entries(record)\n .filter(([key, value]) => value == null && pkPattern.test(key))\n .map(([key]) => key.split('.')[0])\n );\n\n // An unmatched has-one is known to be absent, so its getter must not\n // query for it again (belongs-to already skips the query on a null key).\n const absent = Array.from(missing).filter(\n name => model.relationshipFor(name)?.type === 'hasOne'\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 (key.indexOf('.') >= 0 && missing.has(key.split('.')[0])) {\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 absent.forEach(name => instance.absentRelationships.add(name));\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 if (didRun) {\n return;\n }\n\n didRun = true;\n\n // Any failure below (a rejected SQL query included) must reject the\n // Query. Without this it became an unhandled rejection and the awaiting\n // caller \u2014 e.g. a request being served \u2014 never settled.\n try {\n await run();\n } catch (err) {\n reject(err as Error);\n }\n });\n\n async function run() {\n let results;\n const {\n model,\n isFind,\n snapshots,\n collection,\n shouldCount,\n relationships\n } = target;\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 && owner.absentRelationships.has(key)) {\n value = null;\n } else 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", "import { dasherize } from 'inflection';\n\nimport underscore from '../../../utils/underscore';\nimport type { Server$ErrorSource } from '../interfaces';\n\n/**\n * Member names as the client sees them \u2014 responses dasherize, so pointers do\n * too (`isPublic` -> `is-public`). Escaped per RFC 6901 for use in a pointer.\n *\n * @private\n */\nfunction memberName(key: string): string {\n return dasherize(underscore(key));\n}\n\nfunction escapePointer(segment: string): string {\n return segment.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\n/**\n * Map an internal parameter path to a JSON:API error `source`. Paths under\n * `data` are request document members and become a JSON Pointer\n * (`data.attributes.isPublic` -> `/data/attributes/is-public`); anything else\n * is a query parameter (`page.size` -> `page[size]`).\n *\n * @private\n */\nexport default function sourceFor(path: string): Server$ErrorSource {\n const [root, ...rest] = path.split('.').filter(Boolean).map(memberName);\n\n if (!root) {\n return {};\n } else if (root === 'data') {\n return {\n pointer: `/${[root, ...rest].map(escapePointer).join('/')}`\n };\n }\n\n return {\n parameter: `${root}${rest.map(key => `[${key}]`).join('')}`\n };\n}\n", "import createServerError from '../../../server/utils/create-server-error';\nimport sourceFor from '../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../server';\n\n/**\n * A model validator (`static validates`) rejected an attribute. Answered with\n * 422 and a pointer to the attribute, which clients such as ember-data map to\n * field errors. The rejected value is deliberately not in the message: it\n * ends up in logs and may be a secret (e.g. a password).\n *\n * @private\n */\nclass ValidationError extends Error {\n declare key: string;\n\n declare source: Server$ErrorSource;\n\n constructor(key: string) {\n super(`Validation failed for ${key}.`);\n this.key = key;\n this.source = sourceFor(`data.attributes.${key}`);\n }\n}\n\nexport default createServerError(ValidationError, 422);\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);\n }\n\n return result;\n }, true);\n}\n", "import { UNIQUE_CONSTRAINT, UNIQUE_CONSTRAINT_CODES } from '../../constants';\nimport { UniqueConstraintError } from '../../errors';\n\n/**\n * knex prefixes a failed statement's error message with the SQL (and its\n * bound values) as `<sql> - <driver message>`; keep only the driver message.\n *\n * @private\n */\nfunction driverMessage(message: string): string {\n const index = message.lastIndexOf(' - ');\n\n return index >= 0 ? message.slice(index + 3) : message;\n}\n\n/**\n * Map a database write error to the server error it should surface as.\n *\n * @private\n */\nexport default function processWriteError(err: unknown): unknown {\n if (!(err instanceof Error)) {\n return err;\n }\n\n const { code } = err as { code?: unknown };\n const { message } = err;\n\n if (\n UNIQUE_CONSTRAINT_CODES.has(String(code)) ||\n UNIQUE_CONSTRAINT.test(message)\n ) {\n return new UniqueConstraintError(driverMessage(message));\n }\n\n return err;\n}\n\n/**\n * `.catch()` handler for a write: rethrows the mapped error.\n *\n * @private\n */\nexport function rethrowWriteError(err: unknown): never {\n throw processWriteError(err);\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 { default as sourceFor } from './utils/source-for';\n\nexport type { Server$config, Server$ErrorSource } 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 // `source` only ever points into the client's own request, so unlike\n // `detail` it is safe to expose in every environment.\n const source = (err as { source?: JSONAPI$ErrorObject['source'] } | undefined)\n ?.source;\n\n if (source && (source.pointer || source.parameter)) {\n errData.source = source;\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 { Model, ModelClass } from '../../database';\nimport type Serializer from '../../serializer';\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 * `serializerFor` resolves the Serializer an included resource is serialized\n * with \u2014 in the request's namespace (`Controller#serializerFor()`) \u2014 so its\n * attributes are the ones loaded. Defaults to the related model's root one.\n *\n * @private\n */\nexport default function paramsToQuery(\n model: ModelClass,\n { id, page, sort, filter, fields, include }: Request$params,\n serializerFor: (related: ModelClass) => Serializer<Model> = related =>\n related.serializer\n): Controller$query {\n const relationships = entries(model.relationships);\n const includedFields = omit(fields, model.resourceName);\n // Only the first segment of a nested path (`comments.user`) is loaded by this\n // query; the serializer loads deeper levels when it builds `included`.\n const included = include && include.map(path => path.split('.')[0]);\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 (included && value.length === 1 && included.includes(name)) {\n value = [...value, ...serializerFor(relationship.model).attributes];\n } else if (!included && 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 Serializer from '../../serializer';\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 serializerFor?: (model: ModelClass) => Serializer<Model>\n): Query<T> {\n const params = merge(req.defaultParams, req.params);\n const { id, select, include } = paramsToQuery(model, params, serializerFor);\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 Serializer from '../../serializer';\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 serializerFor?: (model: ModelClass) => Serializer<Model>\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 serializerFor\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 createServerError from '../../server/utils/create-server-error';\nimport sourceFor from '../../server/utils/source-for';\nimport stringify from '../../../utils/stringify';\nimport type { ModelClass } from '../../database';\nimport type { Server$ErrorSource } from '../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 404 Not Found when processing a request\n * that references a related resource that does not exist.\"\n *\n * @private\n */\nclass RelatedRecordNotFoundError extends Error {\n declare source: Server$ErrorSource;\n\n constructor(\n { name, primaryKey }: ModelClass,\n primaryKeyValue: unknown,\n path: string\n ) {\n super(\n `Could not find ${name} with ${primaryKey} ${stringify(primaryKeyValue)}.`\n );\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(RelatedRecordNotFoundError, 404);\n", "import entries from '../../../utils/entries';\nimport { RelatedRecordNotFoundError } from '../errors';\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * Check that every resource referenced from `data.relationships` exists, so a\n * write cannot leave dangling linkage. One query per relationship.\n *\n * @private\n */\nexport default async function validateRelationships<T extends Model>(\n model: ModelClass<T>,\n relationships: Record<string, unknown> = {}\n): Promise<void> {\n await Promise.all(\n entries(relationships).map(async ([key, value]) => {\n const opts = model.relationshipFor(key);\n const { data = null } = (value as { data?: unknown } | null) || {};\n\n if (!opts || !data) {\n return;\n }\n\n const { model: related } = opts;\n const isMany = Array.isArray(data);\n const ids = (isMany ? data : [data]).map(item =>\n Reflect.get(Object(item), 'id')\n );\n\n if (!ids.length) {\n return;\n }\n\n const column = related.columnNameFor(related.primaryKey) || 'id';\n const rows: Array<Record<string, unknown>> = await related\n .table()\n // An item without an id matches nothing and is reported below; knex\n // rejects `undefined` bindings outright.\n .whereIn(\n `${related.tableName}.${column}`,\n ids.filter(id => id != null)\n )\n .select(`${related.tableName}.${column}`);\n\n // Request ids may arrive as strings (to-many items) or numbers (to-one,\n // coerced by parameter validation); rows come back typed by the driver.\n const found = new Set(rows.map(row => String(Reflect.get(row, column))));\n const missing = ids.findIndex(id => !found.has(String(id)));\n\n if (missing >= 0) {\n const path = `data.relationships.${key}.data`;\n\n throw new RelatedRecordNotFoundError(\n related,\n ids[missing],\n isMany ? `${path}.${missing}` : path\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 validateRelationships from './utils/validate-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 * How many relationships deep an `?include` path may go on this\n * controller's routes. `comments.reactions.user` is 3 levels deep; with `1`\n * only direct relationships (`comments`) can be included. Paths deeper than\n * this are rejected with `400 Bad Request`.\n *\n * Set it on `ApplicationController` to change it for the whole app, or on a\n * single controller to override it there.\n *\n * ```javascript\n * class ApplicationController extends Controller {\n * maxIncludeDepth = 2;\n * }\n * ```\n *\n * Every allowed path is enumerated up front from the serializers'\n * relationships, and each nested level costs its own queries per request, so\n * keep this small.\n *\n * @property maxIncludeDepth\n * @type {Number}\n * @default 3\n * @public\n */\n maxIncludeDepth: number = 3;\n\n /**\n * Whether a namespace may fall back to the root Serializer of a type it has\n * no Serializer for. Read from a namespace's `ApplicationController` and\n * applies to the whole namespace.\n *\n * By default `app/controllers/admin/comments.js` without an\n * `app/serializers/admin/comments.js` \u2014 or an included type without one \u2014\n * is serialized by the root Serializer, with every attribute and\n * relationship it declares. For a namespace that must only expose what it\n * declares itself, turn the fallback off:\n *\n * ```javascript\n * // app/controllers/admin/application.js\n * class AdminApplicationController extends ApplicationController {\n * serializerFallback = false;\n * }\n * ```\n *\n * The application then refuses to boot while any type the namespace can\n * serialize or `include` (down to each controller's `maxIncludeDepth`) has\n * no Serializer in that namespace, listing each missing one.\n *\n * @property serializerFallback\n * @type {Boolean}\n * @default true\n * @public\n */\n serializerFallback: boolean = true;\n\n /**\n * The Serializer to serialize (and validate, and load) related resources of\n * this Controller's responses with: the related model's Serializer in this\n * Controller's namespace, falling back to the root one.\n *\n * Always this Controller's namespace \u2014 not its Serializer's, which is the\n * root one when the namespace has no Serializer for this resource.\n *\n * @method serializerFor\n * @private\n */\n serializerFor(model: ModelClass): Serializer<Model> {\n const { serializer, namespace } = this;\n\n return serializer\n ? serializer.serializerFor(model, namespace)\n : model.serializer;\n }\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, related => this.serializerFor(related));\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, related => this.serializerFor(related));\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 await validateRelationships(model, relationships);\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, related => this.serializerFor(related))\n .then(async record => {\n const {\n params: {\n data: { attributes, relationships }\n }\n } = req;\n\n await validateRelationships(model, relationships);\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, related => this.serializerFor(related))\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 { posix } from 'path';\n\nimport { dasherize } from 'inflection';\n\nimport { VERSION } from '../jsonapi';\nimport { freezeProps } from '../freezeable';\nimport closestAncestor from '../loader/resolver/utils/closest-ancestor';\nimport type { Bundle$Namespace } from '../loader';\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';\nimport loadLinkage from './utils/load-linkage';\nimport type { Linkage } from './utils/load-linkage';\nimport { createIncludeTree } from './utils/include-tree';\nimport type { IncludeTree } from './utils/include-tree';\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 * The same goes for relationships: each included resource carries the\n * `relationships` its own Serializer declares in `hasOne` and `hasMany`.\n *\n * Included resources follow the request's namespace: from `/admin/posts`,\n * included comments are serialized by `AdminCommentsSerializer` when it\n * exists and by `CommentsSerializer` otherwise (the same fallback a\n * namespaced Controller uses), and their links point into `/admin`.\n *\n * Relationship paths may be nested, e.g. `/posts?include=comments.user`, up\n * to the controller's `maxIncludeDepth` (3 by default). The intermediate\n * resources (the comments) are included along with the leaves (their users).\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 /**\n * Every Serializer of the application, keyed by namespaced path (`posts`,\n * `admin/posts`). Attached once all of them are built, and used by\n * `serializerFor()` to serialize related resources in this Serializer's\n * namespace.\n *\n * @property serializers\n * @type {Map}\n * @private\n */\n declare serializers?: Bundle$Namespace<Serializer<Model>>;\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 relationship paths (e.g.\n * `'comments'` or `'comments.user'`) whose resources should be added to the\n * top level included object of the returned [JSON API](http://jsonapi.org)\n * document object. Intermediate resources of a nested path are included too.\n *\n * @param {String} options.namespace - The namespace of the request, i.e. of\n * the Controller handling it. Every link in the document is built in it, and\n * included resources are serialized by their Serializer in it (falling back\n * to the root). Defaults to this Serializer's namespace \u2014 which is the root\n * one when a namespaced Controller has no Serializer of its own, so the\n * Controller passes its namespace explicitly.\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 namespace = this.namespace\n }: {\n data: T | Array<T>;\n links: JSONAPI$DocumentLinks;\n domain: string;\n include: Array<string>;\n namespace?: string;\n }): Promise<JSONAPI$Document> {\n const tree = createIncludeTree(include);\n const related = new Map<string, Array<Model>>();\n const included = new Map<string, JSONAPI$ResourceObject>();\n const names = Array.from(tree.keys());\n let primary: Array<JSONAPI$ResourceObject>;\n let serialized: Record<string, unknown>;\n\n if (Array.isArray(data)) {\n primary = await Promise.all(\n data.map(item =>\n this.formatOne({\n item,\n domain,\n related,\n namespace,\n include: names\n })\n )\n );\n\n serialized = { data: primary };\n } else {\n const resource = await this.formatOne({\n domain,\n related,\n namespace,\n item: data,\n include: names,\n links: false\n });\n\n primary = [resource];\n serialized = { data: resource };\n }\n\n // Walk the include tree in request order, so `included` is deterministic.\n for (const [name, children] of tree) {\n const opts = this.model.relationshipFor(name);\n const records = related.get(name);\n\n if (opts && records) {\n await this.addIncluded({\n domain,\n records,\n included,\n namespace,\n model: opts.model,\n tree: children\n });\n }\n }\n\n // A compound document must not repeat a primary resource in `included`.\n primary.forEach(resource => {\n included.delete(resourceKey(resource));\n });\n\n if (included.size) {\n serialized = {\n ...serialized,\n included: Array.from(included.values())\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 * Relationships are serialized in one of two ways. By default each one is\n * read from the Model instance (for primary data the query has already\n * loaded them). When `linkage` is given \u2014 as it is for included resources,\n * whose relationships are batch-loaded by `addIncluded()` \u2014 the resource\n * linkage is built from it instead, without touching the database.\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 the relationship keys whose\n * related records should be collected into `options.related`.\n *\n * @param {Map} options.related - Collects, per relationship key in\n * `options.include`, the related Model instances that belong in the top\n * level included object of a [JSON API](http://jsonapi.org) document object.\n *\n * @param {Object} options.linkage - Pre-loaded resource linkage (related\n * primary keys per relationship key) to serialize relationships from.\n *\n * @param {String} options.namespace - The namespace to build links in.\n * Defaults to this Serializer's; included resources pass the namespace of\n * the request, so every link in a document points into the same namespace.\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 related,\n linkage,\n namespace = this.namespace\n }: {\n item: T;\n links?: boolean;\n domain: string;\n include?: Array<string>;\n related?: Map<string, Array<Model>>;\n linkage?: Linkage;\n namespace?: string;\n }): Promise<JSONAPI$ResourceObject> {\n const { resourceName: type } = item;\n const id = String(item.getPrimaryKey());\n const names = [...this.hasOne, ...this.hasMany];\n let relationships: Record<string, JSONAPI$RelationshipObject>;\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 (linkage) {\n relationships = names.reduce<Record<string, JSONAPI$RelationshipObject>>(\n (hash, name) => ({\n ...hash,\n [dasherize(underscore(name))]: this.formatLinkage(\n domain,\n this.model.relationshipFor(name)?.model.resourceName,\n linkage[name],\n namespace\n )\n }),\n {}\n );\n } else {\n const collect = (name: string, records: Array<Model>) => {\n if (related && include.includes(name)) {\n related.set(name, [...(related.get(name) || []), ...records]);\n }\n };\n\n relationships = (await promiseHash(\n names.reduce<Record<string, unknown>>(\n (hash, name) => ({\n ...hash,\n\n [dasherize(underscore(name))]: (async () => {\n const value = (await Reflect.get(item, name)) as\n Model | Array<Model> | null | undefined;\n\n if (Array.isArray(value)) {\n collect(name, value);\n\n return {\n data: value.map(\n relatedItem =>\n this.formatRelationship(relatedItem, domain, namespace)\n .data\n )\n };\n } else if (value && (value as { id?: unknown }).id != null) {\n collect(name, [value]);\n\n return this.formatRelationship(value, domain, namespace);\n }\n\n return {\n data: null\n };\n })()\n }),\n {}\n )\n )) as Record<string, JSONAPI$RelationshipObject>;\n }\n\n if (Object.keys(relationships).length) {\n serialized.relationships = relationships;\n }\n\n if (links || typeof links !== 'boolean') {\n serialized.links = {\n self: this.linkFor(domain, type, id, namespace)\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 {Model} item - The Model instance to transform into the returned\n * [JSON API](http://jsonapi.org) relationship object.\n *\n * @param {String} domain - A string used to build links included in the\n * returned [JSON API](http://jsonapi.org) relationship object.\n *\n * @return {Object} A [JSON API](http://jsonapi.org) relationship object.\n *\n * @private\n */\n formatRelationship(\n item: Model,\n domain: string,\n namespace: string = this.namespace\n ): JSONAPI$RelationshipObject {\n return this.formatLinkage(\n domain,\n item.resourceName,\n String(item.getPrimaryKey()),\n namespace\n );\n }\n\n /**\n * Build a [JSON API](http://jsonapi.org) relationship object from resource\n * linkage, in the same shape `formatRelationship()` produces from Model\n * instances: to-one relationships carry a `links` object, to-many ones only\n * `data`, and a missing to-one relationship is `{ data: null }`.\n *\n * @method formatLinkage\n * @private\n */\n formatLinkage(\n domain: string,\n type: string | undefined,\n linkage: Array<string> | string | null | undefined,\n namespace: string = this.namespace\n ): JSONAPI$RelationshipObject {\n if (Array.isArray(linkage)) {\n return {\n data: type ? linkage.map(id => ({ id, type })) : []\n };\n }\n\n if (linkage == null || !type) {\n return {\n data: null\n };\n }\n\n return {\n data: {\n id: linkage,\n type\n },\n links: {\n self: this.linkFor(domain, type, linkage, namespace)\n }\n };\n }\n\n /**\n * Add `records` (instances of `model`) to `included` as resource objects,\n * then recurse into the relationships named in `tree`. Each is serialized by\n * `model`'s Serializer in this Serializer's namespace (`serializerFor()`), so\n * `/admin/posts?include=comments` uses `AdminCommentsSerializer` when there\n * is one and `CommentsSerializer` otherwise. The relationships of every level\n * are batch-loaded with one query per relationship, not one per record.\n *\n * @method addIncluded\n * @private\n */\n async addIncluded({\n model,\n records,\n tree,\n domain,\n included,\n namespace\n }: {\n model: ModelClass;\n records: Array<Model>;\n tree: IncludeTree;\n domain: string;\n included: Map<string, JSONAPI$ResourceObject>;\n namespace: string;\n }): Promise<void> {\n // Resolved in the request's namespace at every level \u2014 never in that of\n // whichever (possibly root, fallback) Serializer serialized the parent.\n const serializer = this.serializerFor(model, namespace);\n const unique = Array.from(\n new Map(records.map(record => [record.getPrimaryKey(), record])).values()\n );\n\n if (!unique.length) {\n return;\n }\n\n const names = [...serializer.hasOne, ...serializer.hasMany];\n const linkage = await loadLinkage(model, unique, names);\n\n for (const item of unique) {\n const id = String(item.getPrimaryKey());\n const key = resourceKey({ id, type: item.resourceName });\n\n // Reached through more than one path: the first serialization wins, the\n // linkage is identical either way.\n if (!included.has(key)) {\n included.set(\n key,\n await serializer.formatOne({\n item,\n domain,\n linkage: linkage.get(id),\n namespace\n })\n );\n }\n }\n\n for (const [name, children] of tree) {\n const opts = model.relationshipFor(name);\n\n if (!opts || !names.includes(name)) {\n continue;\n }\n\n const { model: next } = opts;\n const ids = new Set<string>();\n\n linkage.forEach(({ [name]: value }) => {\n (Array.isArray(value) ? value : [value]).forEach(relatedId => {\n if (relatedId != null) {\n ids.add(relatedId);\n }\n });\n });\n\n if (ids.size) {\n // Load exactly the attributes the included resource will serialize.\n const attributes = this.serializerFor(\n next,\n namespace\n ).attributes.filter(attr => next.attributeNames.includes(attr));\n\n const nextRecords = await next\n .select(next.primaryKey, ...attributes)\n .where({ [next.primaryKey]: Array.from(ids) });\n\n await this.addIncluded({\n domain,\n included,\n namespace,\n model: next,\n records: nextRecords,\n tree: children\n });\n }\n }\n }\n\n /**\n * Resolve the Serializer for `model` in `namespace` (this Serializer's by\n * default), the way a namespaced Controller resolves its own:\n * `admin/comments` if it exists, otherwise the closest ancestor namespace's,\n * down to the root `comments` Serializer. Falls back to `model.serializer`\n * when this Serializer was not created by an application (e.g. in\n * isolation).\n *\n * Pass the request's namespace when there is one: a Serializer's own\n * namespace is the root one whenever it is a namespaced Controller's\n * fallback.\n *\n * @method serializerFor\n * @private\n */\n serializerFor(\n model: ModelClass,\n namespace: string = this.namespace\n ): Serializer<Model> {\n const { serializers } = this;\n\n if (serializers) {\n const key = posix.join(namespace || '.', model.resourceName);\n const serializer =\n serializers.get(key) || closestAncestor(serializers, key);\n\n if (serializer) {\n return serializer;\n }\n }\n\n return model.serializer;\n }\n\n /**\n * @private\n */\n linkFor(\n domain: string,\n type: string,\n id: string,\n namespace: string = this.namespace\n ): string {\n if (namespace) {\n return `${domain}/${namespace}/${type}/${id}`;\n }\n\n return `${domain}/${type}/${id}`;\n }\n}\n\n/**\n * @private\n */\nfunction resourceKey({ id, type }: { id: string; type: string }): string {\n return `${type}:${id}`;\n}\n\nexport default Serializer;\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 { camelize } from 'inflection';\n\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * The resource linkage of one record: the primary key(s) of the records each\n * named relationship points to \u2014 an array for has-many, otherwise a single id\n * or `null`.\n *\n * @private\n */\nexport type Linkage = Record<string, Array<string> | string | null>;\n\nconst valueOf = (record: Model, key: string): unknown =>\n Reflect.get(record, key);\n\nconst toId = (value: unknown): string | null =>\n value == null ? null : String(value);\n\n/**\n * Batch-load the resource linkage of the relationships `names` for every one of\n * `records` (all instances of `model`), keyed by each record's primary key.\n *\n * This is what lets included resources carry `relationships` without an N+1:\n * it issues at most one query per relationship \u2014 and a single query for all\n * belongs-to relationships, whose foreign keys live on `model` itself \u2014 however\n * many records there are. The queries mirror the lazy relationship getters in\n * `database/relationship/utils/getters.ts`, which remain the source of truth.\n *\n * @private\n */\nexport default async function loadLinkage(\n model: ModelClass,\n records: Array<Model>,\n names: Array<string>\n): Promise<Map<string, Linkage>> {\n const ids = Array.from(\n new Set(records.map(record => record.getPrimaryKey()))\n );\n const linkage = new Map<string, Linkage>();\n const belongsTo: Array<[string, string, ModelClass]> = [];\n const queries: Array<Promise<void>> = [];\n\n ids.forEach(id => {\n linkage.set(\n String(id),\n names.reduce<Linkage>((result, name) => {\n const opts = model.relationshipFor(name);\n\n result[name] = opts && opts.type === 'hasMany' ? [] : null;\n return result;\n }, {})\n );\n });\n\n if (!ids.length) {\n return linkage;\n }\n\n // Append `relatedId` to the linkage of the owner identified by `ownerId`.\n const link = (ownerId: unknown, name: string, relatedId: unknown) => {\n const owner = linkage.get(String(ownerId));\n const id = toId(relatedId);\n\n if (!owner || id === null) {\n return;\n }\n\n const current = owner[name];\n\n if (Array.isArray(current)) {\n // A join model can hold the same pair twice; like the getters (which\n // query `WHERE id IN (...)`), each related record is linked once.\n if (!current.includes(id)) {\n current.push(id);\n }\n } else if (current === null) {\n // has-one: like `getHasOne()`, the lowest primary key wins.\n owner[name] = id;\n }\n };\n\n names.forEach(name => {\n const opts = model.relationshipFor(name);\n\n if (!opts) {\n return;\n }\n\n const { type, through, model: related } = opts;\n const foreignKey = camelize(opts.foreignKey, true);\n\n if (type === 'belongsTo') {\n belongsTo.push([name, foreignKey, related]);\n } else if (through) {\n // Mirrors `getHasManyThrough()`: the join model holds a key pointing at\n // the owner (`foreignKey`) and one pointing at the related record (the\n // inverse relationship's foreign key).\n const inverse = related.relationshipFor(opts.inverse);\n\n if (!inverse) {\n return;\n }\n\n const relatedKey = camelize(inverse.foreignKey, true);\n\n queries.push(\n (async () => {\n const rows = await through\n .select(foreignKey, relatedKey)\n .where({ [foreignKey]: ids });\n\n rows.forEach(row => {\n link(valueOf(row, foreignKey), name, valueOf(row, relatedKey));\n });\n })()\n );\n } else {\n // has-one and has-many: the foreign key lives on the related model.\n queries.push(\n (async () => {\n const rows = await related\n .select(related.primaryKey, foreignKey)\n .where({ [foreignKey]: ids })\n .order(related.primaryKey, 'ASC');\n\n rows.forEach(row => {\n link(valueOf(row, foreignKey), name, row.getPrimaryKey());\n });\n })()\n );\n }\n });\n\n if (belongsTo.length) {\n queries.push(\n (async () => {\n const rows = await model\n .select(model.primaryKey, ...belongsTo.map(([, key]) => key))\n .where({ [model.primaryKey]: ids });\n\n rows.forEach(row => {\n belongsTo.forEach(([name, key]) => {\n link(row.getPrimaryKey(), name, valueOf(row, key));\n });\n });\n\n await dropDangling(linkage, belongsTo);\n })()\n );\n }\n\n await Promise.all(queries);\n\n return linkage;\n}\n\n/**\n * A foreign key can outlive the record it points to (no FK constraint, or a\n * row deleted out from under it). Resolve belongs-to linkage to `null` then,\n * like the primary query's join does \u2014 rather than linking a resource that\n * does not exist. One query per distinct related model.\n *\n * @private\n */\nasync function dropDangling(\n linkage: Map<string, Linkage>,\n belongsTo: Array<[string, string, ModelClass]>\n): Promise<void> {\n const wanted = new Map<ModelClass, Set<string>>();\n\n belongsTo.forEach(([name, , related]) => {\n const ids = wanted.get(related) || new Set<string>();\n\n linkage.forEach(({ [name]: id }) => {\n if (typeof id === 'string') {\n ids.add(id);\n }\n });\n\n wanted.set(related, ids);\n });\n\n const existing = new Map<ModelClass, Set<string>>();\n\n await Promise.all(\n Array.from(wanted, async ([related, ids]) => {\n if (!ids.size) {\n existing.set(related, ids);\n return;\n }\n\n const rows = await related\n .select(related.primaryKey)\n .where({ [related.primaryKey]: Array.from(ids) });\n\n existing.set(\n related,\n new Set(rows.map(row => String(row.getPrimaryKey())))\n );\n })\n );\n\n belongsTo.forEach(([name, , related]) => {\n const found = existing.get(related);\n\n linkage.forEach(owner => {\n const id = owner[name];\n\n if (typeof id === 'string' && !found?.has(id)) {\n owner[name] = null;\n }\n });\n });\n}\n", "import type { Model, ModelClass } from '../../database';\nimport type Serializer from '../index';\n\n/**\n * A parsed `include` parameter: each relationship name maps to the tree of\n * relationships to include from the records it points to.\n *\n * @private\n */\nexport type IncludeTree = Map<string, IncludeTree>;\n\n/**\n * Parse relationship paths (`['comments', 'comments.user', 'user']`) into an\n * include tree. Every prefix of a path is part of the tree, because JSON:API\n * requires the intermediate resources of a multi-part path to be included\n * along with its leaves (`comments.user` includes the comments too).\n *\n * @private\n */\nexport function createIncludeTree(paths: Array<string> = []): IncludeTree {\n const tree: IncludeTree = new Map();\n\n paths.forEach(path => {\n path\n .split('.')\n .filter(Boolean)\n .reduce((node, name) => {\n let child = node.get(name);\n\n if (!child) {\n child = new Map();\n node.set(name, child);\n }\n\n return child;\n }, tree);\n });\n\n return tree;\n}\n\n/**\n * Enumerate every include path available from `names` (relationships of\n * `model`), down to `depth` levels. Each level continues with the relationships\n * declared by the related model's serializer as `serializerFor` resolves it \u2014\n * the same one its included resources are serialized with (namespaced, with a\n * fallback to the root). Used to build the allowed values of the `include`\n * parameter.\n *\n * @private\n */\nexport function enumerateIncludePaths(\n model: ModelClass,\n names: Array<string>,\n depth: number,\n serializerFor: (\n model: ModelClass\n ) => Serializer<Model> | undefined = related => related.serializer\n): Array<string> {\n if (depth < 1) {\n return [];\n }\n\n return names.reduce<Array<string>>((paths, name) => {\n const opts = model.relationshipFor(name);\n\n if (!opts) {\n return paths;\n }\n\n const { model: related } = opts;\n const serializer = serializerFor(related);\n\n if (!serializer) {\n return [...paths, name];\n }\n\n const { hasOne, hasMany } = serializer;\n\n return [\n ...paths,\n name,\n ...enumerateIncludePaths(\n related,\n [...hasOne, ...hasMany],\n depth - 1,\n serializerFor\n ).map(path => `${name}.${path}`)\n ];\n }, []);\n}\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 // The request's namespace, not the serializer's: a namespaced\n // controller without its own serializer is given the root one.\n namespace\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 sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterTypeError extends TypeError {\n declare source: Server$ErrorSource;\n\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 this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterTypeError, 400);\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterValueError extends TypeError {\n declare source: Server$ErrorSource;\n\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 this.source = sourceFor(param.path);\n }\n}\n\nexport default createServerError(ParameterValueError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * @private\n */\nclass InvalidParameterError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(path: string) {\n super(`'${path}' is not a valid parameter for this resource.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(InvalidParameterError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport { line } from '../../../../logger';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * @private\n */\nclass ResourceMismatchError extends TypeError {\n declare source: Server$ErrorSource;\n\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 this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ResourceMismatchError, 409);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * @private\n */\nclass ParameterRequiredError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(path: string) {\n super(`Missing required parameter '${path}'.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterRequiredError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 403 Forbidden in response to an\n * unsupported request to create a resource with a client-generated ID.\"\n *\n * @private\n */\nclass ClientGeneratedIdError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor() {\n super('Client-generated IDs are not supported for this resource.');\n this.source = sourceFor('data.id');\n }\n}\n\nexport default createServerError(ClientGeneratedIdError, 403);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 403 Forbidden in response to an\n * unsupported request to update a resource or relationship.\" Used for members\n * the model knows about but the controller does not accept (`params`).\n *\n * @private\n */\nclass ForbiddenParameterError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(path: string) {\n super(`Setting '${path}' is not supported for this resource.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ForbiddenParameterError, 403);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterNotNullableError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor({ path }: ParameterLike) {\n super(`Parameter '${path}' is not nullable.`);\n this.source = sourceFor(path);\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 /**\n * Whether the parameter only accepts the given `values`. A parameter built\n * without `values` accepts any value of its type; one built with `values`\n * accepts only those \u2014 so an empty list accepts nothing. (Both used to look\n * alike as an empty set, which let e.g. `?include=anything` through on a\n * serializer without relationships, where JSON:API requires a 400.)\n */\n declare restricted: 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 restricted: values !== undefined\n });\n\n this.freeze();\n }\n\n validate<V>(value: V): V {\n validateType(this, value);\n\n if (this.restricted) {\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 { ForbiddenParameterError } from '../errors';\n\nimport Parameter from './index';\n\n/**\n * A member the resource has but the controller does not accept. Any value for\n * it is rejected with 403 rather than the 400 an unknown member gets.\n *\n * @private\n */\nclass ForbiddenParameter extends Parameter {\n constructor(path: string) {\n super({ path });\n }\n\n override validate<V>(): V {\n throw new ForbiddenParameterError(this.path);\n }\n}\n\nexport default ForbiddenParameter;\n", "import Parameter from '../parameter';\nimport ForbiddenParameter from '../parameter/forbidden-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 // Relationships the model has but the controller does not accept get a 403\n // (unsupported update) instead of the 400 an unknown member gets.\n const forbidden = Object.keys(model.relationships)\n .filter(key => !params.includes(key))\n .map((key): [string, ParameterLike] => [\n key,\n new ForbiddenParameter(`data.relationships.${key}`)\n ]);\n\n return [\n 'relationships',\n new ParameterGroup(\n [\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 ...forbidden\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';\nimport { enumerateIncludePaths } from '../../../../serializer/utils/include-tree';\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(controller: Controller): [string, ParameterLike] {\n const { model, serializer } = controller;\n const { hasOne, hasMany, attributes } = serializer;\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 ...controller.serializerFor(opts.model).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(controller: Controller): [string, ParameterLike] {\n const { model, maxIncludeDepth, serializer } = controller;\n const { hasOne, hasMany } = serializer;\n const relationships = [...hasOne, ...hasMany];\n\n return [\n 'include',\n new Parameter({\n path: 'include',\n type: 'array',\n // Every top level name stays allowed (as before), plus the nested paths\n // (`comments.user`) reachable through each related serializer in the\n // controller's namespace (at every level, even below a root fallback\n // serializer), down to the controller's `maxIncludeDepth`.\n values: Array.from(\n new Set([\n ...relationships,\n ...enumerateIncludePaths(\n model,\n relationships,\n maxIncludeDepth,\n related => controller.serializerFor(related)\n )\n ])\n )\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 { ClientGeneratedIdError } from '../errors';\n\n/**\n * Reject `data.id` on a create request before the parameter tree runs, so it\n * is answered with 403 (unsupported client-generated ID) rather than the 400\n * an unknown member gets.\n *\n * @private\n */\nexport default function validateClientId(params: Record<string, unknown>) {\n const { data } = params;\n\n if (data && typeof data === 'object' && Reflect.has(data, 'id')) {\n throw new ClientGeneratedIdError();\n }\n\n return true;\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 validateClientId } from './utils/validate-client-id';\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 {\n paramsFor,\n defaultParamsFor,\n validateClientId,\n validateResourceId\n} 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 (this.action === 'create' && req.method === 'POST') {\n validateClientId(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 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 { posix } from 'path';\n\nimport NamespacedSerializerMissingError from '../../../errors/namespaced-serializer-missing-error';\nimport type Controller from '../../controller';\nimport type Serializer from '../../serializer';\nimport type { Model, ModelClass } from '../../database';\nimport type { Bundle$Namespace } from '../../loader';\n\n// How many relationships away from a controller's own resource `via` is:\n// `admin/comments` is 0, `admin/posts?include=comments` is 1.\nconst distance = (via: string): number => {\n const [, include] = via.split('?include=');\n\n return include ? include.split('.').length : 0;\n};\n\n/**\n * Enforce `serializerFallback = false`: for every namespace whose\n * ApplicationController sets it, each type its controllers can serialize \u2014 the\n * resource itself, and everything reachable through `include` (and so\n * `fields`) down to the controller's `maxIncludeDepth` \u2014 must have a\n * Serializer in exactly that namespace. Throws listing every gap, so a missing\n * serializer fails the boot instead of silently falling back to the root one.\n *\n * @private\n */\nexport default function validateNamespacedSerializers(\n controllers: Bundle$Namespace<Controller> | Map<string, Controller>,\n serializers:\n Bundle$Namespace<Serializer<Model>> | Map<string, Serializer<Model>>\n): void {\n const missing = new Map<string, string>();\n\n controllers.forEach((controller, key) => {\n const { namespace, model } = controller;\n\n if (!namespace || !model) {\n return;\n }\n\n const application = controllers.get(posix.join(namespace, 'application'));\n\n if (!application || application.serializerFallback !== false) {\n return;\n }\n\n const require = (type: string, via: string) => {\n const serializerKey = posix.join(namespace, type);\n const serializer = serializers.get(serializerKey);\n\n // Report the most direct way a type is reached: by its own controller,\n // else through the shortest include path of any controller.\n if (!serializer) {\n const known = missing.get(serializerKey);\n\n if (known === undefined || distance(via) < distance(known)) {\n missing.set(serializerKey, via);\n }\n }\n\n return serializer;\n };\n\n const own = require(model.resourceName, key);\n\n if (!own) {\n return;\n }\n\n // Breadth-first, so each gap is reported through its shortest include\n // path. Direct relationships are always includable (and\n // `fields`-selectable), even with a `maxIncludeDepth` below 1.\n const depth = Math.max(controller.maxIncludeDepth, 1);\n let level: Array<[ModelClass, Serializer<Model>, Array<string>]> = [\n [model, own, []]\n ];\n\n for (let current = 1; current <= depth && level.length; current += 1) {\n const next: typeof level = [];\n\n level.forEach(([parent, serializer, path]) => {\n [...serializer.hasOne, ...serializer.hasMany].forEach(name => {\n const opts = parent.relationshipFor(name);\n\n if (!opts) {\n return;\n }\n\n const nextPath = [...path, name];\n const related = require(opts.model\n .resourceName, `${key}?include=${nextPath.join('.')}`);\n\n if (related) {\n next.push([opts.model, related, nextPath]);\n }\n });\n });\n\n level = next;\n }\n });\n\n if (missing.size) {\n throw new NamespacedSerializerMissingError(missing);\n }\n}\n", "/**\n * Thrown at boot when a namespace that opted out of serializer fallback\n * (`serializerFallback = false` on its ApplicationController) can reach a type\n * that has no Serializer in that namespace.\n *\n * @private\n */\nclass NamespacedSerializerMissingError extends ReferenceError {\n /**\n * @param missing - Each missing serializer key (`admin/comments`) with an\n * example of how it is reached (`admin/posts?include=comments`).\n */\n constructor(missing: Map<string, string>) {\n const lines = Array.from(missing)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, via]) => ` - ${key} (reached from ${via})`);\n\n super(\n [\n 'Missing namespaced serializers. These namespaces set ' +\n '`serializerFallback = false`, so every type their controllers ' +\n 'can serialize or include needs a serializer of its own:',\n ...lines\n ].join('\\n')\n );\n }\n}\n\nexport default NamespacedSerializerMissingError;\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';\nimport validateNamespacedSerializers from './utils/validate-namespaced-serializers';\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 // Lets a Serializer resolve related resources' Serializers in its own\n // namespace (`Serializer#serializerFor()`), as Controllers do.\n serializers.forEach((serializer: Serializer<Model>) => {\n Reflect.defineProperty(serializer, 'serializers', {\n value: serializers,\n writable: false,\n enumerable: false,\n configurable: false\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 validateNamespacedSerializers(controllers, serializers);\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": ["import_chalk", "ansiRegex", "format", "format", "import_chalk", "import_chalk", "stat", "chalk", "format", "import_chalk", "joinPath", "import_fb_watchman", "resolve", "resolve", "fs", "initialize", "cluster", "import_inflection", "_", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "resolve", "resolve", "resolve", "import_inflection", "import_inflection", "createRunner", "import_inflection", "normalize", "normalize", "import_inflection", "initialize", "createRunner", "resolve", "initialize", "import_inflection", "import_inflection", "resolve", "parseURL", "hasOwnProperty", "import_path", "import_inflection", "import_path", "import_inflection", "resource", "validateType", "validateType", "validateOne", "validateType", "resource", "define", "build", "import_path", "import_inflection", "normalize", "joinPath", "import_path", "resource", "map", "import_path", "build", "import_path", "import_path", "import_path", "require", "initialize", "build", "initialize", "resolve", "resolve"]
7
7
  }