redux-sacala 0.2.0 → 0.2.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.
@@ -1 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function a(r){const e={};for(const t in r)e[t]=r[t].bind(r);return e}function f(r,e){const t={};for(const c in e)t[r+c]=e[c];return t}function l(r){return e=>e===void 0?{type:r}:{type:r,payload:e}}function p(r){return e=>({type:r,payload:e})}function y(r,e,t){const c=f(r+"/",a(t));return(n=e,u)=>{if(u&&u.type){const o=c[u.type];return o?o(n,u.payload):n}else return n}}function C(r,e){return(t=>c=>{const n=f(r+"/",a(e(c.dispatch,c.getState)));return u=>o=>{o&&n.hasOwnProperty(o.type)?n[o.type](o.payload,t):u(o)}})}function s(){throw new Error("Can't have access to 'dispatch' and 'getState' during initialization")}function b(){return function({name:e,initial:t,actions:c,effects:n}){const u=Object.keys(c).reduce((d,i)=>(d[i]=l(`${e}/${i}`),d),{}),o=Object.keys(n?n(s,s):{}).reduce((d,i)=>(d[i]=p(`${e}/${i}`),d),{});return{name:e,reducer:y(e,t,c),createMiddleware:n?C(e,n):(()=>(d=>i=>i)),actions:{...u,...o}}}}exports.createReduxBlock=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=e=>{const r={};for(const c in e)r[c]=e[c].bind(e);return r},a=(e,r)=>{const c={};for(const n in r)c[e+n]=r[n];return c},l=e=>r=>r===void 0?{type:e}:{type:e,payload:r},p=e=>r=>({type:e,payload:r}),f=(e,r,c)=>{const n=a(e+"/",u(c));return(o=r,s)=>{if(s&&s.type){const t=n[s.type];return t?t(o,s.payload):o}else return o}},y=(e,r)=>(c=>n=>{const o=a(e+"/",u(r(n.dispatch,n.getState)));return s=>t=>{t&&Object.prototype.hasOwnProperty.call(o,t.type)?o[t.type](t.payload,c):s(t)}}),i=()=>{throw new Error("Can't have access to 'dispatch' and 'getState' during initialization")},b=()=>({name:e,initial:r,actions:c,effects:n})=>{const o=Object.keys(c).reduce((t,d)=>(t[d]=l(`${e}/${d}`),t),{}),s=Object.keys(n?n(i,i):{}).reduce((t,d)=>(t[d]=p(`${e}/${d}`),t),{});return{name:e,reducer:f(e,r,c),createMiddleware:n?y(e,n):(()=>t=>d=>d),actions:{...o,...s}}};exports.createReduxBlock=b;
2
+ //# sourceMappingURL=redux-sacala.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redux-sacala.cjs","sources":["../src/redux-sacala.ts"],"sourcesContent":["import { Dispatch, Action, Reducer, Middleware, AnyAction, MiddlewareAPI } from \"redux\";\n\ntype UnknownToUndefined<T> = unknown extends T ? undefined : T;\n\ntype FirstArgument<F> = F extends (arg1: infer U, ...args: any[]) => any ? UnknownToUndefined<U> : undefined;\ntype SecondArgument<F> = F extends (arg1: any, arg2: infer U, ...args: any[]) => any\n ? UnknownToUndefined<U>\n : undefined;\n\nconst bindAll = <T extends { [key: string]: Function }>(map: T): T => {\n const result = {} as any as T;\n for (const i in map) {\n result[i] = map[i].bind(map);\n }\n return result;\n};\n\nconst appendPrefix = <T>(prefix: string, map: { [key: string]: T }) => {\n const r: { [key: string]: any } = {};\n for (const i in map) {\n r[prefix + i] = map[i];\n }\n return r;\n};\n\n// Input\ntype ActionHandler<BlockState, Payload> = (state: BlockState, payload: Payload) => BlockState;\ntype ActionMap<BlockState> = { [action: string]: ActionHandler<BlockState, any> };\ntype EffectsMap<GlobalState, ExtraArgument> = (\n dispatch: Dispatch,\n getState: () => GlobalState,\n) => { [effect: string]: (payload: any, extraArgument: ExtraArgument) => any };\n\n// Output\ntype ActionCreator<Handler extends ActionHandler<any, any>> =\n undefined extends SecondArgument<Handler>\n ? () => Action<string>\n : (payload: SecondArgument<Handler>) => Action<string> & { payload: SecondArgument<Handler> };\n\ntype ActionCreatorMap<Actions extends ActionMap<any>> = {\n [name in keyof Actions]: ActionCreator<Actions[name]>;\n};\n\ntype EffectsCreatorMap<GlobalState, ExtraArgument, Map extends EffectsMap<GlobalState, ExtraArgument>> = {\n [key in keyof ReturnType<Map>]: undefined extends FirstArgument<ReturnType<Map>[key]>\n ? () => Action\n : (payload: FirstArgument<ReturnType<Map>[key]>) => Action;\n};\n\n// Transformation\nconst createActionCreator = (type: string) => (payload?: any) => (payload === undefined ? { type } : { type, payload });\nconst createEffectCreator = (type: string) => (payload: any) => ({ type, payload });\n\nconst createReducer = <BlockState>(prefix: string, initial: BlockState, actionMap: ActionMap<BlockState>): Reducer => {\n const actions: ActionMap<BlockState> = appendPrefix(prefix + \"/\", bindAll(actionMap));\n return (state: BlockState = initial, action?: AnyAction) => {\n if (action && action.type) {\n const handler: (state: BlockState, payload?: any) => BlockState = actions[action.type];\n if (handler) {\n return handler(state, action.payload);\n } else {\n return state;\n }\n } else {\n return state;\n }\n };\n};\n\ntype MiddlewareCreator<T> = T extends undefined ? () => Middleware : (argument: T) => Middleware;\n\nconst createMiddlewareCreator = <GlobalState, ExtraArgument>(\n prefix: string,\n effectsMap: EffectsMap<GlobalState, ExtraArgument>,\n): MiddlewareCreator<ExtraArgument> =>\n ((argument: ExtraArgument) => (store: MiddlewareAPI) => {\n const effects = appendPrefix(prefix + \"/\", bindAll(effectsMap(store.dispatch, store.getState)));\n return (next: Dispatch) => (action: Action<string> & { payload: any[] }) => {\n if (action && Object.prototype.hasOwnProperty.call(effects, action.type)) {\n effects[action.type](action.payload, argument);\n } else {\n next(action);\n }\n };\n }) as MiddlewareCreator<ExtraArgument>;\n\nconst fail = (): never => {\n throw new Error(\"Can't have access to 'dispatch' and 'getState' during initialization\");\n};\n\nexport const createReduxBlock =\n <GlobalState, ExtraArgument = undefined>() =>\n <\n Name extends keyof GlobalState & string,\n Actions extends ActionMap<GlobalState[Name]>,\n Effects extends EffectsMap<GlobalState, ExtraArgument>,\n >({\n name,\n initial,\n actions,\n effects,\n }: {\n name: Name;\n initial: GlobalState[Name];\n actions: Actions;\n effects?: Effects;\n }): {\n name: Name;\n reducer: Reducer<GlobalState[Name]>;\n actions: ActionCreatorMap<Actions> & EffectsCreatorMap<GlobalState, ExtraArgument, Effects>;\n } & ({} extends ReturnType<Effects> ? {} : { createMiddleware: MiddlewareCreator<ExtraArgument> }) => {\n const actionCreators = Object.keys(actions).reduce((r, key) => {\n r[key] = createActionCreator(`${name}/${key}`);\n return r;\n }, {} as any);\n const effectCreators = Object.keys(effects ? effects(fail, fail) : {}).reduce((r, key) => {\n r[key] = createEffectCreator(`${name}/${key}`);\n return r;\n }, {} as any);\n\n return {\n name,\n reducer: createReducer(name as string, initial, actions),\n createMiddleware: effects\n ? createMiddlewareCreator<GlobalState, ExtraArgument>(name as string, effects)\n : ((() => (_: MiddlewareAPI) => (next: Dispatch) => next) as MiddlewareCreator<ExtraArgument>),\n actions: {\n ...actionCreators,\n ...effectCreators,\n },\n };\n };\n"],"names":["bindAll","map","result","i","appendPrefix","prefix","r","createActionCreator","type","payload","createEffectCreator","createReducer","initial","actionMap","actions","state","action","handler","createMiddlewareCreator","effectsMap","argument","store","effects","next","fail","createReduxBlock","name","actionCreators","key","effectCreators","_"],"mappings":"gFASA,MAAMA,EAAkDC,GAAc,CAClE,MAAMC,EAAS,CAAA,EACf,UAAWC,KAAKF,EACZC,EAAOC,CAAC,EAAIF,EAAIE,CAAC,EAAE,KAAKF,CAAG,EAE/B,OAAOC,CACX,EAEME,EAAe,CAAIC,EAAgBJ,IAA8B,CACnE,MAAMK,EAA4B,CAAA,EAClC,UAAWH,KAAKF,EACZK,EAAED,EAASF,CAAC,EAAIF,EAAIE,CAAC,EAEzB,OAAOG,CACX,EA2BMC,EAAuBC,GAAkBC,GAAmBA,IAAY,OAAY,CAAE,KAAAD,CAAA,EAAS,CAAE,KAAAA,EAAM,QAAAC,CAAA,EACvGC,EAAuBF,GAAkBC,IAAkB,CAAE,KAAAD,EAAM,QAAAC,IAEnEE,EAAgB,CAAaN,EAAgBO,EAAqBC,IAA8C,CAClH,MAAMC,EAAiCV,EAAaC,EAAS,IAAKL,EAAQa,CAAS,CAAC,EACpF,MAAO,CAACE,EAAoBH,EAASI,IAAuB,CACxD,GAAIA,GAAUA,EAAO,KAAM,CACvB,MAAMC,EAA4DH,EAAQE,EAAO,IAAI,EACrF,OAAIC,EACOA,EAAQF,EAAOC,EAAO,OAAO,EAE7BD,CAEf,KACI,QAAOA,CAEf,CACJ,EAIMG,EAA0B,CAC5Bb,EACAc,KAEEC,GAA6BC,GAAyB,CACpD,MAAMC,EAAUlB,EAAaC,EAAS,IAAKL,EAAQmB,EAAWE,EAAM,SAAUA,EAAM,QAAQ,CAAC,CAAC,EAC9F,OAAQE,GAAoBP,GAAgD,CACpEA,GAAU,OAAO,UAAU,eAAe,KAAKM,EAASN,EAAO,IAAI,EACnEM,EAAQN,EAAO,IAAI,EAAEA,EAAO,QAASI,CAAQ,EAE7CG,EAAKP,CAAM,CAEnB,CACJ,GAEEQ,EAAO,IAAa,CACtB,MAAM,IAAI,MAAM,sEAAsE,CAC1F,EAEaC,EACT,IACA,CAIE,CACE,KAAAC,EACA,QAAAd,EACA,QAAAE,EACA,QAAAQ,CACJ,IASsG,CAClG,MAAMK,EAAiB,OAAO,KAAKb,CAAO,EAAE,OAAO,CAACR,EAAGsB,KACnDtB,EAAEsB,CAAG,EAAIrB,EAAoB,GAAGmB,CAAI,IAAIE,CAAG,EAAE,EACtCtB,GACR,CAAA,CAAS,EACNuB,EAAiB,OAAO,KAAKP,EAAUA,EAAQE,EAAMA,CAAI,EAAI,CAAA,CAAE,EAAE,OAAO,CAAClB,EAAGsB,KAC9EtB,EAAEsB,CAAG,EAAIlB,EAAoB,GAAGgB,CAAI,IAAIE,CAAG,EAAE,EACtCtB,GACR,CAAA,CAAS,EAEZ,MAAO,CACH,KAAAoB,EACA,QAASf,EAAce,EAAgBd,EAASE,CAAO,EACvD,iBAAkBQ,EACZJ,EAAoDQ,EAAgBJ,CAAO,GACzE,IAAOQ,GAAsBP,GAAmBA,GACxD,QAAS,CACL,GAAGI,EACH,GAAGE,CAAA,CACP,CAER"}
@@ -3,9 +3,9 @@ import { Dispatch } from 'redux';
3
3
  import { Middleware } from 'redux';
