@vanrot/store 0.0.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.
@@ -0,0 +1,16 @@
1
+ import type { StoreActionSet } from "./types.js";
2
+ declare const actionSetDefinitionBrand: unique symbol;
3
+ export type ActionSetDefinition<Start extends object | void = void, Success extends object | void = void, ErrorPayload extends object | void = void> = {
4
+ readonly [actionSetDefinitionBrand]: true;
5
+ start<NextStart extends object | void = void>(): ActionSetDefinition<NextStart, Success, ErrorPayload>;
6
+ success<NextSuccess extends object | void = void>(): ActionSetDefinition<Start, NextSuccess, ErrorPayload>;
7
+ error<NextError extends object | void = void>(): ActionSetDefinition<Start, Success, NextError>;
8
+ };
9
+ export type DefinedActionSet<TDefinition> = TDefinition extends ActionSetDefinition<infer Start, infer Success, infer ErrorPayload> ? StoreActionSet<Start, Success, ErrorPayload> : never;
10
+ export type DefinedActions<TDefinitions extends Record<string, ActionSetDefinition<object | void, object | void, object | void>>> = {
11
+ readonly [ActionName in keyof TDefinitions]: DefinedActionSet<TDefinitions[ActionName]>;
12
+ };
13
+ export declare function actionSet(): ActionSetDefinition<void, void, void>;
14
+ export declare function defineActions<TDefinitions extends Record<string, ActionSetDefinition<object | void, object | void, object | void>>>(storeName: string, definitions: TDefinitions): DefinedActions<TDefinitions>;
15
+ export {};
16
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,wBAAwB,eAAuC,CAAC;AAEtE,MAAM,MAAM,mBAAmB,CAC7B,KAAK,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,EAClC,OAAO,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,EACpC,YAAY,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,IACvC;IACF,QAAQ,CAAC,CAAC,wBAAwB,CAAC,EAAE,IAAI,CAAC;IAC1C,KAAK,CAAC,SAAS,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,KAAK,mBAAmB,CAClE,SAAS,EACT,OAAO,EACP,YAAY,CACb,CAAC;IACF,OAAO,CAAC,WAAW,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,KAAK,mBAAmB,CACtE,KAAK,EACL,WAAW,EACX,YAAY,CACb,CAAC;IACF,KAAK,CAAC,SAAS,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,KAAK,mBAAmB,CAClE,KAAK,EACL,OAAO,EACP,SAAS,CACV,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,WAAW,IACtC,WAAW,SAAS,mBAAmB,CAAC,MAAM,KAAK,EAAE,MAAM,OAAO,EAAE,MAAM,YAAY,CAAC,GACnF,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,GAC5C,KAAK,CAAC;AAEZ,MAAM,MAAM,cAAc,CACxB,YAAY,SAAS,MAAM,CACzB,MAAM,EACN,mBAAmB,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CACjE,IACC;IACF,QAAQ,EAAE,UAAU,IAAI,MAAM,YAAY,GAAG,gBAAgB,CAC3D,YAAY,CAAC,UAAU,CAAC,CACzB;CACF,CAAC;AAEF,wBAAgB,SAAS,IAAI,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAEjE;AAED,wBAAgB,aAAa,CAC3B,YAAY,SAAS,MAAM,CACzB,MAAM,EACN,mBAAmB,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CACjE,EACD,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC,CAW5E"}
@@ -0,0 +1,48 @@
1
+ import { storeActionTypeSeparator } from "./constants.js";
2
+ const actionSetDefinitionBrand = Symbol("vanrot.actionSetDefinition");
3
+ export function actionSet() {
4
+ return createActionSetDefinition();
5
+ }
6
+ export function defineActions(storeName, definitions) {
7
+ return Object.fromEntries(Object.keys(definitions).map((actionName) => [
8
+ actionName,
9
+ {
10
+ start: createActionCreator(storeName, actionName, "start"),
11
+ success: createActionCreator(storeName, actionName, "success"),
12
+ error: createActionCreator(storeName, actionName, "error"),
13
+ },
14
+ ]));
15
+ }
16
+ function createActionSetDefinition() {
17
+ return {
18
+ [actionSetDefinitionBrand]: true,
19
+ start() {
20
+ return createActionSetDefinition();
21
+ },
22
+ success() {
23
+ return createActionSetDefinition();
24
+ },
25
+ error() {
26
+ return createActionSetDefinition();
27
+ },
28
+ };
29
+ }
30
+ function createActionCreator(storeName, actionName, phase) {
31
+ const metadata = {
32
+ type: [storeName, actionName, phase].join(storeActionTypeSeparator),
33
+ storeName,
34
+ actionName,
35
+ phase,
36
+ };
37
+ const creator = ((payload) => {
38
+ if (payload === undefined) {
39
+ return { type: metadata.type };
40
+ }
41
+ return {
42
+ type: metadata.type,
43
+ ...payload,
44
+ };
45
+ });
46
+ return Object.assign(creator, metadata);
47
+ }
48
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAQ1D,MAAM,wBAAwB,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAyCtE,MAAM,UAAU,SAAS;IACvB,OAAO,yBAAyB,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,aAAa,CAK3B,SAAiB,EAAE,WAAyB;IAC5C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;QAC3C,UAAU;QACV;YACE,KAAK,EAAE,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC;YAC1D,OAAO,EAAE,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC;YAC9D,KAAK,EAAE,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC;SAC3D;KACF,CAAC,CAC6B,CAAC;AACpC,CAAC;AAED,SAAS,yBAAyB;IAKhC,OAAO;QACL,CAAC,wBAAwB,CAAC,EAAE,IAAI;QAChC,KAAK;YACH,OAAO,yBAAyB,EAAoC,CAAC;QACvE,CAAC;QACD,OAAO;YACL,OAAO,yBAAyB,EAAoC,CAAC;QACvE,CAAC;QACD,KAAK;YACH,OAAO,yBAAyB,EAA6B,CAAC;QAChE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,UAAkB,EAClB,KAAa;IAEb,MAAM,QAAQ,GAAwB;QACpC,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC;QACnE,SAAS;QACT,UAAU;QACV,KAAK;KACN,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,CAAC,OAAiB,EAAE,EAAE;QACrC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAA0B,CAAC;QACzD,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAI,OAAkB;SACC,CAAC;IAC5B,CAAC,CAAgC,CAAC;IAElC,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const storePackageName = "@vanrot/store";
2
+ export declare const storeActionTypeSeparator = "/";
3
+ export declare const storeEffectPhase: {
4
+ readonly start: "start";
5
+ readonly success: "success";
6
+ readonly error: "error";
7
+ };
8
+ export declare const storeSizeBudget: {
9
+ readonly combinedRuntimeAndStoreGzipBytes: number;
10
+ };
11
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,eAAO,MAAM,eAAe;;CAElB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const storePackageName = "@vanrot/store";
2
+ export const storeActionTypeSeparator = "/";
3
+ export const storeEffectPhase = {
4
+ start: "start",
5
+ success: "success",
6
+ error: "error",
7
+ };
8
+ export const storeSizeBudget = {
9
+ combinedRuntimeAndStoreGzipBytes: 10 * 1024,
10
+ };
11
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEhD,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,gCAAgC,EAAE,EAAE,GAAG,IAAI;CACnC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { AnyStoreActionCreator, StoreAction, StoreActionCreator, StoreEffect, StoreEffectMapContext, StoreEffectRunContext, StoreRetryPolicy } from "./types.js";
2
+ export type EffectBuilder<TAction extends StoreAction<any> = StoreAction<any>> = {
3
+ latestBy(read: (context: StoreEffectRunContext<TAction>) => string): EffectBuilder<TAction>;
4
+ skipWhen(read: (context: StoreEffectRunContext<TAction>) => boolean): EffectBuilder<TAction>;
5
+ cancelWhen(actionCreator: AnyStoreActionCreator): EffectBuilder<TAction>;
6
+ timeout(milliseconds: number): EffectBuilder<TAction>;
7
+ retry(policy: StoreRetryPolicy): EffectBuilder<TAction>;
8
+ run(handler: (context: StoreEffectRunContext<TAction>) => Promise<unknown> | unknown): EffectBuilder<TAction>;
9
+ success(map: (result: unknown, context: StoreEffectMapContext<TAction>) => StoreAction<any>): EffectBuilder<TAction>;
10
+ error(map: (error: unknown, context: StoreEffectMapContext<TAction>) => StoreAction<any>): EffectBuilder<TAction>;
11
+ trace(name: string): StoreEffect<TAction>;
12
+ };
13
+ export declare function effect<TPayload extends object | void>(trigger: StoreActionCreator<TPayload>): EffectBuilder<StoreAction<TPayload>>;
14
+ export declare function defineEffects<TEffects extends Record<string, StoreEffect<any>>>(effects: TEffects): TEffects;
15
+ export declare function retryPolicy(policy: StoreRetryPolicy): StoreRetryPolicy;
16
+ export declare function traceName(name: string): string;
17
+ //# sourceMappingURL=effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EAErB,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,CAAC,OAAO,SAAS,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI;IAC/E,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,KAAK,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5F,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,KAAK,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC7F,UAAU,CAAC,aAAa,EAAE,qBAAqB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACzE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtD,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACxD,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9G,OAAO,CACL,GAAG,EAAE,CACH,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,KACpC,WAAW,CAAC,GAAG,CAAC,GACpB,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CACH,GAAG,EAAE,CACH,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,KACpC,WAAW,CAAC,GAAG,CAAC,GACpB,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;CAC3C,CAAC;AAMF,wBAAgB,MAAM,CAAC,QAAQ,SAAS,MAAM,GAAG,IAAI,EACnD,OAAO,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GACpC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAsDtC;AAED,wBAAgB,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAC7E,OAAO,EAAE,QAAQ,GAChB,QAAQ,CAEV;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAEtE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,63 @@
1
+ export function effect(trigger) {
2
+ const policies = {};
3
+ let runHandler = () => undefined;
4
+ let successMapper;
5
+ let errorMapper;
6
+ const builder = {
7
+ latestBy(read) {
8
+ policies.latestBy = read;
9
+ return builder;
10
+ },
11
+ skipWhen(read) {
12
+ policies.skipWhen = read;
13
+ return builder;
14
+ },
15
+ cancelWhen(actionCreator) {
16
+ policies.cancelWhen = actionCreator;
17
+ return builder;
18
+ },
19
+ timeout(milliseconds) {
20
+ policies.timeoutMs = milliseconds;
21
+ return builder;
22
+ },
23
+ retry(policy) {
24
+ policies.retry = policy;
25
+ return builder;
26
+ },
27
+ run(handler) {
28
+ runHandler = handler;
29
+ return builder;
30
+ },
31
+ success(map) {
32
+ successMapper = map;
33
+ return builder;
34
+ },
35
+ error(map) {
36
+ errorMapper = map;
37
+ return builder;
38
+ },
39
+ trace(name) {
40
+ return {
41
+ trigger,
42
+ run: runHandler,
43
+ ...(successMapper ? { success: successMapper } : {}),
44
+ ...(errorMapper ? { error: errorMapper } : {}),
45
+ policies: {
46
+ ...policies,
47
+ trace: name,
48
+ },
49
+ };
50
+ },
51
+ };
52
+ return builder;
53
+ }
54
+ export function defineEffects(effects) {
55
+ return effects;
56
+ }
57
+ export function retryPolicy(policy) {
58
+ return policy;
59
+ }
60
+ export function traceName(name) {
61
+ return name;
62
+ }
63
+ //# sourceMappingURL=effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.js","sourceRoot":"","sources":["../src/effects.ts"],"names":[],"mappings":"AAqCA,MAAM,UAAU,MAAM,CACpB,OAAqC;IAErC,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,IAAI,UAAU,GAA8C,GAAG,EAAE,CAAC,SAAS,CAAC;IAC5E,IAAI,aAA4D,CAAC;IACjE,IAAI,WAAwD,CAAC;IAE7D,MAAM,OAAO,GAAyC;QACpD,QAAQ,CAAC,IAAI;YACX,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,QAAQ,CAAC,IAAI;YACX,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,UAAU,CAAC,aAAa;YACtB,QAAQ,CAAC,UAAU,GAAG,aAAa,CAAC;YACpC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,YAAY;YAClB,QAAQ,CAAC,SAAS,GAAG,YAAY,CAAC;YAClC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,MAAM;YACV,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;YACxB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,GAAG,CAAC,OAAO;YACT,UAAU,GAAG,OAAO,CAAC;YACrB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,GAAG;YACT,aAAa,GAAG,GAAG,CAAC;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,GAAG;YACP,WAAW,GAAG,GAAG,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,IAAI;YACR,OAAO;gBACL,OAAO;gBACP,GAAG,EAAE,UAAU;gBACf,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,QAAQ,EAAE;oBACR,GAAG,QAAQ;oBACX,KAAK,EAAE,IAAI;iBACZ;aACF,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAiB;IAEjB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAwB;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StoreError } from "./types.js";
2
+ export declare function storeError(error: unknown): StoreError;
3
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAkBrD"}
package/dist/errors.js ADDED
@@ -0,0 +1,27 @@
1
+ export function storeError(error) {
2
+ if (isStoreError(error)) {
3
+ return error;
4
+ }
5
+ if (error instanceof Error) {
6
+ return {
7
+ message: error.message,
8
+ code: undefined,
9
+ cause: error,
10
+ };
11
+ }
12
+ return {
13
+ message: "Unknown store error",
14
+ code: undefined,
15
+ cause: error,
16
+ };
17
+ }
18
+ function isStoreError(error) {
19
+ if (!error || typeof error !== "object") {
20
+ return false;
21
+ }
22
+ const candidate = error;
23
+ return (typeof candidate.message === "string" &&
24
+ "code" in candidate &&
25
+ "cause" in candidate);
26
+ }
27
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,KAAK;SACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,qBAAqB;QAC9B,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAA4B,CAAC;IAE/C,OAAO,CACL,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;QACrC,MAAM,IAAI,SAAS;QACnB,OAAO,IAAI,SAAS,CACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { actionSet, defineActions } from "./actions.js";
2
+ export { storeActionTypeSeparator, storeEffectPhase, storePackageName, storeSizeBudget, } from "./constants.js";
3
+ export { defineEffects, effect, retryPolicy, traceName } from "./effects.js";
4
+ export { storeError } from "./errors.js";
5
+ export { defineReducer } from "./reducers.js";
6
+ export { defineSelectors } from "./selectors.js";
7
+ export { defineState } from "./state.js";
8
+ export { defineStore, useStore } from "./store.js";
9
+ export type { ActionSetDefinition, DefinedActions, DefinedActionSet, } from "./actions.js";
10
+ export type { EffectBuilder } from "./effects.js";
11
+ export type { ReducerActionBuilder, ReducerBuilder } from "./reducers.js";
12
+ export type { SelectorBuilder, SelectorRegistry } from "./selectors.js";
13
+ export type { StoreActionFacade, StoreDefinition, StoreInstance, StoreSelectFacade, } from "./store.js";
14
+ export type { StoreAction, StoreActionCreator, StoreActionMetadata, StoreActionSet, StoreEffect, StoreEffectMapContext, StoreEffectPolicies, StoreEffectRunContext, StoreError, StoreReducer, StoreRetryPolicy, StoreSelector, StoreState, } from "./types.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnD,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1E,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,UAAU,GACX,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { actionSet, defineActions } from "./actions.js";
2
+ export { storeActionTypeSeparator, storeEffectPhase, storePackageName, storeSizeBudget, } from "./constants.js";
3
+ export { defineEffects, effect, retryPolicy, traceName } from "./effects.js";
4
+ export { storeError } from "./errors.js";
5
+ export { defineReducer } from "./reducers.js";
6
+ export { defineSelectors } from "./selectors.js";
7
+ export { defineState } from "./state.js";
8
+ export { defineStore, useStore } from "./store.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { StoreAction, StoreActionCreator, StoreReducer, StoreState } from "./types.js";
2
+ type ReducerContext<TState extends object, TAction extends StoreAction<object | void>> = {
3
+ readonly state: TState;
4
+ readonly action: TAction;
5
+ };
6
+ export type ReducerBuilder<TState extends object> = StoreReducer<TState> & {
7
+ on<TPayload extends object | void>(actionCreator: StoreActionCreator<TPayload>): ReducerActionBuilder<TState, StoreAction<TPayload>>;
8
+ };
9
+ export type ReducerActionBuilder<TState extends object, TAction extends StoreAction<object | void>> = {
10
+ patch(update: (context: ReducerContext<TState, TAction>) => Partial<TState>): ReducerBuilder<TState>;
11
+ set(update: (context: ReducerContext<TState, TAction>) => TState): ReducerBuilder<TState>;
12
+ };
13
+ export declare function defineReducer<TState extends object>(state: StoreState<TState>): ReducerBuilder<TState>;
14
+ export {};
15
+ //# sourceMappingURL=reducers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reducers.d.ts","sourceRoot":"","sources":["../src/reducers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,KAAK,cAAc,CACjB,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,IACxC;IACF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;AAUF,MAAM,MAAM,cAAc,CAAC,MAAM,SAAS,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG;IACzE,EAAE,CAAC,QAAQ,SAAS,MAAM,GAAG,IAAI,EAC/B,aAAa,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GAC1C,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAC9B,MAAM,SAAS,MAAM,EACrB,OAAO,SAAS,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,IACxC;IACF,KAAK,CACH,MAAM,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,GACpE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1B,GAAG,CACD,MAAM,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAC3D,cAAc,CAAC,MAAM,CAAC,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,SAAS,MAAM,EACjD,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,GACxB,cAAc,CAAC,MAAM,CAAC,CAuDxB"}
@@ -0,0 +1,63 @@
1
+ export function defineReducer(state) {
2
+ const handlers = [];
3
+ const builder = {
4
+ reduce(currentState, action) {
5
+ const handler = handlers.find((candidate) => candidate.actionType === action.type);
6
+ if (!handler) {
7
+ return currentState;
8
+ }
9
+ return handler.reduce(currentState, action);
10
+ },
11
+ on(actionCreator) {
12
+ return {
13
+ patch(update) {
14
+ handlers.push({
15
+ actionType: actionCreator.type,
16
+ reduce(currentState, action) {
17
+ return mergeState(currentState, update({
18
+ state: currentState,
19
+ action: action,
20
+ }));
21
+ },
22
+ });
23
+ return builder;
24
+ },
25
+ set(update) {
26
+ handlers.push({
27
+ actionType: actionCreator.type,
28
+ reduce(currentState, action) {
29
+ return update({
30
+ state: currentState,
31
+ action: action,
32
+ });
33
+ },
34
+ });
35
+ return builder;
36
+ },
37
+ };
38
+ },
39
+ };
40
+ void state;
41
+ return builder;
42
+ }
43
+ function mergeState(state, partial) {
44
+ const next = {
45
+ ...state,
46
+ };
47
+ for (const [key, value] of Object.entries(partial)) {
48
+ const currentValue = state[key];
49
+ if (isPlainObject(currentValue) && isPlainObject(value)) {
50
+ next[key] = {
51
+ ...currentValue,
52
+ ...value,
53
+ };
54
+ continue;
55
+ }
56
+ next[key] = value;
57
+ }
58
+ return next;
59
+ }
60
+ function isPlainObject(value) {
61
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
62
+ }
63
+ //# sourceMappingURL=reducers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reducers.js","sourceRoot":"","sources":["../src/reducers.ts"],"names":[],"mappings":"AAyCA,MAAM,UAAU,aAAa,CAC3B,KAAyB;IAEzB,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAE9C,MAAM,OAAO,GAA2B;QACtC,MAAM,CAAC,YAAY,EAAE,MAAM;YACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAC3B,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,CACpD,CAAC;YAEF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;QACD,EAAE,CACA,aAA2C;YAE3C,OAAO;gBACL,KAAK,CAAC,MAAM;oBACV,QAAQ,CAAC,IAAI,CAAC;wBACZ,UAAU,EAAE,aAAa,CAAC,IAAI;wBAC9B,MAAM,CAAC,YAAY,EAAE,MAAM;4BACzB,OAAO,UAAU,CACf,YAAY,EACZ,MAAM,CAAC;gCACL,KAAK,EAAE,YAAY;gCACnB,MAAM,EAAE,MAA+B;6BACxC,CAAC,CACH,CAAC;wBACJ,CAAC;qBACF,CAAC,CAAC;oBAEH,OAAO,OAAO,CAAC;gBACjB,CAAC;gBACD,GAAG,CAAC,MAAM;oBACR,QAAQ,CAAC,IAAI,CAAC;wBACZ,UAAU,EAAE,aAAa,CAAC,IAAI;wBAC9B,MAAM,CAAC,YAAY,EAAE,MAAM;4BACzB,OAAO,MAAM,CAAC;gCACZ,KAAK,EAAE,YAAY;gCACnB,MAAM,EAAE,MAA+B;6BACxC,CAAC,CAAC;wBACL,CAAC;qBACF,CAAC,CAAC;oBAEH,OAAO,OAAO,CAAC;gBACjB,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,KAAK,KAAK,CAAC;IAEX,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CACjB,KAAa,EACb,OAAwB;IAExB,MAAM,IAAI,GAAG;QACX,GAAG,KAAK;KACkB,CAAC;IAE7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,YAAY,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;QAE7D,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,GAAG;gBACV,GAAG,YAAY;gBACf,GAAG,KAAK;aACT,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,OAAO,IAAc,CAAC;AACxB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AnyStoreSelector, StoreSelector, StoreState } from "./types.js";
2
+ export type SelectorRegistry<TState extends object> = Record<string, AnyStoreSelector<TState>>;
3
+ export type SelectorBuilder<TState extends object, TSelectors extends SelectorRegistry<TState> = Record<never, never>> = TSelectors & {
4
+ [SelectorName in string]: any & (<TResult, TInput = undefined>(read: TInput extends undefined ? (state: TState) => TResult : (state: TState, input: TInput) => TResult) => SelectorBuilder<TState, TSelectors & Record<SelectorName, StoreSelector<TState, TResult, TInput>>>);
5
+ };
6
+ export declare function defineSelectors<TState extends object>(state: StoreState<TState>): SelectorBuilder<TState>;
7
+ //# sourceMappingURL=selectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,MAAM,gBAAgB,CAAC,MAAM,SAAS,MAAM,IAAI,MAAM,CAC1D,MAAM,EACN,gBAAgB,CAAC,MAAM,CAAC,CACzB,CAAC;AAEF,MAAM,MAAM,eAAe,CACzB,MAAM,SAAS,MAAM,EACrB,UAAU,SAAS,gBAAgB,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAChE,UAAU,GAAG;KACd,YAAY,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,CAC/B,OAAO,EACP,MAAM,GAAG,SAAS,EAElB,IAAI,EAAE,MAAM,SAAS,SAAS,GAC1B,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAC1B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,KAC1C,eAAe,CAClB,MAAM,EACN,UAAU,GACR,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAC/D,CAAC;CACH,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,SAAS,MAAM,EACnD,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,GACxB,eAAe,CAAC,MAAM,CAAC,CA2BzB"}
@@ -0,0 +1,23 @@
1
+ export function defineSelectors(state) {
2
+ const selectors = {};
3
+ const proxy = new Proxy(selectors, {
4
+ get(target, property) {
5
+ if (typeof property !== "string") {
6
+ return Reflect.get(target, property);
7
+ }
8
+ if (property in target) {
9
+ return target[property];
10
+ }
11
+ return (read) => {
12
+ target[property] = {
13
+ name: property,
14
+ read,
15
+ };
16
+ return proxy;
17
+ };
18
+ },
19
+ });
20
+ void state;
21
+ return proxy;
22
+ }
23
+ //# sourceMappingURL=selectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.js","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,eAAe,CAC7B,KAAyB;IAEzB,MAAM,SAAS,GAA6B,EAAE,CAAC;IAE/C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE;QACjC,GAAG,CAAC,MAAM,EAAE,QAAQ;YAClB,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;gBACvB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;YAED,OAAO,CAAC,IAAiD,EAAE,EAAE;gBAC3D,MAAM,CAAC,QAAQ,CAAC,GAAG;oBACjB,IAAI,EAAE,QAAQ;oBACd,IAAI;iBACL,CAAC;gBAEF,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,KAAK,KAAK,CAAC;IAEX,OAAO,KAA2C,CAAC;AACrD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StoreState } from "./types.js";
2
+ export declare function defineState<TState extends object>(initial: TState): StoreState<TState>;
3
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,WAAW,CAAC,MAAM,SAAS,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAmBtF"}
package/dist/state.js ADDED
@@ -0,0 +1,21 @@
1
+ import { signal } from "@vanrot/runtime";
2
+ export function defineState(initial) {
3
+ const current = signal(initial);
4
+ return {
5
+ initial,
6
+ current,
7
+ set(next) {
8
+ current.set(next);
9
+ },
10
+ patch(partial) {
11
+ current.set({
12
+ ...current(),
13
+ ...partial,
14
+ });
15
+ },
16
+ reset() {
17
+ current.set(initial);
18
+ },
19
+ };
20
+ }
21
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIzC,MAAM,UAAU,WAAW,CAAwB,OAAe;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhC,OAAO;QACL,OAAO;QACP,OAAO;QACP,GAAG,CAAC,IAAI;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,CAAC,OAAO;YACX,OAAO,CAAC,GAAG,CAAC;gBACV,GAAG,OAAO,EAAE;gBACZ,GAAG,OAAO;aACX,CAAC,CAAC;QACL,CAAC;QACD,KAAK;YACH,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { AnyStoreSelector, StoreAction, StoreActionSet, StoreEffect, StoreReducer, StoreState } from "./types.js";
2
+ export type StoreDefinition<TState extends object, TActions extends Record<string, StoreActionSet<any, any, any>>, TSelectors extends Record<string, AnyStoreSelector<TState>>, TEffects extends Record<string, StoreEffect<any>>> = {
3
+ readonly name: string;
4
+ readonly state: StoreState<TState>;
5
+ readonly actions: TActions;
6
+ readonly selectors: TSelectors;
7
+ readonly reducer: StoreReducer<TState>;
8
+ readonly effects: TEffects;
9
+ };
10
+ export type StoreActionFacade<TActions extends Record<string, StoreActionSet<any, any, any>>> = {
11
+ readonly [ActionName in keyof TActions]: {
12
+ readonly start: Parameters<TActions[ActionName]["start"]> extends [] ? () => void : (payload: Parameters<TActions[ActionName]["start"]>[0]) => void;
13
+ readonly success: Parameters<TActions[ActionName]["success"]> extends [] ? () => void : (payload: Parameters<TActions[ActionName]["success"]>[0]) => void;
14
+ readonly error: Parameters<TActions[ActionName]["error"]> extends [] ? () => void : (payload: Parameters<TActions[ActionName]["error"]>[0]) => void;
15
+ };
16
+ };
17
+ export type StoreSelectFacade<TState extends object, TSelectors extends Record<string, AnyStoreSelector<TState>>> = {
18
+ readonly [SelectorName in keyof TSelectors]: TSelectors[SelectorName]["read"] extends (state: TState) => infer TResult ? () => () => TResult : TSelectors[SelectorName]["read"] extends (state: TState, input: infer TInput) => infer TResult ? (input: TInput) => () => TResult : never;
19
+ };
20
+ export type StoreInstance<TState extends object, TActions extends Record<string, StoreActionSet<any, any, any>>, TSelectors extends Record<string, AnyStoreSelector<TState>>, TEffects extends Record<string, StoreEffect<any>>> = {
21
+ readonly name: string;
22
+ readonly state: StoreState<TState>;
23
+ readonly action: StoreActionFacade<TActions>;
24
+ readonly select: StoreSelectFacade<TState, TSelectors>;
25
+ readonly dispatch: (action: StoreAction<any>) => void;
26
+ readonly effects: TEffects;
27
+ };
28
+ export declare function defineStore<TState extends object, TActions extends Record<string, StoreActionSet<any, any, any>>, TSelectors extends Record<string, AnyStoreSelector<TState>>, TEffects extends Record<string, StoreEffect<any>>>(definition: StoreDefinition<TState, TActions, TSelectors, TEffects>): StoreDefinition<TState, TActions, TSelectors, TEffects>;
29
+ export declare function useStore<TState extends object, TActions extends Record<string, StoreActionSet<any, any, any>>, TSelectors extends Record<string, AnyStoreSelector<TState>>, TEffects extends Record<string, StoreEffect<any>>>(definition: StoreDefinition<TState, TActions, TSelectors, TEffects>): StoreInstance<TState, TActions, TSelectors, TEffects>;
30
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/store.js ADDED
@@ -0,0 +1,206 @@
1
+ import { computed } from "@vanrot/runtime";
2
+ const defaultEffectRunKey = Symbol();
3
+ const storeEffectAbortedMessage = "Store effect aborted";
4
+ export function defineStore(definition) {
5
+ return definition;
6
+ }
7
+ export function useStore(definition) {
8
+ const activeEffects = new Map();
9
+ const dispatch = (action) => {
10
+ const previousState = definition.state.current();
11
+ definition.state.set(definition.reducer.reduce(previousState, action));
12
+ cancelMatchingEffects(definition.effects, activeEffects, action);
13
+ void runEffects(definition, dispatch, action, previousState, activeEffects);
14
+ };
15
+ return {
16
+ name: definition.name,
17
+ state: definition.state,
18
+ action: bindActions(definition.actions, dispatch),
19
+ select: bindSelectors(definition.state, definition.selectors),
20
+ dispatch,
21
+ effects: definition.effects,
22
+ };
23
+ }
24
+ function bindActions(actions, dispatch) {
25
+ return Object.fromEntries(Object.entries(actions).map(([actionName, actionGroup]) => [
26
+ actionName,
27
+ {
28
+ start(payload) {
29
+ dispatch(actionGroup.start(payload));
30
+ },
31
+ success(payload) {
32
+ dispatch(actionGroup.success(payload));
33
+ },
34
+ error(payload) {
35
+ dispatch(actionGroup.error(payload));
36
+ },
37
+ },
38
+ ]));
39
+ }
40
+ function bindSelectors(state, selectors) {
41
+ return Object.fromEntries(Object.entries(selectors).map(([selectorName, selector]) => {
42
+ const readSelector = selector.read;
43
+ return [
44
+ selectorName,
45
+ (input) => computed(() => readSelector(state.current(), resolveSelectorInput(input))),
46
+ ];
47
+ }));
48
+ }
49
+ function resolveSelectorInput(input) {
50
+ if (typeof input === "function") {
51
+ return input();
52
+ }
53
+ return input;
54
+ }
55
+ async function runEffects(definition, dispatch, action, previousState, activeEffects) {
56
+ const matchingEffects = Object.values(definition.effects).filter((effectDefinition) => effectDefinition.trigger.type === action.type);
57
+ for (const effectDefinition of matchingEffects) {
58
+ const controller = new AbortController();
59
+ const context = {
60
+ action,
61
+ dispatch,
62
+ signal: controller.signal,
63
+ state: previousState,
64
+ };
65
+ if (effectDefinition.policies.skipWhen?.(context)) {
66
+ continue;
67
+ }
68
+ const runKey = effectDefinition.policies.latestBy?.(context) ??
69
+ defaultEffectRunKey;
70
+ if (runKey !== defaultEffectRunKey) {
71
+ abortEffectRun(effectDefinition, activeEffects, runKey);
72
+ }
73
+ const releaseEffectRun = registerEffectRun(effectDefinition, activeEffects, runKey, controller);
74
+ try {
75
+ const result = await runWithRetry(effectDefinition, context);
76
+ if (context.signal.aborted) {
77
+ continue;
78
+ }
79
+ const successAction = effectDefinition.success?.(result, context);
80
+ if (successAction) {
81
+ dispatch(successAction);
82
+ }
83
+ }
84
+ catch (error) {
85
+ if (context.signal.aborted) {
86
+ continue;
87
+ }
88
+ const errorAction = effectDefinition.error?.(error, context);
89
+ if (errorAction) {
90
+ dispatch(errorAction);
91
+ }
92
+ }
93
+ finally {
94
+ releaseEffectRun();
95
+ }
96
+ }
97
+ }
98
+ function cancelMatchingEffects(effects, activeEffects, action) {
99
+ for (const effectDefinition of Object.values(effects)) {
100
+ if (effectDefinition.policies.cancelWhen?.type !== action.type) {
101
+ continue;
102
+ }
103
+ abortEffect(effectDefinition, activeEffects);
104
+ }
105
+ }
106
+ function registerEffectRun(effectDefinition, activeEffects, runKey, controller) {
107
+ let keyedControllers = activeEffects.get(effectDefinition);
108
+ if (!keyedControllers) {
109
+ keyedControllers = new Map();
110
+ activeEffects.set(effectDefinition, keyedControllers);
111
+ }
112
+ let controllers = keyedControllers.get(runKey);
113
+ if (!controllers) {
114
+ controllers = new Set();
115
+ keyedControllers.set(runKey, controllers);
116
+ }
117
+ controllers.add(controller);
118
+ return () => {
119
+ controllers.delete(controller);
120
+ if (controllers.size > 0) {
121
+ return;
122
+ }
123
+ keyedControllers.delete(runKey);
124
+ if (keyedControllers.size === 0) {
125
+ activeEffects.delete(effectDefinition);
126
+ }
127
+ };
128
+ }
129
+ function abortEffect(effectDefinition, activeEffects) {
130
+ const keyedControllers = activeEffects.get(effectDefinition);
131
+ if (!keyedControllers) {
132
+ return;
133
+ }
134
+ for (const controllers of keyedControllers.values()) {
135
+ for (const controller of controllers) {
136
+ controller.abort();
137
+ }
138
+ }
139
+ activeEffects.delete(effectDefinition);
140
+ }
141
+ function abortEffectRun(effectDefinition, activeEffects, runKey) {
142
+ const keyedControllers = activeEffects.get(effectDefinition);
143
+ const controllers = keyedControllers?.get(runKey);
144
+ if (!keyedControllers || !controllers) {
145
+ return;
146
+ }
147
+ for (const controller of controllers) {
148
+ controller.abort();
149
+ }
150
+ keyedControllers.delete(runKey);
151
+ if (keyedControllers.size === 0) {
152
+ activeEffects.delete(effectDefinition);
153
+ }
154
+ }
155
+ async function runWithRetry(effectDefinition, context) {
156
+ const retry = effectDefinition.policies.retry;
157
+ const attempts = retry?.attempts ?? 1;
158
+ let lastError;
159
+ for (let attempt = 1; attempt <= attempts; attempt += 1) {
160
+ if (context.signal.aborted) {
161
+ throw lastError ?? new Error(storeEffectAbortedMessage);
162
+ }
163
+ try {
164
+ return await runWithTimeout(effectDefinition, context);
165
+ }
166
+ catch (error) {
167
+ lastError = error;
168
+ if (context.signal.aborted ||
169
+ !retry ||
170
+ attempt >= attempts ||
171
+ retry.when?.(error) === false) {
172
+ break;
173
+ }
174
+ await wait(retry.delay, context.signal);
175
+ }
176
+ }
177
+ throw lastError;
178
+ }
179
+ function runWithTimeout(effectDefinition, context) {
180
+ const timeoutMs = effectDefinition.policies.timeoutMs;
181
+ if (!timeoutMs) {
182
+ return Promise.resolve(effectDefinition.run(context));
183
+ }
184
+ return new Promise((resolve, reject) => {
185
+ const timer = setTimeout(() => {
186
+ reject(new Error(`Store effect timed out after ${timeoutMs}ms`));
187
+ }, timeoutMs);
188
+ Promise.resolve(effectDefinition.run(context))
189
+ .then(resolve)
190
+ .catch(reject)
191
+ .finally(() => clearTimeout(timer));
192
+ });
193
+ }
194
+ function wait(milliseconds, signal) {
195
+ if (signal.aborted) {
196
+ return Promise.resolve();
197
+ }
198
+ return new Promise((resolve) => {
199
+ const timer = setTimeout(resolve, milliseconds);
200
+ signal.addEventListener("abort", () => {
201
+ clearTimeout(timer);
202
+ resolve();
203
+ }, { once: true });
204
+ });
205
+ }
206
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type { Signal } from "@vanrot/runtime";
2
+ export type StoreError = {
3
+ message: string;
4
+ code: string | undefined;
5
+ cause: unknown;
6
+ };
7
+ export type StoreAction<Payload extends object | void = void> = Payload extends void ? {
8
+ readonly type: string;
9
+ } : {
10
+ readonly type: string;
11
+ } & Readonly<Payload>;
12
+ export type StoreActionMetadata = {
13
+ readonly type: string;
14
+ readonly storeName: string;
15
+ readonly actionName: string;
16
+ readonly phase: string;
17
+ };
18
+ export type StoreActionCreator<Payload extends object | void = void> = Payload extends void ? (() => StoreAction<void>) & StoreActionMetadata : ((payload: Payload) => StoreAction<Payload>) & StoreActionMetadata;
19
+ export type AnyStoreActionCreator = StoreActionCreator<any>;
20
+ export type StoreActionSet<Start extends object | void = void, Success extends object | void = void, ErrorPayload extends object | void = void> = {
21
+ readonly start: StoreActionCreator<Start>;
22
+ readonly success: StoreActionCreator<Success>;
23
+ readonly error: StoreActionCreator<ErrorPayload>;
24
+ };
25
+ export type StoreState<TState extends object> = {
26
+ readonly initial: TState;
27
+ readonly current: Signal<TState>;
28
+ readonly set: (next: TState) => void;
29
+ readonly patch: (partial: Partial<TState>) => void;
30
+ readonly reset: () => void;
31
+ };
32
+ export type StoreSelector<TState extends object, TResult, TInput = undefined> = {
33
+ readonly name: string;
34
+ readonly read: TInput extends undefined ? (state: TState) => TResult : (state: TState, input: TInput) => TResult;
35
+ };
36
+ export type AnyStoreSelector<TState extends object = any> = {
37
+ readonly name: string;
38
+ readonly read: ((state: TState) => unknown) | ((state: TState, input: any) => unknown);
39
+ };
40
+ export type StoreReducer<TState extends object> = {
41
+ readonly reduce: (state: TState, action: StoreAction<object | void>) => TState;
42
+ };
43
+ export type StoreRetryPolicy = {
44
+ readonly attempts: number;
45
+ readonly delay: number;
46
+ readonly when?: (error: unknown) => boolean;
47
+ };
48
+ export type StoreEffectPolicies = {
49
+ readonly latestBy?: (context: StoreEffectRunContext<any>) => string;
50
+ readonly skipWhen?: (context: StoreEffectRunContext<any>) => boolean;
51
+ readonly cancelWhen?: AnyStoreActionCreator;
52
+ readonly timeoutMs?: number;
53
+ readonly retry?: StoreRetryPolicy;
54
+ readonly trace?: string;
55
+ };
56
+ export type StoreEffectRunContext<TAction extends StoreAction<any> = StoreAction<any>> = {
57
+ readonly action: TAction;
58
+ readonly signal: AbortSignal;
59
+ readonly state: Record<string, unknown>;
60
+ readonly dispatch: (action: StoreAction<any>) => void;
61
+ };
62
+ export type StoreEffectMapContext<TAction extends StoreAction<any> = StoreAction<any>> = StoreEffectRunContext<TAction>;
63
+ export type StoreEffect<TAction extends StoreAction<any> = StoreAction<any>> = {
64
+ readonly trigger: AnyStoreActionCreator;
65
+ readonly run: (context: StoreEffectRunContext<TAction>) => Promise<unknown> | unknown;
66
+ readonly success?: (result: unknown, context: StoreEffectMapContext<TAction>) => StoreAction<any>;
67
+ readonly error?: (error: unknown, context: StoreEffectMapContext<TAction>) => StoreAction<any>;
68
+ readonly policies: StoreEffectPolicies;
69
+ };
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@vanrot/store",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "private": false,
6
+ "engines": {
7
+ "node": ">=22.14.0"
8
+ },
9
+ "sideEffects": false,
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "main": "./dist/index.js",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "scripts": {
23
+ "prebuild": "pnpm --filter @vanrot/runtime build",
24
+ "build": "tsc -p tsconfig.json",
25
+ "pretypecheck": "pnpm --filter @vanrot/runtime build",
26
+ "typecheck": "tsc -p tsconfig.json --noEmit",
27
+ "pretest": "pnpm run build",
28
+ "test": "vitest run tests",
29
+ "clean": "node -e \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\""
30
+ },
31
+ "dependencies": {
32
+ "@vanrot/runtime": "0.1.0"
33
+ },
34
+ "devDependencies": {
35
+ "vitest": "^4.0.14"
36
+ },
37
+ "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d"
38
+ }