@andrew_l/service-actor 0.2.21 → 0.3.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.cjs CHANGED
@@ -3,25 +3,25 @@
3
3
  const context = require('@andrew_l/context');
4
4
  const toolkit = require('@andrew_l/toolkit');
5
5
 
6
- const SYM_MARKER = Symbol();
7
- const SYM_RAW = Symbol();
8
- const SYM_DATA = Symbol();
9
- const SYM_API = Symbol();
6
+ var SYM_MARKER = Symbol();
7
+ var SYM_RAW = Symbol();
8
+ var SYM_DATA = Symbol();
9
+ var SYM_API = Symbol();
10
10
  function serviceActor(factory) {
11
- const injectKey = Symbol();
12
- let idSeq = 0;
13
- const createActor = () => {
14
- const actor = createServiceActor();
11
+ var injectKey = Symbol();
12
+ var idSeq = 0;
13
+ var createActor = () => {
14
+ var actor = createServiceActor();
15
15
  actor.traceId = `trace-${++idSeq}`;
16
16
  if (factory) {
17
17
  actor.assign(factory());
18
18
  }
19
19
  return actor;
20
20
  };
21
- const withHook = (fn, params) => {
21
+ var withHook = (fn, params) => {
22
22
  return context.withContext(function(...args) {
23
- const parentActor = context.inject(injectKey);
24
- const actor = createActor();
23
+ var parentActor = context.inject(injectKey);
24
+ var actor = createActor();
25
25
  if (parentActor) {
26
26
  actor.assign(parentActor);
27
27
  }
@@ -32,25 +32,26 @@ function serviceActor(factory) {
32
32
  return fn.apply(this, args);
33
33
  });
34
34
  };
35
- const injectHook = () => {
35
+ var injectHook = () => {
36
36
  return context.hasInjectionContext() ? context.inject(injectKey) : void 0;
37
37
  };
38
- const useHok = () => {
38
+ var useHok = () => {
39
+ var _actor;
39
40
  if (!context.hasInjectionContext()) {
40
- const actor2 = createActor();
41
- context.provide(injectKey, actor2, true);
42
- return actor2;
41
+ _actor = createActor();
42
+ context.provide(injectKey, _actor, true);
43
+ return _actor;
43
44
  }
44
- const existed = context.inject(injectKey);
45
- if (existed) return existed;
46
- const actor = createActor();
47
- context.provide(injectKey, actor);
48
- return actor;
45
+ _actor = context.inject(injectKey);
46
+ if (_actor) return _actor;
47
+ _actor = createActor();
48
+ context.provide(injectKey, _actor);
49
+ return _actor;
49
50
  };
50
51
  return { with: withHook, use: useHok, inject: injectHook };
51
52
  }
52
53
  function createServiceActor() {
53
- const actor = {
54
+ var actor = {
54
55
  traceId: "",
55
56
  actorId: null,
56
57
  actorType: "unknown",
@@ -61,9 +62,9 @@ function createServiceActor() {
61
62
  [SYM_RAW]: null,
62
63
  [SYM_MARKER]: true
63
64
  };
64
- const reservedKeys = new Set(Object.keys(actor));
65
+ var reservedKeys = new Set(Object.keys(actor));
65
66
  actor[SYM_RAW] = actor;
66
- const newProxy = new Proxy(actor[SYM_DATA], {
67
+ var newProxy = new Proxy(actor[SYM_DATA], {
67
68
  defineProperty(target, key, value) {
68
69
  if (key in actor) {
69
70
  actor[key] = value;
@@ -98,7 +99,7 @@ function createServiceActor() {
98
99
  return true;
99
100
  },
100
101
  get: (target, key) => {
101
- let value;
102
+ var value;
102
103
  if (key in actor) {
103
104
  value = Reflect.get(actor, key, value);
104
105
  } else if (key in actor[SYM_API]) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import {\n hasInjectionContext,\n inject,\n provide,\n withContext,\n} from '@andrew_l/context';\nimport {\n type AnyFunction,\n type OverwriteWith,\n isFunction,\n} from '@andrew_l/toolkit';\n\ntype ServiceActorInternal = {\n traceId: unknown;\n actorId: unknown;\n actorType: unknown;\n [SYM_API]: Record<PropertyKey, Function>;\n [SYM_MARKER]: boolean;\n [SYM_RAW]: any;\n [SYM_DATA]: Record<PropertyKey, unknown>;\n};\n\nexport type AnyServiceActor = {\n traceId: any;\n actorId: any;\n actorType: any;\n [x: PropertyKey]: any;\n};\n\nexport type ServiceActorData<T extends Record<PropertyKey, any> = {}> =\n OverwriteWith<\n {\n traceId: string;\n actorId: string | null;\n actorType: 'unknown' | string;\n },\n T\n >;\n\nexport type ServiceActor<T extends Record<PropertyKey, any> = {}> =\n ServiceActorData<T> & {\n assign(params: Partial<ServiceActorData<T>>): ServiceActor<T>;\n };\n\nconst SYM_MARKER = Symbol();\nconst SYM_RAW = Symbol();\nconst SYM_DATA = Symbol();\nconst SYM_API = Symbol();\n\n/**\n * Create service actor hooks\n *\n * @example\n * const { use: useServiceActor, with: withServiceActor } = serviceActor(() => ({\n * actorType: 'http-request',\n * ipAddress: '',\n * }));\n *\n * app.use((ctx, next) => {\n * return withServiceActor(\n * {\n * traceId: ctx.headers['x-request-id'],\n * ipAddress: ctx.headers['x-forwarded-for'],\n * },\n * next,\n * );\n * });\n *\n * app.get('/', () => {\n * const actor = useServiceActor();\n *\n * // { traceId: 'req_35123', actorId: null, actorType: 'http-request', ipAddress: '::' }\n * console.log(actor);\n * });\n *\n * @group Main\n */\nexport function serviceActor<T extends Record<PropertyKey, any> = {}>(\n factory?: () => T,\n): {\n /**\n * Wrap a function to execute it with service actor providers\n */\n with: <Fn extends AnyFunction>(\n fn: Fn,\n params?: Partial<ServiceActor<T>>,\n ) => Fn;\n\n /**\n * Returns the service actor instance from the current context.\n */\n inject: () => ServiceActor<T> | undefined;\n\n /**\n * Returns the service actor instance from the context, or creates and binds a new instance if none exists.\n */\n use: () => ServiceActor<T>;\n} {\n const injectKey = Symbol();\n\n let idSeq = 0;\n\n const createActor = (): AnyServiceActor => {\n const actor = createServiceActor();\n\n actor.traceId = `trace-${++idSeq}`;\n\n if (factory) {\n actor.assign(factory());\n }\n\n return actor;\n };\n\n const withHook = <Fn extends AnyFunction>(\n fn: Fn,\n params?: Partial<ServiceActor<T>>,\n ): Fn => {\n return withContext(function (this: any, ...args: any[]) {\n const parentActor = inject<ServiceActor>(injectKey);\n const actor = createActor();\n\n if (parentActor) {\n actor.assign(parentActor);\n }\n\n if (params) {\n actor.assign(params);\n }\n\n provide(injectKey, actor);\n\n return fn.apply(this, args);\n }) as Fn;\n };\n\n const injectHook = (): AnyServiceActor | undefined => {\n return hasInjectionContext() ? inject<ServiceActor>(injectKey) : undefined;\n };\n\n const useHok = (): AnyServiceActor => {\n if (!hasInjectionContext()) {\n const actor = createActor();\n provide(injectKey, actor, true);\n\n return actor;\n }\n\n const existed = inject<AnyServiceActor>(injectKey);\n\n if (existed) return existed;\n\n const actor = createActor();\n provide(injectKey, actor);\n\n return actor;\n };\n\n return { with: withHook, use: useHok as any, inject: injectHook as any };\n}\n\nfunction createServiceActor(): ServiceActor {\n const actor: ServiceActorInternal = {\n traceId: '',\n actorId: null,\n actorType: 'unknown',\n [SYM_API]: {\n assign,\n },\n [SYM_DATA]: {},\n [SYM_RAW]: null,\n [SYM_MARKER]: true,\n };\n\n const reservedKeys = new Set(Object.keys(actor));\n\n actor[SYM_RAW] = actor;\n\n const newProxy = new Proxy(actor[SYM_DATA], {\n defineProperty(target, key, value) {\n if (key in actor) {\n (actor as any)[key] = value;\n } else {\n target[key] = value;\n }\n\n return true;\n },\n deleteProperty(target, key) {\n if (key in actor) {\n delete (actor as any)[key];\n } else {\n delete target[key];\n }\n\n return true;\n },\n has(target, key) {\n return key in actor || key in target;\n },\n ownKeys(target) {\n return [...reservedKeys, ...Object.keys(target)];\n },\n set: function (target, key, value) {\n if (key in actor[SYM_API]) return false;\n\n if (key in actor) {\n Reflect.set(actor, key, value);\n } else if (isFunction(value)) {\n Reflect.set(actor[SYM_API], key, value);\n } else {\n Reflect.set(target, key, value);\n }\n\n return true;\n },\n get: (target, key) => {\n let value: any;\n\n if (key in actor) {\n value = Reflect.get(actor, key, value);\n } else if (key in actor[SYM_API]) {\n value = Reflect.get(actor[SYM_API], key, value).bind(newProxy);\n } else {\n value = Reflect.get(target, key);\n }\n\n return value;\n },\n getOwnPropertyDescriptor(k) {\n return {\n enumerable: true,\n configurable: true,\n };\n },\n });\n\n return newProxy as ServiceActor;\n}\n\nfunction assign(this: ServiceActor, params: Record<any, any>) {\n Object.assign(this, params);\n return this;\n}\n"],"names":["withContext","inject","provide","hasInjectionContext","actor","isFunction"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import {\n hasInjectionContext,\n inject,\n provide,\n withContext,\n} from '@andrew_l/context';\nimport {\n type AnyFunction,\n type OverwriteWith,\n isFunction,\n} from '@andrew_l/toolkit';\n\ntype ServiceActorInternal = {\n traceId: unknown;\n actorId: unknown;\n actorType: unknown;\n [SYM_API]: Record<PropertyKey, Function>;\n [SYM_MARKER]: boolean;\n [SYM_RAW]: any;\n [SYM_DATA]: Record<PropertyKey, unknown>;\n};\n\nexport type AnyServiceActor = {\n traceId: any;\n actorId: any;\n actorType: any;\n [x: PropertyKey]: any;\n};\n\nexport type ServiceActorData<T extends Record<PropertyKey, any> = {}> =\n OverwriteWith<\n {\n traceId: string;\n actorId: string | null;\n actorType: 'unknown' | string;\n },\n T\n >;\n\nexport type ServiceActor<T extends Record<PropertyKey, any> = {}> =\n ServiceActorData<T> & {\n assign(params: Partial<ServiceActorData<T>>): ServiceActor<T>;\n };\n\nvar SYM_MARKER = Symbol();\nvar SYM_RAW = Symbol();\nvar SYM_DATA = Symbol();\nvar SYM_API = Symbol();\n\n/**\n * Create service actor hooks\n *\n * @example\n * const { use: useServiceActor, with: withServiceActor } = serviceActor(() => ({\n * actorType: 'http-request',\n * ipAddress: '',\n * }));\n *\n * app.use((ctx, next) => {\n * return withServiceActor(\n * {\n * traceId: ctx.headers['x-request-id'],\n * ipAddress: ctx.headers['x-forwarded-for'],\n * },\n * next,\n * );\n * });\n *\n * app.get('/', () => {\n * const actor = useServiceActor();\n *\n * // { traceId: 'req_35123', actorId: null, actorType: 'http-request', ipAddress: '::' }\n * console.log(actor);\n * });\n *\n * @group Main\n */\nexport function serviceActor<T extends Record<PropertyKey, any> = {}>(\n factory?: () => T,\n): {\n /**\n * Wrap a function to execute it with service actor providers\n */\n with: <Fn extends AnyFunction>(\n fn: Fn,\n params?: Partial<ServiceActor<T>>,\n ) => Fn;\n\n /**\n * Returns the service actor instance from the current context.\n */\n inject: () => ServiceActor<T> | undefined;\n\n /**\n * Returns the service actor instance from the context, or creates and binds a new instance if none exists.\n */\n use: () => ServiceActor<T>;\n} {\n var injectKey = Symbol();\n var idSeq = 0;\n\n var createActor = (): AnyServiceActor => {\n var actor = createServiceActor();\n\n actor.traceId = `trace-${++idSeq}`;\n\n if (factory) {\n actor.assign(factory());\n }\n\n return actor;\n };\n\n var withHook = <Fn extends AnyFunction>(\n fn: Fn,\n params?: Partial<ServiceActor<T>>,\n ): Fn => {\n return withContext(function (this: any, ...args: any[]) {\n var parentActor = inject<ServiceActor>(injectKey);\n var actor = createActor();\n\n if (parentActor) {\n actor.assign(parentActor);\n }\n\n if (params) {\n actor.assign(params);\n }\n\n provide(injectKey, actor);\n\n return fn.apply(this, args);\n }) as Fn;\n };\n\n var injectHook = (): AnyServiceActor | undefined => {\n return hasInjectionContext() ? inject<ServiceActor>(injectKey) : undefined;\n };\n\n var useHok = (): AnyServiceActor => {\n var _actor: AnyServiceActor | undefined;\n\n if (!hasInjectionContext()) {\n _actor = createActor();\n provide(injectKey, _actor, true);\n\n return _actor;\n }\n\n // check for existed\n _actor = inject<AnyServiceActor>(injectKey);\n\n if (_actor) return _actor;\n\n _actor = createActor();\n provide(injectKey, _actor);\n\n return _actor;\n };\n\n return { with: withHook, use: useHok as any, inject: injectHook as any };\n}\n\nfunction createServiceActor(): ServiceActor {\n var actor: ServiceActorInternal = {\n traceId: '',\n actorId: null,\n actorType: 'unknown',\n [SYM_API]: {\n assign,\n },\n [SYM_DATA]: {},\n [SYM_RAW]: null,\n [SYM_MARKER]: true,\n };\n\n var reservedKeys = new Set(Object.keys(actor));\n\n actor[SYM_RAW] = actor;\n\n var newProxy = new Proxy(actor[SYM_DATA], {\n defineProperty(target, key, value) {\n if (key in actor) {\n (actor as any)[key] = value;\n } else {\n target[key] = value;\n }\n\n return true;\n },\n deleteProperty(target, key) {\n if (key in actor) {\n delete (actor as any)[key];\n } else {\n delete target[key];\n }\n\n return true;\n },\n has(target, key) {\n return key in actor || key in target;\n },\n ownKeys(target) {\n return [...reservedKeys, ...Object.keys(target)];\n },\n set: function (target, key, value) {\n if (key in actor[SYM_API]) return false;\n\n if (key in actor) {\n Reflect.set(actor, key, value);\n } else if (isFunction(value)) {\n Reflect.set(actor[SYM_API], key, value);\n } else {\n Reflect.set(target, key, value);\n }\n\n return true;\n },\n get: (target, key) => {\n var value: any;\n\n if (key in actor) {\n value = Reflect.get(actor, key, value);\n } else if (key in actor[SYM_API]) {\n value = Reflect.get(actor[SYM_API], key, value).bind(newProxy);\n } else {\n value = Reflect.get(target, key);\n }\n\n return value;\n },\n getOwnPropertyDescriptor(k) {\n return {\n enumerable: true,\n configurable: true,\n };\n },\n });\n\n return newProxy as ServiceActor;\n}\n\nfunction assign(this: ServiceActor, params: Record<any, any>) {\n Object.assign(this, params);\n return this;\n}\n"],"names":["withContext","inject","provide","hasInjectionContext","isFunction"],"mappings":";;;;;AA4CA,IAAI,aAAa,MAAA,EAAO;AACxB,IAAI,UAAU,MAAA,EAAO;AACrB,IAAI,WAAW,MAAA,EAAO;AACtB,IAAI,UAAU,MAAA,EAAO;AA8Bd,SAAS,aACd,OAAA,EAmBA;AACA,EAAA,IAAI,YAAY,MAAA,EAAO;AACvB,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI,cAAc,MAAuB;AACvC,IAAA,IAAI,QAAQ,kBAAA,EAAmB;AAE/B,IAAA,KAAA,CAAM,OAAA,GAAU,CAAA,MAAA,EAAS,EAAE,KAAK,CAAA,CAAA;AAEhC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,QAAA,GAAW,CACb,EAAA,EACA,MAAA,KACO;AACP,IAAA,OAAOA,mBAAA,CAAY,YAAwB,IAAA,EAAa;AACtD,MAAA,IAAI,WAAA,GAAcC,eAAqB,SAAS,CAAA;AAChD,MAAA,IAAI,QAAQ,WAAA,EAAY;AAExB,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,CAAM,OAAO,WAAW,CAAA;AAAA,MAC1B;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,MACrB;AAEA,MAAAC,eAAA,CAAQ,WAAW,KAAK,CAAA;AAExB,MAAA,OAAO,EAAA,CAAG,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,aAAa,MAAmC;AAClD,IAAA,OAAOC,2BAAA,EAAoB,GAAIF,cAAA,CAAqB,SAAS,CAAA,GAAI,MAAA;AAAA,EACnE,CAAA;AAEA,EAAA,IAAI,SAAS,MAAuB;AAClC,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,CAACE,6BAAoB,EAAG;AAC1B,MAAA,MAAA,GAAS,WAAA,EAAY;AACrB,MAAAD,eAAA,CAAQ,SAAA,EAAW,QAAQ,IAAI,CAAA;AAE/B,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAA,GAASD,eAAwB,SAAS,CAAA;AAE1C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAA,GAAS,WAAA,EAAY;AACrB,IAAAC,eAAA,CAAQ,WAAW,MAAM,CAAA;AAEzB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,MAAA,EAAe,QAAQ,UAAA,EAAkB;AACzE;AAEA,SAAS,kBAAA,GAAmC;AAC1C,EAAA,IAAI,KAAA,GAA8B;AAAA,IAChC,OAAA,EAAS,EAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,CAAC,OAAO,GAAG;AAAA,MACT;AAAA,KACF;AAAA,IACA,CAAC,QAAQ,GAAG,EAAC;AAAA,IACb,CAAC,OAAO,GAAG,IAAA;AAAA,IACX,CAAC,UAAU,GAAG;AAAA,GAChB;AAEA,EAAA,IAAI,eAAe,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAE7C,EAAA,KAAA,CAAM,OAAO,CAAA,GAAI,KAAA;AAEjB,EAAA,IAAI,QAAA,GAAW,IAAI,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG;AAAA,IACxC,cAAA,CAAe,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO;AACjC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAC,KAAA,CAAc,GAAG,CAAA,GAAI,KAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,cAAA,CAAe,QAAQ,GAAA,EAAK;AAC1B,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,OAAQ,MAAc,GAAG,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,OAAO,OAAO,GAAG,CAAA;AAAA,MACnB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,QAAQ,GAAA,EAAK;AACf,MAAA,OAAO,GAAA,IAAO,SAAS,GAAA,IAAO,MAAA;AAAA,IAChC,CAAA;AAAA,IACA,QAAQ,MAAA,EAAQ;AACd,MAAA,OAAO,CAAC,GAAG,YAAA,EAAc,GAAG,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,GAAA,EAAK,SAAU,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO;AACjC,MAAA,IAAI,GAAA,IAAO,KAAA,CAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAElC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA;AAAA,MAC/B,CAAA,MAAA,IAAWE,kBAAA,CAAW,KAAK,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG,KAAK,KAAK,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,GAAA,EAAK,KAAK,CAAA;AAAA,MAChC;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,EAAK,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACpB,MAAA,IAAI,KAAA;AAEJ,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA;AAAA,MACvC,CAAA,MAAA,IAAW,GAAA,IAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AAChC,QAAA,KAAA,GAAQ,OAAA,CAAQ,IAAI,KAAA,CAAM,OAAO,GAAG,GAAA,EAAK,KAAK,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AAAA,MACjC;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,yBAAyB,CAAA,EAAG;AAC1B,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,OAA2B,MAAA,EAA0B;AAC5D,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,MAAM,CAAA;AAC1B,EAAA,OAAO,IAAA;AACT;;;;"}
package/dist/index.mjs CHANGED
@@ -1,25 +1,25 @@
1
1
  import { withContext, inject, provide, hasInjectionContext } from '@andrew_l/context';
2
2
  import { isFunction } from '@andrew_l/toolkit';
3
3
 
4
- const SYM_MARKER = Symbol();
5
- const SYM_RAW = Symbol();
6
- const SYM_DATA = Symbol();
7
- const SYM_API = Symbol();
4
+ var SYM_MARKER = Symbol();
5
+ var SYM_RAW = Symbol();
6
+ var SYM_DATA = Symbol();
7
+ var SYM_API = Symbol();
8
8
  function serviceActor(factory) {
9
- const injectKey = Symbol();
10
- let idSeq = 0;
11
- const createActor = () => {
12
- const actor = createServiceActor();
9
+ var injectKey = Symbol();
10
+ var idSeq = 0;
11
+ var createActor = () => {
12
+ var actor = createServiceActor();
13
13
  actor.traceId = `trace-${++idSeq}`;
14
14
  if (factory) {
15
15
  actor.assign(factory());
16
16
  }
17
17
  return actor;
18
18
  };
19
- const withHook = (fn, params) => {
19
+ var withHook = (fn, params) => {
20
20
  return withContext(function(...args) {
21
- const parentActor = inject(injectKey);
22
- const actor = createActor();
21
+ var parentActor = inject(injectKey);
22
+ var actor = createActor();
23
23
  if (parentActor) {
24
24
  actor.assign(parentActor);
25
25
  }
@@ -30,25 +30,26 @@ function serviceActor(factory) {
30
30
  return fn.apply(this, args);
31
31
  });
32
32
  };
33
- const injectHook = () => {
33
+ var injectHook = () => {
34
34
  return hasInjectionContext() ? inject(injectKey) : void 0;
35
35
  };
36
- const useHok = () => {
36
+ var useHok = () => {
37
+ var _actor;
37
38
  if (!hasInjectionContext()) {
38
- const actor2 = createActor();
39
- provide(injectKey, actor2, true);
40
- return actor2;
39
+ _actor = createActor();
40
+ provide(injectKey, _actor, true);
41
+ return _actor;
41
42
  }
42
- const existed = inject(injectKey);
43
- if (existed) return existed;
44
- const actor = createActor();
45
- provide(injectKey, actor);
46
- return actor;
43
+ _actor = inject(injectKey);
44
+ if (_actor) return _actor;
45
+ _actor = createActor();
46
+ provide(injectKey, _actor);
47
+ return _actor;
47
48
  };
48
49
  return { with: withHook, use: useHok, inject: injectHook };
49
50
  }
50
51
  function createServiceActor() {
51
- const actor = {
52
+ var actor = {
52
53
  traceId: "",
53
54
  actorId: null,
54
55
  actorType: "unknown",
@@ -59,9 +60,9 @@ function createServiceActor() {
59
60
  [SYM_RAW]: null,
60
61
  [SYM_MARKER]: true
61
62
  };
62
- const reservedKeys = new Set(Object.keys(actor));
63
+ var reservedKeys = new Set(Object.keys(actor));
63
64
  actor[SYM_RAW] = actor;
64
- const newProxy = new Proxy(actor[SYM_DATA], {
65
+ var newProxy = new Proxy(actor[SYM_DATA], {
65
66
  defineProperty(target, key, value) {
66
67
  if (key in actor) {
67
68
  actor[key] = value;
@@ -96,7 +97,7 @@ function createServiceActor() {
96
97
  return true;
97
98
  },
98
99
  get: (target, key) => {
99
- let value;
100
+ var value;
100
101
  if (key in actor) {
101
102
  value = Reflect.get(actor, key, value);
102
103
  } else if (key in actor[SYM_API]) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import {\n hasInjectionContext,\n inject,\n provide,\n withContext,\n} from '@andrew_l/context';\nimport {\n type AnyFunction,\n type OverwriteWith,\n isFunction,\n} from '@andrew_l/toolkit';\n\ntype ServiceActorInternal = {\n traceId: unknown;\n actorId: unknown;\n actorType: unknown;\n [SYM_API]: Record<PropertyKey, Function>;\n [SYM_MARKER]: boolean;\n [SYM_RAW]: any;\n [SYM_DATA]: Record<PropertyKey, unknown>;\n};\n\nexport type AnyServiceActor = {\n traceId: any;\n actorId: any;\n actorType: any;\n [x: PropertyKey]: any;\n};\n\nexport type ServiceActorData<T extends Record<PropertyKey, any> = {}> =\n OverwriteWith<\n {\n traceId: string;\n actorId: string | null;\n actorType: 'unknown' | string;\n },\n T\n >;\n\nexport type ServiceActor<T extends Record<PropertyKey, any> = {}> =\n ServiceActorData<T> & {\n assign(params: Partial<ServiceActorData<T>>): ServiceActor<T>;\n };\n\nconst SYM_MARKER = Symbol();\nconst SYM_RAW = Symbol();\nconst SYM_DATA = Symbol();\nconst SYM_API = Symbol();\n\n/**\n * Create service actor hooks\n *\n * @example\n * const { use: useServiceActor, with: withServiceActor } = serviceActor(() => ({\n * actorType: 'http-request',\n * ipAddress: '',\n * }));\n *\n * app.use((ctx, next) => {\n * return withServiceActor(\n * {\n * traceId: ctx.headers['x-request-id'],\n * ipAddress: ctx.headers['x-forwarded-for'],\n * },\n * next,\n * );\n * });\n *\n * app.get('/', () => {\n * const actor = useServiceActor();\n *\n * // { traceId: 'req_35123', actorId: null, actorType: 'http-request', ipAddress: '::' }\n * console.log(actor);\n * });\n *\n * @group Main\n */\nexport function serviceActor<T extends Record<PropertyKey, any> = {}>(\n factory?: () => T,\n): {\n /**\n * Wrap a function to execute it with service actor providers\n */\n with: <Fn extends AnyFunction>(\n fn: Fn,\n params?: Partial<ServiceActor<T>>,\n ) => Fn;\n\n /**\n * Returns the service actor instance from the current context.\n */\n inject: () => ServiceActor<T> | undefined;\n\n /**\n * Returns the service actor instance from the context, or creates and binds a new instance if none exists.\n */\n use: () => ServiceActor<T>;\n} {\n const injectKey = Symbol();\n\n let idSeq = 0;\n\n const createActor = (): AnyServiceActor => {\n const actor = createServiceActor();\n\n actor.traceId = `trace-${++idSeq}`;\n\n if (factory) {\n actor.assign(factory());\n }\n\n return actor;\n };\n\n const withHook = <Fn extends AnyFunction>(\n fn: Fn,\n params?: Partial<ServiceActor<T>>,\n ): Fn => {\n return withContext(function (this: any, ...args: any[]) {\n const parentActor = inject<ServiceActor>(injectKey);\n const actor = createActor();\n\n if (parentActor) {\n actor.assign(parentActor);\n }\n\n if (params) {\n actor.assign(params);\n }\n\n provide(injectKey, actor);\n\n return fn.apply(this, args);\n }) as Fn;\n };\n\n const injectHook = (): AnyServiceActor | undefined => {\n return hasInjectionContext() ? inject<ServiceActor>(injectKey) : undefined;\n };\n\n const useHok = (): AnyServiceActor => {\n if (!hasInjectionContext()) {\n const actor = createActor();\n provide(injectKey, actor, true);\n\n return actor;\n }\n\n const existed = inject<AnyServiceActor>(injectKey);\n\n if (existed) return existed;\n\n const actor = createActor();\n provide(injectKey, actor);\n\n return actor;\n };\n\n return { with: withHook, use: useHok as any, inject: injectHook as any };\n}\n\nfunction createServiceActor(): ServiceActor {\n const actor: ServiceActorInternal = {\n traceId: '',\n actorId: null,\n actorType: 'unknown',\n [SYM_API]: {\n assign,\n },\n [SYM_DATA]: {},\n [SYM_RAW]: null,\n [SYM_MARKER]: true,\n };\n\n const reservedKeys = new Set(Object.keys(actor));\n\n actor[SYM_RAW] = actor;\n\n const newProxy = new Proxy(actor[SYM_DATA], {\n defineProperty(target, key, value) {\n if (key in actor) {\n (actor as any)[key] = value;\n } else {\n target[key] = value;\n }\n\n return true;\n },\n deleteProperty(target, key) {\n if (key in actor) {\n delete (actor as any)[key];\n } else {\n delete target[key];\n }\n\n return true;\n },\n has(target, key) {\n return key in actor || key in target;\n },\n ownKeys(target) {\n return [...reservedKeys, ...Object.keys(target)];\n },\n set: function (target, key, value) {\n if (key in actor[SYM_API]) return false;\n\n if (key in actor) {\n Reflect.set(actor, key, value);\n } else if (isFunction(value)) {\n Reflect.set(actor[SYM_API], key, value);\n } else {\n Reflect.set(target, key, value);\n }\n\n return true;\n },\n get: (target, key) => {\n let value: any;\n\n if (key in actor) {\n value = Reflect.get(actor, key, value);\n } else if (key in actor[SYM_API]) {\n value = Reflect.get(actor[SYM_API], key, value).bind(newProxy);\n } else {\n value = Reflect.get(target, key);\n }\n\n return value;\n },\n getOwnPropertyDescriptor(k) {\n return {\n enumerable: true,\n configurable: true,\n };\n },\n });\n\n return newProxy as ServiceActor;\n}\n\nfunction assign(this: ServiceActor, params: Record<any, any>) {\n Object.assign(this, params);\n return this;\n}\n"],"names":["actor"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import {\n hasInjectionContext,\n inject,\n provide,\n withContext,\n} from '@andrew_l/context';\nimport {\n type AnyFunction,\n type OverwriteWith,\n isFunction,\n} from '@andrew_l/toolkit';\n\ntype ServiceActorInternal = {\n traceId: unknown;\n actorId: unknown;\n actorType: unknown;\n [SYM_API]: Record<PropertyKey, Function>;\n [SYM_MARKER]: boolean;\n [SYM_RAW]: any;\n [SYM_DATA]: Record<PropertyKey, unknown>;\n};\n\nexport type AnyServiceActor = {\n traceId: any;\n actorId: any;\n actorType: any;\n [x: PropertyKey]: any;\n};\n\nexport type ServiceActorData<T extends Record<PropertyKey, any> = {}> =\n OverwriteWith<\n {\n traceId: string;\n actorId: string | null;\n actorType: 'unknown' | string;\n },\n T\n >;\n\nexport type ServiceActor<T extends Record<PropertyKey, any> = {}> =\n ServiceActorData<T> & {\n assign(params: Partial<ServiceActorData<T>>): ServiceActor<T>;\n };\n\nvar SYM_MARKER = Symbol();\nvar SYM_RAW = Symbol();\nvar SYM_DATA = Symbol();\nvar SYM_API = Symbol();\n\n/**\n * Create service actor hooks\n *\n * @example\n * const { use: useServiceActor, with: withServiceActor } = serviceActor(() => ({\n * actorType: 'http-request',\n * ipAddress: '',\n * }));\n *\n * app.use((ctx, next) => {\n * return withServiceActor(\n * {\n * traceId: ctx.headers['x-request-id'],\n * ipAddress: ctx.headers['x-forwarded-for'],\n * },\n * next,\n * );\n * });\n *\n * app.get('/', () => {\n * const actor = useServiceActor();\n *\n * // { traceId: 'req_35123', actorId: null, actorType: 'http-request', ipAddress: '::' }\n * console.log(actor);\n * });\n *\n * @group Main\n */\nexport function serviceActor<T extends Record<PropertyKey, any> = {}>(\n factory?: () => T,\n): {\n /**\n * Wrap a function to execute it with service actor providers\n */\n with: <Fn extends AnyFunction>(\n fn: Fn,\n params?: Partial<ServiceActor<T>>,\n ) => Fn;\n\n /**\n * Returns the service actor instance from the current context.\n */\n inject: () => ServiceActor<T> | undefined;\n\n /**\n * Returns the service actor instance from the context, or creates and binds a new instance if none exists.\n */\n use: () => ServiceActor<T>;\n} {\n var injectKey = Symbol();\n var idSeq = 0;\n\n var createActor = (): AnyServiceActor => {\n var actor = createServiceActor();\n\n actor.traceId = `trace-${++idSeq}`;\n\n if (factory) {\n actor.assign(factory());\n }\n\n return actor;\n };\n\n var withHook = <Fn extends AnyFunction>(\n fn: Fn,\n params?: Partial<ServiceActor<T>>,\n ): Fn => {\n return withContext(function (this: any, ...args: any[]) {\n var parentActor = inject<ServiceActor>(injectKey);\n var actor = createActor();\n\n if (parentActor) {\n actor.assign(parentActor);\n }\n\n if (params) {\n actor.assign(params);\n }\n\n provide(injectKey, actor);\n\n return fn.apply(this, args);\n }) as Fn;\n };\n\n var injectHook = (): AnyServiceActor | undefined => {\n return hasInjectionContext() ? inject<ServiceActor>(injectKey) : undefined;\n };\n\n var useHok = (): AnyServiceActor => {\n var _actor: AnyServiceActor | undefined;\n\n if (!hasInjectionContext()) {\n _actor = createActor();\n provide(injectKey, _actor, true);\n\n return _actor;\n }\n\n // check for existed\n _actor = inject<AnyServiceActor>(injectKey);\n\n if (_actor) return _actor;\n\n _actor = createActor();\n provide(injectKey, _actor);\n\n return _actor;\n };\n\n return { with: withHook, use: useHok as any, inject: injectHook as any };\n}\n\nfunction createServiceActor(): ServiceActor {\n var actor: ServiceActorInternal = {\n traceId: '',\n actorId: null,\n actorType: 'unknown',\n [SYM_API]: {\n assign,\n },\n [SYM_DATA]: {},\n [SYM_RAW]: null,\n [SYM_MARKER]: true,\n };\n\n var reservedKeys = new Set(Object.keys(actor));\n\n actor[SYM_RAW] = actor;\n\n var newProxy = new Proxy(actor[SYM_DATA], {\n defineProperty(target, key, value) {\n if (key in actor) {\n (actor as any)[key] = value;\n } else {\n target[key] = value;\n }\n\n return true;\n },\n deleteProperty(target, key) {\n if (key in actor) {\n delete (actor as any)[key];\n } else {\n delete target[key];\n }\n\n return true;\n },\n has(target, key) {\n return key in actor || key in target;\n },\n ownKeys(target) {\n return [...reservedKeys, ...Object.keys(target)];\n },\n set: function (target, key, value) {\n if (key in actor[SYM_API]) return false;\n\n if (key in actor) {\n Reflect.set(actor, key, value);\n } else if (isFunction(value)) {\n Reflect.set(actor[SYM_API], key, value);\n } else {\n Reflect.set(target, key, value);\n }\n\n return true;\n },\n get: (target, key) => {\n var value: any;\n\n if (key in actor) {\n value = Reflect.get(actor, key, value);\n } else if (key in actor[SYM_API]) {\n value = Reflect.get(actor[SYM_API], key, value).bind(newProxy);\n } else {\n value = Reflect.get(target, key);\n }\n\n return value;\n },\n getOwnPropertyDescriptor(k) {\n return {\n enumerable: true,\n configurable: true,\n };\n },\n });\n\n return newProxy as ServiceActor;\n}\n\nfunction assign(this: ServiceActor, params: Record<any, any>) {\n Object.assign(this, params);\n return this;\n}\n"],"names":[],"mappings":";;;AA4CA,IAAI,aAAa,MAAA,EAAO;AACxB,IAAI,UAAU,MAAA,EAAO;AACrB,IAAI,WAAW,MAAA,EAAO;AACtB,IAAI,UAAU,MAAA,EAAO;AA8Bd,SAAS,aACd,OAAA,EAmBA;AACA,EAAA,IAAI,YAAY,MAAA,EAAO;AACvB,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,IAAI,cAAc,MAAuB;AACvC,IAAA,IAAI,QAAQ,kBAAA,EAAmB;AAE/B,IAAA,KAAA,CAAM,OAAA,GAAU,CAAA,MAAA,EAAS,EAAE,KAAK,CAAA,CAAA;AAEhC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,QAAA,GAAW,CACb,EAAA,EACA,MAAA,KACO;AACP,IAAA,OAAO,WAAA,CAAY,YAAwB,IAAA,EAAa;AACtD,MAAA,IAAI,WAAA,GAAc,OAAqB,SAAS,CAAA;AAChD,MAAA,IAAI,QAAQ,WAAA,EAAY;AAExB,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,CAAM,OAAO,WAAW,CAAA;AAAA,MAC1B;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,MACrB;AAEA,MAAA,OAAA,CAAQ,WAAW,KAAK,CAAA;AAExB,MAAA,OAAO,EAAA,CAAG,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,aAAa,MAAmC;AAClD,IAAA,OAAO,mBAAA,EAAoB,GAAI,MAAA,CAAqB,SAAS,CAAA,GAAI,MAAA;AAAA,EACnE,CAAA;AAEA,EAAA,IAAI,SAAS,MAAuB;AAClC,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,CAAC,qBAAoB,EAAG;AAC1B,MAAA,MAAA,GAAS,WAAA,EAAY;AACrB,MAAA,OAAA,CAAQ,SAAA,EAAW,QAAQ,IAAI,CAAA;AAE/B,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAA,GAAS,OAAwB,SAAS,CAAA;AAE1C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAA,GAAS,WAAA,EAAY;AACrB,IAAA,OAAA,CAAQ,WAAW,MAAM,CAAA;AAEzB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,MAAA,EAAe,QAAQ,UAAA,EAAkB;AACzE;AAEA,SAAS,kBAAA,GAAmC;AAC1C,EAAA,IAAI,KAAA,GAA8B;AAAA,IAChC,OAAA,EAAS,EAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA,IACX,CAAC,OAAO,GAAG;AAAA,MACT;AAAA,KACF;AAAA,IACA,CAAC,QAAQ,GAAG,EAAC;AAAA,IACb,CAAC,OAAO,GAAG,IAAA;AAAA,IACX,CAAC,UAAU,GAAG;AAAA,GAChB;AAEA,EAAA,IAAI,eAAe,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAE7C,EAAA,KAAA,CAAM,OAAO,CAAA,GAAI,KAAA;AAEjB,EAAA,IAAI,QAAA,GAAW,IAAI,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,EAAG;AAAA,IACxC,cAAA,CAAe,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO;AACjC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAC,KAAA,CAAc,GAAG,CAAA,GAAI,KAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,cAAA,CAAe,QAAQ,GAAA,EAAK;AAC1B,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,OAAQ,MAAc,GAAG,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,OAAO,OAAO,GAAG,CAAA;AAAA,MACnB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,QAAQ,GAAA,EAAK;AACf,MAAA,OAAO,GAAA,IAAO,SAAS,GAAA,IAAO,MAAA;AAAA,IAChC,CAAA;AAAA,IACA,QAAQ,MAAA,EAAQ;AACd,MAAA,OAAO,CAAC,GAAG,YAAA,EAAc,GAAG,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACjD,CAAA;AAAA,IACA,GAAA,EAAK,SAAU,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO;AACjC,MAAA,IAAI,GAAA,IAAO,KAAA,CAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAElC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA;AAAA,MAC/B,CAAA,MAAA,IAAW,UAAA,CAAW,KAAK,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG,KAAK,KAAK,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,GAAA,EAAK,KAAK,CAAA;AAAA,MAChC;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,EAAK,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACpB,MAAA,IAAI,KAAA;AAEJ,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA;AAAA,MACvC,CAAA,MAAA,IAAW,GAAA,IAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AAChC,QAAA,KAAA,GAAQ,OAAA,CAAQ,IAAI,KAAA,CAAM,OAAO,GAAG,GAAA,EAAK,KAAK,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AAAA,MACjC;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,yBAAyB,CAAA,EAAG;AAC1B,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,OAA2B,MAAA,EAA0B;AAC5D,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,MAAM,CAAA;AAC1B,EAAA,OAAO,IAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrew_l/service-actor",
3
- "version": "0.2.21",
3
+ "version": "0.3.1",
4
4
  "description": "Forget about passing data like trace IDs between functions.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -29,15 +29,16 @@
29
29
  ],
30
30
  "devDependencies": {
31
31
  "@types/node": "22.10.5",
32
- "typescript": "~5.6.2",
33
- "unbuild": "3.0.0-rc.11",
34
- "vitest": "^2.1.3"
32
+ "typescript": "~5.8.3",
33
+ "unbuild": "3.5.0",
34
+ "vitest": "^3.2.4"
35
35
  },
36
36
  "dependencies": {
37
- "@andrew_l/context": "0.2.21",
38
- "@andrew_l/toolkit": "0.2.21"
37
+ "@andrew_l/context": "0.3.1",
38
+ "@andrew_l/toolkit": "0.3.1"
39
39
  },
40
40
  "scripts": {
41
+ "check-types": "tsc --noEmit",
41
42
  "build": "unbuild",
42
43
  "test": "vitest run --typecheck",
43
44
  "test:watch": "vitest watch --typecheck"