lumen-framework 3.0.1 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/cli.cjs +2 -1
- package/dist/cli.cjs.map +2 -2
- package/dist/index.js +62 -15
- package/dist/index.js.map +4 -4
- package/dist/index.mjs +62 -15
- package/dist/index.mjs.map +4 -4
- package/dist/types/packages/jsonapi/errors/not-acceptable-error.d.ts +1 -1
- package/dist/types/packages/jsonapi/index.d.ts +3 -1
- package/dist/types/packages/jsonapi/utils/has-media-type-params.d.ts +6 -0
- package/dist/types/packages/jsonapi/utils/is-jsonapi.d.ts +2 -0
- package/dist/types/packages/jsonapi/utils/media-type.d.ts +19 -0
- package/dist/types/packages/server/utils/validate-accept.d.ts +5 -1
- package/dist/types/packages/server/utils/validate-content-type.d.ts +4 -0
- package/package.json +1 -1
- package/dist/types/packages/jsonapi/utils/has-media-type.d.ts +0 -4
package/dist/cli.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/packages/cli/commands/index.ts", "../src/packages/cli/commands/build.ts", "../src/constants.ts", "../src/packages/compiler/index.ts", "../src/packages/fs/index.ts", "../src/packages/fs/watcher/index.ts", "../src/packages/fs/watcher/initialize.ts", "../src/utils/exec.ts", "../src/utils/k.ts", "../src/utils/try-catch.ts", "../src/packages/fs/utils/is-js-file.ts", "../src/packages/freezeable/constants.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/fs/utils/create-resolver.ts", "../src/packages/fs/utils/create-path-remover.ts", "../src/packages/fs/utils/rmrf.ts", "../src/packages/fs/utils/exists.ts", "../src/packages/fs/utils/parse-path.ts", "../src/utils/chain.ts", "../src/packages/compiler/utils/create-manifest.ts", "../src/utils/underscore.ts", "../src/utils/compose.ts", "../src/packages/compiler/utils/format-name.ts", "../src/packages/compiler/utils/create-boot-script.ts", "../src/packages/template/utils/insert-values.ts", "../src/packages/template/index.ts", "../src/packages/cli/commands/create.ts", "../src/packages/cli/utils/driver-for.ts", "../src/packages/cli/templates/application.ts", "../src/packages/cli/templates/config.ts", "../src/packages/cli/templates/routes.ts", "../src/packages/cli/utils/indent.ts", "../src/packages/cli/templates/database.ts", "../src/packages/cli/templates/seed.ts", "../package.json", "../src/packages/cli/templates/package-json.ts", "../src/packages/cli/templates/eslint-config.ts", "../src/packages/cli/templates/readme.ts", "../src/packages/cli/templates/license.ts", "../src/packages/cli/templates/gitignore.ts", "../src/packages/cli/generator/index.ts", "../src/packages/cli/utils/create-prompt.ts", "../src/packages/cli/generator/utils/generate-type.ts", "../src/packages/cli/generator/constants.ts", "../src/packages/database/errors/invalid-driver-error.ts", "../src/packages/database/constants.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/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/database/utils/pending-migrations.ts", "../src/packages/database/utils/normalize-model-name.ts", "../src/packages/database/model/index.ts", "../src/packages/database/query/index.ts", "../src/packages/database/query/utils/format-select.ts", "../src/packages/database/query/errors/record-not-found-error.ts", "../src/packages/database/query/runner/utils/build-results.ts", "../src/packages/database/relationship/index.ts", "../src/packages/database/relationship/utils/getters.ts", "../src/packages/database/model/initialize-class.ts", "../src/packages/database/migration/utils/generate-timestamp.ts", "../src/packages/database/migration/index.ts", "../src/packages/database/index.ts", "../src/packages/cli/templates/model.ts", "../src/packages/cli/templates/serializer.ts", "../src/packages/cli/templates/controller.ts", "../src/packages/cli/templates/empty-migration.ts", "../src/packages/cli/templates/model-migration.ts", "../src/packages/cli/templates/middleware.ts", "../src/packages/cli/templates/util.ts", "../src/packages/cli/generator/utils/log.ts", "../src/packages/cli/generator/utils/create-generator.ts", "../src/packages/cli/generator/utils/migration-conflict.ts", "../src/packages/cli/generator/utils/generator-for.ts", "../src/packages/cli/commands/generate.ts", "../src/packages/cli/commands/dbcreate.ts", "../src/utils/github.ts", "../src/packages/cli/constants.ts", "../src/packages/cli/errors/database-config-missing.ts", "../src/packages/loader/utils/bundle-for.ts", "../src/packages/config/index.ts", "../src/utils/merge.ts", "../src/packages/loader/utils/format-key.ts", "../src/packages/loader/index.ts", "../src/packages/cli/commands/dbdrop.ts", "../src/packages/cli/commands/dbmigrate.ts", "../src/packages/cli/commands/dbrollback.ts", "../src/packages/cli/commands/dbseed.ts", "../src/packages/cli/commands/destroy.ts", "../src/packages/cli/commands/repl.ts", "../src/packages/cli/commands/serve.ts", "../src/packages/pm/cluster/index.ts", "../src/utils/range.ts", "../src/packages/pm/index.ts", "../src/packages/cli/commands/test.ts"],
|
|
4
|
-
"sourcesContent": ["export { build } from './build';\nexport { create } from './create';\nexport { dbcreate } from './dbcreate';\nexport { dbdrop } from './dbdrop';\nexport { dbmigrate } from './dbmigrate';\nexport { dbrollback } from './dbrollback';\nexport { dbseed } from './dbseed';\nexport { destroy } from './destroy';\nexport { generate } from './generate';\nexport { repl } from './repl';\nexport { serve } from './serve';\nexport { test } from './test';\n", "import Ora from 'ora';\n\nimport { CWD, NODE_ENV } from '../../../constants';\nimport { compile } from '../../compiler';\n\nexport async function build(useStrict: boolean = false): Promise<void> {\n const spinner = new Ora({\n text: 'Building your application...',\n spinner: 'dots'\n });\n\n spinner.start();\n\n await compile(CWD, NODE_ENV, {\n useStrict\n });\n\n spinner.stop();\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", "import path from 'path';\n\nimport * as esbuild from 'esbuild';\n\nimport { rmrf, readdir, readdirRec, isJSFile } from '../fs';\n\nimport createManifest from './utils/create-manifest';\nimport createBootScript from './utils/create-boot-script';\n\n/**\n * @private\n */\ntype CompileOptions = {\n useStrict?: boolean;\n};\n\n/**\n * @private\n */\nexport async function compile(\n dir: string,\n env: string,\n opts: CompileOptions = {}\n): Promise<void> {\n const { useStrict = false } = opts;\n // The framework is consumed as its built ESM bundle (sibling of the CLI\n // bundle in `dist/`), not as raw source \u2014 so the app compiler is decoupled\n // from the framework's source language.\n const local = path.join(__dirname, 'index.mjs');\n const entry = path.join(dir, 'dist', 'index.js');\n\n const assets = await Promise.all([\n readdir(path.join(dir, 'app', 'models')),\n readdir(path.join(dir, 'db', 'migrate')),\n readdirRec(path.join(dir, 'app', 'controllers')),\n readdirRec(path.join(dir, 'app', 'serializers'))\n ]).then(types => {\n let [models, migrations, controllers, serializers] = types;\n\n models = models.filter(isJSFile);\n migrations = migrations.filter(isJSFile);\n controllers = controllers.filter(isJSFile);\n serializers = serializers.filter(isJSFile);\n\n return new Map<string, Array<string> | string>([\n ['Application', path.join('app', 'index.js')],\n ['config', path.join('config', 'environments', `${env}.js`)],\n ['controllers', controllers],\n ['database', path.join('config', 'database.js')],\n ['migrations', migrations],\n ['models', models],\n ['routes', path.join('app', 'routes.js')],\n ['seed', path.join('db', 'seed.js')],\n ['serializers', serializers]\n ]);\n });\n\n await Promise.all([\n createManifest(dir, assets, { useStrict }),\n createBootScript(dir, { useStrict })\n ]);\n\n await esbuild.build({\n entryPoints: [entry],\n outfile: path.join(dir, 'dist', 'bundle.js'),\n bundle: true,\n platform: 'node',\n format: 'cjs',\n target: 'node20',\n sourcemap: true,\n // Reproduces `rollup-plugin-lumen`: preserves each class's `.name` (Lumen keys\n // models/controllers/serializers off it) against esbuild's own renaming.\n keepNames: true,\n // Bare specifiers stay external (knex, inflection, the app's own deps);\n // relative paths and the two aliases below are bundled in. This matches the\n // old `is-external` split, with the framework itself pulled in via LUMEN_LOCAL.\n packages: 'external',\n alias: {\n // Apps import the framework as `import { Model } from 'LUMEN_LOCAL'`.\n LUMEN_LOCAL: local,\n // ...and their own tree as `app/...`.\n app: path.join(dir, 'app')\n }\n });\n\n await rmrf(entry);\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 { exec as nativeExec } from 'child_process';\nimport type { ExecOptions } from 'child_process';\n\n/**\n * @private\n */\nexport default function exec(\n cmd: string,\n opts?: ExecOptions\n): Promise<[string, string]> {\n return new Promise((resolve, reject) => {\n // `utf8` is already child_process.exec's default; passing it explicitly\n // selects the string-returning overload, so callers get `string` rather\n // than `string | Buffer` (which `ExecOptions` alone would permit).\n nativeExec(cmd, { ...opts, encoding: 'utf8' }, (err, stdout, stderr) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve([stdout, stderr]);\n });\n });\n}\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", "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", "import { extname } from 'path';\n\n/**\n * @private\n */\nexport default function isJSFile(target: string): boolean {\n return extname(target) === '.js';\n}\n", "export const FREEZER = new WeakSet<object>();\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", "/* 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 { PLATFORM } from '../../../constants';\n\n/**\n * @private\n */\nfunction createPathRemover(path: string): (src: string) => string {\n let pattern = new RegExp(`${path}(/)?(.+)`);\n\n if (PLATFORM.startsWith('win')) {\n const sep = '\\\\\\\\';\n\n pattern = new RegExp(`${path.replace(/\\\\/g, sep)}(${sep})?(.+)`);\n }\n\n return source => source.replace(pattern, '$2');\n}\n\nexport default createPathRemover;\n", "import path from 'path';\n\nimport { stat, rmdir, readdir, unlink } from '../index';\n\n/**\n * @private\n */\nfunction rmrf(target: string): Promise<boolean> {\n return stat(target)\n .then(stats => {\n if (stats && stats.isDirectory()) {\n return readdir(target);\n } else if (stats && stats.isFile()) {\n return unlink(target).then(() => []);\n }\n\n return [];\n })\n .then(files =>\n Promise.all(files.map(file => rmrf(path.join(target, file))))\n )\n .then(() => rmdir(target))\n .catch(err => {\n if (err.code === 'ENOENT') {\n return Promise.resolve();\n }\n\n return Promise.reject(err);\n })\n .then(() => true);\n}\n\nexport default rmrf;\n", "import { stat, readdir } from '../index';\n\n/**\n * @private\n */\nexport default async function exists(\n path: string | RegExp,\n dir?: string\n): Promise<boolean> {\n if (path instanceof RegExp) {\n const pattern = path;\n let files: Array<string> = [];\n\n if (dir) {\n files = await readdir(dir);\n }\n\n return files.some(file => pattern.test(file));\n }\n\n return stat(path).then(\n () => true,\n () => false\n );\n}\n", "import path from 'path';\n\nimport { CWD } from '../../../constants';\nimport chain from '../../../utils/chain';\nimport type { fs$ParsedPath } from '../index';\n\n/**\n * @private\n */\nexport default function resolvePath(\n cwd: string = CWD,\n dir: string = '',\n name: string = ''\n): fs$ParsedPath {\n return chain(name.split('/'))\n .pipe(parts => path.join(cwd, dir, ...parts))\n .pipe(path.parse)\n .pipe(({ base, ...etc }) => ({\n base,\n ...etc,\n relative: path.join(etc.dir.substr(etc.dir.indexOf(dir)), base),\n absolute: path.join(etc.dir, base)\n }))\n .value();\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 { sep, posix, basename, join as joinPath } from 'path';\n\nimport { camelize, capitalize, pluralize } from 'inflection';\n\nimport { mkdir, writeFile, appendFile } from '../../fs';\nimport chain from '../../../utils/chain';\nimport tryCatch from '../../../utils/try-catch';\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\n\nimport formatName from './format-name';\n\n/**\n * @private\n */\nfunction createExportStatement(\n name: string,\n path: string,\n isDefault: boolean = true\n): string {\n const normalized = posix.join(...path.split(sep));\n\n if (isDefault) {\n return `export {\\n default as ${name}\\n} from '../${normalized}';\\n\\n`;\n }\n\n return `export {\\n ${name}\\n} from '../${normalized}';\\n\\n`;\n}\n\n/**\n * @private\n */\nfunction createWriter(file: string) {\n const writerFor =\n (type: string, handleWrite?: (value: string) => Promise<void>) =>\n (value: Array<string>) => {\n const formatSymbol = compose(\n (str: string) => str + capitalize(type),\n formatName\n );\n\n return Promise.all(\n value.map(item => {\n if (handleWrite) {\n return handleWrite(item);\n }\n\n const path = joinPath('app', pluralize(type), item);\n const symbol = formatSymbol(item);\n\n return appendFile(file, createExportStatement(symbol, path));\n })\n );\n };\n\n return {\n controllers: writerFor('controller'),\n serializers: writerFor('serializer'),\n\n models: writerFor('model', async item => {\n const path = joinPath('app', 'models', item);\n const name = formatName(item);\n\n return appendFile(file, createExportStatement(name, path));\n }),\n\n migrations: writerFor('migration', async item => {\n const path = joinPath('db', 'migrate', item);\n const name = chain(item)\n .pipe(str => basename(str, '.js'))\n .pipe(underscore)\n .pipe(str => str.substr(17))\n .pipe(str => camelize(str, true))\n .value();\n\n await appendFile(\n file,\n createExportStatement(`up as ${name}Up`, path, false)\n );\n\n await appendFile(\n file,\n createExportStatement(`down as ${name}Down`, path, false)\n );\n })\n };\n}\n\n/**\n * @private\n */\nexport default async function createManifest(\n dir: string,\n assets: Map<string, Array<string> | string>,\n { useStrict }: { useStrict: boolean }\n): Promise<void> {\n const dist = joinPath(dir, 'dist');\n const file = joinPath(dist, 'index.js');\n const writer = createWriter(file);\n\n await tryCatch(() => mkdir(dist));\n await writeFile(file, useStrict ? \"'use strict';\\n\\n\" : '');\n\n await Promise.all(\n Array.from(assets).map(([key, value]) => {\n const write = Reflect.get(writer, key);\n\n if (write) {\n return write(value);\n } else if (!write && typeof value === 'string') {\n return appendFile(file, createExportStatement(key, value));\n }\n\n return Promise.resolve();\n })\n );\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", "/* 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 { posix, dirname, basename } from 'path';\n\nimport { camelize } from 'inflection';\n\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\n\nconst DOUBLE_COLON = /::/g;\n\n/**\n * @private\n */\nconst formatName: (source: string) => string = compose(\n (name: string) => name.replace(DOUBLE_COLON, '$'),\n camelize,\n underscore,\n (name: string) => posix.join(dirname(name), basename(name, '.js'))\n);\n\nexport default formatName;\n", "import path from 'path';\n\nimport template from '../../template';\nimport { writeFile } from '../../fs';\n\n/**\n * @private\n */\nexport default async function createBootScript(\n dir: string,\n {\n useStrict\n }: {\n useStrict: boolean;\n }\n): Promise<void> {\n let data = template`\n const CWD = process.cwd();\n const { env: { PORT } } = process;\n const { Application, config, database } = require('./bundle');\n\n module.exports = new Application(\n Object.assign(config, {\n database,\n path: CWD,\n port: PORT\n })\n ).catch(err => {\n process.send({\n error: err ? err.stack : void 0,\n message: 'error'\n });\n });\n `;\n\n if (useStrict) {\n data = `'use strict';\\n\\n${data}`;\n }\n\n await writeFile(path.join(dir, 'dist', 'boot.js'), data);\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 './utils/insert-values';\n\nconst bodyPattern = /^\\n([\\s\\S]+)\\s{2}$/gm;\nconst trailingWhitespace = /\\s+$/;\n\n/**\n * Used as a template tag, so `strings` arrives as a TemplateStringsArray \u2014\n * typed as `readonly string[]`, which also accepts a plain array.\n *\n * @private\n */\nexport default function template(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n const compiled = insertValues(strings, ...values);\n let [body] = compiled.match(bodyPattern) || [];\n let indentLevel = /^\\s{0,4}(.+)$/g;\n\n if (!body) {\n body = compiled;\n indentLevel = /^\\s{0,2}(.+)$/g;\n }\n\n return body\n .split('\\n')\n .slice(1)\n .map(line => {\n let str = line.replace(indentLevel, '$1');\n\n if (trailingWhitespace.test(str)) {\n str = str.replace(trailingWhitespace, '');\n }\n\n return str;\n })\n .join('\\n');\n}\n\nexport { default as insertValues } from './utils/insert-values';\n", "import { EOL } from 'os';\n\nimport Ora from 'ora';\nimport { green } from 'chalk';\n\nimport { CWD } from '../../../constants';\nimport { mkdir, writeFile } from '../../fs';\nimport template from '../../template';\nimport exec from '../../../utils/exec';\nimport driverFor from '../utils/driver-for';\nimport appTemplate from '../templates/application';\nimport configTemplate from '../templates/config';\nimport routesTemplate from '../templates/routes';\nimport dbTemplate from '../templates/database';\nimport seedTemplate from '../templates/seed';\nimport pkgJSONTemplate from '../templates/package-json';\nimport eslintConfigTemplate from '../templates/eslint-config';\nimport readmeTemplate from '../templates/readme';\nimport licenseTemplate from '../templates/license';\nimport gitignoreTemplate from '../templates/gitignore';\n\nimport { generate } from './generate';\n\n/**\n * @private\n */\nexport async function create(name: string, database: string) {\n const driver = driverFor(database);\n const project = `${CWD}/${name}`;\n\n await mkdir(project);\n\n await Promise.all([\n mkdir(`${project}/app`),\n mkdir(`${project}/config`),\n mkdir(`${project}/db`)\n ]);\n\n await Promise.all([\n mkdir(`${project}/app/models`),\n mkdir(`${project}/app/serializers`),\n mkdir(`${project}/app/controllers`),\n mkdir(`${project}/app/middleware`),\n mkdir(`${project}/app/utils`),\n mkdir(`${project}/config/environments`),\n mkdir(`${project}/db/migrate`)\n ]);\n\n await Promise.all([\n writeFile(`${project}/app/index.js`, appTemplate(name)),\n\n writeFile(`${project}/app/routes.js`, routesTemplate()),\n\n writeFile(\n `${project}/config/environments/development.js`,\n configTemplate(name, 'development')\n ),\n\n writeFile(\n `${project}/config/environments/test.js`,\n configTemplate(name, 'test')\n ),\n\n writeFile(\n `${project}/config/environments/production.js`,\n configTemplate(name, 'production')\n ),\n\n writeFile(`${project}/config/database.js`, dbTemplate(name, driver)),\n\n writeFile(`${project}/db/seed.js`, seedTemplate()),\n\n writeFile(`${project}/README.md`, readmeTemplate(name)),\n\n writeFile(`${project}/LICENSE`, licenseTemplate()),\n\n writeFile(`${project}/package.json`, pkgJSONTemplate(name, driver)),\n\n writeFile(`${project}/eslint.config.mjs`, eslintConfigTemplate()),\n\n writeFile(`${project}/.gitignore`, gitignoreTemplate())\n ]);\n\n const logOutput = template`\n ${green('create')} app/index.js\n ${green('create')} app/routes.js\n ${green('create')} bin/app.js\n ${green('create')} config/environments/development.js\n ${green('create')} config/environments/test.js\n ${green('create')} config/environments/production.js\n ${green('create')} config/database.js\n ${green('create')} db/migrate\n ${green('create')} db/seed.js\n ${green('create')} README.md\n ${green('create')} LICENSE\n ${green('create')} package.json\n ${green('create')} eslint.config.mjs\n ${green('create')} .gitignore\n `;\n\n process.stdout.write(logOutput.substr(0, logOutput.length - 1));\n process.stdout.write(EOL);\n\n await Promise.all([\n generate({\n cwd: project,\n type: 'serializer',\n name: 'application'\n }),\n\n generate({\n cwd: project,\n type: 'controller',\n name: 'application'\n })\n ]);\n\n await exec('git init && git add .', {\n cwd: project\n });\n\n process.stdout.write(`${green('initialize')} git`);\n process.stdout.write(EOL);\n\n const spinner = new Ora({\n text: 'Installing dependencies from npm...',\n spinner: 'dots'\n });\n\n spinner.start();\n\n // The database driver is already declared in the generated package.json, so a\n // plain install pulls it in \u2014 no separate `npm install --save` needed.\n await exec('npm install', {\n cwd: project\n });\n\n spinner.stop();\n}\n", "const drivers = new Map([\n ['postgres', 'pg'],\n ['sqlite', 'sqlite3'],\n ['mysql', 'mysql2']\n]);\n\nexport default function driverFor(database = 'sqlite') {\n return drivers.get(database) || 'sqlite3';\n}\n", "import { classify } from 'inflection';\n\nimport template from '../../template';\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n return template`\n import { Application } from 'lumen-framework';\n\n class ${normalized} extends Application {\n\n }\n\n export default ${normalized};\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string, env: string): string => {\n const isTestENV = env === 'test';\n const isProdENV = env === 'production';\n\n return template`\n export default {\n logging: {\n level: ${isProdENV ? \"'INFO'\" : \"'DEBUG'\"},\n format: ${isProdENV ? \"'json'\" : \"'text'\"},\n enabled: ${(!isTestENV).toString()},\n\n filter: {\n params: []\n }\n }\n };\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export default function routes() {\n\n }\n`;\n", "export default function indent(amount: number = 1): string {\n return ' '.repeat(amount);\n}\n", "import indent from '../utils/indent';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, driver: string): string => {\n const schemaName = underscore(name);\n let driverName = driver;\n let template = 'export default {\\n';\n let username: string | undefined;\n\n if (!driverName) {\n driverName = 'sqlite3';\n }\n\n if (driverName === 'pg') {\n username = 'postgres';\n } else if (driverName !== 'pg' && driverName !== 'sqlite3') {\n username = 'root';\n }\n\n ['development', 'test', 'production'].forEach(environment => {\n template += `${indent(2)}${environment}: {\\n`;\n\n if (driverName !== 'sqlite3') {\n template += `${indent(4)}pool: 5,\\n`;\n }\n\n template += `${indent(4)}driver: '${driverName}',\\n`;\n\n if (username) {\n template += `${indent(4)}username: '${username}',\\n`;\n }\n\n switch (environment) {\n case 'development':\n template += `${indent(4)}database: '${schemaName}_dev'\\n`;\n break;\n\n case 'test':\n template += `${indent(4)}database: '${schemaName}_test'\\n`;\n break;\n\n case 'production':\n template += `${indent(4)}database: '${schemaName}_prod'\\n`;\n break;\n\n default:\n template += `${indent(4)}database: '${schemaName}_${environment}'\\n`;\n break;\n }\n\n template += `${indent(2)}}`;\n\n if (environment !== 'production') {\n template += ',\\n\\n';\n }\n });\n\n template += '\\n};\\n';\n\n return template;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export default async function seed() {\n\n }\n`;\n", "{\n \"name\": \"lumen-framework\",\n \"version\": \"3.0.1\",\n \"description\": \"Build scalable, Node.js-powered REST APIs with almost no code.\",\n \"keywords\": [\n \"mvc\",\n \"api\",\n \"lux\",\n \"lumen\",\n \"jsonapi\",\n \"json-api\",\n \"rest\",\n \"framework\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/nickschot/lux/issues\"\n },\n \"repository\": \"github:nickschot/lux\",\n \"license\": \"MIT\",\n \"author\": \"Nick Schot <nickschot@gmail.com>\",\n \"contributors\": [\n {\n \"name\": \"Zachary Golba\",\n \"url\": \"https://github.com/zacharygolba\"\n }\n ],\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"./dist/types/index.d.ts\",\n \"bin\": {\n \"lumen\": \"bin/lumen\"\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"node build.mjs\",\n \"build:debugger\": \"node test/utils/debugger/build.mjs\",\n \"build:types\": \"tsc -p tsconfig.build.json\",\n \"clean\": \"shx rm -rf coverage dist test/test-app/dist\",\n \"debugger\": \"node --enable-source-maps test/utils/debugger/dist/debug.js\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint .\",\n \"prepack\": \"pnpm run build && pnpm run build:types\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\",\n \"chalk\": \"^4.1.2\",\n \"commander\": \"^2.20.3\",\n \"esbuild\": \"^0.28.1\",\n \"fb-watchman\": \"^2.0.2\",\n \"inflection\": \"^1.13.4\",\n \"knex\": \"^3.3.0\",\n \"ora\": \"^5.4.1\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.5\",\n \"@types/inflection\": \"1.13.2\",\n \"@types/node\": \"^20.19.43\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"eslint\": \"^9.39.5\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"faker\": \"4.1.0\",\n \"globals\": \"^17.7.0\",\n \"lumen-framework\": \"link:.\",\n \"node-fetch\": \"^2.7.0\",\n \"prettier\": \"^3.9.5\",\n \"release-plan\": \"^0.18.0\",\n \"shx\": \"^0.3.4\",\n \"sinon\": \"2.2.0\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.64.0\",\n \"vitest\": \"^4.1.10\"\n },\n \"packageManager\": \"pnpm@10.34.5\",\n \"engines\": {\n \"node\": \">= 20\"\n },\n \"volta\": {\n \"node\": \"20.20.2\"\n }\n}\n", "import { version } from '../../../../package.json';\n\nconst LUMEN_VERSION: string = version;\n\n// The knex client name (what `driverFor` returns) -> the npm package + version\n// a generated app needs installed to actually connect. Pinned to the versions\n// CI validates (see test/test-app).\nconst DRIVER_DEPS: Record<string, { name: string; version: string }> = {\n sqlite3: { name: 'sqlite3', version: '^5.1.7' },\n pg: { name: 'pg', version: '^8.16.3' },\n mysql2: { name: 'mysql2', version: '^3.15.3' }\n};\n\n/**\n * @private\n */\nexport default (name: string, driver: string): string => {\n const dbDriver = DRIVER_DEPS[driver] || DRIVER_DEPS.sqlite3;\n\n const pkg: Record<string, unknown> = {\n name,\n version: '0.0.1',\n description: '',\n scripts: {\n start: 'lumen serve',\n test: 'lumen test',\n lint: 'eslint .'\n },\n author: '',\n license: 'MIT',\n dependencies: {\n knex: '^3.3.0',\n 'lumen-framework': LUMEN_VERSION,\n [dbDriver.name]: dbDriver.version\n },\n devDependencies: {\n '@eslint/js': '^9.39.5',\n eslint: '^9.39.5',\n globals: '^17.7.0'\n },\n engines: {\n node: '>= 20'\n }\n };\n\n // sqlite3 ships a native binary; pnpm needs its build approved explicitly.\n if (dbDriver.name === 'sqlite3') {\n pkg.pnpm = { onlyBuiltDependencies: ['sqlite3'] };\n }\n\n return `${JSON.stringify(pkg, null, 2)}\\n`;\n};\n", "/**\n * @private\n */\nexport default (): string => `import js from '@eslint/js';\nimport globals from 'globals';\n\nexport default [\n js.configs.recommended,\n {\n languageOptions: {\n ecmaVersion: 2023,\n sourceType: 'module',\n globals: {\n ...globals.node\n }\n }\n }\n];\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => template`\n # ${name}\n\n ## Installation\n\n * \\`git clone https://github.com/<this-repository>\\`\n * \\`cd ${name}\\`\n * \\`npm install\\`\n\n ## Running / Development\n\n * \\`lumen serve\\`\n\n ## Testing\n\n * \\`lumen test\\`\n\n ## Further Reading / Useful Links\n * [Lumen](https://github.com/nickschot/lux/)\n * [Chai](http://chaijs.com/) / [Mocha](http://mochajs.org/)\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n The MIT License (MIT)\n\n Copyright (c) 2016\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n # See http://help.github.com/ignore-files/ for more about ignoring files.\n\n # dependencies\n /node_modules\n\n # build\n /dist\n\n # logs\n /log\n npm-debug.log\n\n # database\n *.sqlite\n *.sqlite-journal\n *.sqlite-wal\n *.sqlite-shm\n\n # misc\n *.DS_Store\n`;\n", "import { red, green } from 'chalk';\n\nimport createPrompt from '../utils/create-prompt';\n\nimport generatorFor from './utils/generator-for';\nimport type { Generator$opts } from './interfaces';\n\n/**\n * @private\n */\nexport async function runGenerator({\n cwd,\n type,\n name,\n attrs\n}: {\n cwd: Generator$opts['cwd'];\n type: Generator$opts['type'];\n name: Generator$opts['name'];\n attrs: Generator$opts['attrs'];\n}): Promise<void> {\n const generator = generatorFor(type);\n const prompt = createPrompt();\n\n await generator({\n cwd,\n type,\n name,\n attrs,\n onConflict: path =>\n prompt.question(`${green('?')} ${red('Overwrite')} ${path}? (Y/n)\\r`)\n });\n\n prompt.close();\n}\n\nexport type {\n Generator,\n Generator$opts,\n Generator$template\n} from './interfaces';\n", "import { createInterface } from 'readline';\n\nconst YES = /^y(es)?$/i;\n\nexport default function createPrompt() {\n const prompt = createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n prompt.setPrompt('');\n\n return {\n question(text: string): Promise<boolean> {\n return new Promise(resolve => {\n prompt.question(text, answer => {\n resolve(YES.test(answer));\n });\n });\n },\n\n close(): void {\n prompt.close();\n }\n };\n}\n", "import { posix, join as joinPath } from 'path';\n\nimport { green } from 'chalk';\nimport { pluralize, singularize } from 'inflection';\n\nimport { NAMESPACED_RESOURCE_MESSAGE } from '../constants';\nimport { generateTimestamp } from '../../../database';\nimport { exists, readFile, writeFile } from '../../../fs';\nimport modelTemplate from '../../templates/model';\nimport serializerTemplate from '../../templates/serializer';\nimport controllerTemplate from '../../templates/controller';\nimport emptyMigrationTemplate from '../../templates/empty-migration';\nimport modelMigrationTemplate from '../../templates/model-migration';\nimport middlewareTemplate from '../../templates/middleware';\nimport utilTemplate from '../../templates/util';\nimport chain from '../../../../utils/chain';\nimport type { Generator$opts } from '../index';\n\nimport log from './log';\nimport createGenerator from './create-generator';\nimport { createConflictResolver, detectConflict } from './migration-conflict';\n\n/**\n * @private\n */\nexport async function controller(opts: Generator$opts): Promise<void> {\n const { cwd } = opts;\n let { name } = opts;\n\n const dir = joinPath('app', 'controllers');\n const generate = createGenerator({\n dir,\n template: controllerTemplate\n });\n\n if (!name.endsWith('application')) {\n name = pluralize(name);\n }\n\n await generate({\n ...opts,\n cwd,\n name\n });\n\n const namespace = posix.dirname(name);\n\n if (namespace !== '.') {\n const hasParent = await exists(\n joinPath(cwd, dir, ...[...namespace.split('/'), 'application.js'])\n );\n\n if (!hasParent) {\n await controller({\n ...opts,\n cwd,\n name: `${namespace}/application`,\n attrs: []\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport async function serializer(opts: Generator$opts): Promise<void> {\n const { cwd } = opts;\n let { name } = opts;\n\n const dir = joinPath('app', 'serializers');\n const generate = createGenerator({\n dir,\n template: serializerTemplate\n });\n\n if (!name.endsWith('application')) {\n name = pluralize(name);\n }\n\n await generate({\n ...opts,\n cwd,\n name\n });\n\n const namespace = posix.dirname(name);\n\n if (namespace !== '.') {\n const hasParent = await exists(\n joinPath(cwd, dir, ...[...namespace.split('/'), 'application.js'])\n );\n\n if (!hasParent) {\n await serializer({\n ...opts,\n cwd,\n name: `${namespace}/application`,\n attrs: []\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport function migration(opts: Generator$opts) {\n const { cwd, onConflict } = opts;\n let { name } = opts;\n\n const dir = joinPath('db', 'migrate');\n const generate = createGenerator({\n dir,\n template: emptyMigrationTemplate,\n hasConflict: detectConflict\n });\n\n name = chain(name)\n .pipe(posix.basename)\n .pipe(str => `${generateTimestamp()}-${str}`)\n .value();\n\n return generate({\n ...opts,\n cwd,\n name,\n onConflict: createConflictResolver({\n cwd,\n onConflict\n })\n });\n}\n\n/**\n * @private\n */\nexport function modelMigration(opts: Generator$opts) {\n const { cwd, onConflict } = opts;\n let { name } = opts;\n\n const dir = joinPath('db', 'migrate');\n const generate = createGenerator({\n dir,\n template: modelMigrationTemplate,\n hasConflict: detectConflict\n });\n\n name = chain(name)\n .pipe(posix.basename)\n .pipe(pluralize)\n .pipe(str => `${generateTimestamp()}-create-${str}`)\n .value();\n\n return generate({\n ...opts,\n cwd,\n name,\n onConflict: createConflictResolver({\n cwd,\n onConflict\n })\n });\n}\n\n/**\n * @private\n */\nexport async function model(opts: Generator$opts): Promise<void> {\n let { name } = opts;\n const generate = createGenerator({\n dir: joinPath('app', 'models'),\n template: modelTemplate\n });\n\n await modelMigration({ ...opts, name });\n\n name = chain(name).pipe(posix.basename).pipe(singularize).value();\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport function middleware(opts: Generator$opts) {\n let { name } = opts;\n const parts = name.split('/');\n\n name = parts.pop() || name;\n\n const generate = createGenerator({\n dir: joinPath('app', 'middleware', ...parts),\n template: middlewareTemplate\n });\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport function util(opts: Generator$opts) {\n let { name } = opts;\n const parts = name.split('/');\n\n name = parts.pop() || name;\n\n const generate = createGenerator({\n dir: joinPath('app', 'utils', ...parts),\n template: utilTemplate\n });\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport async function resource(opts: Generator$opts) {\n await model(opts);\n await controller(opts);\n await serializer(opts);\n\n if (posix.dirname(opts.name) !== '.') {\n log(NAMESPACED_RESOURCE_MESSAGE);\n return;\n }\n\n const path = joinPath(opts.cwd, 'app', 'routes.js');\n const routes = chain(await readFile(path))\n .pipe(buf => buf.toString('utf8'))\n .pipe(str => str.split('\\n'))\n .pipe(lines =>\n lines.reduce((result, line, index, arr) => {\n const closeIndex = arr.lastIndexOf('}');\n let str = result;\n\n if (line && index <= closeIndex) {\n str += `${line}\\n`;\n }\n\n if (index + 1 === closeIndex) {\n str += ` this.resource('${pluralize(opts.name)}');\\n`;\n }\n\n return str;\n }, '')\n )\n .value();\n\n await writeFile(path, routes);\n log(`${green('update')} app/routes.js`);\n}\n", "import { dim } from 'chalk';\n\nimport template from '../../template';\n\n/**\n * TODO: Update the 'routes.js' file when generating a resource within a\n * namespace.\n */\nexport const NAMESPACED_RESOURCE_MESSAGE = template`\n\n \uD83C\uDF89 It looks like the resource you generated is within a namespace!\n\n Lumen will only update your 'routes.js' file if you generate a resource at the\\\n root namespace (i.e 'lumen generate resource users').\n\n In order to access the resource you have created, remember to manually update\\\n your 'routes.js' file.\n\n Example:\n\n export default function routes() {\n ${dim('// this resource will be accessible at /users')}\n this.resource('users');\n\n this.namespace('admin', function () {\n ${dim('// this resource will be accessible at /admin/users')}\n this.resource('users');\n });\n }\n\n`;\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 { 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", "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 { 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", "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", "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", "/* 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 { 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", "/* 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", "function formatInt(int: number): string {\n return (int / 10).toString().replace('.', '').substr(0, 2);\n}\n\nexport function* padding(\n char: string,\n amount: number\n): Generator<string, void, void> {\n for (let i = 0; i < amount; i += 1) {\n yield char;\n }\n}\n\nexport default function generateTimestamp(): string {\n const now = new Date();\n const timestamp =\n now.toISOString().substr(0, 10).split('-').join('') +\n formatInt(now.getHours()) +\n formatInt(now.getMinutes()) +\n formatInt(now.getSeconds()) +\n formatInt(now.getMilliseconds());\n\n return timestamp + Array.from(padding('0', 16 - timestamp.length)).join('');\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 { 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 { EOL } from 'os';\n\nimport { classify, camelize } from 'inflection';\n\nimport template from '../../template';\nimport indent from '../utils/indent';\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\n\nconst VALID_ATTR = /^(\\w|-)+:(\\w|-)+$/;\nconst RELATIONSHIP = /^belongs-to|has-(one|many)$/;\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>) => {\n const normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n return template`\n import { Model } from 'lumen-framework';\n\n class ${normalized} extends Model {\n ${entries(\n (attrs || [])\n .filter(attr => VALID_ATTR.test(attr))\n .map(attr => attr.split(':'))\n .filter(([, type]) => RELATIONSHIP.test(type))\n .reduce(\n (types, [related, type]) => {\n const key = chain(type)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n const value = Reflect.get(types, key);\n\n if (value) {\n const inverse = camelize(normalized, true);\n const relatedKey = chain(related)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return {\n ...types,\n [key]: [\n ...value,\n `${indent(8)}${relatedKey}: {${EOL}` +\n `${indent(10)}inverse: '${inverse}'${EOL}` +\n `${indent(8)}}`\n ]\n };\n }\n\n return types;\n },\n {\n hasOne: [],\n hasMany: [],\n belongsTo: []\n }\n )\n )\n .filter(([, value]) => value.length)\n .reduce(\n (result, [key, value], index) =>\n chain(result)\n .pipe(str => {\n if (index && str.length) {\n return `${str}${EOL.repeat(2)}`;\n }\n\n return str;\n })\n .pipe(\n str =>\n str +\n `${indent(index === 0 ? 2 : 6)}static ${key} = {${EOL}` +\n `${value.join(`,${EOL.repeat(2)}`)}${EOL}` +\n `${indent(6)}};`\n )\n .value(),\n ''\n )}\n }\n\n export default ${normalized};\n `;\n};\n", "import { classify, camelize, pluralize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\nimport indent from '../utils/indent';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>): string => {\n let normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n if (!normalized.endsWith('Application')) {\n normalized = pluralize(normalized);\n }\n\n const body = entries(\n attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':'))\n .reduce(\n (obj, parts) => {\n const [, type] = parts;\n let [attr] = parts;\n let { hasOne, hasMany, attributes } = obj;\n\n attr = `${indent(8)}'${camelize(underscore(attr), true)}'`;\n\n switch (type) {\n case 'belongs-to':\n case 'has-one':\n hasOne = [...hasOne, attr];\n break;\n\n case 'has-many':\n hasMany = [...hasMany, attr];\n break;\n\n default:\n attributes = [...attributes, attr];\n }\n\n return {\n attributes,\n hasOne,\n hasMany\n };\n },\n {\n // `belongsTo` was a dead accumulator key \u2014 never destructured and, for\n // non-empty attrs, never present in the returned object \u2014 so it emitted\n // nothing. Dropped so the accumulator types cleanly.\n attributes: [] as string[],\n hasOne: [] as string[],\n hasMany: [] as string[]\n }\n )\n ).reduce((result, group, index) => {\n const [key, items] = group;\n let str = result;\n\n if (items.length) {\n const value = items.join(',\\n');\n\n if (index && str.length) {\n str += '\\n\\n';\n }\n\n str +=\n `${indent(index === 0 ? 2 : 6)}${key} = ` +\n `[\\n${value}\\n${indent(6)}];`;\n }\n\n return str;\n }, '');\n\n return template`\n import { Serializer } from 'lumen-framework';\n\n class ${normalized}Serializer extends Serializer {\n ${body}\n }\n\n export default ${normalized}Serializer;\n `;\n};\n", "import { classify, camelize, pluralize } from 'inflection';\n\nimport template from '../../template';\nimport entries from '../../../utils/entries';\nimport indent from '../utils/indent';\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>): string => {\n let normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n if (!normalized.endsWith('Application')) {\n normalized = pluralize(normalized);\n }\n\n const body = entries(\n attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':')[0])\n .reduce(\n (obj, attr) => ({\n ...obj,\n params: [\n ...obj.params,\n `${indent(8)}'${camelize(underscore(attr), true)}'`\n ]\n }),\n { params: [] as string[] }\n )\n ).reduce((result, group, index) => {\n const [key, items] = group;\n let str = result;\n\n if (items.length) {\n const value = items.join(',\\n');\n\n if (index && str.length) {\n str += '\\n\\n';\n }\n\n str +=\n `${indent(index === 0 ? 2 : 6)}${key} = ` +\n `[\\n${value}\\n${indent(6)}];`;\n }\n\n return str;\n }, '');\n\n return template`\n import { Controller } from 'lumen-framework';\n\n class ${normalized}Controller extends Controller {\n ${body}\n }\n\n export default ${normalized}Controller;\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export function up(schema) {\n\n }\n\n export function down(schema) {\n\n }\n`;\n", "import { pluralize } from 'inflection';\n\nimport template from '../../template';\nimport chain from '../../../utils/chain';\nimport indent from '../utils/indent';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string> | string): string => {\n const indices = ['id'];\n const table = chain(name)\n .pipe(str => str.substr(24))\n .pipe(underscore)\n .pipe(pluralize)\n .value();\n\n let body = '';\n\n if (Array.isArray(attrs)) {\n body = attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':'))\n .filter(([, type]) => !/^has-(one|many)$/g.test(type))\n .map(attr => {\n let [column, type] = attr;\n\n column = underscore(column);\n\n if (type === 'belongs-to') {\n type = 'integer';\n column = `${column}_id`;\n\n if (Array.isArray(indices)) {\n indices.push(column);\n }\n }\n\n return [column, type];\n })\n .map((attr, index) => {\n let [column] = attr;\n const [, type] = attr;\n const shouldIndex = indices.indexOf(column) >= 0;\n\n column = `${indent(index > 0 ? 8 : 0)}table.${type}('${column}')`;\n return shouldIndex ? `${column}.index();` : `${column};`;\n })\n .join('\\n');\n }\n\n return template`\n export function up(schema) {\n return schema.createTable('${table}', table => {\n table.increments('id');\n ${body}\n table.timestamps();\n\n table.index('created_at');\n table.index('updated_at');\n });\n }\n\n export function down(schema) {\n return schema.dropTable('${table}');\n }\n `;\n};\n", "import { camelize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return template`\n export default function ${normalized}(/*request, response*/) {\n\n }\n `;\n};\n", "import { camelize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return template`\n export default function ${normalized}() {\n\n }\n `;\n};\n", "/**\n * @private\n */\nexport default function log(data: string | Error): void {\n if (data instanceof Error) {\n process.stdout.write(`${data.stack || data.message}\\n`);\n } else {\n process.stderr.write(`${data}\\n`);\n }\n}\n", "import { join as joinPath } from 'path';\n\nimport { red, green, yellow } from 'chalk';\n\nimport { rmrf, exists, mkdirRec, writeFile, parsePath } from '../../../fs';\nimport type { Generator, Generator$template } from '../index';\n\nimport log from './log';\n\nconst FORWARD_SLASH = /\\//g;\n\n/**\n * @private\n */\nexport default function createGenerator({\n dir,\n template,\n hasConflict = exists\n}: {\n dir: string;\n template: Generator$template;\n hasConflict?: (path: string) => Promise<boolean>;\n}): Generator {\n return async ({ cwd, attrs, onConflict, ...opts }) => {\n const path = parsePath(cwd, dir, `${opts.name}.js`);\n const name = opts.name.replace(FORWARD_SLASH, '-');\n let action = green('create');\n\n await mkdirRec(path.dir);\n\n if (await hasConflict(path.absolute)) {\n const shouldContinue = await onConflict(path.relative);\n\n if (shouldContinue && typeof shouldContinue === 'string') {\n await rmrf(joinPath(path.dir, shouldContinue));\n log(`${red('remove')} ${joinPath(dir, shouldContinue)}`);\n } else if (shouldContinue && typeof shouldContinue === 'boolean') {\n action = yellow('overwrite');\n await rmrf(path.absolute);\n } else {\n log(`${yellow('skip')} ${path.relative}`);\n return;\n }\n }\n\n await writeFile(path.absolute, template(name, attrs));\n log(`${action} ${path.relative}`);\n };\n}\n", "import { exists, readdir, parsePath } from '../../../fs';\nimport type { Generator$opts } from '../index';\n\nexport function detectConflict(path: string): Promise<boolean> {\n const { dir, base } = parsePath(path);\n const pattern = new RegExp(`^\\\\d+-${base.substr(17)}$`);\n\n return exists(pattern, dir);\n}\n\nexport function createConflictResolver({\n cwd,\n onConflict\n}: {\n cwd: Generator$opts['cwd'];\n onConflict: Generator$opts['onConflict'];\n}): Generator$opts['onConflict'] {\n return async (path: string) => {\n if (await onConflict(path)) {\n const parsed = parsePath(cwd, path);\n const migrations = await readdir(parsed.dir);\n\n return (\n migrations.find(file => file.substr(17) === parsed.base.substr(17)) ||\n false\n );\n }\n\n return false;\n };\n}\n", "import type { Generator } from '../index';\n\nimport * as generators from './generate-type';\n\nexport default function generatorFor(type: string): Generator {\n const normalized = type.toLowerCase();\n const generator: void | Generator = Reflect.get(generators, normalized);\n\n if (!generator) {\n throw new Error(`Could not find a generator for '${type}'.`);\n }\n\n return generator;\n}\n", "import { CWD } from '../../../constants';\nimport { runGenerator } from '../generator';\nimport type { Generator$opts } from '../generator';\n\n/**\n * @private\n */\nexport function generate({\n cwd = CWD,\n name,\n type,\n attrs = []\n}: {\n cwd?: Generator$opts['cwd'];\n name: Generator$opts['name'];\n type: Generator$opts['type'];\n attrs?: Generator$opts['attrs'];\n}): Promise<void> {\n return runGenerator({\n cwd,\n name,\n type,\n attrs\n });\n}\n", "import { EOL } from 'os';\n\nimport { CWD, NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { CONNECTION_STRING_MESSAGE } from '../constants';\nimport DatabaseConfigMissingError from '../errors/database-config-missing';\nimport { connect } from '../../database';\nimport { writeFile } from '../../fs';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbcreate() {\n const load = createLoader(CWD);\n const config = Reflect.get(load('config').database, NODE_ENV);\n\n if (!config) {\n throw new DatabaseConfigMissingError(NODE_ENV);\n }\n\n if (config.driver === 'sqlite3') {\n return writeFile(`${CWD}/db/${config.database}_${NODE_ENV}.sqlite`, '');\n }\n\n if (DATABASE_URL || config.url) {\n process.stderr.write(CONNECTION_STRING_MESSAGE);\n process.stderr.write(EOL);\n return Promise.resolve();\n }\n\n const { schema } = connect(CWD, config);\n const query = `CREATE DATABASE ${config.database}`;\n\n // Knex query builders are event emitters at runtime, but `.once` isn't on the\n // `SchemaBuilder` type surface.\n const raw = schema.raw(query) as unknown as {\n once(event: string, listener: () => void): Promise<unknown>;\n };\n\n return raw.once('query', () => {\n process.stdout.write(query);\n process.stdout.write(EOL);\n });\n}\n", "const GITHUB_URL = 'https://github.com/nickschot/lux';\n\ntype Options = {\n line?: number;\n branch?: string;\n};\n\n/**\n * @private\n */\nexport function fileLink(path: string, opts: Options = {}): string {\n const { line, branch = 'master' } = opts;\n let link = `${GITHUB_URL}/blob/${branch}/${path}`;\n\n if (line && line >= 0) {\n link += `#${line}`;\n }\n\n return link;\n}\n", "import template from '../template';\nimport { fileLink } from '../../utils/github';\n\nexport const VALID_DATABASES = [\n 'postgres',\n 'sqlite',\n 'mysql',\n 'mariadb',\n 'oracle'\n];\n\nconst DB_INTERFACE_URL = fileLink('src/packages/database/interfaces.js', {\n line: 17\n});\n\nexport const CONNECTION_STRING_MESSAGE = template`\n\n You're using a URL in your database config (config/database.js).\n\n In that case, Lumen assumes you don't need to create or drop your database.\n If you'd like to create or drop a database, set up your database config\n without the url.\n\n For guidance, see:\n ${DB_INTERFACE_URL}\n`;\n", "class DatabaseConfigMissingError extends ReferenceError {\n constructor(environment: string) {\n super(`Could not find database config for environment \"${environment}\".`);\n }\n}\n\nexport default DatabaseConfigMissingError;\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 { 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", "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 { 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 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", "import { EOL } from 'os';\n\nimport { CWD, NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { CONNECTION_STRING_MESSAGE } from '../constants';\nimport DatabaseConfigMissingError from '../errors/database-config-missing';\nimport { rmrf } from '../../fs';\nimport { connect } from '../../database';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbdrop() {\n const load = createLoader(CWD);\n const config = Reflect.get(load('config').database, NODE_ENV);\n\n if (!config) {\n throw new DatabaseConfigMissingError(NODE_ENV);\n }\n\n if (config.driver === 'sqlite3') {\n return rmrf(`${CWD}/db/${config.database}_${NODE_ENV}.sqlite`);\n }\n\n if (DATABASE_URL || config.url) {\n process.stderr.write(CONNECTION_STRING_MESSAGE);\n process.stderr.write(EOL);\n return Promise.resolve();\n }\n\n const { schema } = connect(CWD, config);\n const query = `DROP DATABASE IF EXISTS ${config.database}`;\n\n // Knex query builders are event emitters at runtime, but `.once` isn't on the\n // `SchemaBuilder` type surface.\n const raw = schema.raw(query) as unknown as {\n once(event: string, listener: () => void): Promise<unknown>;\n };\n\n return raw.once('query', () => {\n process.stdout.write(query);\n process.stdout.write(EOL);\n });\n}\n", "import { EOL } from 'os';\n\nimport { CWD } from '../../../constants';\nimport Database, { pendingMigrations } from '../../database';\nimport Logger, { sql } from '../../logger';\nimport { createLoader } from '../../loader';\nimport { composeAsync } from '../../../utils/compose';\n\n/**\n * @private\n */\nexport async function dbmigrate() {\n const load = createLoader(CWD);\n\n const { database: config } = load('config');\n const models = load('models');\n const migrations = load('migrations');\n\n const { connection, schema } = await new Database({\n config,\n models,\n path: CWD,\n checkMigrations: false,\n\n logger: new Logger({ enabled: false } as ConstructorParameters<\n typeof Logger\n >[0])\n });\n\n const pending = await pendingMigrations(CWD, () => connection('migrations'));\n\n if (pending.length) {\n const runners = pending\n .map(name => {\n const version = name.replace(/^(\\d{16})-.+$/g, '$1');\n const key = name.replace(new RegExp(`${version}-(.+)\\\\.js`), '$1');\n\n return [version, migrations.get(`${key}-up`)];\n })\n .filter(([, migration]) => Boolean(migration))\n .reverse()\n .map(([version, migration]) => () => {\n const query = migration.run(schema());\n\n return query\n .on('query', () => {\n process.stdout.write(sql`${query.toString()}`);\n process.stdout.write(EOL);\n })\n .then(() =>\n connection('migrations').insert({\n version\n })\n );\n });\n\n // `composeAsync`'s variadic signature doesn't model a spread of an array\n // of thunks; the runtime contract is a list of stages returning a runner.\n await (\n composeAsync as unknown as (\n ...fns: Array<() => Promise<unknown>>\n ) => () => Promise<unknown>\n )(...runners)();\n }\n\n return true;\n}\n", "import { EOL } from 'os';\n\nimport { CWD } from '../../../constants';\nimport Database from '../../database';\nimport Logger, { sql } from '../../logger';\nimport { readdir } from '../../fs';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport async function dbrollback() {\n const load = createLoader(CWD);\n\n const { database: config } = load('config');\n const models = load('models');\n const migrations = load('migrations');\n\n const { connection, schema } = await new Database({\n config,\n models,\n path: CWD,\n checkMigrations: false,\n\n logger: new Logger({ enabled: false } as ConstructorParameters<\n typeof Logger\n >[0])\n });\n\n const migrationFiles = await readdir(`${CWD}/db/migrate`);\n\n if (migrationFiles.length) {\n let migration;\n let version = await connection('migrations')\n .orderBy('version', 'desc')\n .first();\n\n if (version && version.version) {\n version = version.version;\n }\n\n const target = migrationFiles.find(m => m.indexOf(version) === 0);\n\n if (target) {\n migration = target.replace(new RegExp(`${version}-(.+)\\\\.js`), '$1');\n migration = migrations.get(`${migration}-down`);\n\n if (migration) {\n const query = migration.run(schema());\n\n await query.on('query', () => {\n process.stdout.write(sql`${query.toString()}`);\n process.stdout.write(EOL);\n });\n\n await connection('migrations')\n .where({\n version\n })\n .del();\n }\n }\n }\n}\n", "import { CWD } from '../../../constants';\nimport Logger from '../../logger';\nimport Database from '../../database';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbseed(): Promise<unknown> {\n const load = createLoader(CWD);\n const { database: config } = load('config');\n const seed = load('seed');\n const models = load('models');\n\n // `new Database(...)` returns a promise for the initialized store at runtime\n // (async-constructor pattern), though its static type is `Database`.\n return (\n new Database({\n config,\n models,\n path: CWD,\n logger: new Logger({\n enabled: false\n } as ConstructorParameters<typeof Logger>[0])\n }) as unknown as Promise<Database>\n ).then(store => store.connection.transaction(seed));\n}\n", "import { EOL } from 'os';\n\nimport { red, green } from 'chalk';\nimport { pluralize, singularize } from 'inflection';\n\nimport { CWD } from '../../../constants';\nimport { rmrf, exists, readdir, readFile, writeFile } from '../../fs';\n\n/**\n * @private\n */\nexport async function destroyType(type: string, name: string) {\n const normalizedType = type.toLowerCase();\n let normalizedName = name;\n let path: string | undefined;\n let migrations: Array<string>;\n\n switch (normalizedType) {\n case 'model':\n normalizedName = singularize(normalizedName);\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n case 'migration':\n migrations = await readdir(`${CWD}/db/migrate`);\n\n // `find` may return undefined (no matching migration); pre-existing\n // behaviour lets that flow into the path as the string \"undefined\",\n // which then simply fails the `exists` check below.\n normalizedName = migrations.find(\n file => `${normalizedName}.js` === file.substr(17)\n ) as string;\n\n path = `db/migrate/${normalizedName}`;\n break;\n\n case 'controller':\n case 'serializer':\n normalizedName = pluralize(normalizedName);\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n case 'middleware':\n path = `app/${normalizedType}/${normalizedName}.js`;\n break;\n\n case 'util':\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n default:\n return;\n }\n\n if (await exists(`${CWD}/${path}`)) {\n await rmrf(`${CWD}/${path}`);\n\n process.stdout.write(`${red('remove')} ${path}`);\n process.stdout.write(EOL);\n }\n}\n\n/**\n * @private\n */\nexport async function destroy({ type, name }: { type: string; name: string }) {\n if (type === 'resource') {\n const routes = (await readFile(`${CWD}/app/routes.js`))\n .toString('utf8')\n .split('\\n')\n .reduce((lines, line) => {\n const pattern = new RegExp(\n `\\\\s*this.resource\\\\(('|\"|\\`)${pluralize(name)}('|\"|\\`)\\\\);?`\n );\n\n return pattern.test(line) ? lines : [...lines, line];\n }, [] as string[])\n .join('\\n');\n\n await Promise.all([\n destroyType('model', name),\n destroyType('migration', `create-${pluralize(name)}`),\n destroyType('serializer', name),\n destroyType('controller', name)\n ]);\n\n await writeFile(`${CWD}/app/routes.js`, routes);\n\n process.stdout.write(`${green('update')} app/routes.js`);\n process.stdout.write(EOL);\n } else if (type === 'model') {\n await Promise.all([\n destroyType(type, name),\n destroyType('migration', `create-${pluralize(name)}`)\n ]);\n } else {\n await destroyType(type, name);\n }\n}\n", "import path from 'path';\nimport { start as startRepl } from 'repl';\n\nimport { CWD } from '../../../constants';\nimport type Application from '../../application';\n\nexport function repl(): Promise<void> {\n // FIXME: this async executor swallows rejections from the `require` below.\n // Pre-existing behaviour, left as-is so the lint migration stays\n // behaviour-neutral \u2014 worth fixing when this file is converted to TypeScript.\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async resolve => {\n const app: Application = await Reflect.apply(require, null, [\n path.join(CWD, 'dist', 'boot')\n ]);\n\n const instance = startRepl({\n prompt: '> '\n });\n\n instance.once('exit', resolve);\n\n Object.assign(instance.context, {\n app,\n logger: app.logger,\n routes: app.router,\n [app.constructor.name]: app,\n\n ...Array.from(app.models).reduce(\n (context, [, model]) => ({\n ...context,\n [model.name]: model\n }),\n {}\n ),\n\n ...Array.from(app.controllers).reduce(\n (context, [, controller]) => ({\n ...context,\n [controller.constructor.name]: controller\n }),\n {}\n ),\n\n ...Array.from(app.serializers).reduce(\n (context, [, serializer]) => ({\n ...context,\n [serializer.constructor.name]: serializer\n }),\n {}\n )\n });\n });\n}\n", "import { cyan } from 'chalk';\n\nimport { CWD, PORT, NODE_ENV } from '../../../constants';\nimport Logger from '../../logger';\nimport { createLoader } from '../../loader';\nimport { createCluster } from '../../pm';\nimport { watch } from '../../fs';\n\nimport { build } from './build';\n\n/**\n * @private\n */\nexport async function serve({\n hot = NODE_ENV === 'development',\n cluster = false,\n useStrict = false\n}: {\n hot: boolean;\n cluster: boolean;\n useStrict: boolean;\n}): Promise<void> {\n const load = createLoader(CWD);\n const { logging } = load('config');\n const logger = new Logger(logging);\n\n if (hot) {\n const watcher = await watch(CWD);\n\n watcher.on('change', async changed => {\n await build(useStrict);\n (process as NodeJS.EventEmitter).emit('update', changed);\n });\n }\n\n createCluster({\n logger,\n path: CWD,\n port: PORT,\n maxWorkers: cluster ? undefined : 1\n }).once('ready', () => {\n logger.info(`Lumen Server listening on port: ${cyan(`${PORT}`)}`);\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The cluster manager talks to worker processes over Node's untyped IPC\n * channel: the `update` process event and worker `message` payloads carry\n * arbitrary data, so those values are genuinely untyped here (as they were\n * `Object` in Flow).\n */\nimport EventEmitter from 'events';\nimport os from 'os';\nimport cluster, { type Worker } from 'cluster';\nimport { join as joinPath } from 'path';\n\nimport { red, green } from 'chalk';\n\nimport { NODE_ENV } from '../../../constants';\nimport { line } from '../../logger';\nimport omit from '../../../utils/omit';\nimport range from '../../../utils/range';\nimport { composeAsync } from '../../../utils/compose';\nimport type Logger from '../../logger';\n\nimport type { Cluster$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Cluster extends EventEmitter {\n declare path: string;\n\n declare port: number;\n\n declare logger: Logger;\n\n declare workers: Set<Worker>;\n\n declare maxWorkers: number;\n\n constructor({ path, port, logger, maxWorkers }: Cluster$opts) {\n super();\n\n Object.defineProperties(this, {\n path: {\n value: path,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n port: {\n value: port,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n workers: {\n value: new Set(),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n maxWorkers: {\n value: maxWorkers || os.cpus().length,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n\n cluster.setupMaster({\n exec: joinPath(path, 'dist', 'boot.js')\n });\n\n process.on('update', (changed: Array<{ name: string }>) => {\n changed.forEach(({ name: filename }) => {\n logger.info(`${green('update')} ${filename}`);\n });\n\n this.reload();\n });\n\n this.forkAll().then(() => this.emit('ready'));\n }\n\n fork(retry: boolean = true): Promise<Worker> {\n return new Promise(resolve => {\n if (this.workers.size < this.maxWorkers) {\n const worker = cluster.fork({\n NODE_ENV,\n PORT: this.port\n });\n\n const timeout = setTimeout(() => {\n this.logger.info(line`\n Removing worker process: ${red(`${worker.process.pid}`)}\n `);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n worker.kill();\n\n this.workers.delete(worker);\n\n resolve(worker);\n\n if (retry) {\n this.fork(false);\n }\n }, 30000);\n\n const handleError = (err?: any) => {\n if (err) {\n this.logger.error(err);\n }\n\n this.logger.info(line`\n Removing worker process: ${red(`${worker.process.pid}`)}\n `);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n worker.kill();\n\n this.workers.delete(worker);\n\n resolve(worker);\n };\n\n worker.on('message', (msg: string | Record<string, any>) => {\n let data: Record<string, any> = {};\n let message = msg;\n\n if (typeof message === 'object') {\n data = omit(message, 'message');\n message = message.message;\n }\n\n switch (message) {\n case 'ready':\n this.logger.info(line`\n Adding worker process: ${green(`${worker.process.pid}`)}\n `);\n\n this.workers.add(worker);\n\n clearTimeout(timeout);\n worker.removeListener('error', handleError);\n\n resolve(worker);\n break;\n\n case 'error':\n handleError(data.error);\n break;\n\n default:\n break;\n }\n });\n\n worker.once('error', handleError);\n worker.once('exit', (code: number | null) => {\n const {\n process: { pid }\n } = worker;\n\n if (typeof code === 'number') {\n this.logger.info(line`\n Worker process: ${red(`${pid}`)} exited with code ${code}\n `);\n }\n\n this.logger.info(`Removing worker process: ${red(`${pid}`)}`);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n this.workers.delete(worker);\n\n this.fork();\n });\n }\n });\n }\n\n shutdown<T extends Worker>(worker: T): Promise<T> {\n return new Promise(resolve => {\n this.workers.delete(worker);\n\n const timeout = setTimeout(() => worker.kill(), 5000);\n\n worker.once('disconnect', () => {\n worker.kill();\n });\n\n worker.once('exit', () => {\n resolve(worker);\n clearTimeout(timeout);\n });\n\n worker.send('shutdown');\n worker.disconnect();\n });\n }\n\n reload() {\n if (this.workers.size) {\n const groups = Array.from(this.workers).reduce<\n Array<() => Promise<Array<Worker>>>\n >((arr, item, idx, src) => {\n if ((idx + 1) % 2) {\n const group = src.slice(idx, idx + 2);\n\n return [\n ...arr,\n () => Promise.all(group.map(worker => this.shutdown(worker)))\n ];\n }\n\n return arr;\n }, []);\n\n // groups is non-empty here (guarded by workers.size); composeAsync's\n // fixed-first-param signature can't be spread with a dynamic array.\n return (composeAsync as any)(...groups)();\n }\n\n return this.fork();\n }\n\n forkAll() {\n return Promise.race(\n Array.from(range(1, this.maxWorkers)).map(() => this.fork())\n );\n }\n}\n\nexport default Cluster;\n\nexport type { Cluster$opts } from './interfaces';\n", "/**\n * @private\n */\nexport default function* range(\n start: number,\n end: number\n): Generator<number, void, void> {\n for (let i = start; i <= end; i += 1) {\n yield i;\n }\n}\n", "import Cluster from './cluster';\nimport type { Cluster$opts } from './cluster';\n\n/**\n * @private\n */\nexport function createCluster({\n path,\n port,\n logger,\n maxWorkers\n}: Cluster$opts) {\n return new Cluster({\n path,\n port,\n logger,\n maxWorkers\n });\n}\n", "import { EOL } from 'os';\n\n/**\n * @private\n */\nexport function test(): Promise<void> {\n process.stdout.write('Coming Soon!');\n process.stdout.write(EOL);\n\n return Promise.resolve();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export { build } from './build';\nexport { create } from './create';\nexport { dbcreate } from './dbcreate';\nexport { dbdrop } from './dbdrop';\nexport { dbmigrate } from './dbmigrate';\nexport { dbrollback } from './dbrollback';\nexport { dbseed } from './dbseed';\nexport { destroy } from './destroy';\nexport { generate } from './generate';\nexport { repl } from './repl';\nexport { serve } from './serve';\nexport { test } from './test';\n", "import Ora from 'ora';\n\nimport { CWD, NODE_ENV } from '../../../constants';\nimport { compile } from '../../compiler';\n\nexport async function build(useStrict: boolean = false): Promise<void> {\n const spinner = new Ora({\n text: 'Building your application...',\n spinner: 'dots'\n });\n\n spinner.start();\n\n await compile(CWD, NODE_ENV, {\n useStrict\n });\n\n spinner.stop();\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", "import path from 'path';\n\nimport * as esbuild from 'esbuild';\n\nimport { mkdir, rmrf, readdir, readdirRec, isJSFile } from '../fs';\nimport tryCatch from '../../utils/try-catch';\n\nimport createManifest from './utils/create-manifest';\nimport createBootScript from './utils/create-boot-script';\n\n/**\n * @private\n */\ntype CompileOptions = {\n useStrict?: boolean;\n};\n\n/**\n * @private\n */\nexport async function compile(\n dir: string,\n env: string,\n opts: CompileOptions = {}\n): Promise<void> {\n const { useStrict = false } = opts;\n // The framework is consumed as its built ESM bundle (sibling of the CLI\n // bundle in `dist/`), not as raw source \u2014 so the app compiler is decoupled\n // from the framework's source language.\n const local = path.join(__dirname, 'index.mjs');\n const entry = path.join(dir, 'dist', 'index.js');\n\n const assets = await Promise.all([\n readdir(path.join(dir, 'app', 'models')),\n readdir(path.join(dir, 'db', 'migrate')),\n readdirRec(path.join(dir, 'app', 'controllers')),\n readdirRec(path.join(dir, 'app', 'serializers'))\n ]).then(types => {\n let [models, migrations, controllers, serializers] = types;\n\n models = models.filter(isJSFile);\n migrations = migrations.filter(isJSFile);\n controllers = controllers.filter(isJSFile);\n serializers = serializers.filter(isJSFile);\n\n return new Map<string, Array<string> | string>([\n ['Application', path.join('app', 'index.js')],\n ['config', path.join('config', 'environments', `${env}.js`)],\n ['controllers', controllers],\n ['database', path.join('config', 'database.js')],\n ['migrations', migrations],\n ['models', models],\n ['routes', path.join('app', 'routes.js')],\n ['seed', path.join('db', 'seed.js')],\n ['serializers', serializers]\n ]);\n });\n\n // Both writers below target `dist/`, so it must exist before they run\n // concurrently \u2014 otherwise on a fresh checkout the boot script can race\n // ahead of the manifest's own `mkdir` and fail with ENOENT.\n await tryCatch(() => mkdir(path.join(dir, 'dist')));\n\n await Promise.all([\n createManifest(dir, assets, { useStrict }),\n createBootScript(dir, { useStrict })\n ]);\n\n await esbuild.build({\n entryPoints: [entry],\n outfile: path.join(dir, 'dist', 'bundle.js'),\n bundle: true,\n platform: 'node',\n format: 'cjs',\n target: 'node20',\n sourcemap: true,\n // Reproduces `rollup-plugin-lumen`: preserves each class's `.name` (Lumen keys\n // models/controllers/serializers off it) against esbuild's own renaming.\n keepNames: true,\n // Bare specifiers stay external (knex, inflection, the app's own deps);\n // relative paths and the two aliases below are bundled in. This matches the\n // old `is-external` split, with the framework itself pulled in via LUMEN_LOCAL.\n packages: 'external',\n alias: {\n // Apps import the framework as `import { Model } from 'LUMEN_LOCAL'`.\n LUMEN_LOCAL: local,\n // ...and their own tree as `app/...`.\n app: path.join(dir, 'app')\n }\n });\n\n await rmrf(entry);\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 { exec as nativeExec } from 'child_process';\nimport type { ExecOptions } from 'child_process';\n\n/**\n * @private\n */\nexport default function exec(\n cmd: string,\n opts?: ExecOptions\n): Promise<[string, string]> {\n return new Promise((resolve, reject) => {\n // `utf8` is already child_process.exec's default; passing it explicitly\n // selects the string-returning overload, so callers get `string` rather\n // than `string | Buffer` (which `ExecOptions` alone would permit).\n nativeExec(cmd, { ...opts, encoding: 'utf8' }, (err, stdout, stderr) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve([stdout, stderr]);\n });\n });\n}\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", "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", "import { extname } from 'path';\n\n/**\n * @private\n */\nexport default function isJSFile(target: string): boolean {\n return extname(target) === '.js';\n}\n", "export const FREEZER = new WeakSet<object>();\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", "/* 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 { PLATFORM } from '../../../constants';\n\n/**\n * @private\n */\nfunction createPathRemover(path: string): (src: string) => string {\n let pattern = new RegExp(`${path}(/)?(.+)`);\n\n if (PLATFORM.startsWith('win')) {\n const sep = '\\\\\\\\';\n\n pattern = new RegExp(`${path.replace(/\\\\/g, sep)}(${sep})?(.+)`);\n }\n\n return source => source.replace(pattern, '$2');\n}\n\nexport default createPathRemover;\n", "import path from 'path';\n\nimport { stat, rmdir, readdir, unlink } from '../index';\n\n/**\n * @private\n */\nfunction rmrf(target: string): Promise<boolean> {\n return stat(target)\n .then(stats => {\n if (stats && stats.isDirectory()) {\n return readdir(target);\n } else if (stats && stats.isFile()) {\n return unlink(target).then(() => []);\n }\n\n return [];\n })\n .then(files =>\n Promise.all(files.map(file => rmrf(path.join(target, file))))\n )\n .then(() => rmdir(target))\n .catch(err => {\n if (err.code === 'ENOENT') {\n return Promise.resolve();\n }\n\n return Promise.reject(err);\n })\n .then(() => true);\n}\n\nexport default rmrf;\n", "import { stat, readdir } from '../index';\n\n/**\n * @private\n */\nexport default async function exists(\n path: string | RegExp,\n dir?: string\n): Promise<boolean> {\n if (path instanceof RegExp) {\n const pattern = path;\n let files: Array<string> = [];\n\n if (dir) {\n files = await readdir(dir);\n }\n\n return files.some(file => pattern.test(file));\n }\n\n return stat(path).then(\n () => true,\n () => false\n );\n}\n", "import path from 'path';\n\nimport { CWD } from '../../../constants';\nimport chain from '../../../utils/chain';\nimport type { fs$ParsedPath } from '../index';\n\n/**\n * @private\n */\nexport default function resolvePath(\n cwd: string = CWD,\n dir: string = '',\n name: string = ''\n): fs$ParsedPath {\n return chain(name.split('/'))\n .pipe(parts => path.join(cwd, dir, ...parts))\n .pipe(path.parse)\n .pipe(({ base, ...etc }) => ({\n base,\n ...etc,\n relative: path.join(etc.dir.substr(etc.dir.indexOf(dir)), base),\n absolute: path.join(etc.dir, base)\n }))\n .value();\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 { sep, posix, basename, join as joinPath } from 'path';\n\nimport { camelize, capitalize, pluralize } from 'inflection';\n\nimport { mkdir, writeFile, appendFile } from '../../fs';\nimport chain from '../../../utils/chain';\nimport tryCatch from '../../../utils/try-catch';\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\n\nimport formatName from './format-name';\n\n/**\n * @private\n */\nfunction createExportStatement(\n name: string,\n path: string,\n isDefault: boolean = true\n): string {\n const normalized = posix.join(...path.split(sep));\n\n if (isDefault) {\n return `export {\\n default as ${name}\\n} from '../${normalized}';\\n\\n`;\n }\n\n return `export {\\n ${name}\\n} from '../${normalized}';\\n\\n`;\n}\n\n/**\n * @private\n */\nfunction createWriter(file: string) {\n const writerFor =\n (type: string, handleWrite?: (value: string) => Promise<void>) =>\n (value: Array<string>) => {\n const formatSymbol = compose(\n (str: string) => str + capitalize(type),\n formatName\n );\n\n return Promise.all(\n value.map(item => {\n if (handleWrite) {\n return handleWrite(item);\n }\n\n const path = joinPath('app', pluralize(type), item);\n const symbol = formatSymbol(item);\n\n return appendFile(file, createExportStatement(symbol, path));\n })\n );\n };\n\n return {\n controllers: writerFor('controller'),\n serializers: writerFor('serializer'),\n\n models: writerFor('model', async item => {\n const path = joinPath('app', 'models', item);\n const name = formatName(item);\n\n return appendFile(file, createExportStatement(name, path));\n }),\n\n migrations: writerFor('migration', async item => {\n const path = joinPath('db', 'migrate', item);\n const name = chain(item)\n .pipe(str => basename(str, '.js'))\n .pipe(underscore)\n .pipe(str => str.substr(17))\n .pipe(str => camelize(str, true))\n .value();\n\n await appendFile(\n file,\n createExportStatement(`up as ${name}Up`, path, false)\n );\n\n await appendFile(\n file,\n createExportStatement(`down as ${name}Down`, path, false)\n );\n })\n };\n}\n\n/**\n * @private\n */\nexport default async function createManifest(\n dir: string,\n assets: Map<string, Array<string> | string>,\n { useStrict }: { useStrict: boolean }\n): Promise<void> {\n const dist = joinPath(dir, 'dist');\n const file = joinPath(dist, 'index.js');\n const writer = createWriter(file);\n\n await tryCatch(() => mkdir(dist));\n await writeFile(file, useStrict ? \"'use strict';\\n\\n\" : '');\n\n await Promise.all(\n Array.from(assets).map(([key, value]) => {\n const write = Reflect.get(writer, key);\n\n if (write) {\n return write(value);\n } else if (!write && typeof value === 'string') {\n return appendFile(file, createExportStatement(key, value));\n }\n\n return Promise.resolve();\n })\n );\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", "/* 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 { posix, dirname, basename } from 'path';\n\nimport { camelize } from 'inflection';\n\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\n\nconst DOUBLE_COLON = /::/g;\n\n/**\n * @private\n */\nconst formatName: (source: string) => string = compose(\n (name: string) => name.replace(DOUBLE_COLON, '$'),\n camelize,\n underscore,\n (name: string) => posix.join(dirname(name), basename(name, '.js'))\n);\n\nexport default formatName;\n", "import path from 'path';\n\nimport template from '../../template';\nimport { writeFile } from '../../fs';\n\n/**\n * @private\n */\nexport default async function createBootScript(\n dir: string,\n {\n useStrict\n }: {\n useStrict: boolean;\n }\n): Promise<void> {\n let data = template`\n const CWD = process.cwd();\n const { env: { PORT } } = process;\n const { Application, config, database } = require('./bundle');\n\n module.exports = new Application(\n Object.assign(config, {\n database,\n path: CWD,\n port: PORT\n })\n ).catch(err => {\n process.send({\n error: err ? err.stack : void 0,\n message: 'error'\n });\n });\n `;\n\n if (useStrict) {\n data = `'use strict';\\n\\n${data}`;\n }\n\n await writeFile(path.join(dir, 'dist', 'boot.js'), data);\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 './utils/insert-values';\n\nconst bodyPattern = /^\\n([\\s\\S]+)\\s{2}$/gm;\nconst trailingWhitespace = /\\s+$/;\n\n/**\n * Used as a template tag, so `strings` arrives as a TemplateStringsArray \u2014\n * typed as `readonly string[]`, which also accepts a plain array.\n *\n * @private\n */\nexport default function template(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n const compiled = insertValues(strings, ...values);\n let [body] = compiled.match(bodyPattern) || [];\n let indentLevel = /^\\s{0,4}(.+)$/g;\n\n if (!body) {\n body = compiled;\n indentLevel = /^\\s{0,2}(.+)$/g;\n }\n\n return body\n .split('\\n')\n .slice(1)\n .map(line => {\n let str = line.replace(indentLevel, '$1');\n\n if (trailingWhitespace.test(str)) {\n str = str.replace(trailingWhitespace, '');\n }\n\n return str;\n })\n .join('\\n');\n}\n\nexport { default as insertValues } from './utils/insert-values';\n", "import { EOL } from 'os';\n\nimport Ora from 'ora';\nimport { green } from 'chalk';\n\nimport { CWD } from '../../../constants';\nimport { mkdir, writeFile } from '../../fs';\nimport template from '../../template';\nimport exec from '../../../utils/exec';\nimport driverFor from '../utils/driver-for';\nimport appTemplate from '../templates/application';\nimport configTemplate from '../templates/config';\nimport routesTemplate from '../templates/routes';\nimport dbTemplate from '../templates/database';\nimport seedTemplate from '../templates/seed';\nimport pkgJSONTemplate from '../templates/package-json';\nimport eslintConfigTemplate from '../templates/eslint-config';\nimport readmeTemplate from '../templates/readme';\nimport licenseTemplate from '../templates/license';\nimport gitignoreTemplate from '../templates/gitignore';\n\nimport { generate } from './generate';\n\n/**\n * @private\n */\nexport async function create(name: string, database: string) {\n const driver = driverFor(database);\n const project = `${CWD}/${name}`;\n\n await mkdir(project);\n\n await Promise.all([\n mkdir(`${project}/app`),\n mkdir(`${project}/config`),\n mkdir(`${project}/db`)\n ]);\n\n await Promise.all([\n mkdir(`${project}/app/models`),\n mkdir(`${project}/app/serializers`),\n mkdir(`${project}/app/controllers`),\n mkdir(`${project}/app/middleware`),\n mkdir(`${project}/app/utils`),\n mkdir(`${project}/config/environments`),\n mkdir(`${project}/db/migrate`)\n ]);\n\n await Promise.all([\n writeFile(`${project}/app/index.js`, appTemplate(name)),\n\n writeFile(`${project}/app/routes.js`, routesTemplate()),\n\n writeFile(\n `${project}/config/environments/development.js`,\n configTemplate(name, 'development')\n ),\n\n writeFile(\n `${project}/config/environments/test.js`,\n configTemplate(name, 'test')\n ),\n\n writeFile(\n `${project}/config/environments/production.js`,\n configTemplate(name, 'production')\n ),\n\n writeFile(`${project}/config/database.js`, dbTemplate(name, driver)),\n\n writeFile(`${project}/db/seed.js`, seedTemplate()),\n\n writeFile(`${project}/README.md`, readmeTemplate(name)),\n\n writeFile(`${project}/LICENSE`, licenseTemplate()),\n\n writeFile(`${project}/package.json`, pkgJSONTemplate(name, driver)),\n\n writeFile(`${project}/eslint.config.mjs`, eslintConfigTemplate()),\n\n writeFile(`${project}/.gitignore`, gitignoreTemplate())\n ]);\n\n const logOutput = template`\n ${green('create')} app/index.js\n ${green('create')} app/routes.js\n ${green('create')} bin/app.js\n ${green('create')} config/environments/development.js\n ${green('create')} config/environments/test.js\n ${green('create')} config/environments/production.js\n ${green('create')} config/database.js\n ${green('create')} db/migrate\n ${green('create')} db/seed.js\n ${green('create')} README.md\n ${green('create')} LICENSE\n ${green('create')} package.json\n ${green('create')} eslint.config.mjs\n ${green('create')} .gitignore\n `;\n\n process.stdout.write(logOutput.substr(0, logOutput.length - 1));\n process.stdout.write(EOL);\n\n await Promise.all([\n generate({\n cwd: project,\n type: 'serializer',\n name: 'application'\n }),\n\n generate({\n cwd: project,\n type: 'controller',\n name: 'application'\n })\n ]);\n\n await exec('git init && git add .', {\n cwd: project\n });\n\n process.stdout.write(`${green('initialize')} git`);\n process.stdout.write(EOL);\n\n const spinner = new Ora({\n text: 'Installing dependencies from npm...',\n spinner: 'dots'\n });\n\n spinner.start();\n\n // The database driver is already declared in the generated package.json, so a\n // plain install pulls it in \u2014 no separate `npm install --save` needed.\n await exec('npm install', {\n cwd: project\n });\n\n spinner.stop();\n}\n", "const drivers = new Map([\n ['postgres', 'pg'],\n ['sqlite', 'sqlite3'],\n ['mysql', 'mysql2']\n]);\n\nexport default function driverFor(database = 'sqlite') {\n return drivers.get(database) || 'sqlite3';\n}\n", "import { classify } from 'inflection';\n\nimport template from '../../template';\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n return template`\n import { Application } from 'lumen-framework';\n\n class ${normalized} extends Application {\n\n }\n\n export default ${normalized};\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string, env: string): string => {\n const isTestENV = env === 'test';\n const isProdENV = env === 'production';\n\n return template`\n export default {\n logging: {\n level: ${isProdENV ? \"'INFO'\" : \"'DEBUG'\"},\n format: ${isProdENV ? \"'json'\" : \"'text'\"},\n enabled: ${(!isTestENV).toString()},\n\n filter: {\n params: []\n }\n }\n };\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export default function routes() {\n\n }\n`;\n", "export default function indent(amount: number = 1): string {\n return ' '.repeat(amount);\n}\n", "import indent from '../utils/indent';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, driver: string): string => {\n const schemaName = underscore(name);\n let driverName = driver;\n let template = 'export default {\\n';\n let username: string | undefined;\n\n if (!driverName) {\n driverName = 'sqlite3';\n }\n\n if (driverName === 'pg') {\n username = 'postgres';\n } else if (driverName !== 'pg' && driverName !== 'sqlite3') {\n username = 'root';\n }\n\n ['development', 'test', 'production'].forEach(environment => {\n template += `${indent(2)}${environment}: {\\n`;\n\n if (driverName !== 'sqlite3') {\n template += `${indent(4)}pool: 5,\\n`;\n }\n\n template += `${indent(4)}driver: '${driverName}',\\n`;\n\n if (username) {\n template += `${indent(4)}username: '${username}',\\n`;\n }\n\n switch (environment) {\n case 'development':\n template += `${indent(4)}database: '${schemaName}_dev'\\n`;\n break;\n\n case 'test':\n template += `${indent(4)}database: '${schemaName}_test'\\n`;\n break;\n\n case 'production':\n template += `${indent(4)}database: '${schemaName}_prod'\\n`;\n break;\n\n default:\n template += `${indent(4)}database: '${schemaName}_${environment}'\\n`;\n break;\n }\n\n template += `${indent(2)}}`;\n\n if (environment !== 'production') {\n template += ',\\n\\n';\n }\n });\n\n template += '\\n};\\n';\n\n return template;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export default async function seed() {\n\n }\n`;\n", "{\n \"name\": \"lumen-framework\",\n \"version\": \"3.0.3\",\n \"description\": \"Build scalable, Node.js-powered REST APIs with almost no code.\",\n \"keywords\": [\n \"mvc\",\n \"api\",\n \"lux\",\n \"lumen\",\n \"jsonapi\",\n \"json-api\",\n \"rest\",\n \"framework\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/nickschot/lux/issues\"\n },\n \"repository\": \"github:nickschot/lux\",\n \"license\": \"MIT\",\n \"author\": \"Nick Schot <nickschot@gmail.com>\",\n \"contributors\": [\n {\n \"name\": \"Zachary Golba\",\n \"url\": \"https://github.com/zacharygolba\"\n }\n ],\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"./dist/types/index.d.ts\",\n \"bin\": {\n \"lumen\": \"bin/lumen\"\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"node build.mjs\",\n \"build:debugger\": \"node test/utils/debugger/build.mjs\",\n \"build:types\": \"tsc -p tsconfig.build.json\",\n \"clean\": \"shx rm -rf coverage dist test/test-app/dist\",\n \"debugger\": \"node --enable-source-maps test/utils/debugger/dist/debug.js\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint .\",\n \"prepack\": \"pnpm run build && pnpm run build:types\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\",\n \"chalk\": \"^4.1.2\",\n \"commander\": \"^2.20.3\",\n \"esbuild\": \"^0.28.1\",\n \"fb-watchman\": \"^2.0.2\",\n \"inflection\": \"^1.13.4\",\n \"knex\": \"^3.3.0\",\n \"ora\": \"^5.4.1\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.5\",\n \"@types/inflection\": \"1.13.2\",\n \"@types/node\": \"^20.19.43\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"eslint\": \"^9.39.5\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"faker\": \"4.1.0\",\n \"globals\": \"^17.7.0\",\n \"lumen-framework\": \"link:.\",\n \"node-fetch\": \"^2.7.0\",\n \"prettier\": \"^3.9.5\",\n \"release-plan\": \"^0.18.0\",\n \"shx\": \"^0.3.4\",\n \"sinon\": \"2.2.0\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.64.0\",\n \"vitest\": \"^4.1.10\"\n },\n \"packageManager\": \"pnpm@10.34.5\",\n \"engines\": {\n \"node\": \">= 20\"\n },\n \"volta\": {\n \"node\": \"20.20.2\"\n }\n}\n", "import { version } from '../../../../package.json';\n\nconst LUMEN_VERSION: string = version;\n\n// The knex client name (what `driverFor` returns) -> the npm package + version\n// a generated app needs installed to actually connect. Pinned to the versions\n// CI validates (see test/test-app).\nconst DRIVER_DEPS: Record<string, { name: string; version: string }> = {\n sqlite3: { name: 'sqlite3', version: '^5.1.7' },\n pg: { name: 'pg', version: '^8.16.3' },\n mysql2: { name: 'mysql2', version: '^3.15.3' }\n};\n\n/**\n * @private\n */\nexport default (name: string, driver: string): string => {\n const dbDriver = DRIVER_DEPS[driver] || DRIVER_DEPS.sqlite3;\n\n const pkg: Record<string, unknown> = {\n name,\n version: '0.0.1',\n description: '',\n scripts: {\n start: 'lumen serve',\n test: 'lumen test',\n lint: 'eslint .'\n },\n author: '',\n license: 'MIT',\n dependencies: {\n knex: '^3.3.0',\n 'lumen-framework': LUMEN_VERSION,\n [dbDriver.name]: dbDriver.version\n },\n devDependencies: {\n '@eslint/js': '^9.39.5',\n eslint: '^9.39.5',\n globals: '^17.7.0'\n },\n engines: {\n node: '>= 20'\n }\n };\n\n // sqlite3 ships a native binary; pnpm needs its build approved explicitly.\n if (dbDriver.name === 'sqlite3') {\n pkg.pnpm = { onlyBuiltDependencies: ['sqlite3'] };\n }\n\n return `${JSON.stringify(pkg, null, 2)}\\n`;\n};\n", "/**\n * @private\n */\nexport default (): string => `import js from '@eslint/js';\nimport globals from 'globals';\n\nexport default [\n js.configs.recommended,\n {\n languageOptions: {\n ecmaVersion: 2023,\n sourceType: 'module',\n globals: {\n ...globals.node\n }\n }\n }\n];\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => template`\n # ${name}\n\n ## Installation\n\n * \\`git clone https://github.com/<this-repository>\\`\n * \\`cd ${name}\\`\n * \\`npm install\\`\n\n ## Running / Development\n\n * \\`lumen serve\\`\n\n ## Testing\n\n * \\`lumen test\\`\n\n ## Further Reading / Useful Links\n * [Lumen](https://github.com/nickschot/lux/)\n * [Chai](http://chaijs.com/) / [Mocha](http://mochajs.org/)\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n The MIT License (MIT)\n\n Copyright (c) 2016\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n # See http://help.github.com/ignore-files/ for more about ignoring files.\n\n # dependencies\n /node_modules\n\n # build\n /dist\n\n # logs\n /log\n npm-debug.log\n\n # database\n *.sqlite\n *.sqlite-journal\n *.sqlite-wal\n *.sqlite-shm\n\n # misc\n *.DS_Store\n`;\n", "import { red, green } from 'chalk';\n\nimport createPrompt from '../utils/create-prompt';\n\nimport generatorFor from './utils/generator-for';\nimport type { Generator$opts } from './interfaces';\n\n/**\n * @private\n */\nexport async function runGenerator({\n cwd,\n type,\n name,\n attrs\n}: {\n cwd: Generator$opts['cwd'];\n type: Generator$opts['type'];\n name: Generator$opts['name'];\n attrs: Generator$opts['attrs'];\n}): Promise<void> {\n const generator = generatorFor(type);\n const prompt = createPrompt();\n\n await generator({\n cwd,\n type,\n name,\n attrs,\n onConflict: path =>\n prompt.question(`${green('?')} ${red('Overwrite')} ${path}? (Y/n)\\r`)\n });\n\n prompt.close();\n}\n\nexport type {\n Generator,\n Generator$opts,\n Generator$template\n} from './interfaces';\n", "import { createInterface } from 'readline';\n\nconst YES = /^y(es)?$/i;\n\nexport default function createPrompt() {\n const prompt = createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n prompt.setPrompt('');\n\n return {\n question(text: string): Promise<boolean> {\n return new Promise(resolve => {\n prompt.question(text, answer => {\n resolve(YES.test(answer));\n });\n });\n },\n\n close(): void {\n prompt.close();\n }\n };\n}\n", "import { posix, join as joinPath } from 'path';\n\nimport { green } from 'chalk';\nimport { pluralize, singularize } from 'inflection';\n\nimport { NAMESPACED_RESOURCE_MESSAGE } from '../constants';\nimport { generateTimestamp } from '../../../database';\nimport { exists, readFile, writeFile } from '../../../fs';\nimport modelTemplate from '../../templates/model';\nimport serializerTemplate from '../../templates/serializer';\nimport controllerTemplate from '../../templates/controller';\nimport emptyMigrationTemplate from '../../templates/empty-migration';\nimport modelMigrationTemplate from '../../templates/model-migration';\nimport middlewareTemplate from '../../templates/middleware';\nimport utilTemplate from '../../templates/util';\nimport chain from '../../../../utils/chain';\nimport type { Generator$opts } from '../index';\n\nimport log from './log';\nimport createGenerator from './create-generator';\nimport { createConflictResolver, detectConflict } from './migration-conflict';\n\n/**\n * @private\n */\nexport async function controller(opts: Generator$opts): Promise<void> {\n const { cwd } = opts;\n let { name } = opts;\n\n const dir = joinPath('app', 'controllers');\n const generate = createGenerator({\n dir,\n template: controllerTemplate\n });\n\n if (!name.endsWith('application')) {\n name = pluralize(name);\n }\n\n await generate({\n ...opts,\n cwd,\n name\n });\n\n const namespace = posix.dirname(name);\n\n if (namespace !== '.') {\n const hasParent = await exists(\n joinPath(cwd, dir, ...[...namespace.split('/'), 'application.js'])\n );\n\n if (!hasParent) {\n await controller({\n ...opts,\n cwd,\n name: `${namespace}/application`,\n attrs: []\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport async function serializer(opts: Generator$opts): Promise<void> {\n const { cwd } = opts;\n let { name } = opts;\n\n const dir = joinPath('app', 'serializers');\n const generate = createGenerator({\n dir,\n template: serializerTemplate\n });\n\n if (!name.endsWith('application')) {\n name = pluralize(name);\n }\n\n await generate({\n ...opts,\n cwd,\n name\n });\n\n const namespace = posix.dirname(name);\n\n if (namespace !== '.') {\n const hasParent = await exists(\n joinPath(cwd, dir, ...[...namespace.split('/'), 'application.js'])\n );\n\n if (!hasParent) {\n await serializer({\n ...opts,\n cwd,\n name: `${namespace}/application`,\n attrs: []\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport function migration(opts: Generator$opts) {\n const { cwd, onConflict } = opts;\n let { name } = opts;\n\n const dir = joinPath('db', 'migrate');\n const generate = createGenerator({\n dir,\n template: emptyMigrationTemplate,\n hasConflict: detectConflict\n });\n\n name = chain(name)\n .pipe(posix.basename)\n .pipe(str => `${generateTimestamp()}-${str}`)\n .value();\n\n return generate({\n ...opts,\n cwd,\n name,\n onConflict: createConflictResolver({\n cwd,\n onConflict\n })\n });\n}\n\n/**\n * @private\n */\nexport function modelMigration(opts: Generator$opts) {\n const { cwd, onConflict } = opts;\n let { name } = opts;\n\n const dir = joinPath('db', 'migrate');\n const generate = createGenerator({\n dir,\n template: modelMigrationTemplate,\n hasConflict: detectConflict\n });\n\n name = chain(name)\n .pipe(posix.basename)\n .pipe(pluralize)\n .pipe(str => `${generateTimestamp()}-create-${str}`)\n .value();\n\n return generate({\n ...opts,\n cwd,\n name,\n onConflict: createConflictResolver({\n cwd,\n onConflict\n })\n });\n}\n\n/**\n * @private\n */\nexport async function model(opts: Generator$opts): Promise<void> {\n let { name } = opts;\n const generate = createGenerator({\n dir: joinPath('app', 'models'),\n template: modelTemplate\n });\n\n await modelMigration({ ...opts, name });\n\n name = chain(name).pipe(posix.basename).pipe(singularize).value();\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport function middleware(opts: Generator$opts) {\n let { name } = opts;\n const parts = name.split('/');\n\n name = parts.pop() || name;\n\n const generate = createGenerator({\n dir: joinPath('app', 'middleware', ...parts),\n template: middlewareTemplate\n });\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport function util(opts: Generator$opts) {\n let { name } = opts;\n const parts = name.split('/');\n\n name = parts.pop() || name;\n\n const generate = createGenerator({\n dir: joinPath('app', 'utils', ...parts),\n template: utilTemplate\n });\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport async function resource(opts: Generator$opts) {\n await model(opts);\n await controller(opts);\n await serializer(opts);\n\n if (posix.dirname(opts.name) !== '.') {\n log(NAMESPACED_RESOURCE_MESSAGE);\n return;\n }\n\n const path = joinPath(opts.cwd, 'app', 'routes.js');\n const routes = chain(await readFile(path))\n .pipe(buf => buf.toString('utf8'))\n .pipe(str => str.split('\\n'))\n .pipe(lines =>\n lines.reduce((result, line, index, arr) => {\n const closeIndex = arr.lastIndexOf('}');\n let str = result;\n\n if (line && index <= closeIndex) {\n str += `${line}\\n`;\n }\n\n if (index + 1 === closeIndex) {\n str += ` this.resource('${pluralize(opts.name)}');\\n`;\n }\n\n return str;\n }, '')\n )\n .value();\n\n await writeFile(path, routes);\n log(`${green('update')} app/routes.js`);\n}\n", "import { dim } from 'chalk';\n\nimport template from '../../template';\n\n/**\n * TODO: Update the 'routes.js' file when generating a resource within a\n * namespace.\n */\nexport const NAMESPACED_RESOURCE_MESSAGE = template`\n\n \uD83C\uDF89 It looks like the resource you generated is within a namespace!\n\n Lumen will only update your 'routes.js' file if you generate a resource at the\\\n root namespace (i.e 'lumen generate resource users').\n\n In order to access the resource you have created, remember to manually update\\\n your 'routes.js' file.\n\n Example:\n\n export default function routes() {\n ${dim('// this resource will be accessible at /users')}\n this.resource('users');\n\n this.namespace('admin', function () {\n ${dim('// this resource will be accessible at /admin/users')}\n this.resource('users');\n });\n }\n\n`;\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 { 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", "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 { 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", "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", "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", "/* 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 { 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", "/* 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", "function formatInt(int: number): string {\n return (int / 10).toString().replace('.', '').substr(0, 2);\n}\n\nexport function* padding(\n char: string,\n amount: number\n): Generator<string, void, void> {\n for (let i = 0; i < amount; i += 1) {\n yield char;\n }\n}\n\nexport default function generateTimestamp(): string {\n const now = new Date();\n const timestamp =\n now.toISOString().substr(0, 10).split('-').join('') +\n formatInt(now.getHours()) +\n formatInt(now.getMinutes()) +\n formatInt(now.getSeconds()) +\n formatInt(now.getMilliseconds());\n\n return timestamp + Array.from(padding('0', 16 - timestamp.length)).join('');\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 { 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 { EOL } from 'os';\n\nimport { classify, camelize } from 'inflection';\n\nimport template from '../../template';\nimport indent from '../utils/indent';\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\n\nconst VALID_ATTR = /^(\\w|-)+:(\\w|-)+$/;\nconst RELATIONSHIP = /^belongs-to|has-(one|many)$/;\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>) => {\n const normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n return template`\n import { Model } from 'lumen-framework';\n\n class ${normalized} extends Model {\n ${entries(\n (attrs || [])\n .filter(attr => VALID_ATTR.test(attr))\n .map(attr => attr.split(':'))\n .filter(([, type]) => RELATIONSHIP.test(type))\n .reduce(\n (types, [related, type]) => {\n const key = chain(type)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n const value = Reflect.get(types, key);\n\n if (value) {\n const inverse = camelize(normalized, true);\n const relatedKey = chain(related)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return {\n ...types,\n [key]: [\n ...value,\n `${indent(8)}${relatedKey}: {${EOL}` +\n `${indent(10)}inverse: '${inverse}'${EOL}` +\n `${indent(8)}}`\n ]\n };\n }\n\n return types;\n },\n {\n hasOne: [],\n hasMany: [],\n belongsTo: []\n }\n )\n )\n .filter(([, value]) => value.length)\n .reduce(\n (result, [key, value], index) =>\n chain(result)\n .pipe(str => {\n if (index && str.length) {\n return `${str}${EOL.repeat(2)}`;\n }\n\n return str;\n })\n .pipe(\n str =>\n str +\n `${indent(index === 0 ? 2 : 6)}static ${key} = {${EOL}` +\n `${value.join(`,${EOL.repeat(2)}`)}${EOL}` +\n `${indent(6)}};`\n )\n .value(),\n ''\n )}\n }\n\n export default ${normalized};\n `;\n};\n", "import { classify, camelize, pluralize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\nimport indent from '../utils/indent';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>): string => {\n let normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n if (!normalized.endsWith('Application')) {\n normalized = pluralize(normalized);\n }\n\n const body = entries(\n attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':'))\n .reduce(\n (obj, parts) => {\n const [, type] = parts;\n let [attr] = parts;\n let { hasOne, hasMany, attributes } = obj;\n\n attr = `${indent(8)}'${camelize(underscore(attr), true)}'`;\n\n switch (type) {\n case 'belongs-to':\n case 'has-one':\n hasOne = [...hasOne, attr];\n break;\n\n case 'has-many':\n hasMany = [...hasMany, attr];\n break;\n\n default:\n attributes = [...attributes, attr];\n }\n\n return {\n attributes,\n hasOne,\n hasMany\n };\n },\n {\n // `belongsTo` was a dead accumulator key \u2014 never destructured and, for\n // non-empty attrs, never present in the returned object \u2014 so it emitted\n // nothing. Dropped so the accumulator types cleanly.\n attributes: [] as string[],\n hasOne: [] as string[],\n hasMany: [] as string[]\n }\n )\n ).reduce((result, group, index) => {\n const [key, items] = group;\n let str = result;\n\n if (items.length) {\n const value = items.join(',\\n');\n\n if (index && str.length) {\n str += '\\n\\n';\n }\n\n str +=\n `${indent(index === 0 ? 2 : 6)}${key} = ` +\n `[\\n${value}\\n${indent(6)}];`;\n }\n\n return str;\n }, '');\n\n return template`\n import { Serializer } from 'lumen-framework';\n\n class ${normalized}Serializer extends Serializer {\n ${body}\n }\n\n export default ${normalized}Serializer;\n `;\n};\n", "import { classify, camelize, pluralize } from 'inflection';\n\nimport template from '../../template';\nimport entries from '../../../utils/entries';\nimport indent from '../utils/indent';\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>): string => {\n let normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n if (!normalized.endsWith('Application')) {\n normalized = pluralize(normalized);\n }\n\n const body = entries(\n attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':')[0])\n .reduce(\n (obj, attr) => ({\n ...obj,\n params: [\n ...obj.params,\n `${indent(8)}'${camelize(underscore(attr), true)}'`\n ]\n }),\n { params: [] as string[] }\n )\n ).reduce((result, group, index) => {\n const [key, items] = group;\n let str = result;\n\n if (items.length) {\n const value = items.join(',\\n');\n\n if (index && str.length) {\n str += '\\n\\n';\n }\n\n str +=\n `${indent(index === 0 ? 2 : 6)}${key} = ` +\n `[\\n${value}\\n${indent(6)}];`;\n }\n\n return str;\n }, '');\n\n return template`\n import { Controller } from 'lumen-framework';\n\n class ${normalized}Controller extends Controller {\n ${body}\n }\n\n export default ${normalized}Controller;\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export function up(schema) {\n\n }\n\n export function down(schema) {\n\n }\n`;\n", "import { pluralize } from 'inflection';\n\nimport template from '../../template';\nimport chain from '../../../utils/chain';\nimport indent from '../utils/indent';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string> | string): string => {\n const indices = ['id'];\n const table = chain(name)\n .pipe(str => str.substr(24))\n .pipe(underscore)\n .pipe(pluralize)\n .value();\n\n let body = '';\n\n if (Array.isArray(attrs)) {\n body = attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':'))\n .filter(([, type]) => !/^has-(one|many)$/g.test(type))\n .map(attr => {\n let [column, type] = attr;\n\n column = underscore(column);\n\n if (type === 'belongs-to') {\n type = 'integer';\n column = `${column}_id`;\n\n if (Array.isArray(indices)) {\n indices.push(column);\n }\n }\n\n return [column, type];\n })\n .map((attr, index) => {\n let [column] = attr;\n const [, type] = attr;\n const shouldIndex = indices.indexOf(column) >= 0;\n\n column = `${indent(index > 0 ? 8 : 0)}table.${type}('${column}')`;\n return shouldIndex ? `${column}.index();` : `${column};`;\n })\n .join('\\n');\n }\n\n return template`\n export function up(schema) {\n return schema.createTable('${table}', table => {\n table.increments('id');\n ${body}\n table.timestamps();\n\n table.index('created_at');\n table.index('updated_at');\n });\n }\n\n export function down(schema) {\n return schema.dropTable('${table}');\n }\n `;\n};\n", "import { camelize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return template`\n export default function ${normalized}(/*request, response*/) {\n\n }\n `;\n};\n", "import { camelize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return template`\n export default function ${normalized}() {\n\n }\n `;\n};\n", "/**\n * @private\n */\nexport default function log(data: string | Error): void {\n if (data instanceof Error) {\n process.stdout.write(`${data.stack || data.message}\\n`);\n } else {\n process.stderr.write(`${data}\\n`);\n }\n}\n", "import { join as joinPath } from 'path';\n\nimport { red, green, yellow } from 'chalk';\n\nimport { rmrf, exists, mkdirRec, writeFile, parsePath } from '../../../fs';\nimport type { Generator, Generator$template } from '../index';\n\nimport log from './log';\n\nconst FORWARD_SLASH = /\\//g;\n\n/**\n * @private\n */\nexport default function createGenerator({\n dir,\n template,\n hasConflict = exists\n}: {\n dir: string;\n template: Generator$template;\n hasConflict?: (path: string) => Promise<boolean>;\n}): Generator {\n return async ({ cwd, attrs, onConflict, ...opts }) => {\n const path = parsePath(cwd, dir, `${opts.name}.js`);\n const name = opts.name.replace(FORWARD_SLASH, '-');\n let action = green('create');\n\n await mkdirRec(path.dir);\n\n if (await hasConflict(path.absolute)) {\n const shouldContinue = await onConflict(path.relative);\n\n if (shouldContinue && typeof shouldContinue === 'string') {\n await rmrf(joinPath(path.dir, shouldContinue));\n log(`${red('remove')} ${joinPath(dir, shouldContinue)}`);\n } else if (shouldContinue && typeof shouldContinue === 'boolean') {\n action = yellow('overwrite');\n await rmrf(path.absolute);\n } else {\n log(`${yellow('skip')} ${path.relative}`);\n return;\n }\n }\n\n await writeFile(path.absolute, template(name, attrs));\n log(`${action} ${path.relative}`);\n };\n}\n", "import { exists, readdir, parsePath } from '../../../fs';\nimport type { Generator$opts } from '../index';\n\nexport function detectConflict(path: string): Promise<boolean> {\n const { dir, base } = parsePath(path);\n const pattern = new RegExp(`^\\\\d+-${base.substr(17)}$`);\n\n return exists(pattern, dir);\n}\n\nexport function createConflictResolver({\n cwd,\n onConflict\n}: {\n cwd: Generator$opts['cwd'];\n onConflict: Generator$opts['onConflict'];\n}): Generator$opts['onConflict'] {\n return async (path: string) => {\n if (await onConflict(path)) {\n const parsed = parsePath(cwd, path);\n const migrations = await readdir(parsed.dir);\n\n return (\n migrations.find(file => file.substr(17) === parsed.base.substr(17)) ||\n false\n );\n }\n\n return false;\n };\n}\n", "import type { Generator } from '../index';\n\nimport * as generators from './generate-type';\n\nexport default function generatorFor(type: string): Generator {\n const normalized = type.toLowerCase();\n const generator: void | Generator = Reflect.get(generators, normalized);\n\n if (!generator) {\n throw new Error(`Could not find a generator for '${type}'.`);\n }\n\n return generator;\n}\n", "import { CWD } from '../../../constants';\nimport { runGenerator } from '../generator';\nimport type { Generator$opts } from '../generator';\n\n/**\n * @private\n */\nexport function generate({\n cwd = CWD,\n name,\n type,\n attrs = []\n}: {\n cwd?: Generator$opts['cwd'];\n name: Generator$opts['name'];\n type: Generator$opts['type'];\n attrs?: Generator$opts['attrs'];\n}): Promise<void> {\n return runGenerator({\n cwd,\n name,\n type,\n attrs\n });\n}\n", "import { EOL } from 'os';\n\nimport { CWD, NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { CONNECTION_STRING_MESSAGE } from '../constants';\nimport DatabaseConfigMissingError from '../errors/database-config-missing';\nimport { connect } from '../../database';\nimport { writeFile } from '../../fs';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbcreate() {\n const load = createLoader(CWD);\n const config = Reflect.get(load('config').database, NODE_ENV);\n\n if (!config) {\n throw new DatabaseConfigMissingError(NODE_ENV);\n }\n\n if (config.driver === 'sqlite3') {\n return writeFile(`${CWD}/db/${config.database}_${NODE_ENV}.sqlite`, '');\n }\n\n if (DATABASE_URL || config.url) {\n process.stderr.write(CONNECTION_STRING_MESSAGE);\n process.stderr.write(EOL);\n return Promise.resolve();\n }\n\n const { schema } = connect(CWD, config);\n const query = `CREATE DATABASE ${config.database}`;\n\n // Knex query builders are event emitters at runtime, but `.once` isn't on the\n // `SchemaBuilder` type surface.\n const raw = schema.raw(query) as unknown as {\n once(event: string, listener: () => void): Promise<unknown>;\n };\n\n return raw.once('query', () => {\n process.stdout.write(query);\n process.stdout.write(EOL);\n });\n}\n", "const GITHUB_URL = 'https://github.com/nickschot/lux';\n\ntype Options = {\n line?: number;\n branch?: string;\n};\n\n/**\n * @private\n */\nexport function fileLink(path: string, opts: Options = {}): string {\n const { line, branch = 'master' } = opts;\n let link = `${GITHUB_URL}/blob/${branch}/${path}`;\n\n if (line && line >= 0) {\n link += `#${line}`;\n }\n\n return link;\n}\n", "import template from '../template';\nimport { fileLink } from '../../utils/github';\n\nexport const VALID_DATABASES = [\n 'postgres',\n 'sqlite',\n 'mysql',\n 'mariadb',\n 'oracle'\n];\n\nconst DB_INTERFACE_URL = fileLink('src/packages/database/interfaces.js', {\n line: 17\n});\n\nexport const CONNECTION_STRING_MESSAGE = template`\n\n You're using a URL in your database config (config/database.js).\n\n In that case, Lumen assumes you don't need to create or drop your database.\n If you'd like to create or drop a database, set up your database config\n without the url.\n\n For guidance, see:\n ${DB_INTERFACE_URL}\n`;\n", "class DatabaseConfigMissingError extends ReferenceError {\n constructor(environment: string) {\n super(`Could not find database config for environment \"${environment}\".`);\n }\n}\n\nexport default DatabaseConfigMissingError;\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 { 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", "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 { 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 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", "import { EOL } from 'os';\n\nimport { CWD, NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { CONNECTION_STRING_MESSAGE } from '../constants';\nimport DatabaseConfigMissingError from '../errors/database-config-missing';\nimport { rmrf } from '../../fs';\nimport { connect } from '../../database';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbdrop() {\n const load = createLoader(CWD);\n const config = Reflect.get(load('config').database, NODE_ENV);\n\n if (!config) {\n throw new DatabaseConfigMissingError(NODE_ENV);\n }\n\n if (config.driver === 'sqlite3') {\n return rmrf(`${CWD}/db/${config.database}_${NODE_ENV}.sqlite`);\n }\n\n if (DATABASE_URL || config.url) {\n process.stderr.write(CONNECTION_STRING_MESSAGE);\n process.stderr.write(EOL);\n return Promise.resolve();\n }\n\n const { schema } = connect(CWD, config);\n const query = `DROP DATABASE IF EXISTS ${config.database}`;\n\n // Knex query builders are event emitters at runtime, but `.once` isn't on the\n // `SchemaBuilder` type surface.\n const raw = schema.raw(query) as unknown as {\n once(event: string, listener: () => void): Promise<unknown>;\n };\n\n return raw.once('query', () => {\n process.stdout.write(query);\n process.stdout.write(EOL);\n });\n}\n", "import { EOL } from 'os';\n\nimport { CWD } from '../../../constants';\nimport Database, { pendingMigrations } from '../../database';\nimport Logger, { sql } from '../../logger';\nimport { createLoader } from '../../loader';\nimport { composeAsync } from '../../../utils/compose';\n\n/**\n * @private\n */\nexport async function dbmigrate() {\n const load = createLoader(CWD);\n\n const { database: config } = load('config');\n const models = load('models');\n const migrations = load('migrations');\n\n const { connection, schema } = await new Database({\n config,\n models,\n path: CWD,\n checkMigrations: false,\n\n logger: new Logger({ enabled: false } as ConstructorParameters<\n typeof Logger\n >[0])\n });\n\n const pending = await pendingMigrations(CWD, () => connection('migrations'));\n\n if (pending.length) {\n const runners = pending\n .map(name => {\n const version = name.replace(/^(\\d{16})-.+$/g, '$1');\n const key = name.replace(new RegExp(`${version}-(.+)\\\\.js`), '$1');\n\n return [version, migrations.get(`${key}-up`)];\n })\n .filter(([, migration]) => Boolean(migration))\n .reverse()\n .map(([version, migration]) => () => {\n const query = migration.run(schema());\n\n return query\n .on('query', () => {\n process.stdout.write(sql`${query.toString()}`);\n process.stdout.write(EOL);\n })\n .then(() =>\n connection('migrations').insert({\n version\n })\n );\n });\n\n // `composeAsync`'s variadic signature doesn't model a spread of an array\n // of thunks; the runtime contract is a list of stages returning a runner.\n await (\n composeAsync as unknown as (\n ...fns: Array<() => Promise<unknown>>\n ) => () => Promise<unknown>\n )(...runners)();\n }\n\n return true;\n}\n", "import { EOL } from 'os';\n\nimport { CWD } from '../../../constants';\nimport Database from '../../database';\nimport Logger, { sql } from '../../logger';\nimport { readdir } from '../../fs';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport async function dbrollback() {\n const load = createLoader(CWD);\n\n const { database: config } = load('config');\n const models = load('models');\n const migrations = load('migrations');\n\n const { connection, schema } = await new Database({\n config,\n models,\n path: CWD,\n checkMigrations: false,\n\n logger: new Logger({ enabled: false } as ConstructorParameters<\n typeof Logger\n >[0])\n });\n\n const migrationFiles = await readdir(`${CWD}/db/migrate`);\n\n if (migrationFiles.length) {\n let migration;\n let version = await connection('migrations')\n .orderBy('version', 'desc')\n .first();\n\n if (version && version.version) {\n version = version.version;\n }\n\n const target = migrationFiles.find(m => m.indexOf(version) === 0);\n\n if (target) {\n migration = target.replace(new RegExp(`${version}-(.+)\\\\.js`), '$1');\n migration = migrations.get(`${migration}-down`);\n\n if (migration) {\n const query = migration.run(schema());\n\n await query.on('query', () => {\n process.stdout.write(sql`${query.toString()}`);\n process.stdout.write(EOL);\n });\n\n await connection('migrations')\n .where({\n version\n })\n .del();\n }\n }\n }\n}\n", "import { CWD } from '../../../constants';\nimport Logger from '../../logger';\nimport Database from '../../database';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbseed(): Promise<unknown> {\n const load = createLoader(CWD);\n const { database: config } = load('config');\n const seed = load('seed');\n const models = load('models');\n\n // `new Database(...)` returns a promise for the initialized store at runtime\n // (async-constructor pattern), though its static type is `Database`.\n return (\n new Database({\n config,\n models,\n path: CWD,\n logger: new Logger({\n enabled: false\n } as ConstructorParameters<typeof Logger>[0])\n }) as unknown as Promise<Database>\n ).then(store => store.connection.transaction(seed));\n}\n", "import { EOL } from 'os';\n\nimport { red, green } from 'chalk';\nimport { pluralize, singularize } from 'inflection';\n\nimport { CWD } from '../../../constants';\nimport { rmrf, exists, readdir, readFile, writeFile } from '../../fs';\n\n/**\n * @private\n */\nexport async function destroyType(type: string, name: string) {\n const normalizedType = type.toLowerCase();\n let normalizedName = name;\n let path: string | undefined;\n let migrations: Array<string>;\n\n switch (normalizedType) {\n case 'model':\n normalizedName = singularize(normalizedName);\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n case 'migration':\n migrations = await readdir(`${CWD}/db/migrate`);\n\n // `find` may return undefined (no matching migration); pre-existing\n // behaviour lets that flow into the path as the string \"undefined\",\n // which then simply fails the `exists` check below.\n normalizedName = migrations.find(\n file => `${normalizedName}.js` === file.substr(17)\n ) as string;\n\n path = `db/migrate/${normalizedName}`;\n break;\n\n case 'controller':\n case 'serializer':\n normalizedName = pluralize(normalizedName);\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n case 'middleware':\n path = `app/${normalizedType}/${normalizedName}.js`;\n break;\n\n case 'util':\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n default:\n return;\n }\n\n if (await exists(`${CWD}/${path}`)) {\n await rmrf(`${CWD}/${path}`);\n\n process.stdout.write(`${red('remove')} ${path}`);\n process.stdout.write(EOL);\n }\n}\n\n/**\n * @private\n */\nexport async function destroy({ type, name }: { type: string; name: string }) {\n if (type === 'resource') {\n const routes = (await readFile(`${CWD}/app/routes.js`))\n .toString('utf8')\n .split('\\n')\n .reduce((lines, line) => {\n const pattern = new RegExp(\n `\\\\s*this.resource\\\\(('|\"|\\`)${pluralize(name)}('|\"|\\`)\\\\);?`\n );\n\n return pattern.test(line) ? lines : [...lines, line];\n }, [] as string[])\n .join('\\n');\n\n await Promise.all([\n destroyType('model', name),\n destroyType('migration', `create-${pluralize(name)}`),\n destroyType('serializer', name),\n destroyType('controller', name)\n ]);\n\n await writeFile(`${CWD}/app/routes.js`, routes);\n\n process.stdout.write(`${green('update')} app/routes.js`);\n process.stdout.write(EOL);\n } else if (type === 'model') {\n await Promise.all([\n destroyType(type, name),\n destroyType('migration', `create-${pluralize(name)}`)\n ]);\n } else {\n await destroyType(type, name);\n }\n}\n", "import path from 'path';\nimport { start as startRepl } from 'repl';\n\nimport { CWD } from '../../../constants';\nimport type Application from '../../application';\n\nexport function repl(): Promise<void> {\n // FIXME: this async executor swallows rejections from the `require` below.\n // Pre-existing behaviour, left as-is so the lint migration stays\n // behaviour-neutral \u2014 worth fixing when this file is converted to TypeScript.\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async resolve => {\n const app: Application = await Reflect.apply(require, null, [\n path.join(CWD, 'dist', 'boot')\n ]);\n\n const instance = startRepl({\n prompt: '> '\n });\n\n instance.once('exit', resolve);\n\n Object.assign(instance.context, {\n app,\n logger: app.logger,\n routes: app.router,\n [app.constructor.name]: app,\n\n ...Array.from(app.models).reduce(\n (context, [, model]) => ({\n ...context,\n [model.name]: model\n }),\n {}\n ),\n\n ...Array.from(app.controllers).reduce(\n (context, [, controller]) => ({\n ...context,\n [controller.constructor.name]: controller\n }),\n {}\n ),\n\n ...Array.from(app.serializers).reduce(\n (context, [, serializer]) => ({\n ...context,\n [serializer.constructor.name]: serializer\n }),\n {}\n )\n });\n });\n}\n", "import { cyan } from 'chalk';\n\nimport { CWD, PORT, NODE_ENV } from '../../../constants';\nimport Logger from '../../logger';\nimport { createLoader } from '../../loader';\nimport { createCluster } from '../../pm';\nimport { watch } from '../../fs';\n\nimport { build } from './build';\n\n/**\n * @private\n */\nexport async function serve({\n hot = NODE_ENV === 'development',\n cluster = false,\n useStrict = false\n}: {\n hot: boolean;\n cluster: boolean;\n useStrict: boolean;\n}): Promise<void> {\n const load = createLoader(CWD);\n const { logging } = load('config');\n const logger = new Logger(logging);\n\n if (hot) {\n const watcher = await watch(CWD);\n\n watcher.on('change', async changed => {\n await build(useStrict);\n (process as NodeJS.EventEmitter).emit('update', changed);\n });\n }\n\n createCluster({\n logger,\n path: CWD,\n port: PORT,\n maxWorkers: cluster ? undefined : 1\n }).once('ready', () => {\n logger.info(`Lumen Server listening on port: ${cyan(`${PORT}`)}`);\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The cluster manager talks to worker processes over Node's untyped IPC\n * channel: the `update` process event and worker `message` payloads carry\n * arbitrary data, so those values are genuinely untyped here (as they were\n * `Object` in Flow).\n */\nimport EventEmitter from 'events';\nimport os from 'os';\nimport cluster, { type Worker } from 'cluster';\nimport { join as joinPath } from 'path';\n\nimport { red, green } from 'chalk';\n\nimport { NODE_ENV } from '../../../constants';\nimport { line } from '../../logger';\nimport omit from '../../../utils/omit';\nimport range from '../../../utils/range';\nimport { composeAsync } from '../../../utils/compose';\nimport type Logger from '../../logger';\n\nimport type { Cluster$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Cluster extends EventEmitter {\n declare path: string;\n\n declare port: number;\n\n declare logger: Logger;\n\n declare workers: Set<Worker>;\n\n declare maxWorkers: number;\n\n constructor({ path, port, logger, maxWorkers }: Cluster$opts) {\n super();\n\n Object.defineProperties(this, {\n path: {\n value: path,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n port: {\n value: port,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n workers: {\n value: new Set(),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n maxWorkers: {\n value: maxWorkers || os.cpus().length,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n\n cluster.setupMaster({\n exec: joinPath(path, 'dist', 'boot.js')\n });\n\n process.on('update', (changed: Array<{ name: string }>) => {\n changed.forEach(({ name: filename }) => {\n logger.info(`${green('update')} ${filename}`);\n });\n\n this.reload();\n });\n\n this.forkAll().then(() => this.emit('ready'));\n }\n\n fork(retry: boolean = true): Promise<Worker> {\n return new Promise(resolve => {\n if (this.workers.size < this.maxWorkers) {\n const worker = cluster.fork({\n NODE_ENV,\n PORT: this.port\n });\n\n const timeout = setTimeout(() => {\n this.logger.info(line`\n Removing worker process: ${red(`${worker.process.pid}`)}\n `);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n worker.kill();\n\n this.workers.delete(worker);\n\n resolve(worker);\n\n if (retry) {\n this.fork(false);\n }\n }, 30000);\n\n const handleError = (err?: any) => {\n if (err) {\n this.logger.error(err);\n }\n\n this.logger.info(line`\n Removing worker process: ${red(`${worker.process.pid}`)}\n `);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n worker.kill();\n\n this.workers.delete(worker);\n\n resolve(worker);\n };\n\n worker.on('message', (msg: string | Record<string, any>) => {\n let data: Record<string, any> = {};\n let message = msg;\n\n if (typeof message === 'object') {\n data = omit(message, 'message');\n message = message.message;\n }\n\n switch (message) {\n case 'ready':\n this.logger.info(line`\n Adding worker process: ${green(`${worker.process.pid}`)}\n `);\n\n this.workers.add(worker);\n\n clearTimeout(timeout);\n worker.removeListener('error', handleError);\n\n resolve(worker);\n break;\n\n case 'error':\n handleError(data.error);\n break;\n\n default:\n break;\n }\n });\n\n worker.once('error', handleError);\n worker.once('exit', (code: number | null) => {\n const {\n process: { pid }\n } = worker;\n\n if (typeof code === 'number') {\n this.logger.info(line`\n Worker process: ${red(`${pid}`)} exited with code ${code}\n `);\n }\n\n this.logger.info(`Removing worker process: ${red(`${pid}`)}`);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n this.workers.delete(worker);\n\n this.fork();\n });\n }\n });\n }\n\n shutdown<T extends Worker>(worker: T): Promise<T> {\n return new Promise(resolve => {\n this.workers.delete(worker);\n\n const timeout = setTimeout(() => worker.kill(), 5000);\n\n worker.once('disconnect', () => {\n worker.kill();\n });\n\n worker.once('exit', () => {\n resolve(worker);\n clearTimeout(timeout);\n });\n\n worker.send('shutdown');\n worker.disconnect();\n });\n }\n\n reload() {\n if (this.workers.size) {\n const groups = Array.from(this.workers).reduce<\n Array<() => Promise<Array<Worker>>>\n >((arr, item, idx, src) => {\n if ((idx + 1) % 2) {\n const group = src.slice(idx, idx + 2);\n\n return [\n ...arr,\n () => Promise.all(group.map(worker => this.shutdown(worker)))\n ];\n }\n\n return arr;\n }, []);\n\n // groups is non-empty here (guarded by workers.size); composeAsync's\n // fixed-first-param signature can't be spread with a dynamic array.\n return (composeAsync as any)(...groups)();\n }\n\n return this.fork();\n }\n\n forkAll() {\n return Promise.race(\n Array.from(range(1, this.maxWorkers)).map(() => this.fork())\n );\n }\n}\n\nexport default Cluster;\n\nexport type { Cluster$opts } from './interfaces';\n", "/**\n * @private\n */\nexport default function* range(\n start: number,\n end: number\n): Generator<number, void, void> {\n for (let i = start; i <= end; i += 1) {\n yield i;\n }\n}\n", "import Cluster from './cluster';\nimport type { Cluster$opts } from './cluster';\n\n/**\n * @private\n */\nexport function createCluster({\n path,\n port,\n logger,\n maxWorkers\n}: Cluster$opts) {\n return new Cluster({\n path,\n port,\n logger,\n maxWorkers\n });\n}\n", "import { EOL } from 'os';\n\n/**\n * @private\n */\nexport function test(): Promise<void> {\n process.stdout.write('Coming Soon!');\n process.stdout.write(EOL);\n\n return Promise.resolve();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["build", "create", "destroy", "import_path", "import_fs", "import_path", "import_fb_watchman", "import_path", "resolve", "nativeExec", "path", "nativeWatch", "resolve", "watch", "joinPath", "EventEmitter", "path", "resolve", "path", "sep", "import_path", "path", "path", "import_path", "path", "path", "resolve", "fs", "resolvePath", "joinPath", "basename", "import_path", "import_inflection", "_", "import_path", "import_inflection", "path", "joinPath", "import_path", "line", "path", "path", "build", "Ora", "import_os", "import_ora", "import_chalk", "import_inflection", "template", "import_chalk", "resolve", "import_path", "import_chalk", "import_inflection", "import_chalk", "import_chalk", "ansiRegex", "createWriter", "import_chalk", "import_chalk", "path", "stat", "controller", "path", "chalk", "path", "createWriter", "import_chalk", "import_path", "path", "joinPath", "version", "migration", "initialize", "path", "cluster", "model", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "initialize", "model", "database_default", "import_os", "import_inflection", "model_default", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_path", "import_chalk", "template", "path", "joinPath", "path", "joinPath", "generate", "model_default", "path", "line", "path", "create", "Ora", "import_os", "path", "line", "import_path", "hasOwnProperty", "import_inflection", "path", "joinPath", "path", "import_os", "import_os", "database_default", "version", "migration", "import_os", "database_default", "migration", "version", "database_default", "import_os", "import_chalk", "import_inflection", "path", "destroy", "line", "import_path", "resolve", "path", "startRepl", "model", "controller", "serializer", "import_chalk", "import_events", "import_os", "import_cluster", "import_path", "import_chalk", "EventEmitter", "path", "os", "cluster", "joinPath", "resolve", "path", "cluster", "build", "import_os"]
|
|
7
7
|
}
|