@arkstack/common 0.19.5 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -439,71 +439,7 @@ RequestException.abortIf(!user.isActive, 'Account is suspended', 403)
439
439
 
440
440
  **`src/Hook.ts`**
441
441
 
442
- A global, named hook registry for extending Arkstack internals without modifying core code. Hooks are keyed by name and support positional slots (`before`, `after`, or any custom string).
443
-
444
- #### `Hook.set(name, hook)`
445
-
446
- Registers a hook. Multiple calls for the same name are merged.
447
-
448
- ```ts
449
- import { Hook } from '@arkstack/common'
450
-
451
- Hook.set('request:handle', {
452
- before: (ctx) => console.log('before handler'),
453
- after: (ctx) => console.log('after handler'),
454
- })
455
- ```
456
-
457
- ---
458
-
459
- #### `Hook.get(name, pos?)`
460
-
461
- Retrieves the full hook object or a specific positional handler.
462
-
463
- ```ts
464
- const hook = Hook.get('request:handle') // IHook | undefined
465
- const before = Hook.get('request:handle', 'before') // function | undefined
466
- ```
467
-
468
- ---
469
-
470
- #### `Hook.has(name, pos?)`
471
-
472
- Checks whether a hook (or a specific position within it) exists.
473
-
474
- ```ts
475
- Hook.has('request:handle') // true | false
476
- Hook.has('request:handle', 'after') // true | false
477
- ```
478
-
479
- ---
480
-
481
- #### `Hook.unset(name?, pos?)`
482
-
483
- Removes a hook or a single positional handler. If the hook becomes empty after removal, it is deleted entirely. Called with no arguments, it delegates to `Hook.clear()`.
484
-
485
- ```ts
486
- Hook.unset('request:handle', 'before') // removes only the 'before' handler
487
- Hook.unset('request:handle') // removes the entire hook
488
- Hook.unset() // clears all hooks
489
- ```
490
-
491
- ---
492
-
493
- #### `Hook.getAll()`
494
-
495
- Returns all registered hooks as a plain record.
496
-
497
- ```ts
498
- const hooks = Hook.getAll()
499
- // { 'request:handle': { before: fn, after: fn } }
500
- ```
501
-
502
- ---
503
-
504
- #### `Hook.clear()`
505
-
506
- Clears all registered hooks.
442
+ Re-exports `Hook` from `@arkstack/foundry`; both imports are the same process-wide registry. See the [`@arkstack/foundry` README](../foundry/README.md#hook) for the API (`on`, `emit`, `get`, `has`, `off`, `all`, `clear`). Declare typed hook names by augmenting `HookRegistry` on `@arkstack/foundry`.
507
443
 
508
444
  ---
509
445
 
@@ -1,3 +1,4 @@
1
+ import { HookArgs, HookFor, HookName, HookPos, HookPositions, HookRegistry, HookResult, IHook } from "@arkstack/foundry";
1
2
  import { ChannelOptions, Cipher, CipherOptions, Codec, DeriveOptions, DerivedKey, EncryptionKey, FingerprintOptions, KeyInput, KeyPair, Keys, SealedBox, SecureChannel, SerializedKeyPair } from "@arkstack/encryption";
2
3
  import { NodeCipher } from "@arkstack/encryption/node";
3
4
  import { JitiOptions, JitiResolveOptions } from "jiti";
@@ -334,14 +335,6 @@ interface ArkstackErrorPayload {
334
335
  /** Custom fields contributed by an exception's `body`. */
335
336
  [key: string]: unknown;
336
337
  }
337
- interface HookRegistry {}
338
- type Position = 'before' | 'after' | (string & {});
339
- type IHook = { [P in Position]?: (...args: any[]) => void; };
340
- type HookName = keyof HookRegistry extends never ? string : keyof HookRegistry | (string & {});
341
- type HookFor<N extends string> = N extends keyof HookRegistry ? HookRegistry[N] : IHook;
342
- type HookPos<N extends string, P extends string> = N extends keyof HookRegistry ? P extends keyof HookRegistry[N] ? HookRegistry[N][P] : (...args: any[]) => void : (...args: any[]) => void;
343
- type HookPositions<N extends string> = N extends keyof HookRegistry ? keyof HookRegistry[N] : Position;
344
- type HookArgs<N extends string, P extends string> = N extends keyof HookRegistry ? P extends keyof HookRegistry[N] ? HookRegistry[N][P] extends ((...args: infer A) => any) ? A : any[] : any[] : any[];
345
338
  type Choice<Value> = {
346
339
  value: Value;
347
340
  name?: string;
@@ -715,4 +708,4 @@ declare const abortIf: <T>(boolean: T, message?: string, code?: number) => asser
715
708
  */
716
709
  declare const assertFound: <T>(value: T | null | undefined, message: string, code?: number) => asserts value is T;
717
710
  //#endregion
718
- export { HookPos as $, SealedBox as A, ConfigShape as B, Encryption as C, KeyPair as D, KeyInput as E, ArkstackErrorShape as F, EnvRegistry as G, DotPathValue as H, Choice as I, GlobalConfig as J, EnvReturn as K, Choices as L, SerializedKeyPair as M, AppConfig as N, Keys as O, ArkstackErrorPayload as P, HookName as Q, Concrete as R, DerivedKey as S, FingerprintOptions as T, EnvKey as U, DotPath as V, EnvLookup as W, HookArgs as X, GlobalEnv as Y, HookFor as Z, ChannelOptions as _, abort as a, LoggerParseSignature as at, Codec as b, getModel as c, Primitive as ct, isClass as d, PublishFilter as dt, HookPositions as et, normalizePositiveInteger as f, PublishGroup as ft, Hash as g, setModelResolver as h, ModelResolver as i, LoggerLog as it, SecureChannel as j, NodeCipher as k, getModelSync as l, PublishConfirmation as lt, resolvePagination as m, Logger as mt, ModelConstructor as n, IHook as nt, abortIf as o, MergedConfig as ot, perPage as p, UnionToIntersection as pt, FileImporter as q, ModelRegistry as r, LoggerChalk as rt, assertFound as s, PaginationOptions as st, AbstractModelConstructor as t, HookRegistry as tt, initializeGlobalContext as u, PublishEntry as ut, Cipher as v, EncryptionKey as w, DeriveOptions as x, CipherOptions as y, ConfigRegistry as z };
711
+ export { HookPos as $, SealedBox as A, ConfigShape as B, Encryption as C, KeyPair as D, KeyInput as E, ArkstackErrorShape as F, EnvRegistry as G, DotPathValue as H, Choice as I, GlobalConfig as J, EnvReturn as K, Choices as L, SerializedKeyPair as M, AppConfig as N, Keys as O, ArkstackErrorPayload as P, HookName as Q, Concrete as R, DerivedKey as S, FingerprintOptions as T, EnvKey as U, DotPath as V, EnvLookup as W, HookArgs as X, GlobalEnv as Y, HookFor as Z, ChannelOptions as _, abort as a, LoggerLog as at, Codec as b, getModel as c, PaginationOptions as ct, isClass as d, PublishEntry as dt, HookPositions as et, normalizePositiveInteger as f, PublishFilter as ft, Hash as g, setModelResolver as h, Logger as ht, ModelResolver as i, LoggerChalk as it, SecureChannel as j, NodeCipher as k, getModelSync as l, Primitive as lt, resolvePagination as m, UnionToIntersection as mt, ModelConstructor as n, HookResult as nt, abortIf as o, LoggerParseSignature as ot, perPage as p, PublishGroup as pt, FileImporter as q, ModelRegistry as r, IHook as rt, assertFound as s, MergedConfig as st, AbstractModelConstructor as t, HookRegistry as tt, initializeGlobalContext as u, PublishConfirmation as ut, Cipher as v, EncryptionKey as w, DeriveOptions as x, CipherOptions as y, ConfigRegistry as z };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /// <reference path="./app.d.ts" />
2
- import { $ as HookPos, A as SealedBox, B as ConfigShape, C as Encryption, D as KeyPair, E as KeyInput, F as ArkstackErrorShape, G as EnvRegistry, H as DotPathValue, I as Choice, J as GlobalConfig, K as EnvReturn, L as Choices, M as SerializedKeyPair, N as AppConfig, O as Keys, P as ArkstackErrorPayload, Q as HookName, R as Concrete, S as DerivedKey, T as FingerprintOptions, U as EnvKey, V as DotPath, W as EnvLookup, X as HookArgs, Y as GlobalEnv, Z as HookFor, _ as ChannelOptions, a as abort, at as LoggerParseSignature, b as Codec, c as getModel, ct as Primitive, d as isClass, dt as PublishFilter, et as HookPositions, f as normalizePositiveInteger, ft as PublishGroup, g as Hash, h as setModelResolver, i as ModelResolver, it as LoggerLog, j as SecureChannel, k as NodeCipher, l as getModelSync, lt as PublishConfirmation, m as resolvePagination, mt as Logger, n as ModelConstructor, nt as IHook, o as abortIf, ot as MergedConfig, p as perPage, pt as UnionToIntersection, q as FileImporter, r as ModelRegistry, rt as LoggerChalk, s as assertFound, st as PaginationOptions, t as AbstractModelConstructor, tt as HookRegistry, u as initializeGlobalContext, ut as PublishEntry, v as Cipher, w as EncryptionKey, x as DeriveOptions, y as CipherOptions, z as ConfigRegistry } from "./helpers-DpnBcrO9.js";
2
+ import { $ as HookPos, A as SealedBox, B as ConfigShape, C as Encryption, D as KeyPair, E as KeyInput, F as ArkstackErrorShape, G as EnvRegistry, H as DotPathValue, I as Choice, J as GlobalConfig, K as EnvReturn, L as Choices, M as SerializedKeyPair, N as AppConfig, O as Keys, P as ArkstackErrorPayload, Q as HookName, R as Concrete, S as DerivedKey, T as FingerprintOptions, U as EnvKey, V as DotPath, W as EnvLookup, X as HookArgs, Y as GlobalEnv, Z as HookFor, _ as ChannelOptions, a as abort, at as LoggerLog, b as Codec, c as getModel, ct as PaginationOptions, d as isClass, dt as PublishEntry, et as HookPositions, f as normalizePositiveInteger, ft as PublishFilter, g as Hash, h as setModelResolver, ht as Logger, i as ModelResolver, it as LoggerChalk, j as SecureChannel, k as NodeCipher, l as getModelSync, lt as Primitive, m as resolvePagination, mt as UnionToIntersection, n as ModelConstructor, nt as HookResult, o as abortIf, ot as LoggerParseSignature, p as perPage, pt as PublishGroup, q as FileImporter, r as ModelRegistry, rt as IHook, s as assertFound, st as MergedConfig, t as AbstractModelConstructor, tt as HookRegistry, u as initializeGlobalContext, ut as PublishConfirmation, v as Cipher, w as EncryptionKey, x as DeriveOptions, y as CipherOptions, z as ConfigRegistry } from "./helpers-Dq0l34ve.js";
3
+ import { Hook } from "@arkstack/foundry";
3
4
  import { Arkstack } from "@arkstack/contract";
4
5
  import { ForkOptions } from "node:child_process";
5
6
  import pino from "pino";
@@ -329,60 +330,6 @@ declare class Publisher {
329
330
  static confirmables(pkg: string | true): PublishConfirmation[];
330
331
  }
331
332
  //#endregion
332
- //#region src/Hook.d.ts
333
- declare class Hook {
334
- private static hooks;
335
- /**
336
- * Hooks define code that should run within defined boundaries to add extra functionalities.
337
- *
338
- * @param name
339
- * @param value
340
- */
341
- static set<N extends HookName>(name: N | (string & {}), hook: HookFor<N>): void;
342
- /**
343
- * Check if a hook is defined by name
344
- *
345
- * @param name
346
- */
347
- static has<N extends HookName, P extends HookPositions<N>>(name: N | (string & {}), pos?: P): boolean;
348
- /**
349
- * Retrieve a defined hook by name
350
- *
351
- * @param name
352
- */
353
- static get<N extends HookName>(name: N): HookFor<N> | undefined;
354
- /**
355
- * Retrieve a defined hook by name and position
356
- *
357
- * @param name
358
- * @param pos
359
- */
360
- static get<N extends HookName, P extends HookPositions<N>>(name: N, pos: P): HookPos<N, P> | undefined;
361
- /**
362
- * Retrieve a defined hook by name and position the set args for callback
363
- *
364
- * @param name
365
- * @param pos
366
- */
367
- static get<N extends HookName, P extends HookPositions<N>>(name: N, pos: P, ...args: HookArgs<N, P>): void;
368
- /**
369
- * Retrieve all defined hooks
370
- *
371
- * @param name
372
- */
373
- static getAll: () => Record<string, IHook> & HookRegistry;
374
- /**
375
- * Remove the defined hook
376
- *
377
- * @param name
378
- */
379
- static unset<N extends HookName, P extends HookPositions<N>>(name?: N | (string & {}), pos?: P): undefined;
380
- /**
381
- * Clear all the defined hooks
382
- */
383
- static clear: () => void;
384
- }
385
- //#endregion
386
333
  //#region src/EnvLoader.d.ts
387
334
  /**
388
335
  * Loads environment variables, reading the `.env` file on first access.
@@ -533,4 +480,4 @@ declare const devServer: (options: DevServerRunnerOptions) => {
533
480
  closeWatcher(): Promise<void>;
534
481
  };
535
482
  //#endregion
536
- export { AbstractModelConstructor, AppConfig, AppException, ArkstackErrorPayload, ArkstackErrorShape, CONFIG_KEY, type ChannelOptions, Choice, Choices, Cipher, type CipherOptions, Codec, Concrete, ConfigLoader, ConfigRegistry, ConfigShape, type DeriveOptions, type DerivedKey, DevServerRunnerOptions, DotPath, DotPathValue, Encryption, EncryptionKey, EnvKey, EnvLoader, EnvLookup, EnvRegistry, EnvReturn, ErrorHandler, Exception, FileImporter, type FingerprintOptions, GlobalConfig, GlobalEnv, Hash, Hook, HookArgs, HookFor, HookName, HookPos, HookPositions, HookRegistry, IHook, type KeyInput, KeyPair, Keys, Logger, LoggerChalk, LoggerLog, LoggerParseSignature, MergedConfig, ModelConstructor, ModelRegistry, ModelResolver, NodeCipher, PaginationOptions, Primitive, PublishConfirmation, PublishEntry, PublishFilter, PublishGroup, Publisher, RequestException, SealedBox, SecureChannel, type SerializedKeyPair, TlsCredentials, UnionToIntersection, abort, abortIf, appKey, appUrl, assertFound, bindGracefulShutdown, bootWithDetectedPort, config, configLoader, createErrorPayload, devServer, devTlsCredentials, discoverCommands, env, envLoader, getErrorLogger, getModel, getModelSync, getPrimaryError, getValidationErrors, importFile, initializeGlobalContext, interopDefault, isClass, isModelNotFoundError, isValidationError, loadPrototypes, localNetworkAddress, logUnhandledError, nodeEnv, normalizePositiveInteger, normalizeStatusCode, outputDir, perPage, rebuildOutput, renderError, resolvePagination, resolveRuntimeDir, resolveRuntimeModule, serializeError, setModelResolver, shouldHideStack, shouldLogError, toErrorShape, toOutputPath };
483
+ export { AbstractModelConstructor, AppConfig, AppException, ArkstackErrorPayload, ArkstackErrorShape, CONFIG_KEY, type ChannelOptions, Choice, Choices, Cipher, type CipherOptions, Codec, Concrete, ConfigLoader, ConfigRegistry, ConfigShape, type DeriveOptions, type DerivedKey, DevServerRunnerOptions, DotPath, DotPathValue, Encryption, EncryptionKey, EnvKey, EnvLoader, EnvLookup, EnvRegistry, EnvReturn, ErrorHandler, Exception, FileImporter, type FingerprintOptions, GlobalConfig, GlobalEnv, Hash, Hook, type HookArgs, type HookFor, type HookName, type HookPos, type HookPositions, type HookRegistry, type HookResult, type IHook, type KeyInput, KeyPair, Keys, Logger, LoggerChalk, LoggerLog, LoggerParseSignature, MergedConfig, ModelConstructor, ModelRegistry, ModelResolver, NodeCipher, PaginationOptions, Primitive, PublishConfirmation, PublishEntry, PublishFilter, PublishGroup, Publisher, RequestException, SealedBox, SecureChannel, type SerializedKeyPair, TlsCredentials, UnionToIntersection, abort, abortIf, appKey, appUrl, assertFound, bindGracefulShutdown, bootWithDetectedPort, config, configLoader, createErrorPayload, devServer, devTlsCredentials, discoverCommands, env, envLoader, getErrorLogger, getModel, getModelSync, getPrimaryError, getValidationErrors, importFile, initializeGlobalContext, interopDefault, isClass, isModelNotFoundError, isValidationError, loadPrototypes, localNetworkAddress, logUnhandledError, nodeEnv, normalizePositiveInteger, normalizeStatusCode, outputDir, perPage, rebuildOutput, renderError, resolvePagination, resolveRuntimeDir, resolveRuntimeModule, serializeError, setModelResolver, shouldHideStack, shouldLogError, toErrorShape, toOutputPath };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { _ as EnvLoader, a as env, c as nodeEnv, d as resolveRuntimeDir, f as resolveRuntimeModule, g as configLoader, h as ConfigLoader, i as discoverCommands, l as outputDir, m as CONFIG_KEY, n as appUrl, o as importFile, p as toOutputPath, r as config, s as interopDefault, t as appKey, u as rebuildOutput, v as envLoader } from "./system-DzAzwH__.js";
2
2
  import { A as SecureChannel, C as Codec, D as Keys, E as KeyPair, O as NodeCipher, S as Cipher, T as EncryptionKey, _ as setModelResolver, b as Exception, c as abortIf, d as getModelSync, f as initializeGlobalContext, g as resolvePagination, h as perPage, k as SealedBox, l as assertFound, m as normalizePositiveInteger, p as isClass, s as abort, u as getModel, v as RequestException, w as Encryption, x as Hash, y as AppException } from "./utils-DwfM0lt4.js";
3
- import { Hook as Hook$1 } from "@arkstack/foundry";
3
+ import { Hook, Hook as Hook$1 } from "@arkstack/foundry";
4
4
  import { Arkstack } from "@arkstack/contract";
5
5
  import { str } from "@h3ravel/support";
6
6
  import path from "node:path";
@@ -19,7 +19,7 @@ const bindGracefulShutdown = (shutdown, defer) => {
19
19
  "SIGQUIT"
20
20
  ].forEach((signal) => {
21
21
  process.on(signal, async () => {
22
- if (Hook$1.has("shutdown", "before")) Hook$1.get("shutdown", "after", {});
22
+ await Hook$1.emit("shutdown", "before", {});
23
23
  await shutdown();
24
24
  });
25
25
  });
@@ -37,7 +37,7 @@ const bindGracefulShutdown = (shutdown, defer) => {
37
37
  */
38
38
  const bootWithDetectedPort = async (boot, preferredPort = 3e3, app, defer) => {
39
39
  const port = await detect(preferredPort);
40
- if (Hook$1.has("boot", "before")) Hook$1.get("boot", "before", port, app);
40
+ await Hook$1.emit("boot", "before", port, app);
41
41
  if (app && !globalThis.app) globalThis.app = () => app;
42
42
  globalThis.env = env;
43
43
  globalThis.config = config;
@@ -49,7 +49,7 @@ const bootWithDetectedPort = async (boot, preferredPort = 3e3, app, defer) => {
49
49
  await boot(port);
50
50
  await initializeGlobalContext();
51
51
  bindGracefulShutdown(async () => await app?.shutdown(), defer);
52
- if (Hook$1.has("boot", "after")) Hook$1.get("boot", "after", port, app);
52
+ await Hook$1.emit("boot", "after", port, app);
53
53
  };
54
54
  const renderError = ({ message = "An unexpected error occurred.", stack, title, code = 500 }) => {
55
55
  title = {
@@ -520,74 +520,6 @@ var Logger = class Logger {
520
520
  }
521
521
  };
522
522
  //#endregion
523
- //#region src/Hook.ts
524
- var Hook = class {
525
- static hooks = /* @__PURE__ */ new Map();
526
- /**
527
- * Hooks define code that should run within defined boundaries to add extra functionalities.
528
- *
529
- * @param name
530
- * @param value
531
- */
532
- static set(name, hook) {
533
- const oldhook = this.hooks.get(name) ?? {};
534
- this.hooks.set(name, {
535
- ...oldhook,
536
- ...hook
537
- });
538
- }
539
- /**
540
- * Check if a hook is defined by name
541
- *
542
- * @param name
543
- */
544
- static has(name, pos) {
545
- if (pos && this.hooks.has(name)) return Boolean(this.get(name, pos));
546
- return this.hooks.has(name);
547
- }
548
- static get(name, pos, ...args) {
549
- const hook = this.hooks.get(name);
550
- if (!hook) return void 0;
551
- if (pos === void 0) return hook;
552
- const fn = hook[pos];
553
- if (!fn) return void 0;
554
- if (args.length > 0) return fn(...args);
555
- return fn;
556
- }
557
- /**
558
- * Retrieve all defined hooks
559
- *
560
- * @param name
561
- */
562
- static getAll = () => {
563
- const hooks = {};
564
- for (const [name, value] of this.hooks) hooks[name] = value;
565
- return hooks;
566
- };
567
- /**
568
- * Remove the defined hook
569
- *
570
- * @param name
571
- */
572
- static unset(name, pos) {
573
- if (name && this.hooks.has(name)) {
574
- if (pos !== void 0) {
575
- const hook = this.get(name);
576
- if (hook?.[pos]) delete hook[pos];
577
- Object.keys(hook ?? {}).length < 1 && this.hooks.delete(name);
578
- return;
579
- }
580
- this.hooks.delete(name);
581
- } else this.clear();
582
- }
583
- /**
584
- * Clear all the defined hooks
585
- */
586
- static clear = () => {
587
- this.hooks.clear();
588
- };
589
- };
590
- //#endregion
591
523
  //#region src/tls.ts
592
524
  let devCertCache;
593
525
  /**
@@ -1,4 +1,4 @@
1
- import { A as SealedBox, C as Encryption, D as KeyPair, E as KeyInput, M as SerializedKeyPair, O as Keys, S as DerivedKey, T as FingerprintOptions, _ as ChannelOptions, a as abort, b as Codec, c as getModel, d as isClass, f as normalizePositiveInteger, g as Hash, h as setModelResolver, i as ModelResolver, j as SecureChannel, k as NodeCipher, l as getModelSync, m as resolvePagination, n as ModelConstructor, o as abortIf, p as perPage, r as ModelRegistry, s as assertFound, t as AbstractModelConstructor, u as initializeGlobalContext, v as Cipher, w as EncryptionKey, x as DeriveOptions, y as CipherOptions } from "../helpers-DpnBcrO9.js";
1
+ import { A as SealedBox, C as Encryption, D as KeyPair, E as KeyInput, M as SerializedKeyPair, O as Keys, S as DerivedKey, T as FingerprintOptions, _ as ChannelOptions, a as abort, b as Codec, c as getModel, d as isClass, f as normalizePositiveInteger, g as Hash, h as setModelResolver, i as ModelResolver, j as SecureChannel, k as NodeCipher, l as getModelSync, m as resolvePagination, n as ModelConstructor, o as abortIf, p as perPage, r as ModelRegistry, s as assertFound, t as AbstractModelConstructor, u as initializeGlobalContext, v as Cipher, w as EncryptionKey, x as DeriveOptions, y as CipherOptions } from "../helpers-Dq0l34ve.js";
2
2
  import { Model } from "arkormx";
3
3
  //#region src/utils/traits.d.ts
4
4
  declare const crc32: (str: string) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkstack/common",
3
- "version": "0.19.5",
3
+ "version": "0.20.0",
4
4
  "type": "module",
5
5
  "description": "Core utilities, primitives, and shared infrastructure for the Arkstack ecosystem.",
6
6
  "homepage": "https://arkstack.toneflix.net",
@@ -43,13 +43,13 @@
43
43
  "otpauth": "^9.5.1",
44
44
  "pino": "^10.3.1",
45
45
  "selfsigned": "^2.4.1",
46
- "@arkstack/encryption": "^0.19.5"
46
+ "@arkstack/encryption": "^0.20.0"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "@h3ravel/support": "^2.2.7",
50
50
  "arkormx": "^2.12.8",
51
- "@arkstack/contract": "^0.19.5",
52
- "@arkstack/foundry": "^0.19.5"
51
+ "@arkstack/contract": "^0.20.0",
52
+ "@arkstack/foundry": "^0.20.0"
53
53
  },
54
54
  "optionalDependencies": {
55
55
  "@faker-js/faker": "^10.4.0"