@arkstack/common 0.11.0 → 0.11.1

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/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /// <reference path="./app.d.ts" />
2
2
  import { a as initializeGlobalContext, c as Encryption, i as getModel, n as ModelConstructor, o as perPage, r as ModelRegistry, s as Hash, t as AbstractModelConstructor } from "./helpers-CCnLLifY.js";
3
+ import { Arkstack } from "@arkstack/contract";
3
4
  import pino from "pino";
4
5
  import { ChalkInstance } from "chalk";
5
6
 
@@ -7,7 +8,7 @@ import { ChalkInstance } from "chalk";
7
8
  declare const bindGracefulShutdown: (shutdown: () => Promise<void> | void) => void;
8
9
  //#endregion
9
10
  //#region src/network.d.ts
10
- declare const bootWithDetectedPort: (boot: (port: number) => Promise<void>, preferredPort?: number, app?: any) => Promise<void>;
11
+ declare const bootWithDetectedPort: <TApp, TRoutes = unknown, THandler = unknown>(boot: (port: number) => Promise<void>, preferredPort?: number, app?: Arkstack<TApp, TRoutes, THandler>) => Promise<void>;
11
12
  declare const renderError: ({
12
13
  message,
13
14
  stack,
package/dist/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { a as getModel, c as Hash, d as config, f as env, g as outputDir, h as nodeEnv, l as Encryption, m as interopDefault, o as initializeGlobalContext, p as importFile, s as perPage, u as appUrl } from "./utils-B1z9N3vl.js";
2
+ import { Hook as Hook$1 } from "@arkstack/foundry";
2
3
  import { Arkstack } from "@arkstack/contract";
3
4
  import { str } from "@h3ravel/support";
4
5
  import path from "node:path";
5
6
  import { detect } from "detect-port";
7
+ import { ModelNotFoundException } from "arkormx";
6
8
  import pino from "pino";
7
9
  import chalk from "chalk";
8
10
  //#region src/lifecycle.ts
@@ -13,6 +15,7 @@ const bindGracefulShutdown = (shutdown) => {
13
15
  "SIGQUIT"
14
16
  ].forEach((signal) => {
15
17
  process.on(signal, async () => {
18
+ if (Hook$1.has("shutdown", "before")) Hook$1.get("shutdown", "after", {});
16
19
  await shutdown();
17
20
  });
18
21
  });
@@ -20,13 +23,17 @@ const bindGracefulShutdown = (shutdown) => {
20
23
  //#endregion
21
24
  //#region src/network.ts
22
25
  const bootWithDetectedPort = async (boot, preferredPort = 3e3, app) => {
26
+ const port = await detect(preferredPort);
27
+ if (Hook$1.has("boot", "before")) Hook$1.get("boot", "before", port, app);
23
28
  if (app && !globalThis.app) globalThis.app = () => app;
24
29
  globalThis.env = env;
25
30
  globalThis.config = config;
26
31
  globalThis.str = str;
27
32
  globalThis.arkctx = { runtime: "HTTP" };
28
- await boot(await detect(preferredPort));
33
+ await boot(port);
29
34
  await initializeGlobalContext();
35
+ bindGracefulShutdown(async () => await app?.shutdown());
36
+ if (Hook$1.has("boot", "after")) Hook$1.get("boot", "after", port, app);
30
37
  };
31
38
  const renderError = ({ message = "An unexpected error occurred.", stack, title, code = 500 }) => {
32
39
  title = {
@@ -177,7 +184,12 @@ var ErrorHandler = class ErrorHandler {
177
184
  return typeof ErrorHandler.toErrorShape(error)?.errors !== "undefined";
178
185
  }
179
186
  static isModelNotFoundError(error) {
180
- return typeof ErrorHandler.toErrorShape(error)?.getModelName === "function";
187
+ const candidate = ErrorHandler.toErrorShape(error);
188
+ if (error.cause && error.cause instanceof ModelNotFoundException) {
189
+ error.getModelName = error.cause.getModelName;
190
+ return true;
191
+ }
192
+ return typeof candidate?.getModelName === "function" || error instanceof ModelNotFoundException;
181
193
  }
182
194
  static shouldHideStack() {
183
195
  const value = process.env.HIDE_ERROR_STACK;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/lifecycle.ts","../src/network.ts","../src/prototypes.ts","../src/Exceptions/Exception.ts","../src/Exceptions/AppException.ts","../src/Exceptions/RequestException.ts","../src/ErrorHandler.ts","../src/Logger.ts","../src/Hook.ts"],"sourcesContent":["export const bindGracefulShutdown = (shutdown: () => Promise<void> | void) => {\n ['SIGINT', 'SIGTERM', 'SIGQUIT'].forEach((signal) => {\n process.on(signal, async () => {\n await shutdown()\n })\n })\n}\n","import { config, env } from './system'\n\nimport { detect } from 'detect-port'\nimport { initializeGlobalContext } from './utils'\nimport { str } from '@h3ravel/support'\n\nexport const bootWithDetectedPort = async (\n boot: (port: number) => Promise<void>,\n preferredPort: number = 3000,\n app?: any\n) => {\n if (app && !globalThis.app) globalThis.app = () => app\n globalThis.env = env\n globalThis.config = config\n globalThis.str = str\n globalThis.arkctx = {\n runtime: 'HTTP',\n }\n const port = await detect(preferredPort)\n await boot(port)\n await initializeGlobalContext()\n}\n\nexport const renderError = ({\n message = 'An unexpected error occurred.',\n stack,\n title,\n code = 500,\n}: {\n message?: string;\n stack?: string;\n code?: number;\n title?: string;\n}) => {\n const titleMap: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n }\n\n title = titleMap[code] || title || 'Error'\n\n return globalThis.view('~arkstack/common.error', {\n code,\n title,\n stack,\n message,\n }).renderSync()\n}","export const loadPrototypes = () => {\n String.prototype.titleCase = function () {\n return this.toLowerCase()\n .replace(/_/g, ' ')\n .replace(/-/g, ' ')\n .replace(/(?:^|\\s)\\w/g, function (match) {\n return match.toUpperCase()\n })\n }\n\n String.prototype.camelCase = function () {\n return this.replace(/(?:^\\w|[A-Z]|\\b\\w|\\s+)/g, function (match, index) {\n if (+match === 0) return '' // or if (/\\s+/.test(match)) for white spaces\n\n return index === 0 ? match.toLowerCase() : match.toUpperCase()\n })\n }\n\n String.prototype.pascalCase = function () {\n return this.replace(/(?:^\\w|[A-Z]|\\b\\w|\\s+)/g, function (match) {\n return match.toUpperCase()\n })\n }\n\n String.prototype.truncate = function (len: number = 20, suffix: string = '...') {\n if (this.length <= len) {\n return this.toString()\n }\n\n const truncated = this.substring(0, len)\n const lastSpaceIndex = truncated.lastIndexOf(' ')\n if (lastSpaceIndex > 0) {\n return truncated.substring(0, lastSpaceIndex) + suffix\n }\n\n return truncated + suffix\n }\n} \n","export class Exception extends Error {\n name: string\n\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'Exception'\n }\n}","import { Exception } from './Exception'\n\nexport class AppException extends Exception {\n errors?: { [key: string]: string[] | string } | undefined = undefined\n\n statusCode: number\n\n constructor(message?: string, statusCode: number = 400, options?: ErrorOptions) {\n super(message, options)\n this.statusCode = statusCode\n }\n}","import { AppException } from './AppException'\n\nexport class RequestException extends AppException {\n statusCode: number\n\n constructor(message?: string, statusCode: number = 400, options?: ErrorOptions) {\n super(message, statusCode, options)\n this.statusCode = statusCode\n }\n\n /**\n * Asserts that a value is not null or undefined. \n * \n * @param value \n * @param message \n * @param code \n * @throws {RequestException} Throws if the value is null or undefined.\n */\n static assertNotEmpty<T> (\n value: T | null | undefined,\n message: string,\n code: number = 404,\n ): asserts value is T {\n if (!value) {\n throw new RequestException(message, code)\n }\n }\n\n /**\n * Asserts that a boolean condition is true. \n * \n * @param boolean \n * @param message \n * @param code \n * @throws {RequestException} Throws if the boolean condition is true.\n */\n static abortIf<T> (\n boolean: T,\n message: string,\n code?: number,\n ): asserts boolean is T {\n if (boolean) {\n throw new RequestException(message, code)\n }\n }\n}","import pino, { type Logger as PinoLogger } from 'pino'\nimport path from 'node:path'\nimport { ArkstackErrorPayload, ArkstackErrorShape } from './types'\nimport { Arkstack } from '@arkstack/contract'\n\nexport class ErrorHandler {\n private static loggerCache = new Map<string, PinoLogger>()\n\n private static isRecord (value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n }\n\n static toErrorShape (value: unknown): ArkstackErrorShape | undefined {\n return ErrorHandler.isRecord(value) ? value as unknown as ArkstackErrorShape : undefined\n }\n\n static normalizeStatusCode (value: unknown, fallback: number = 500) {\n const code = typeof value === 'number' ? value : Number(value)\n\n return Number.isInteger(code) && code >= 100 && code < 600 ? code : fallback\n }\n\n static getErrorLogger () {\n const destination = path.resolve(Arkstack.rootDir(), 'storage/logs/error.log')\n\n if (!ErrorHandler.loggerCache.has(destination)) {\n ErrorHandler.loggerCache.set(destination, pino({\n level: 'error',\n }, pino.destination({\n dest: destination,\n mkdir: true,\n sync: false,\n })))\n }\n\n return ErrorHandler.loggerCache.get(destination)!\n }\n\n static serializeError (\n value: unknown,\n seen: WeakSet<object> = new WeakSet()\n ): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => ErrorHandler.serializeError(entry, seen))\n }\n\n if (!ErrorHandler.isRecord(value)) {\n return value\n }\n\n if (seen.has(value)) {\n return '[Circular]'\n }\n\n seen.add(value)\n\n const serialized: Record<string, unknown> = {}\n\n if (value instanceof Error) {\n serialized.name = value.name\n serialized.message = value.message\n serialized.stack = value.stack\n }\n\n for (const key of Reflect.ownKeys(value)) {\n const property = typeof key === 'string' ? key : key.toString()\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n\n if (!descriptor || !('value' in descriptor)) {\n continue\n }\n\n serialized[property] = ErrorHandler.serializeError(descriptor.value, seen)\n }\n\n return serialized\n }\n\n static getPrimaryError (error: ArkstackErrorShape | string) {\n if (typeof error === 'string') {\n return error\n }\n\n return ErrorHandler.toErrorShape(error.cause) ?? error\n }\n\n static getValidationErrors (error: ArkstackErrorShape) {\n if (typeof error.errors === 'function') {\n return error.errors()\n }\n\n return error.errors\n }\n\n static isValidationError (error: unknown): error is ArkstackErrorShape {\n const candidate = ErrorHandler.toErrorShape(error)\n\n return typeof candidate?.errors !== 'undefined'\n }\n\n static isModelNotFoundError (error: unknown): error is ArkstackErrorShape {\n const candidate = ErrorHandler.toErrorShape(error)\n\n return typeof candidate?.getModelName === 'function'\n }\n\n static shouldHideStack () {\n const value = process.env.HIDE_ERROR_STACK\n\n return value === 'true' || value === '1' || value === 'on'\n }\n\n static shouldLogError (error: unknown) {\n return !ErrorHandler.isValidationError(error) &&\n !ErrorHandler.isModelNotFoundError(error)\n }\n\n static createErrorPayload (\n err: ArkstackErrorShape | string,\n fallbackMessage: string = 'Something went wrong',\n ): ArkstackErrorPayload {\n const primaryError = ErrorHandler.getPrimaryError(err)\n const detailedError = typeof primaryError === 'string'\n ? undefined\n : primaryError\n const validationError = detailedError && ErrorHandler.isValidationError(detailedError)\n ? detailedError\n : undefined\n const modelNotFoundError = detailedError && ErrorHandler.isModelNotFoundError(detailedError)\n ? detailedError\n : undefined\n const payload: ArkstackErrorPayload = {\n status: 'error',\n code: typeof err === 'string'\n ? 500\n : ErrorHandler.normalizeStatusCode(detailedError?.statusCode ?? detailedError?.status),\n message: typeof err === 'string'\n ? `${fallbackMessage}: ${err}`\n : detailedError?.message || err.message || fallbackMessage,\n }\n\n if (validationError) {\n payload.code = ErrorHandler.normalizeStatusCode(validationError.statusCode ?? validationError.status, 422)\n payload.message = validationError.message || fallbackMessage\n payload.errors = ErrorHandler.getValidationErrors(validationError)\n } else if (modelNotFoundError) {\n payload.code = 404\n payload.message = `${modelNotFoundError.getModelName?.()} not found!`\n } else if (detailedError?.stack) {\n const [stackLine, ...rest] = detailedError.stack.split('\\n')\n const [key, content = ''] = stackLine.split(':')\n\n payload.errors = {\n [key]: [content.trim(), ...rest.map((entry: string) => entry.trim())]\n }\n }\n\n if (\n detailedError &&\n process.env.NODE_ENV === 'development' &&\n !ErrorHandler.shouldHideStack() &&\n !validationError\n ) {\n payload.stack = detailedError.stack\n }\n\n if (!validationError || payload.code === 404) {\n delete payload.errors\n delete payload.stack\n }\n\n return payload\n }\n\n static logUnhandledError (\n err: unknown,\n request: Record<string, unknown>,\n message: string,\n ) {\n ErrorHandler.getErrorLogger().error({\n error: ErrorHandler.serializeError(err),\n request,\n }, message)\n }\n}\n\nexport const toErrorShape = ErrorHandler.toErrorShape\nexport const normalizeStatusCode = ErrorHandler.normalizeStatusCode\nexport const getErrorLogger = ErrorHandler.getErrorLogger\nexport const serializeError = ErrorHandler.serializeError\nexport const getPrimaryError = ErrorHandler.getPrimaryError\nexport const getValidationErrors = ErrorHandler.getValidationErrors\nexport const isValidationError = ErrorHandler.isValidationError\nexport const isModelNotFoundError = ErrorHandler.isModelNotFoundError\nexport const shouldHideStack = ErrorHandler.shouldHideStack\nexport const shouldLogError = ErrorHandler.shouldLogError\nexport const createErrorPayload = ErrorHandler.createErrorPayload\nexport const logUnhandledError = ErrorHandler.logUnhandledError\n","import chalk, { type ChalkInstance } from 'chalk'\nimport { LoggerChalk, LoggerLog, LoggerParseSignature } from './types'\n\nclass Console {\n static log = (...args: any[]) => Logger.log(args.map(e => [e, 'white']))\n static debug = (...args: any[]) => Logger.debug(args, false, true)\n static warn = (...args: any[]) => args.map(e => Logger.warn(e, false, true))\n static info = (...args: any[]) => args.map(e => Logger.info(e, false, true))\n static error = (...args: any[]) => args.map(e => Logger.error(e, false), true)\n}\n\nexport class Logger {\n /**\n * Global verbosity configuration\n */\n private static verbosity: number = 0\n private static isQuiet: boolean = false\n private static isSilent: boolean = false\n\n /**\n * Configure global verbosity levels\n */\n static configure (options: { verbosity?: number, quiet?: boolean, silent?: boolean } = {}) {\n this.verbosity = options.verbosity ?? 0\n this.isQuiet = options.quiet ?? false\n this.isSilent = options.silent ?? false\n }\n\n /**\n * Check if output should be suppressed\n */\n private static shouldSuppressOutput (level: 'line' | 'debug' | 'info' | 'warn' | 'error' | 'success'): boolean {\n if (this.isSilent) return true\n if (this.isQuiet && (level === 'info' || level === 'success')) return true\n if (level === 'debug' && this.verbosity < 3) return true\n\n return false\n }\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param value \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static twoColumnDetail (name: string, value: string, log?: true, spacer?: string): void\n static twoColumnDetail (name: string, value: string, log?: false, spacer?: string): [string, string, string]\n static twoColumnDetail (name: string, value: string, log = true, spacer = '.'): [string, string, string] | void {\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const width = Math.max(process.stdout.columns, 100)\n const dots = Math.max(width - name.replace(regex, '').length - value.replace(regex, '').length - 10, 0)\n\n if (log) return console.log(name, chalk.gray(spacer.repeat(dots)), value)\n else return [name, chalk.gray(spacer.repeat(dots)), value]\n }\n\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param desc \n * @param width \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static describe (name: string, desc: string, width?: number, log?: true): void\n static describe (name: string, desc: string, width?: number, log?: false): [string, string, string]\n static describe (name: string, desc: string, width = 50, log = true): [string, string, string] | void {\n width = Math.max(width, 30)\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const dots = Math.max(width - name.replace(regex, '').length, 0)\n\n if (log) return console.log(name, ' '.repeat(dots), desc)\n else return [name, ' '.repeat(dots), desc]\n }\n\n /**\n * Logs the message in two columns but allways passing status\n * \n * @param name \n * @param value \n * @param status \n * @param exit \n * @param preserveCol \n */\n static split (name: string, value: string, status?: 'success' | 'info' | 'error', exit = false, preserveCol = false, spacer = '.') {\n status ??= 'info'\n const color = { success: chalk.bgGreen, info: chalk.bgBlue, error: chalk.bgRed }\n\n const [_name, dots, val] = this.twoColumnDetail(name, value, false, spacer)\n\n console.log(this.textFormat(_name, color[status], preserveCol), dots, val)\n\n if (exit) process.exit(0)\n }\n\n /**\n * Wraps text with chalk\n * \n * @param txt \n * @param color \n * @param preserveCol \n * @returns \n */\n static textFormat (\n txt: unknown | unknown[],\n color: (...text: unknown[]) => string,\n preserveCol = false\n ): string {\n if (txt instanceof Error) {\n const err: Error & { code?: number, statusCode?: number } = txt\n const code = err.code ?? err.statusCode ? ` (${err.code ?? err.statusCode})` : ''\n const output: string[] = []\n\n if (err.message) {\n output.push(this.textFormat(`${err.constructor.name}${code}: ${err.message}`, chalk.bgRed, preserveCol))\n }\n\n if (err.stack) {\n output.push(' ' + chalk.white(err.stack.replace(`${err.name}: ${err.message}`, '').trim()))\n }\n\n return output.join('\\n')\n }\n\n if (Array.isArray(txt)) {\n return txt.map(e => this.textFormat(e, color, preserveCol)).join('\\n')\n }\n\n if (typeof txt === 'object') {\n return this.textFormat(Object.values(txt!), color, preserveCol)\n }\n\n if (typeof txt !== 'string') {\n return color(txt)\n }\n\n const str = String(txt)\n\n if (preserveCol) return str\n\n const [first, ...rest] = str.split(':')\n if (rest.length === 0) return str\n\n return color(` ${first} `) + rest.join(':')\n }\n\n /**\n * Logs a success message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static success (msg: any, exit = false, preserveCol = false) {\n if (!this.shouldSuppressOutput('success')) {\n console.log(chalk.green('✓'), this.textFormat(msg, chalk.bgGreen, preserveCol))\n }\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an informational message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static info (msg: any, exit = false, preserveCol = false) {\n if (!this.shouldSuppressOutput('info')) {\n console.log(chalk.blue('ℹ'), this.textFormat(msg, chalk.bgBlue, preserveCol))\n }\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an error message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static error (msg: any, exit = true, preserveCol = false) {\n if (!this.shouldSuppressOutput('error')) {\n if (msg instanceof Error) {\n if (msg.message) {\n console.error(chalk.red('✖'), this.textFormat('ERROR:' + msg.message, chalk.bgRed, preserveCol))\n }\n console.error(chalk.red(`${(msg as any).detail ? `${(msg as any).detail}\\n` : ''}${msg.stack}`))\n } else {\n console.error(chalk.red('✖'), this.textFormat(msg, chalk.bgRed, preserveCol))\n }\n }\n if (exit) process.exit(1)\n }\n\n /**\n * Logs a warning message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static warn (msg: any, exit = false, preserveCol = false) {\n if (!this.shouldSuppressOutput('warn')) {\n console.warn(chalk.yellow('⚠'), this.textFormat(msg, chalk.bgYellow, preserveCol))\n }\n if (exit) process.exit(0)\n }\n\n /**\n * Logs a debug message (only shown with verbosity >= 3)\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static debug<M = any> (msg: M | M[], exit = false, preserveCol = false) {\n if (!this.shouldSuppressOutput('debug')) {\n if (Array.isArray(msg)) {\n for (let i = 0; i < msg.length; i++) {\n console.log(chalk.gray('🐛'), chalk.bgGray(i + 1), this.textFormat(msg[i], chalk.bgGray, preserveCol))\n }\n } else {\n console.log(chalk.gray('🐛'), this.textFormat(msg, chalk.bgGray, preserveCol))\n }\n }\n if (exit) process.exit(0)\n }\n\n /**\n * Terminates the process\n */\n static quiet () {\n process.exit(0)\n }\n\n static chalker (styles: LoggerChalk[]) {\n return (input: any): string =>\n styles.reduce((acc, style) => {\n if ((style as any) in chalk) {\n const fn = typeof style === 'function'\n ? style\n : chalk[style as never]\n\n return fn(acc)\n }\n\n return acc\n }, input)\n }\n\n /**\n * Parse an array formated message and logs it\n * \n * @param config \n * @param joiner \n * @param log If set to false, string output will be returned and not logged \n * @param sc color to use ue on split text if : is found \n */\n static parse (config: LoggerParseSignature, joiner?: string, log?: true, sc?: LoggerChalk): void\n static parse (config: LoggerParseSignature, joiner?: string, log?: false, sc?: LoggerChalk): string\n static parse (config: LoggerParseSignature, joiner = ' ', log = true, sc?: LoggerChalk): string | void {\n const string = config.map(([str, opt]) => {\n if (Array.isArray(opt)) {\n opt = Logger.chalker(opt) as ChalkInstance\n }\n\n const output = typeof opt === 'string' && typeof chalk[opt] === 'function'\n ? (chalk as any)[opt](str)\n : typeof opt === 'function' ? opt(str) : str\n\n if (!sc) {\n return output\n }\n\n return this.textFormat(output, Logger.chalker(Array.isArray(sc) ? sc : [sc]))\n }).join(joiner)\n\n if (log && !this.shouldSuppressOutput('line')) console.log(string)\n else return string\n }\n\n /**\n * Ouput formater object or format the output\n * \n * @returns \n */\n static log: LoggerLog = ((config, joiner, log: boolean = true, sc) => {\n if (typeof config === 'string') {\n const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n\n return this.parse(conf, '', log as false, sc)\n } else if (Array.isArray(config)) {\n return this.parse(config, String(joiner), log as false, sc)\n } else if (log && !this.shouldSuppressOutput('line')) {\n return console.log(this.textFormat(config, Logger.chalker(['blue'])))\n }\n\n return this\n }) as LoggerLog\n\n /**\n * A simple console like output logger\n * \n * @returns \n */\n static console () {\n return Console\n }\n}","import { HookArgs, HookFor, HookName, HookPos, HookPositions, HookRegistry, IHook } from './types'\n\nexport class Hook {\n private static hooks = new Map<string, IHook>()\n\n /**\n * Hooks define code that should run within defined boundaries to add extra functionalities.\n * \n * @param name \n * @param value \n */\n static set<N extends HookName> (\n name: N | (string & {}),\n hook: HookFor<N>\n ) {\n const oldhook = this.hooks.get(name) ?? {}\n\n this.hooks.set(name, {\n ...oldhook,\n ...hook,\n })\n }\n\n /**\n * Check if a hook is defined by name\n * \n * @param name \n */\n static has<N extends HookName, P extends HookPositions<N>> (name: N | (string & {}), pos?: P) {\n if (pos && this.hooks.has(name))\n return Boolean(this.get(name, pos))\n\n return this.hooks.has(name)\n }\n\n /**\n * Retrieve a defined hook by name\n * \n * @param name \n */\n static get<N extends HookName> (name: N): HookFor<N> | undefined\n /**\n * Retrieve a defined hook by name and position\n * \n * @param name \n * @param pos \n */\n static get<N extends HookName, P extends HookPositions<N>> (name: N, pos: P): HookPos<N, P> | undefined\n /**\n * Retrieve a defined hook by name and position the set args for callback\n * \n * @param name \n * @param pos \n */\n static get<N extends HookName, P extends HookPositions<N>> (name: N, pos: P, ...args: HookArgs<N, P>): void\n static get<N extends HookName, P extends HookPositions<N>> (\n name: N,\n pos?: P,\n ...args: HookArgs<N, P> | any[]\n ): HookFor<N> | HookPos<N, P> | undefined {\n const hook = this.hooks.get(name)\n\n if (!hook) return undefined\n if (pos === undefined) return hook as HookFor<N>\n\n const fn = hook[pos]\n if (!fn) return undefined\n\n if (args.length > 0) return fn(...args) as HookPos<N, P>\n\n return fn as HookPos<N, P>\n }\n\n /**\n * Retrieve all defined hooks\n * \n * @param name \n */\n static getAll = () => {\n const hooks: Record<string, IHook> & HookRegistry = {}\n\n for (const [name, value] of this.hooks)\n hooks[name] = value\n\n return hooks\n }\n\n /**\n * Remove the defined hook\n * \n * @param name \n */\n static unset<N extends HookName, P extends HookPositions<N>> (name?: N | (string & {}), pos?: P) {\n if (name && this.hooks.has(name)) {\n if (pos !== undefined) {\n const hook = this.get(name)\n if (hook?.[pos]) delete hook[pos]\n\n return Object.keys(hook ?? {}).length < 1\n ? void this.hooks.delete(name)\n : undefined\n }\n\n this.hooks.delete(name)\n } else this.clear()\n }\n\n /**\n * Clear all the defined hooks\n */\n static clear = () => {\n this.hooks.clear()\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Hook","Hook"],"sources":["../src/lifecycle.ts","../src/network.ts","../src/prototypes.ts","../src/Exceptions/Exception.ts","../src/Exceptions/AppException.ts","../src/Exceptions/RequestException.ts","../src/ErrorHandler.ts","../src/Logger.ts","../src/Hook.ts"],"sourcesContent":["import { Hook } from '@arkstack/foundry'\n\nexport const bindGracefulShutdown = (shutdown: () => Promise<void> | void) => {\n ['SIGINT', 'SIGTERM', 'SIGQUIT'].forEach((signal) => {\n process.on(signal, async () => {\n if (Hook.has('shutdown', 'before')) Hook.get('shutdown', 'after', {})\n await shutdown()\n })\n })\n}\n","import { config, env } from './system'\n\nimport { Arkstack } from '@arkstack/contract'\nimport { Hook } from '@arkstack/foundry'\nimport { bindGracefulShutdown } from './lifecycle'\nimport { detect } from 'detect-port'\nimport { initializeGlobalContext } from './utils'\nimport { str } from '@h3ravel/support'\n\nexport const bootWithDetectedPort = async <TApp, TRoutes = unknown, THandler = unknown> (\n boot: (port: number) => Promise<void>,\n preferredPort: number = 3000,\n app?: Arkstack<TApp, TRoutes, THandler>\n) => {\n const port = await detect(preferredPort)\n\n if (Hook.has('boot', 'before')) Hook.get('boot', 'before', port, app)\n\n if (app && !globalThis.app) globalThis.app = () => app as never\n globalThis.env = env\n globalThis.config = config\n globalThis.str = str\n globalThis.arkctx = {\n runtime: 'HTTP',\n }\n await boot(port)\n await initializeGlobalContext()\n\n // Handle graceful shutdown\n bindGracefulShutdown(async () => await app?.shutdown())\n\n if (Hook.has('boot', 'after')) Hook.get('boot', 'after', port, app)\n}\n\nexport const renderError = ({\n message = 'An unexpected error occurred.',\n stack,\n title,\n code = 500,\n}: {\n message?: string;\n stack?: string;\n code?: number;\n title?: string;\n}) => {\n const titleMap: Record<number, string> = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n }\n\n title = titleMap[code] || title || 'Error'\n\n return globalThis.view('~arkstack/common.error', {\n code,\n title,\n stack,\n message,\n }).renderSync()\n}","export const loadPrototypes = () => {\n String.prototype.titleCase = function () {\n return this.toLowerCase()\n .replace(/_/g, ' ')\n .replace(/-/g, ' ')\n .replace(/(?:^|\\s)\\w/g, function (match) {\n return match.toUpperCase()\n })\n }\n\n String.prototype.camelCase = function () {\n return this.replace(/(?:^\\w|[A-Z]|\\b\\w|\\s+)/g, function (match, index) {\n if (+match === 0) return '' // or if (/\\s+/.test(match)) for white spaces\n\n return index === 0 ? match.toLowerCase() : match.toUpperCase()\n })\n }\n\n String.prototype.pascalCase = function () {\n return this.replace(/(?:^\\w|[A-Z]|\\b\\w|\\s+)/g, function (match) {\n return match.toUpperCase()\n })\n }\n\n String.prototype.truncate = function (len: number = 20, suffix: string = '...') {\n if (this.length <= len) {\n return this.toString()\n }\n\n const truncated = this.substring(0, len)\n const lastSpaceIndex = truncated.lastIndexOf(' ')\n if (lastSpaceIndex > 0) {\n return truncated.substring(0, lastSpaceIndex) + suffix\n }\n\n return truncated + suffix\n }\n} \n","export class Exception extends Error {\n name: string\n\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'Exception'\n }\n}","import { Exception } from './Exception'\n\nexport class AppException extends Exception {\n errors?: { [key: string]: string[] | string } | undefined = undefined\n\n statusCode: number\n\n constructor(message?: string, statusCode: number = 400, options?: ErrorOptions) {\n super(message, options)\n this.statusCode = statusCode\n }\n}","import { AppException } from './AppException'\n\nexport class RequestException extends AppException {\n statusCode: number\n\n constructor(message?: string, statusCode: number = 400, options?: ErrorOptions) {\n super(message, statusCode, options)\n this.statusCode = statusCode\n }\n\n /**\n * Asserts that a value is not null or undefined. \n * \n * @param value \n * @param message \n * @param code \n * @throws {RequestException} Throws if the value is null or undefined.\n */\n static assertNotEmpty<T> (\n value: T | null | undefined,\n message: string,\n code: number = 404,\n ): asserts value is T {\n if (!value) {\n throw new RequestException(message, code)\n }\n }\n\n /**\n * Asserts that a boolean condition is true. \n * \n * @param boolean \n * @param message \n * @param code \n * @throws {RequestException} Throws if the boolean condition is true.\n */\n static abortIf<T> (\n boolean: T,\n message: string,\n code?: number,\n ): asserts boolean is T {\n if (boolean) {\n throw new RequestException(message, code)\n }\n }\n}","import pino, { type Logger as PinoLogger } from 'pino'\nimport path from 'node:path'\nimport { ArkstackErrorPayload, ArkstackErrorShape } from './types'\nimport { Arkstack } from '@arkstack/contract'\nimport { ModelNotFoundException } from 'arkormx'\n\nexport class ErrorHandler {\n private static loggerCache = new Map<string, PinoLogger>()\n\n private static isRecord (value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n }\n\n static toErrorShape (value: unknown): ArkstackErrorShape | undefined {\n return ErrorHandler.isRecord(value) ? value as unknown as ArkstackErrorShape : undefined\n }\n\n static normalizeStatusCode (value: unknown, fallback: number = 500) {\n const code = typeof value === 'number' ? value : Number(value)\n\n return Number.isInteger(code) && code >= 100 && code < 600 ? code : fallback\n }\n\n static getErrorLogger () {\n const destination = path.resolve(Arkstack.rootDir(), 'storage/logs/error.log')\n\n if (!ErrorHandler.loggerCache.has(destination)) {\n ErrorHandler.loggerCache.set(destination, pino({\n level: 'error',\n }, pino.destination({\n dest: destination,\n mkdir: true,\n sync: false,\n })))\n }\n\n return ErrorHandler.loggerCache.get(destination)!\n }\n\n static serializeError (\n value: unknown,\n seen: WeakSet<object> = new WeakSet()\n ): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => ErrorHandler.serializeError(entry, seen))\n }\n\n if (!ErrorHandler.isRecord(value)) {\n return value\n }\n\n if (seen.has(value)) {\n return '[Circular]'\n }\n\n seen.add(value)\n\n const serialized: Record<string, unknown> = {}\n\n if (value instanceof Error) {\n serialized.name = value.name\n serialized.message = value.message\n serialized.stack = value.stack\n }\n\n for (const key of Reflect.ownKeys(value)) {\n const property = typeof key === 'string' ? key : key.toString()\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n\n if (!descriptor || !('value' in descriptor)) {\n continue\n }\n\n serialized[property] = ErrorHandler.serializeError(descriptor.value, seen)\n }\n\n return serialized\n }\n\n static getPrimaryError (error: ArkstackErrorShape | string) {\n if (typeof error === 'string') {\n return error\n }\n\n return ErrorHandler.toErrorShape(error.cause) ?? error\n }\n\n static getValidationErrors (error: ArkstackErrorShape) {\n if (typeof error.errors === 'function') {\n return error.errors()\n }\n\n return error.errors\n }\n\n static isValidationError (error: unknown): error is ArkstackErrorShape {\n const candidate = ErrorHandler.toErrorShape(error)\n\n return typeof candidate?.errors !== 'undefined'\n }\n\n static isModelNotFoundError (error: unknown): error is ArkstackErrorShape {\n const candidate = ErrorHandler.toErrorShape(error)\n\n if ((error as any).cause && (error as any).cause instanceof ModelNotFoundException) {\n (error as any).getModelName = (error as any).cause.getModelName\n\n return true\n }\n\n return typeof candidate?.getModelName === 'function' ||\n error instanceof ModelNotFoundException\n }\n\n static shouldHideStack () {\n const value = process.env.HIDE_ERROR_STACK\n\n return value === 'true' || value === '1' || value === 'on'\n }\n\n static shouldLogError (error: unknown) {\n return !ErrorHandler.isValidationError(error) &&\n !ErrorHandler.isModelNotFoundError(error)\n }\n\n static createErrorPayload (\n err: ArkstackErrorShape | string,\n fallbackMessage: string = 'Something went wrong',\n ): ArkstackErrorPayload {\n const primaryError = ErrorHandler.getPrimaryError(err)\n const detailedError = typeof primaryError === 'string'\n ? undefined\n : primaryError\n const validationError = detailedError && ErrorHandler.isValidationError(detailedError)\n ? detailedError\n : undefined\n const modelNotFoundError = detailedError && ErrorHandler.isModelNotFoundError(detailedError)\n ? detailedError\n : undefined\n\n const payload: ArkstackErrorPayload = {\n status: 'error',\n code: typeof err === 'string'\n ? 500\n : ErrorHandler.normalizeStatusCode(detailedError?.statusCode ?? detailedError?.status),\n message: typeof err === 'string'\n ? `${fallbackMessage}: ${err}`\n : detailedError?.message || err.message || fallbackMessage,\n }\n\n if (validationError) {\n payload.code = ErrorHandler.normalizeStatusCode(validationError.statusCode ?? validationError.status, 422)\n payload.message = validationError.message || fallbackMessage\n payload.errors = ErrorHandler.getValidationErrors(validationError)\n } else if (modelNotFoundError) {\n payload.code = 404\n payload.message = `${modelNotFoundError.getModelName?.()} not found!`\n } else if (detailedError?.stack) {\n const [stackLine, ...rest] = detailedError.stack.split('\\n')\n const [key, content = ''] = stackLine.split(':')\n\n payload.errors = {\n [key]: [content.trim(), ...rest.map((entry: string) => entry.trim())]\n }\n }\n\n if (\n detailedError &&\n process.env.NODE_ENV === 'development' &&\n !ErrorHandler.shouldHideStack() &&\n !validationError\n ) {\n payload.stack = detailedError.stack\n }\n\n if (!validationError || payload.code === 404) {\n delete payload.errors\n delete payload.stack\n }\n\n return payload\n }\n\n static logUnhandledError (\n err: unknown,\n request: Record<string, unknown>,\n message: string,\n ) {\n ErrorHandler.getErrorLogger().error({\n error: ErrorHandler.serializeError(err),\n request,\n }, message)\n }\n}\n\nexport const toErrorShape = ErrorHandler.toErrorShape\nexport const normalizeStatusCode = ErrorHandler.normalizeStatusCode\nexport const getErrorLogger = ErrorHandler.getErrorLogger\nexport const serializeError = ErrorHandler.serializeError\nexport const getPrimaryError = ErrorHandler.getPrimaryError\nexport const getValidationErrors = ErrorHandler.getValidationErrors\nexport const isValidationError = ErrorHandler.isValidationError\nexport const isModelNotFoundError = ErrorHandler.isModelNotFoundError\nexport const shouldHideStack = ErrorHandler.shouldHideStack\nexport const shouldLogError = ErrorHandler.shouldLogError\nexport const createErrorPayload = ErrorHandler.createErrorPayload\nexport const logUnhandledError = ErrorHandler.logUnhandledError\n","import chalk, { type ChalkInstance } from 'chalk'\nimport { LoggerChalk, LoggerLog, LoggerParseSignature } from './types'\n\nclass Console {\n static log = (...args: any[]) => Logger.log(args.map(e => [e, 'white']))\n static debug = (...args: any[]) => Logger.debug(args, false, true)\n static warn = (...args: any[]) => args.map(e => Logger.warn(e, false, true))\n static info = (...args: any[]) => args.map(e => Logger.info(e, false, true))\n static error = (...args: any[]) => args.map(e => Logger.error(e, false), true)\n}\n\nexport class Logger {\n /**\n * Global verbosity configuration\n */\n private static verbosity: number = 0\n private static isQuiet: boolean = false\n private static isSilent: boolean = false\n\n /**\n * Configure global verbosity levels\n */\n static configure (options: { verbosity?: number, quiet?: boolean, silent?: boolean } = {}) {\n this.verbosity = options.verbosity ?? 0\n this.isQuiet = options.quiet ?? false\n this.isSilent = options.silent ?? false\n }\n\n /**\n * Check if output should be suppressed\n */\n private static shouldSuppressOutput (level: 'line' | 'debug' | 'info' | 'warn' | 'error' | 'success'): boolean {\n if (this.isSilent) return true\n if (this.isQuiet && (level === 'info' || level === 'success')) return true\n if (level === 'debug' && this.verbosity < 3) return true\n\n return false\n }\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param value \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static twoColumnDetail (name: string, value: string, log?: true, spacer?: string): void\n static twoColumnDetail (name: string, value: string, log?: false, spacer?: string): [string, string, string]\n static twoColumnDetail (name: string, value: string, log = true, spacer = '.'): [string, string, string] | void {\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const width = Math.max(process.stdout.columns, 100)\n const dots = Math.max(width - name.replace(regex, '').length - value.replace(regex, '').length - 10, 0)\n\n if (log) return console.log(name, chalk.gray(spacer.repeat(dots)), value)\n else return [name, chalk.gray(spacer.repeat(dots)), value]\n }\n\n /**\n * Logs the message in two columns\n * \n * @param name \n * @param desc \n * @param width \n * @param log If set to false, array of [name, dots, value] output will be returned and not logged \n * @returns \n */\n static describe (name: string, desc: string, width?: number, log?: true): void\n static describe (name: string, desc: string, width?: number, log?: false): [string, string, string]\n static describe (name: string, desc: string, width = 50, log = true): [string, string, string] | void {\n width = Math.max(width, 30)\n // eslint-disable-next-line no-control-regex\n const regex = /\\x1b\\[\\d+m/g\n const dots = Math.max(width - name.replace(regex, '').length, 0)\n\n if (log) return console.log(name, ' '.repeat(dots), desc)\n else return [name, ' '.repeat(dots), desc]\n }\n\n /**\n * Logs the message in two columns but allways passing status\n * \n * @param name \n * @param value \n * @param status \n * @param exit \n * @param preserveCol \n */\n static split (name: string, value: string, status?: 'success' | 'info' | 'error', exit = false, preserveCol = false, spacer = '.') {\n status ??= 'info'\n const color = { success: chalk.bgGreen, info: chalk.bgBlue, error: chalk.bgRed }\n\n const [_name, dots, val] = this.twoColumnDetail(name, value, false, spacer)\n\n console.log(this.textFormat(_name, color[status], preserveCol), dots, val)\n\n if (exit) process.exit(0)\n }\n\n /**\n * Wraps text with chalk\n * \n * @param txt \n * @param color \n * @param preserveCol \n * @returns \n */\n static textFormat (\n txt: unknown | unknown[],\n color: (...text: unknown[]) => string,\n preserveCol = false\n ): string {\n if (txt instanceof Error) {\n const err: Error & { code?: number, statusCode?: number } = txt\n const code = err.code ?? err.statusCode ? ` (${err.code ?? err.statusCode})` : ''\n const output: string[] = []\n\n if (err.message) {\n output.push(this.textFormat(`${err.constructor.name}${code}: ${err.message}`, chalk.bgRed, preserveCol))\n }\n\n if (err.stack) {\n output.push(' ' + chalk.white(err.stack.replace(`${err.name}: ${err.message}`, '').trim()))\n }\n\n return output.join('\\n')\n }\n\n if (Array.isArray(txt)) {\n return txt.map(e => this.textFormat(e, color, preserveCol)).join('\\n')\n }\n\n if (typeof txt === 'object') {\n return this.textFormat(Object.values(txt!), color, preserveCol)\n }\n\n if (typeof txt !== 'string') {\n return color(txt)\n }\n\n const str = String(txt)\n\n if (preserveCol) return str\n\n const [first, ...rest] = str.split(':')\n if (rest.length === 0) return str\n\n return color(` ${first} `) + rest.join(':')\n }\n\n /**\n * Logs a success message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static success (msg: any, exit = false, preserveCol = false) {\n if (!this.shouldSuppressOutput('success')) {\n console.log(chalk.green('✓'), this.textFormat(msg, chalk.bgGreen, preserveCol))\n }\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an informational message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static info (msg: any, exit = false, preserveCol = false) {\n if (!this.shouldSuppressOutput('info')) {\n console.log(chalk.blue('ℹ'), this.textFormat(msg, chalk.bgBlue, preserveCol))\n }\n if (exit) process.exit(0)\n }\n\n /**\n * Logs an error message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static error (msg: any, exit = true, preserveCol = false) {\n if (!this.shouldSuppressOutput('error')) {\n if (msg instanceof Error) {\n if (msg.message) {\n console.error(chalk.red('✖'), this.textFormat('ERROR:' + msg.message, chalk.bgRed, preserveCol))\n }\n console.error(chalk.red(`${(msg as any).detail ? `${(msg as any).detail}\\n` : ''}${msg.stack}`))\n } else {\n console.error(chalk.red('✖'), this.textFormat(msg, chalk.bgRed, preserveCol))\n }\n }\n if (exit) process.exit(1)\n }\n\n /**\n * Logs a warning message\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static warn (msg: any, exit = false, preserveCol = false) {\n if (!this.shouldSuppressOutput('warn')) {\n console.warn(chalk.yellow('⚠'), this.textFormat(msg, chalk.bgYellow, preserveCol))\n }\n if (exit) process.exit(0)\n }\n\n /**\n * Logs a debug message (only shown with verbosity >= 3)\n * \n * @param msg \n * @param exit \n * @param preserveCol \n */\n static debug<M = any> (msg: M | M[], exit = false, preserveCol = false) {\n if (!this.shouldSuppressOutput('debug')) {\n if (Array.isArray(msg)) {\n for (let i = 0; i < msg.length; i++) {\n console.log(chalk.gray('🐛'), chalk.bgGray(i + 1), this.textFormat(msg[i], chalk.bgGray, preserveCol))\n }\n } else {\n console.log(chalk.gray('🐛'), this.textFormat(msg, chalk.bgGray, preserveCol))\n }\n }\n if (exit) process.exit(0)\n }\n\n /**\n * Terminates the process\n */\n static quiet () {\n process.exit(0)\n }\n\n static chalker (styles: LoggerChalk[]) {\n return (input: any): string =>\n styles.reduce((acc, style) => {\n if ((style as any) in chalk) {\n const fn = typeof style === 'function'\n ? style\n : chalk[style as never]\n\n return fn(acc)\n }\n\n return acc\n }, input)\n }\n\n /**\n * Parse an array formated message and logs it\n * \n * @param config \n * @param joiner \n * @param log If set to false, string output will be returned and not logged \n * @param sc color to use ue on split text if : is found \n */\n static parse (config: LoggerParseSignature, joiner?: string, log?: true, sc?: LoggerChalk): void\n static parse (config: LoggerParseSignature, joiner?: string, log?: false, sc?: LoggerChalk): string\n static parse (config: LoggerParseSignature, joiner = ' ', log = true, sc?: LoggerChalk): string | void {\n const string = config.map(([str, opt]) => {\n if (Array.isArray(opt)) {\n opt = Logger.chalker(opt) as ChalkInstance\n }\n\n const output = typeof opt === 'string' && typeof chalk[opt] === 'function'\n ? (chalk as any)[opt](str)\n : typeof opt === 'function' ? opt(str) : str\n\n if (!sc) {\n return output\n }\n\n return this.textFormat(output, Logger.chalker(Array.isArray(sc) ? sc : [sc]))\n }).join(joiner)\n\n if (log && !this.shouldSuppressOutput('line')) console.log(string)\n else return string\n }\n\n /**\n * Ouput formater object or format the output\n * \n * @returns \n */\n static log: LoggerLog = ((config, joiner, log: boolean = true, sc) => {\n if (typeof config === 'string') {\n const conf = [[config, joiner]] as [string, keyof ChalkInstance][]\n\n return this.parse(conf, '', log as false, sc)\n } else if (Array.isArray(config)) {\n return this.parse(config, String(joiner), log as false, sc)\n } else if (log && !this.shouldSuppressOutput('line')) {\n return console.log(this.textFormat(config, Logger.chalker(['blue'])))\n }\n\n return this\n }) as LoggerLog\n\n /**\n * A simple console like output logger\n * \n * @returns \n */\n static console () {\n return Console\n }\n}","import { HookArgs, HookFor, HookName, HookPos, HookPositions, HookRegistry, IHook } from './types'\n\nexport class Hook {\n private static hooks = new Map<string, IHook>()\n\n /**\n * Hooks define code that should run within defined boundaries to add extra functionalities.\n * \n * @param name \n * @param value \n */\n static set<N extends HookName> (\n name: N | (string & {}),\n hook: HookFor<N>\n ) {\n const oldhook = this.hooks.get(name) ?? {}\n\n this.hooks.set(name, {\n ...oldhook,\n ...hook,\n })\n }\n\n /**\n * Check if a hook is defined by name\n * \n * @param name \n */\n static has<N extends HookName, P extends HookPositions<N>> (name: N | (string & {}), pos?: P) {\n if (pos && this.hooks.has(name))\n return Boolean(this.get(name, pos))\n\n return this.hooks.has(name)\n }\n\n /**\n * Retrieve a defined hook by name\n * \n * @param name \n */\n static get<N extends HookName> (name: N): HookFor<N> | undefined\n /**\n * Retrieve a defined hook by name and position\n * \n * @param name \n * @param pos \n */\n static get<N extends HookName, P extends HookPositions<N>> (name: N, pos: P): HookPos<N, P> | undefined\n /**\n * Retrieve a defined hook by name and position the set args for callback\n * \n * @param name \n * @param pos \n */\n static get<N extends HookName, P extends HookPositions<N>> (name: N, pos: P, ...args: HookArgs<N, P>): void\n static get<N extends HookName, P extends HookPositions<N>> (\n name: N,\n pos?: P,\n ...args: HookArgs<N, P> | any[]\n ): HookFor<N> | HookPos<N, P> | undefined {\n const hook = this.hooks.get(name)\n\n if (!hook) return undefined\n if (pos === undefined) return hook as HookFor<N>\n\n const fn = hook[pos]\n if (!fn) return undefined\n\n if (args.length > 0) return fn(...args) as HookPos<N, P>\n\n return fn as HookPos<N, P>\n }\n\n /**\n * Retrieve all defined hooks\n * \n * @param name \n */\n static getAll = () => {\n const hooks: Record<string, IHook> & HookRegistry = {}\n\n for (const [name, value] of this.hooks)\n hooks[name] = value\n\n return hooks\n }\n\n /**\n * Remove the defined hook\n * \n * @param name \n */\n static unset<N extends HookName, P extends HookPositions<N>> (name?: N | (string & {}), pos?: P) {\n if (name && this.hooks.has(name)) {\n if (pos !== undefined) {\n const hook = this.get(name)\n if (hook?.[pos]) delete hook[pos]\n\n return Object.keys(hook ?? {}).length < 1\n ? void this.hooks.delete(name)\n : undefined\n }\n\n this.hooks.delete(name)\n } else this.clear()\n }\n\n /**\n * Clear all the defined hooks\n */\n static clear = () => {\n this.hooks.clear()\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkstack/common",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "type": "module",
5
5
  "description": "Core utilities, primitives, and shared infrastructure for the Arkstack ecosystem.",
6
6
  "homepage": "https://arkstack.toneflix.net",
@@ -42,7 +42,8 @@
42
42
  "peerDependencies": {
43
43
  "@h3ravel/support": "^0.15.11",
44
44
  "arkormx": "^ 2.4.1",
45
- "@arkstack/contract": "^0.11.0"
45
+ "@arkstack/foundry": "^0.11.1",
46
+ "@arkstack/contract": "^0.11.1"
46
47
  },
47
48
  "scripts": {
48
49
  "build": "tsdown --config-loader unrun",