@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 +26 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +26 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -6
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
21
|
+
var withHook = (fn, params) => {
|
|
22
22
|
return context.withContext(function(...args) {
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
35
|
+
var injectHook = () => {
|
|
36
36
|
return context.hasInjectionContext() ? context.inject(injectKey) : void 0;
|
|
37
37
|
};
|
|
38
|
-
|
|
38
|
+
var useHok = () => {
|
|
39
|
+
var _actor;
|
|
39
40
|
if (!context.hasInjectionContext()) {
|
|
40
|
-
|
|
41
|
-
context.provide(injectKey,
|
|
42
|
-
return
|
|
41
|
+
_actor = createActor();
|
|
42
|
+
context.provide(injectKey, _actor, true);
|
|
43
|
+
return _actor;
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
context.provide(injectKey,
|
|
48
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
65
|
+
var reservedKeys = new Set(Object.keys(actor));
|
|
65
66
|
actor[SYM_RAW] = actor;
|
|
66
|
-
|
|
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
|
-
|
|
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]) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -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\
|
|
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":"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"}
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
19
|
+
var withHook = (fn, params) => {
|
|
20
20
|
return withContext(function(...args) {
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
33
|
+
var injectHook = () => {
|
|
34
34
|
return hasInjectionContext() ? inject(injectKey) : void 0;
|
|
35
35
|
};
|
|
36
|
-
|
|
36
|
+
var useHok = () => {
|
|
37
|
+
var _actor;
|
|
37
38
|
if (!hasInjectionContext()) {
|
|
38
|
-
|
|
39
|
-
provide(injectKey,
|
|
40
|
-
return
|
|
39
|
+
_actor = createActor();
|
|
40
|
+
provide(injectKey, _actor, true);
|
|
41
|
+
return _actor;
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
-
if (
|
|
44
|
-
|
|
45
|
-
provide(injectKey,
|
|
46
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
63
|
+
var reservedKeys = new Set(Object.keys(actor));
|
|
63
64
|
actor[SYM_RAW] = actor;
|
|
64
|
-
|
|
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
|
-
|
|
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]) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -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\
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrew_l/service-actor",
|
|
3
|
-
"version": "0.
|
|
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.
|
|
33
|
-
"unbuild": "3.
|
|
34
|
-
"vitest": "^2.
|
|
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.
|
|
38
|
-
"@andrew_l/toolkit": "0.
|
|
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"
|