4
4
  import { Reducer } from 'redux';
5
5
 
6
- declare type ActionCreator<Handler extends ActionHandler<any, any>> = undefined extends SecondArgument<Handler> ? () => Action<string> : (payload: SecondArgument<Handler>) => (Action<string> & {
6
+ declare type ActionCreator<Handler extends ActionHandler<any, any>> = undefined extends SecondArgument<Handler> ? () => Action<string> : (payload: SecondArgument<Handler>) => Action<string> & {
7
7
  payload: SecondArgument<Handler>;
8
- });
8
+ };
9
9
 
10
10
  declare type ActionCreatorMap<Actions extends ActionMap<any>> = {
11
11
  [name in keyof Actions]: ActionCreator<Actions[name]>;
@@ -17,7 +17,7 @@ declare type ActionMap<BlockState> = {
17
17
  [action: string]: ActionHandler<BlockState, any>;
18
18
  };
19
19
 
20
- export declare function createReduxBlock<GlobalState, ExtraArgument = undefined>(): <Name extends (keyof GlobalState) & string, Actions extends ActionMap<GlobalState[Name]>, Effects extends EffectsMap<GlobalState, ExtraArgument>>({ name, initial, actions, effects }: {
20
+ export declare const createReduxBlock: <GlobalState, ExtraArgument = undefined>() => <Name extends keyof GlobalState & string, Actions extends ActionMap<GlobalState[Name]>, Effects extends EffectsMap<GlobalState, ExtraArgument>>({ name, initial, actions, effects, }: {
21
21
  name: Name;
22
22
  initial: GlobalState[Name];
23
23
  actions: Actions;
@@ -31,7 +31,7 @@ export declare function createReduxBlock<GlobalState, ExtraArgument = undefined>
31
31
  });
32
32
 
33
33
  declare type EffectsCreatorMap<GlobalState, ExtraArgument, Map extends EffectsMap<GlobalState, ExtraArgument>> = {
34
- [key in keyof ReturnType<Map>]: (undefined extends FirstArgument<ReturnType<Map>[key]> ? () => Action : (payload: FirstArgument<ReturnType<Map>[key]>) => Action);
34
+ [key in keyof ReturnType<Map>]: undefined extends FirstArgument<ReturnType<Map>[key]> ? () => Action : (payload: FirstArgument<ReturnType<Map>[key]>) => Action;
35
35
  };
36
36
 
37
37
  declare type EffectsMap<GlobalState, ExtraArgument> = (dispatch: Dispatch, getState: () => GlobalState) => {
@@ -1,56 +1,47 @@
1
- function f(e) {
1
+ const u = (e) => {
2
2
  const r = {};
3
- for (const t in e)
4
- r[t] = e[t].bind(e);
3
+ for (const c in e)
4
+ r[c] = e[c].bind(e);
5
5
  return r;
6
- }
7
- function a(e, r) {
8
- const t = {};
9
- for (const c in r)
10
- t[e + c] = r[c];
11
- return t;
12
- }
13
- function l(e) {
14
- return (r) => r === void 0 ? { type: e } : { type: e, payload: r };
15
- }
16
- function p(e) {
17
- return (r) => ({ type: e, payload: r });
18
- }
19
- function C(e, r, t) {
20
- const c = a(e + "/", f(t));
21
- return (n = r, u) => {
22
- if (u && u.type) {
23
- const o = c[u.type];
24
- return o ? o(n, u.payload) : n;
6
+ }, a = (e, r) => {
7
+ const c = {};
8
+ for (const n in r)
9
+ c[e + n] = r[n];
10
+ return c;
11
+ }, l = (e) => (r) => r === void 0 ? { type: e } : { type: e, payload: r }, p = (e) => (r) => ({ type: e, payload: r }), f = (e, r, c) => {
12
+ const n = a(e + "/", u(c));
13
+ return (o = r, s) => {
14
+ if (s && s.type) {
15
+ const t = n[s.type];
16
+ return t ? t(o, s.payload) : o;
25
17
  } else
26
- return n;
18
+ return o;
27
19
  };
28
- }
29
- function h(e, r) {
30
- return ((t) => (c) => {
31
- const n = a(e + "/", f(r(c.dispatch, c.getState)));
32
- return (u) => (o) => {
33
- o && n.hasOwnProperty(o.type) ? n[o.type](o.payload, t) : u(o);
34
- };
35
- });
36
- }
37
- function s() {
20
+ }, h = (e, r) => ((c) => (n) => {
21
+ const o = a(e + "/", u(r(n.dispatch, n.getState)));
22
+ return (s) => (t) => {
23
+ t && Object.prototype.hasOwnProperty.call(o, t.type) ? o[t.type](t.payload, c) : s(t);
24
+ };
25
+ }), i = () => {
38
26
  throw new Error("Can't have access to 'dispatch' and 'getState' during initialization");
39
- }
40
- function y() {
41
- return function({ name: r, initial: t, actions: c, effects: n }) {
42
- const u = Object.keys(c).reduce((d, i) => (d[i] = l(`${r}/${i}`), d), {}), o = Object.keys(n ? n(s, s) : {}).reduce((d, i) => (d[i] = p(`${r}/${i}`), d), {});
43
- return {
44
- name: r,
45
- reducer: C(r, t, c),
46
- createMiddleware: n ? h(r, n) : (() => ((d) => (i) => i)),
47
- actions: {
48
- ...u,
49
- ...o
50
- }
51
- };
27
+ }, y = () => ({
28
+ name: e,
29
+ initial: r,
30
+ actions: c,
31
+ effects: n
32
+ }) => {
33
+ const o = Object.keys(c).reduce((t, d) => (t[d] = l(`${e}/${d}`), t), {}), s = Object.keys(n ? n(i, i) : {}).reduce((t, d) => (t[d] = p(`${e}/${d}`), t), {});
34
+ return {
35
+ name: e,
36
+ reducer: f(e, r, c),
37
+ createMiddleware: n ? h(e, n) : (() => (t) => (d) => d),
38
+ actions: {
39
+ ...o,
40
+ ...s
41
+ }
52
42
  };
53
- }
43
+ };
54
44
  export {
55
45
  y as createReduxBlock
56
46
  };
47
+ //# sourceMappingURL=redux-sacala.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redux-sacala.js","sources":["../src/redux-sacala.ts"],"sourcesContent":["import { Dispatch, Action, Reducer, Middleware, AnyAction, MiddlewareAPI } from \"redux\";\n\ntype UnknownToUndefined<T> = unknown extends T ? undefined : T;\n\ntype FirstArgument<F> = F extends (arg1: infer U, ...args: any[]) => any ? UnknownToUndefined<U> : undefined;\ntype SecondArgument<F> = F extends (arg1: any, arg2: infer U, ...args: any[]) => any\n ? UnknownToUndefined<U>\n : undefined;\n\nconst bindAll = <T extends { [key: string]: Function }>(map: T): T => {\n const result = {} as any as T;\n for (const i in map) {\n result[i] = map[i].bind(map);\n }\n return result;\n};\n\nconst appendPrefix = <T>(prefix: string, map: { [key: string]: T }) => {\n const r: { [key: string]: any } = {};\n for (const i in map) {\n r[prefix + i] = map[i];\n }\n return r;\n};\n\n// Input\ntype ActionHandler<BlockState, Payload> = (state: BlockState, payload: Payload) => BlockState;\ntype ActionMap<BlockState> = { [action: string]: ActionHandler<BlockState, any> };\ntype EffectsMap<GlobalState, ExtraArgument> = (\n dispatch: Dispatch,\n getState: () => GlobalState,\n) => { [effect: string]: (payload: any, extraArgument: ExtraArgument) => any };\n\n// Output\ntype ActionCreator<Handler extends ActionHandler<any, any>> =\n undefined extends SecondArgument<Handler>\n ? () => Action<string>\n : (payload: SecondArgument<Handler>) => Action<string> & { payload: SecondArgument<Handler> };\n\ntype ActionCreatorMap<Actions extends ActionMap<any>> = {\n [name in keyof Actions]: ActionCreator<Actions[name]>;\n};\n\ntype EffectsCreatorMap<GlobalState, ExtraArgument, Map extends EffectsMap<GlobalState, ExtraArgument>> = {\n [key in keyof ReturnType<Map>]: undefined extends FirstArgument<ReturnType<Map>[key]>\n ? () => Action\n : (payload: FirstArgument<ReturnType<Map>[key]>) => Action;\n};\n\n// Transformation\nconst createActionCreator = (type: string) => (payload?: any) => (payload === undefined ? { type } : { type, payload });\nconst createEffectCreator = (type: string) => (payload: any) => ({ type, payload });\n\nconst createReducer = <BlockState>(prefix: string, initial: BlockState, actionMap: ActionMap<BlockState>): Reducer => {\n const actions: ActionMap<BlockState> = appendPrefix(prefix + \"/\", bindAll(actionMap));\n return (state: BlockState = initial, action?: AnyAction) => {\n if (action && action.type) {\n const handler: (state: BlockState, payload?: any) => BlockState = actions[action.type];\n if (handler) {\n return handler(state, action.payload);\n } else {\n return state;\n }\n } else {\n return state;\n }\n };\n};\n\ntype MiddlewareCreator<T> = T extends undefined ? () => Middleware : (argument: T) => Middleware;\n\nconst createMiddlewareCreator = <GlobalState, ExtraArgument>(\n prefix: string,\n effectsMap: EffectsMap<GlobalState, ExtraArgument>,\n): MiddlewareCreator<ExtraArgument> =>\n ((argument: ExtraArgument) => (store: MiddlewareAPI) => {\n const effects = appendPrefix(prefix + \"/\", bindAll(effectsMap(store.dispatch, store.getState)));\n return (next: Dispatch) => (action: Action<string> & { payload: any[] }) => {\n if (action && Object.prototype.hasOwnProperty.call(effects, action.type)) {\n effects[action.type](action.payload, argument);\n } else {\n next(action);\n }\n };\n }) as MiddlewareCreator<ExtraArgument>;\n\nconst fail = (): never => {\n throw new Error(\"Can't have access to 'dispatch' and 'getState' during initialization\");\n};\n\nexport const createReduxBlock =\n <GlobalState, ExtraArgument = undefined>() =>\n <\n Name extends keyof GlobalState & string,\n Actions extends ActionMap<GlobalState[Name]>,\n Effects extends EffectsMap<GlobalState, ExtraArgument>,\n >({\n name,\n initial,\n actions,\n effects,\n }: {\n name: Name;\n initial: GlobalState[Name];\n actions: Actions;\n effects?: Effects;\n }): {\n name: Name;\n reducer: Reducer<GlobalState[Name]>;\n actions: ActionCreatorMap<Actions> & EffectsCreatorMap<GlobalState, ExtraArgument, Effects>;\n } & ({} extends ReturnType<Effects> ? {} : { createMiddleware: MiddlewareCreator<ExtraArgument> }) => {\n const actionCreators = Object.keys(actions).reduce((r, key) => {\n r[key] = createActionCreator(`${name}/${key}`);\n return r;\n }, {} as any);\n const effectCreators = Object.keys(effects ? effects(fail, fail) : {}).reduce((r, key) => {\n r[key] = createEffectCreator(`${name}/${key}`);\n return r;\n }, {} as any);\n\n return {\n name,\n reducer: createReducer(name as string, initial, actions),\n createMiddleware: effects\n ? createMiddlewareCreator<GlobalState, ExtraArgument>(name as string, effects)\n : ((() => (_: MiddlewareAPI) => (next: Dispatch) => next) as MiddlewareCreator<ExtraArgument>),\n actions: {\n ...actionCreators,\n ...effectCreators,\n },\n };\n };\n"],"names":["bindAll","map","result","i","appendPrefix","prefix","r","createActionCreator","type","payload","createEffectCreator","createReducer","initial","actionMap","actions","state","action","handler","createMiddlewareCreator","effectsMap","argument","store","effects","next","fail","createReduxBlock","name","actionCreators","key","effectCreators","_"],"mappings":"AASA,MAAMA,IAAU,CAAwCC,MAAc;AAClE,QAAMC,IAAS,CAAA;AACf,aAAWC,KAAKF;AACZ,IAAAC,EAAOC,CAAC,IAAIF,EAAIE,CAAC,EAAE,KAAKF,CAAG;AAE/B,SAAOC;AACX,GAEME,IAAe,CAAIC,GAAgBJ,MAA8B;AACnE,QAAMK,IAA4B,CAAA;AAClC,aAAWH,KAAKF;AACZ,IAAAK,EAAED,IAASF,CAAC,IAAIF,EAAIE,CAAC;AAEzB,SAAOG;AACX,GA2BMC,IAAsB,CAACC,MAAiB,CAACC,MAAmBA,MAAY,SAAY,EAAE,MAAAD,EAAA,IAAS,EAAE,MAAAA,GAAM,SAAAC,EAAA,GACvGC,IAAsB,CAACF,MAAiB,CAACC,OAAkB,EAAE,MAAAD,GAAM,SAAAC,MAEnEE,IAAgB,CAAaN,GAAgBO,GAAqBC,MAA8C;AAClH,QAAMC,IAAiCV,EAAaC,IAAS,KAAKL,EAAQa,CAAS,CAAC;AACpF,SAAO,CAACE,IAAoBH,GAASI,MAAuB;AACxD,QAAIA,KAAUA,EAAO,MAAM;AACvB,YAAMC,IAA4DH,EAAQE,EAAO,IAAI;AACrF,aAAIC,IACOA,EAAQF,GAAOC,EAAO,OAAO,IAE7BD;AAAA,IAEf;AACI,aAAOA;AAAA,EAEf;AACJ,GAIMG,IAA0B,CAC5Bb,GACAc,OAEC,CAACC,MAA4B,CAACC,MAAyB;AACpD,QAAMC,IAAUlB,EAAaC,IAAS,KAAKL,EAAQmB,EAAWE,EAAM,UAAUA,EAAM,QAAQ,CAAC,CAAC;AAC9F,SAAO,CAACE,MAAmB,CAACP,MAAgD;AACxE,IAAIA,KAAU,OAAO,UAAU,eAAe,KAAKM,GAASN,EAAO,IAAI,IACnEM,EAAQN,EAAO,IAAI,EAAEA,EAAO,SAASI,CAAQ,IAE7CG,EAAKP,CAAM;AAAA,EAEnB;AACJ,IAEEQ,IAAO,MAAa;AACtB,QAAM,IAAI,MAAM,sEAAsE;AAC1F,GAEaC,IACT,MACA,CAIE;AAAA,EACE,MAAAC;AAAA,EACA,SAAAd;AAAA,EACA,SAAAE;AAAA,EACA,SAAAQ;AACJ,MASsG;AAClG,QAAMK,IAAiB,OAAO,KAAKb,CAAO,EAAE,OAAO,CAACR,GAAGsB,OACnDtB,EAAEsB,CAAG,IAAIrB,EAAoB,GAAGmB,CAAI,IAAIE,CAAG,EAAE,GACtCtB,IACR,CAAA,CAAS,GACNuB,IAAiB,OAAO,KAAKP,IAAUA,EAAQE,GAAMA,CAAI,IAAI,CAAA,CAAE,EAAE,OAAO,CAAClB,GAAGsB,OAC9EtB,EAAEsB,CAAG,IAAIlB,EAAoB,GAAGgB,CAAI,IAAIE,CAAG,EAAE,GACtCtB,IACR,CAAA,CAAS;AAEZ,SAAO;AAAA,IACH,MAAAoB;AAAA,IACA,SAASf,EAAce,GAAgBd,GAASE,CAAO;AAAA,IACvD,kBAAkBQ,IACZJ,EAAoDQ,GAAgBJ,CAAO,KACzE,MAAM,CAACQ,MAAqB,CAACP,MAAmBA;AAAA,IACxD,SAAS;AAAA,MACL,GAAGI;AAAA,MACH,GAAGE;AAAA,IAAA;AAAA,EACP;AAER;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "redux-sacala",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "author": {
6
6
  "name": "Andrey Monkin",
@@ -1,6 +0,0 @@
1
- <component name="InspectionProjectProfileManager">
2
- <profile version="1.0">
3
- <option name="myName" value="Project Default" />
4
- <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
- </profile>
6
- </component>
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="EslintConfiguration">
4
- <option name="fix-on-save" value="true" />
5
- </component>
6
- </project>
package/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/redux-sacala.iml" filepath="$PROJECT_DIR$/.idea/redux-sacala.iml" />
6
- </modules>
7
- </component>
8
- </project>
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="PrettierConfiguration">
4
- <option name="myConfigurationMode" value="AUTOMATIC" />
5
- <option name="myRunOnSave" value="true" />
6
- </component>
7
- </project>
@@ -1,13 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="WEB_MODULE" version="4">
3
- <component name="NewModuleRootManager">
4
- <content url="file://$MODULE_DIR$">
5
- <excludeFolder url="file://$MODULE_DIR$/temp" />
6
- <excludeFolder url="file://$MODULE_DIR$/.tmp" />
7
- <excludeFolder url="file://$MODULE_DIR$/tmp" />
8
- <excludeFolder url="file://$MODULE_DIR$/build" />
9
- </content>
10
- <orderEntry type="inheritedJdk" />
11
- <orderEntry type="sourceFolder" forTests="false" />
12
- </component>
13
- </module>
package/.idea/vcs.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="" vcs="Git" />
5
- </component>
6
- </project>
@@ -1,14 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="WebResourcesPaths">
4
- <contentEntries>
5
- <entry url="file://$PROJECT_DIR$">
6
- <entryData>
7
- <resourceRoots>
8
- <path value="file://$PROJECT_DIR$/src" />
9
- </resourceRoots>
10
- </entryData>
11
- </entry>
12
- </contentEntries>
13
- </component>
14
- </project>
package/.prettierignore DELETED
@@ -1,5 +0,0 @@
1
- node_modules
2
- build
3
- dist
4
- coverage
5
- package-lock.json
package/.prettierrc DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "tabWidth": 4,
3
- "useTabs": false,
4
- "semi": true,
5
- "singleQuote": false,
6
- "trailingComma": "all",
7
- "printWidth": 120
8
- }
package/eslint.config.js DELETED
@@ -1,23 +0,0 @@
1
- import eslint from "@eslint/js";
2
- import tseslint from "typescript-eslint";
3
- import prettierConfig from "eslint-config-prettier";
4
-
5
- export default tseslint.config(
6
- eslint.configs.recommended,
7
- ...tseslint.configs.recommended,
8
- prettierConfig,
9
- {
10
- rules: {
11
- "prefer-arrow-callback": "error",
12
- "arrow-body-style": ["error", "as-needed"],
13
- "func-style": ["error", "expression", { allowArrowFunctions: true }],
14
- "@typescript-eslint/no-explicit-any": "off",
15
- "@typescript-eslint/no-unsafe-function-type": "off",
16
- "@typescript-eslint/no-empty-object-type": "off",
17
- "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
18
- },
19
- },
20
- {
21
- ignores: ["build/", "node_modules/", "coverage/"],
22
- },
23
- );
@@ -1,55 +0,0 @@
1
- import { applyMiddleware, combineReducers, createStore } from "redux";
2
- import { createReduxBlock } from "./redux-sacala";
3
-
4
- interface LocalState {
5
- count: number;
6
- }
7
-
8
- interface MyState {
9
- local: LocalState;
10
- }
11
-
12
- const {
13
- actions: local,
14
- reducer: localReducer,
15
- createMiddleware: createLocalMiddleware,
16
- } = createReduxBlock<MyState, number>()({
17
- name: "local",
18
- initial: { count: 0 },
19
- actions: {
20
- inc(state) {
21
- return { count: state.count + 1 };
22
- },
23
- set(_, count: number) {
24
- return { count };
25
- },
26
- },
27
- effects: (dispatch) => ({
28
- incEffect() {
29
- dispatch(local.inc());
30
- },
31
- }),
32
- });
33
-
34
- const createMyStore = () =>
35
- createStore(
36
- combineReducers({
37
- local: localReducer,
38
- }),
39
- applyMiddleware(createLocalMiddleware(100)),
40
- );
41
-
42
- describe("Store with reducer and middleware", () => {
43
- it("Should be updated on action without payload", () => {
44
- const store = createMyStore();
45
- store.dispatch(local.inc());
46
- store.dispatch(local.inc());
47
- expect(store.getState()).toEqual({ local: { count: 2 } });
48
- });
49
-
50
- it("Should be updated on action with payload", () => {
51
- const store = createMyStore();
52
- store.dispatch(local.set(12));
53
- expect(store.getState()).toEqual({ local: { count: 12 } });
54
- });
55
- });
@@ -1,132 +0,0 @@
1
- import { Dispatch, Action, Reducer, Middleware, AnyAction, MiddlewareAPI } from "redux";
2
-
3
- type UnknownToUndefined<T> = unknown extends T ? undefined : T;
4
-
5
- type FirstArgument<F> = F extends (arg1: infer U, ...args: any[]) => any ? UnknownToUndefined<U> : undefined;
6
- type SecondArgument<F> = F extends (arg1: any, arg2: infer U, ...args: any[]) => any
7
- ? UnknownToUndefined<U>
8
- : undefined;
9
-
10
- const bindAll = <T extends { [key: string]: Function }>(map: T): T => {
11
- const result = {} as any as T;
12
- for (const i in map) {
13
- result[i] = map[i].bind(map);
14
- }
15
- return result;
16
- };
17
-
18
- const appendPrefix = <T>(prefix: string, map: { [key: string]: T }) => {
19
- const r: { [key: string]: any } = {};
20
- for (const i in map) {
21
- r[prefix + i] = map[i];
22
- }
23
- return r;
24
- };
25
-
26
- // Input
27
- type ActionHandler<BlockState, Payload> = (state: BlockState, payload: Payload) => BlockState;
28
- type ActionMap<BlockState> = { [action: string]: ActionHandler<BlockState, any> };
29
- type EffectsMap<GlobalState, ExtraArgument> = (
30
- dispatch: Dispatch,
31
- getState: () => GlobalState,
32
- ) => { [effect: string]: (payload: any, extraArgument: ExtraArgument) => any };
33
-
34
- // Output
35
- type ActionCreator<Handler extends ActionHandler<any, any>> =
36
- undefined extends SecondArgument<Handler>
37
- ? () => Action<string>
38
- : (payload: SecondArgument<Handler>) => Action<string> & { payload: SecondArgument<Handler> };
39
-
40
- type ActionCreatorMap<Actions extends ActionMap<any>> = {
41
- [name in keyof Actions]: ActionCreator<Actions[name]>;
42
- };
43
-
44
- type EffectsCreatorMap<GlobalState, ExtraArgument, Map extends EffectsMap<GlobalState, ExtraArgument>> = {
45
- [key in keyof ReturnType<Map>]: undefined extends FirstArgument<ReturnType<Map>[key]>
46
- ? () => Action
47
- : (payload: FirstArgument<ReturnType<Map>[key]>) => Action;
48
- };
49
-
50
- // Transformation
51
- const createActionCreator = (type: string) => (payload?: any) => (payload === undefined ? { type } : { type, payload });
52
- const createEffectCreator = (type: string) => (payload: any) => ({ type, payload });
53
-
54
- const createReducer = <BlockState>(prefix: string, initial: BlockState, actionMap: ActionMap<BlockState>): Reducer => {
55
- const actions: ActionMap<BlockState> = appendPrefix(prefix + "/", bindAll(actionMap));
56
- return (state: BlockState = initial, action?: AnyAction) => {
57
- if (action && action.type) {
58
- const handler: (state: BlockState, payload?: any) => BlockState = actions[action.type];
59
- if (handler) {
60
- return handler(state, action.payload);
61
- } else {
62
- return state;
63
- }
64
- } else {
65
- return state;
66
- }
67
- };
68
- };
69
-
70
- type MiddlewareCreator<T> = T extends undefined ? () => Middleware : (argument: T) => Middleware;
71
-
72
- const createMiddlewareCreator = <GlobalState, ExtraArgument>(
73
- prefix: string,
74
- effectsMap: EffectsMap<GlobalState, ExtraArgument>,
75
- ): MiddlewareCreator<ExtraArgument> =>
76
- ((argument: ExtraArgument) => (store: MiddlewareAPI) => {
77
- const effects = appendPrefix(prefix + "/", bindAll(effectsMap(store.dispatch, store.getState)));
78
- return (next: Dispatch) => (action: Action<string> & { payload: any[] }) => {
79
- if (action && Object.prototype.hasOwnProperty.call(effects, action.type)) {
80
- effects[action.type](action.payload, argument);
81
- } else {
82
- next(action);
83
- }
84
- };
85
- }) as MiddlewareCreator<ExtraArgument>;
86
-
87
- const fail = (): never => {
88
- throw new Error("Can't have access to 'dispatch' and 'getState' during initialization");
89
- };
90
-
91
- export const createReduxBlock =
92
- <GlobalState, ExtraArgument = undefined>() =>
93
- <
94
- Name extends keyof GlobalState & string,
95
- Actions extends ActionMap<GlobalState[Name]>,
96
- Effects extends EffectsMap<GlobalState, ExtraArgument>,
97
- >({
98
- name,
99
- initial,
100
- actions,
101
- effects,
102
- }: {
103
- name: Name;
104
- initial: GlobalState[Name];
105
- actions: Actions;
106
- effects?: Effects;
107
- }): {
108
- name: Name;
109
- reducer: Reducer<GlobalState[Name]>;
110
- actions: ActionCreatorMap<Actions> & EffectsCreatorMap<GlobalState, ExtraArgument, Effects>;
111
- } & ({} extends ReturnType<Effects> ? {} : { createMiddleware: MiddlewareCreator<ExtraArgument> }) => {
112
- const actionCreators = Object.keys(actions).reduce((r, key) => {
113
- r[key] = createActionCreator(`${name}/${key}`);
114
- return r;
115
- }, {} as any);
116
- const effectCreators = Object.keys(effects ? effects(fail, fail) : {}).reduce((r, key) => {
117
- r[key] = createEffectCreator(`${name}/${key}`);
118
- return r;
119
- }, {} as any);
120
-
121
- return {
122
- name,
123
- reducer: createReducer(name as string, initial, actions),
124
- createMiddleware: effects
125
- ? createMiddlewareCreator<GlobalState, ExtraArgument>(name as string, effects)
126
- : ((() => (_: MiddlewareAPI) => (next: Dispatch) => next) as MiddlewareCreator<ExtraArgument>),
127
- actions: {
128
- ...actionCreators,
129
- ...effectCreators,
130
- },
131
- };
132
- };
package/tsconfig.json DELETED
@@ -1,14 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "strict": true,
4
- "noImplicitAny": true,
5
- "moduleResolution": "bundler",
6
- "module": "ESNext",
7
- "outDir": "build",
8
- "sourceMap": true,
9
- "declaration": true,
10
- "target": "ESNext",
11
- "types": ["vitest/globals"]
12
- },
13
- "include": ["src/*.ts"]
14
- }
package/vite.config.ts DELETED
@@ -1,29 +0,0 @@
1
- import { defineConfig } from "vitest/config";
2
- import dts from "vite-plugin-dts";
3
- import { resolve } from "path";
4
-
5
- export default defineConfig({
6
- build: {
7
- lib: {
8
- entry: resolve(__dirname, "src/redux-sacala.ts"),
9
- name: "ReduxSacala",
10
- fileName: "redux-sacala",
11
- formats: ["es", "cjs"],
12
- },
13
- outDir: "build",
14
- rollupOptions: {
15
- external: ["redux"],
16
- output: {
17
- globals: {
18
- redux: "Redux",
19
- },
20
- },
21
- },
22
- },
23
- plugins: [dts({ rollupTypes: true })],
24
- test: {
25
- globals: true,
26
- environment: "node",
27
- exclude: ["**/node_modules/**", "**/build/**"],
28
- },
29
- });