+21
| MIT License | ||
| Copyright (c) 2019 forsigner | ||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
| The above copyright notice and this permission notice shall be included in all | ||
| copies or substantial portions of the Software. | ||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| SOFTWARE. |
@@ -1,1 +0,1 @@ | ||
| export declare function getState<S = any>(key: string): S | null; | ||
| export declare function getState<S = any>(key: string): S; |
@@ -154,5 +154,6 @@ 'use strict'; | ||
| var undefined_as_any = undefined; | ||
| function getState(key) { | ||
| var store = Storage.get(key); | ||
| return store ? store.state : null; | ||
| return store ? store.state : undefined_as_any; | ||
| } | ||
@@ -163,3 +164,3 @@ | ||
| if (store) { | ||
| if (store && store.setState) { | ||
| store.setState(key, value); | ||
@@ -166,0 +167,0 @@ } else { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"stook.cjs.development.js","sources":["../src/Storage.ts","../src/emitter.ts","../src/Store.ts","../src/createUseStore.ts","../src/useStore.ts","../src/getState.ts","../src/mutate.ts"],"sourcesContent":["import { Store } from './Store'\n\ninterface Stores {\n [key: string]: Store\n}\n\n/**\n * Storage for anything\n */\nexport class Storage {\n static stores: Stores = {}\n static set(key: string, value: Store) {\n const store = Storage.stores[key]\n if (!store || !store.setState) {\n Storage.stores[key] = value\n }\n }\n\n static get<S = any>(key: string): Store<S> {\n return Storage.stores[key]\n }\n}\n","import mitt from 'mitt'\n\ninterface Data {\n key: any\n nextState: any\n}\n\nexport const emitter = mitt()\n\nexport const STORE_INITED = 'STORE_INITED'\n\nexport const STORE_UPDATED = 'STORE_UPDATED'\n\nexport function emitStoreInit(key: any) {\n emitter.emit(STORE_INITED, key)\n}\n\nexport function emitStoreUpdate(data: Data) {\n emitter.emit(STORE_UPDATED, data)\n}\n\nexport function onStoreInit(cb: (data: string) => void) {\n emitter.on(STORE_INITED, key => {\n cb(key)\n })\n}\n\nexport function onStoreUpdate(cb: (data: Data) => void) {\n emitter.on(STORE_UPDATED, data => {\n cb(data)\n })\n}\n","import { produce } from 'immer'\nimport { Dispatch, SetStateAction } from './types'\nimport { emitStoreUpdate } from './emitter'\n\n/**\n * store for one key\n */\nexport class Store<S = any> {\n state: S\n setters: Dispatch<SetStateAction<S>>[] = []\n constructor(value: any) {\n this.state = value\n }\n\n private getNextState(value: any): any {\n let nextState: any\n\n // not function\n if (typeof value !== 'function') return value\n\n // can not use immer\n if (typeof this.state !== 'object') return value()\n\n let useImmer = true\n\n const immerState = produce(this.state, draft => {\n const fnValue = value(draft)\n\n // use function return value\n if (fnValue && typeof fnValue === 'object') {\n nextState = fnValue\n useImmer = false\n }\n })\n\n if (useImmer) {\n nextState = immerState\n }\n\n return nextState\n }\n\n setState = (key: any, value: any): any => {\n const nextState = this.getNextState(value)\n\n emitStoreUpdate({ key, nextState })\n\n this.state = nextState\n this.setters.forEach(setter => setter(nextState))\n }\n}\n","import isEqual from 'react-fast-compare'\nimport { Storage } from './Storage'\nimport { Store } from './Store'\nimport { Dispatch, Action } from './types'\n\nimport { emitStoreInit } from './emitter'\n\nexport function createUseStore(useState: any, useEffect: any, useRef: any) {\n return function useStore<S = any>(key: string, value?: S): [S, Dispatch<Action<S>>] {\n const storageStore = Storage.get(key)\n const initalValue = storageStore ? storageStore.state : value\n const { current: initialState } = useRef(initalValue)\n\n // check multi init\n if (!isEqual(initialState, value) && value !== undefined) {\n // TODO: mybe should show tip\n // const initialStateString = JSON.stringify(initialState)\n // const error = new Error(\n // `[stook]: store ${key} is inited with ${initialStateString}, initialState is unnecessary`,\n // )\n // console.warn(error)\n }\n\n Storage.set(key, new Store<S>(initialState))\n\n const newStore = Storage.get(key)\n const [state, set] = useState(initialState)\n const { setters } = newStore\n\n useEffect(() => {\n setters.push(set)\n\n emitStoreInit(key)\n\n return () => {\n setters.splice(setters.indexOf(set), 1)\n }\n }, [])\n\n function act(key: any): Dispatch<Action<S>> {\n return (value: any) => {\n return newStore.setState(key, value)\n }\n }\n\n return [state, act(key)]\n }\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { createUseStore } from './createUseStore'\n\nexport const useStore = createUseStore(useState, useEffect, useRef)\n","import { Storage } from './Storage'\n\nexport function getState<S = any>(key: string) {\n const store = Storage.get<S>(key)\n return store ? store.state : null\n}\n","import { Storage } from './Storage'\n\nexport function mutate<S>(key: string, value?: S) {\n const store = Storage.get(key)\n\n if (store) {\n store.setState(key, value)\n } else {\n // init state, if no store exist\n Storage.set(key, { state: value } as any)\n }\n}\n"],"names":["Storage","set","key","value","store","stores","setState","get","emitter","mitt","STORE_INITED","STORE_UPDATED","emitStoreInit","emit","emitStoreUpdate","data","onStoreInit","cb","on","onStoreUpdate","Store","nextState","getNextState","state","setters","forEach","setter","useImmer","immerState","produce","draft","fnValue","createUseStore","useState","useEffect","useRef","useStore","storageStore","initalValue","initialState","current","isEqual","undefined","newStore","push","splice","indexOf","act","getState","mutate"],"mappings":"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"} | ||
| {"version":3,"file":"stook.cjs.development.js","sources":["../src/Storage.ts","../src/emitter.ts","../src/Store.ts","../src/createUseStore.ts","../src/useStore.ts","../src/getState.ts","../src/mutate.ts"],"sourcesContent":["import { Store } from './Store'\n\ninterface Stores {\n [key: string]: Store\n}\n\n/**\n * Storage for anything\n */\nexport class Storage {\n static stores: Stores = {}\n static set(key: string, value: Store) {\n const store = Storage.stores[key]\n if (!store || !store.setState) {\n Storage.stores[key] = value\n }\n }\n\n static get<S = any>(key: string): Store<S> {\n return Storage.stores[key]\n }\n}\n","import mitt from 'mitt'\n\ninterface Data {\n key: any\n nextState: any\n}\n\nexport const emitter = mitt()\n\nexport const STORE_INITED = 'STORE_INITED'\n\nexport const STORE_UPDATED = 'STORE_UPDATED'\n\nexport function emitStoreInit(key: any) {\n emitter.emit(STORE_INITED, key)\n}\n\nexport function emitStoreUpdate(data: Data) {\n emitter.emit(STORE_UPDATED, data)\n}\n\nexport function onStoreInit(cb: (data: string) => void) {\n emitter.on(STORE_INITED, key => {\n cb(key)\n })\n}\n\nexport function onStoreUpdate(cb: (data: Data) => void) {\n emitter.on(STORE_UPDATED, data => {\n cb(data)\n })\n}\n","import { produce } from 'immer'\nimport { Dispatch, SetStateAction } from './types'\nimport { emitStoreUpdate } from './emitter'\n\n/**\n * store for one key\n */\nexport class Store<S = any> {\n state: S\n setters: Dispatch<SetStateAction<S>>[] = []\n constructor(value: any) {\n this.state = value\n }\n\n private getNextState(value: any): any {\n let nextState: any\n\n // not function\n if (typeof value !== 'function') return value\n\n // can not use immer\n if (typeof this.state !== 'object') return value()\n\n let useImmer = true\n\n const immerState = produce(this.state, draft => {\n const fnValue = value(draft)\n\n // use function return value\n if (fnValue && typeof fnValue === 'object') {\n nextState = fnValue\n useImmer = false\n }\n })\n\n if (useImmer) {\n nextState = immerState\n }\n\n return nextState\n }\n\n setState = (key: any, value: any): any => {\n const nextState = this.getNextState(value)\n\n emitStoreUpdate({ key, nextState })\n\n this.state = nextState\n this.setters.forEach(setter => setter(nextState))\n }\n}\n","import isEqual from 'react-fast-compare'\nimport { Storage } from './Storage'\nimport { Store } from './Store'\nimport { Dispatch, Action } from './types'\n\nimport { emitStoreInit } from './emitter'\n\nexport function createUseStore(useState: any, useEffect: any, useRef: any) {\n return function useStore<S = any>(key: string, value?: S): [S, Dispatch<Action<S>>] {\n const storageStore = Storage.get(key)\n const initalValue = storageStore ? storageStore.state : value\n const { current: initialState } = useRef(initalValue)\n\n // check multi init\n if (!isEqual(initialState, value) && value !== undefined) {\n // TODO: mybe should show tip\n // const initialStateString = JSON.stringify(initialState)\n // const error = new Error(\n // `[stook]: store ${key} is inited with ${initialStateString}, initialState is unnecessary`,\n // )\n // console.warn(error)\n }\n\n Storage.set(key, new Store<S>(initialState))\n\n const newStore = Storage.get(key)\n const [state, set] = useState(initialState)\n const { setters } = newStore\n\n useEffect(() => {\n setters.push(set)\n\n emitStoreInit(key)\n\n return () => {\n setters.splice(setters.indexOf(set), 1)\n }\n }, [])\n\n function act(key: any): Dispatch<Action<S>> {\n return (value: any) => {\n return newStore.setState(key, value)\n }\n }\n\n return [state, act(key)]\n }\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { createUseStore } from './createUseStore'\n\nexport const useStore = createUseStore(useState, useEffect, useRef)\n","import { Storage } from './Storage'\n\nconst undefined_as_any: any = undefined\n\nexport function getState<S = any>(key: string): S {\n const store = Storage.get<S>(key)\n return store ? store.state : undefined_as_any\n}\n","import { Storage } from './Storage'\n\nexport function mutate<S>(key: string, value?: S) {\n const store = Storage.get(key)\n\n if (store && store.setState) {\n store.setState(key, value)\n } else {\n // init state, if no store exist\n Storage.set(key, { state: value } as any)\n }\n}\n"],"names":["Storage","set","key","value","store","stores","setState","get","emitter","mitt","STORE_INITED","STORE_UPDATED","emitStoreInit","emit","emitStoreUpdate","data","onStoreInit","cb","on","onStoreUpdate","Store","nextState","getNextState","state","setters","forEach","setter","useImmer","immerState","produce","draft","fnValue","createUseStore","useState","useEffect","useRef","useStore","storageStore","initalValue","initialState","current","isEqual","undefined","newStore","push","splice","indexOf","act","undefined_as_any","getState","mutate"],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}var e=require("react"),r=t(require("react-fast-compare")),n=require("immer"),o=t(require("mitt")),u=function(){function t(){}return t.set=function(e,r){var n=t.stores[e];n&&n.setState||(t.stores[e]=r)},t.get=function(e){return t.stores[e]},t}();u.stores={};var s=o(),i="STORE_INITED",a="STORE_UPDATED",f=function(){function t(t){var e=this;this.setters=[],this.setState=function(t,r){var n=e.getNextState(r);s.emit(a,{key:t,nextState:n}),e.state=n,e.setters.forEach((function(t){return t(n)}))},this.state=t}return t.prototype.getNextState=function(t){var e;if("function"!=typeof t)return t;if("object"!=typeof this.state)return t();var r=!0,o=n.produce(this.state,(function(n){var o=t(n);o&&"object"==typeof o&&(e=o,r=!1)}));return r&&(e=o),e},t}();function c(t,e,n){return function(o,a){var c=u.get(o),p=n(c?c.state:a).current;r(p,a),u.set(o,new f(p));var S=u.get(o),v=t(p),x=v[0],g=v[1],h=S.setters;return e((function(){return h.push(g),function(t){s.emit(i,t)}(o),function(){h.splice(h.indexOf(g),1)}}),[]),[x,function(t){return function(e){return S.setState(t,e)}}(o)]}}var p=c(e.useState,e.useEffect,e.useRef);exports.Storage=u,exports.createUseStore=c,exports.getState=function(t){var e=u.get(t);return e?e.state:null},exports.mutate=function(t,e){var r=u.get(t);r?r.setState(t,e):u.set(t,{state:e})},exports.onStoreInit=function(t){s.on(i,(function(e){t(e)}))},exports.onStoreUpdate=function(t){s.on(a,(function(e){t(e)}))},exports.useStore=p; | ||
| "use strict";function t(t){return t&&"object"==typeof t&&"default"in t?t.default:t}var e=require("react"),r=t(require("react-fast-compare")),n=require("immer"),o=t(require("mitt")),u=function(){function t(){}return t.set=function(e,r){var n=t.stores[e];n&&n.setState||(t.stores[e]=r)},t.get=function(e){return t.stores[e]},t}();u.stores={};var s=o(),i="STORE_INITED",a="STORE_UPDATED",f=function(){function t(t){var e=this;this.setters=[],this.setState=function(t,r){var n=e.getNextState(r);s.emit(a,{key:t,nextState:n}),e.state=n,e.setters.forEach((function(t){return t(n)}))},this.state=t}return t.prototype.getNextState=function(t){var e;if("function"!=typeof t)return t;if("object"!=typeof this.state)return t();var r=!0,o=n.produce(this.state,(function(n){var o=t(n);o&&"object"==typeof o&&(e=o,r=!1)}));return r&&(e=o),e},t}();function c(t,e,n){return function(o,a){var c=u.get(o),p=n(c?c.state:a).current;r(p,a),u.set(o,new f(p));var S=u.get(o),v=t(p),x=v[0],g=v[1],h=S.setters;return e((function(){return h.push(g),function(t){s.emit(i,t)}(o),function(){h.splice(h.indexOf(g),1)}}),[]),[x,function(t){return function(e){return S.setState(t,e)}}(o)]}}var p=c(e.useState,e.useEffect,e.useRef);exports.Storage=u,exports.createUseStore=c,exports.getState=function(t){var e=u.get(t);return e?e.state:void 0},exports.mutate=function(t,e){var r=u.get(t);r&&r.setState?r.setState(t,e):u.set(t,{state:e})},exports.onStoreInit=function(t){s.on(i,(function(e){t(e)}))},exports.onStoreUpdate=function(t){s.on(a,(function(e){t(e)}))},exports.useStore=p; | ||
| //# sourceMappingURL=stook.cjs.production.min.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"stook.cjs.production.min.js","sources":["../src/Storage.ts","../src/emitter.ts","../src/Store.ts","../src/createUseStore.ts","../src/useStore.ts","../src/getState.ts","../src/mutate.ts"],"sourcesContent":["import { Store } from './Store'\n\ninterface Stores {\n [key: string]: Store\n}\n\n/**\n * Storage for anything\n */\nexport class Storage {\n static stores: Stores = {}\n static set(key: string, value: Store) {\n const store = Storage.stores[key]\n if (!store || !store.setState) {\n Storage.stores[key] = value\n }\n }\n\n static get<S = any>(key: string): Store<S> {\n return Storage.stores[key]\n }\n}\n","import mitt from 'mitt'\n\ninterface Data {\n key: any\n nextState: any\n}\n\nexport const emitter = mitt()\n\nexport const STORE_INITED = 'STORE_INITED'\n\nexport const STORE_UPDATED = 'STORE_UPDATED'\n\nexport function emitStoreInit(key: any) {\n emitter.emit(STORE_INITED, key)\n}\n\nexport function emitStoreUpdate(data: Data) {\n emitter.emit(STORE_UPDATED, data)\n}\n\nexport function onStoreInit(cb: (data: string) => void) {\n emitter.on(STORE_INITED, key => {\n cb(key)\n })\n}\n\nexport function onStoreUpdate(cb: (data: Data) => void) {\n emitter.on(STORE_UPDATED, data => {\n cb(data)\n })\n}\n","import { produce } from 'immer'\nimport { Dispatch, SetStateAction } from './types'\nimport { emitStoreUpdate } from './emitter'\n\n/**\n * store for one key\n */\nexport class Store<S = any> {\n state: S\n setters: Dispatch<SetStateAction<S>>[] = []\n constructor(value: any) {\n this.state = value\n }\n\n private getNextState(value: any): any {\n let nextState: any\n\n // not function\n if (typeof value !== 'function') return value\n\n // can not use immer\n if (typeof this.state !== 'object') return value()\n\n let useImmer = true\n\n const immerState = produce(this.state, draft => {\n const fnValue = value(draft)\n\n // use function return value\n if (fnValue && typeof fnValue === 'object') {\n nextState = fnValue\n useImmer = false\n }\n })\n\n if (useImmer) {\n nextState = immerState\n }\n\n return nextState\n }\n\n setState = (key: any, value: any): any => {\n const nextState = this.getNextState(value)\n\n emitStoreUpdate({ key, nextState })\n\n this.state = nextState\n this.setters.forEach(setter => setter(nextState))\n }\n}\n","import isEqual from 'react-fast-compare'\nimport { Storage } from './Storage'\nimport { Store } from './Store'\nimport { Dispatch, Action } from './types'\n\nimport { emitStoreInit } from './emitter'\n\nexport function createUseStore(useState: any, useEffect: any, useRef: any) {\n return function useStore<S = any>(key: string, value?: S): [S, Dispatch<Action<S>>] {\n const storageStore = Storage.get(key)\n const initalValue = storageStore ? storageStore.state : value\n const { current: initialState } = useRef(initalValue)\n\n // check multi init\n if (!isEqual(initialState, value) && value !== undefined) {\n // TODO: mybe should show tip\n // const initialStateString = JSON.stringify(initialState)\n // const error = new Error(\n // `[stook]: store ${key} is inited with ${initialStateString}, initialState is unnecessary`,\n // )\n // console.warn(error)\n }\n\n Storage.set(key, new Store<S>(initialState))\n\n const newStore = Storage.get(key)\n const [state, set] = useState(initialState)\n const { setters } = newStore\n\n useEffect(() => {\n setters.push(set)\n\n emitStoreInit(key)\n\n return () => {\n setters.splice(setters.indexOf(set), 1)\n }\n }, [])\n\n function act(key: any): Dispatch<Action<S>> {\n return (value: any) => {\n return newStore.setState(key, value)\n }\n }\n\n return [state, act(key)]\n }\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { createUseStore } from './createUseStore'\n\nexport const useStore = createUseStore(useState, useEffect, useRef)\n","import { Storage } from './Storage'\n\nexport function getState<S = any>(key: string) {\n const store = Storage.get<S>(key)\n return store ? store.state : null\n}\n","import { Storage } from './Storage'\n\nexport function mutate<S>(key: string, value?: S) {\n const store = Storage.get(key)\n\n if (store) {\n store.setState(key, value)\n } else {\n // init state, if no store exist\n Storage.set(key, { state: value } as any)\n }\n}\n"],"names":["Storage","set","key","value","store","stores","setState","get","emitter","mitt","STORE_INITED","STORE_UPDATED","Store","nextState","_this","getNextState","emit","state","setters","forEach","setter","this","useImmer","immerState","produce","draft","fnValue","createUseStore","useState","useEffect","useRef","storageStore","initialState","current","isEqual","newStore","push","emitStoreInit","splice","indexOf","act","useStore","cb","on","data"],"mappings":"qLASaA,EAAb,kCAESC,IAAP,SAAWC,EAAaC,OAChBC,EAAQJ,EAAQK,OAAOH,GACxBE,GAAUA,EAAME,WACnBN,EAAQK,OAAOH,GAAOC,MAInBI,IAAP,SAAoBL,UACXF,EAAQK,OAAOH,MAV1B,GACSF,SAAiB,GCHnB,IAAMQ,EAAUC,IAEVC,EAAe,eAEfC,EAAgB,gBCJhBC,EAAb,sBAGcT,2BAD6B,iBAiC9B,SAACD,EAAUC,OACdU,EAAYC,EAAKC,aAAaZ,GDzBtCK,EAAQQ,KAAKL,EC2BK,CAAET,IAAAA,EAAKW,UAAAA,IAEvBC,EAAKG,MAAQJ,EACbC,EAAKI,QAAQC,SAAQ,SAAAC,UAAUA,EAAOP,YArCjCI,MAAQd,qBAGPY,aAAA,SAAaZ,OACfU,KAGiB,mBAAVV,EAAsB,OAAOA,KAGd,iBAAfkB,KAAKJ,MAAoB,OAAOd,QAEvCmB,GAAW,EAETC,EAAaC,UAAQH,KAAKJ,OAAO,SAAAQ,OAC/BC,EAAUvB,EAAMsB,GAGlBC,GAA8B,iBAAZA,IACpBb,EAAYa,EACZJ,GAAW,aAIXA,IACFT,EAAYU,GAGPV,KAhCX,YCAgBc,EAAeC,EAAeC,EAAgBC,UACrD,SAA2B5B,EAAaC,OACvC4B,EAAe/B,EAAQO,IAAIL,GAEhB8B,EAAiBF,EADdC,EAAeA,EAAad,MAAQd,GAChD8B,QAGHC,EAAQF,EAAc7B,GAS3BH,EAAQC,IAAIC,EAAK,IAAIU,EAASoB,QAExBG,EAAWnC,EAAQO,IAAIL,KACR0B,EAASI,GAAvBf,OAAOhB,OACNiB,EAAYiB,EAAZjB,eAERW,GAAU,kBACRX,EAAQkB,KAAKnC,YFjBWC,GAC5BM,EAAQQ,KAAKN,EAAcR,GEkBvBmC,CAAcnC,GAEP,WACLgB,EAAQoB,OAAOpB,EAAQqB,QAAQtC,GAAM,MAEtC,IAQI,CAACgB,WANKf,UACJ,SAACC,UACCgC,EAAS7B,SAASJ,EAAKC,IAInBqC,CAAItC,SC1CVuC,EAAWd,EAAeC,WAAUC,YAAWC,+ECD1B5B,OAC1BE,EAAQJ,EAAQO,IAAOL,UACtBE,EAAQA,EAAMa,MAAQ,8BCFLf,EAAaC,OAC/BC,EAAQJ,EAAQO,IAAIL,GAEtBE,EACFA,EAAME,SAASJ,EAAKC,GAGpBH,EAAQC,IAAIC,EAAK,CAAEe,MAAOd,kCLYFuC,GAC1BlC,EAAQmC,GAAGjC,GAAc,SAAAR,GACvBwC,EAAGxC,sCAIuBwC,GAC5BlC,EAAQmC,GAAGhC,GAAe,SAAAiC,GACxBF,EAAGE"} | ||
| {"version":3,"file":"stook.cjs.production.min.js","sources":["../src/Storage.ts","../src/emitter.ts","../src/Store.ts","../src/createUseStore.ts","../src/useStore.ts","../src/getState.ts","../src/mutate.ts"],"sourcesContent":["import { Store } from './Store'\n\ninterface Stores {\n [key: string]: Store\n}\n\n/**\n * Storage for anything\n */\nexport class Storage {\n static stores: Stores = {}\n static set(key: string, value: Store) {\n const store = Storage.stores[key]\n if (!store || !store.setState) {\n Storage.stores[key] = value\n }\n }\n\n static get<S = any>(key: string): Store<S> {\n return Storage.stores[key]\n }\n}\n","import mitt from 'mitt'\n\ninterface Data {\n key: any\n nextState: any\n}\n\nexport const emitter = mitt()\n\nexport const STORE_INITED = 'STORE_INITED'\n\nexport const STORE_UPDATED = 'STORE_UPDATED'\n\nexport function emitStoreInit(key: any) {\n emitter.emit(STORE_INITED, key)\n}\n\nexport function emitStoreUpdate(data: Data) {\n emitter.emit(STORE_UPDATED, data)\n}\n\nexport function onStoreInit(cb: (data: string) => void) {\n emitter.on(STORE_INITED, key => {\n cb(key)\n })\n}\n\nexport function onStoreUpdate(cb: (data: Data) => void) {\n emitter.on(STORE_UPDATED, data => {\n cb(data)\n })\n}\n","import { produce } from 'immer'\nimport { Dispatch, SetStateAction } from './types'\nimport { emitStoreUpdate } from './emitter'\n\n/**\n * store for one key\n */\nexport class Store<S = any> {\n state: S\n setters: Dispatch<SetStateAction<S>>[] = []\n constructor(value: any) {\n this.state = value\n }\n\n private getNextState(value: any): any {\n let nextState: any\n\n // not function\n if (typeof value !== 'function') return value\n\n // can not use immer\n if (typeof this.state !== 'object') return value()\n\n let useImmer = true\n\n const immerState = produce(this.state, draft => {\n const fnValue = value(draft)\n\n // use function return value\n if (fnValue && typeof fnValue === 'object') {\n nextState = fnValue\n useImmer = false\n }\n })\n\n if (useImmer) {\n nextState = immerState\n }\n\n return nextState\n }\n\n setState = (key: any, value: any): any => {\n const nextState = this.getNextState(value)\n\n emitStoreUpdate({ key, nextState })\n\n this.state = nextState\n this.setters.forEach(setter => setter(nextState))\n }\n}\n","import isEqual from 'react-fast-compare'\nimport { Storage } from './Storage'\nimport { Store } from './Store'\nimport { Dispatch, Action } from './types'\n\nimport { emitStoreInit } from './emitter'\n\nexport function createUseStore(useState: any, useEffect: any, useRef: any) {\n return function useStore<S = any>(key: string, value?: S): [S, Dispatch<Action<S>>] {\n const storageStore = Storage.get(key)\n const initalValue = storageStore ? storageStore.state : value\n const { current: initialState } = useRef(initalValue)\n\n // check multi init\n if (!isEqual(initialState, value) && value !== undefined) {\n // TODO: mybe should show tip\n // const initialStateString = JSON.stringify(initialState)\n // const error = new Error(\n // `[stook]: store ${key} is inited with ${initialStateString}, initialState is unnecessary`,\n // )\n // console.warn(error)\n }\n\n Storage.set(key, new Store<S>(initialState))\n\n const newStore = Storage.get(key)\n const [state, set] = useState(initialState)\n const { setters } = newStore\n\n useEffect(() => {\n setters.push(set)\n\n emitStoreInit(key)\n\n return () => {\n setters.splice(setters.indexOf(set), 1)\n }\n }, [])\n\n function act(key: any): Dispatch<Action<S>> {\n return (value: any) => {\n return newStore.setState(key, value)\n }\n }\n\n return [state, act(key)]\n }\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { createUseStore } from './createUseStore'\n\nexport const useStore = createUseStore(useState, useEffect, useRef)\n","import { Storage } from './Storage'\n\nconst undefined_as_any: any = undefined\n\nexport function getState<S = any>(key: string): S {\n const store = Storage.get<S>(key)\n return store ? store.state : undefined_as_any\n}\n","import { Storage } from './Storage'\n\nexport function mutate<S>(key: string, value?: S) {\n const store = Storage.get(key)\n\n if (store && store.setState) {\n store.setState(key, value)\n } else {\n // init state, if no store exist\n Storage.set(key, { state: value } as any)\n }\n}\n"],"names":["Storage","set","key","value","store","stores","setState","get","emitter","mitt","STORE_INITED","STORE_UPDATED","Store","nextState","_this","getNextState","emit","state","setters","forEach","setter","this","useImmer","immerState","produce","draft","fnValue","createUseStore","useState","useEffect","useRef","storageStore","initialState","current","isEqual","newStore","push","emitStoreInit","splice","indexOf","act","useStore","undefined","cb","on","data"],"mappings":"qLASaA,EAAb,kCAESC,IAAP,SAAWC,EAAaC,OAChBC,EAAQJ,EAAQK,OAAOH,GACxBE,GAAUA,EAAME,WACnBN,EAAQK,OAAOH,GAAOC,MAInBI,IAAP,SAAoBL,UACXF,EAAQK,OAAOH,MAV1B,GACSF,SAAiB,GCHnB,IAAMQ,EAAUC,IAEVC,EAAe,eAEfC,EAAgB,gBCJhBC,EAAb,sBAGcT,2BAD6B,iBAiC9B,SAACD,EAAUC,OACdU,EAAYC,EAAKC,aAAaZ,GDzBtCK,EAAQQ,KAAKL,EC2BK,CAAET,IAAAA,EAAKW,UAAAA,IAEvBC,EAAKG,MAAQJ,EACbC,EAAKI,QAAQC,SAAQ,SAAAC,UAAUA,EAAOP,YArCjCI,MAAQd,qBAGPY,aAAA,SAAaZ,OACfU,KAGiB,mBAAVV,EAAsB,OAAOA,KAGd,iBAAfkB,KAAKJ,MAAoB,OAAOd,QAEvCmB,GAAW,EAETC,EAAaC,UAAQH,KAAKJ,OAAO,SAAAQ,OAC/BC,EAAUvB,EAAMsB,GAGlBC,GAA8B,iBAAZA,IACpBb,EAAYa,EACZJ,GAAW,aAIXA,IACFT,EAAYU,GAGPV,KAhCX,YCAgBc,EAAeC,EAAeC,EAAgBC,UACrD,SAA2B5B,EAAaC,OACvC4B,EAAe/B,EAAQO,IAAIL,GAEhB8B,EAAiBF,EADdC,EAAeA,EAAad,MAAQd,GAChD8B,QAGHC,EAAQF,EAAc7B,GAS3BH,EAAQC,IAAIC,EAAK,IAAIU,EAASoB,QAExBG,EAAWnC,EAAQO,IAAIL,KACR0B,EAASI,GAAvBf,OAAOhB,OACNiB,EAAYiB,EAAZjB,eAERW,GAAU,kBACRX,EAAQkB,KAAKnC,YFjBWC,GAC5BM,EAAQQ,KAAKN,EAAcR,GEkBvBmC,CAAcnC,GAEP,WACLgB,EAAQoB,OAAOpB,EAAQqB,QAAQtC,GAAM,MAEtC,IAQI,CAACgB,WANKf,UACJ,SAACC,UACCgC,EAAS7B,SAASJ,EAAKC,IAInBqC,CAAItC,SC1CVuC,EAAWd,EAAeC,WAAUC,YAAWC,+ECC1B5B,OAC1BE,EAAQJ,EAAQO,IAAOL,UACtBE,EAAQA,EAAMa,WAJOyB,2BCAJxC,EAAaC,OAC/BC,EAAQJ,EAAQO,IAAIL,GAEtBE,GAASA,EAAME,SACjBF,EAAME,SAASJ,EAAKC,GAGpBH,EAAQC,IAAIC,EAAK,CAAEe,MAAOd,kCLYFwC,GAC1BnC,EAAQoC,GAAGlC,GAAc,SAAAR,GACvByC,EAAGzC,sCAIuByC,GAC5BnC,EAAQoC,GAAGjC,GAAe,SAAAkC,GACxBF,EAAGE"} |
@@ -150,5 +150,6 @@ import { useRef, useEffect, useState } from 'react'; | ||
| var undefined_as_any = undefined; | ||
| function getState(key) { | ||
| var store = Storage.get(key); | ||
| return store ? store.state : null; | ||
| return store ? store.state : undefined_as_any; | ||
| } | ||
@@ -159,3 +160,3 @@ | ||
| if (store) { | ||
| if (store && store.setState) { | ||
| store.setState(key, value); | ||
@@ -162,0 +163,0 @@ } else { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"stook.esm.js","sources":["../src/Storage.ts","../src/emitter.ts","../src/Store.ts","../src/createUseStore.ts","../src/useStore.ts","../src/getState.ts","../src/mutate.ts"],"sourcesContent":["import { Store } from './Store'\n\ninterface Stores {\n [key: string]: Store\n}\n\n/**\n * Storage for anything\n */\nexport class Storage {\n static stores: Stores = {}\n static set(key: string, value: Store) {\n const store = Storage.stores[key]\n if (!store || !store.setState) {\n Storage.stores[key] = value\n }\n }\n\n static get<S = any>(key: string): Store<S> {\n return Storage.stores[key]\n }\n}\n","import mitt from 'mitt'\n\ninterface Data {\n key: any\n nextState: any\n}\n\nexport const emitter = mitt()\n\nexport const STORE_INITED = 'STORE_INITED'\n\nexport const STORE_UPDATED = 'STORE_UPDATED'\n\nexport function emitStoreInit(key: any) {\n emitter.emit(STORE_INITED, key)\n}\n\nexport function emitStoreUpdate(data: Data) {\n emitter.emit(STORE_UPDATED, data)\n}\n\nexport function onStoreInit(cb: (data: string) => void) {\n emitter.on(STORE_INITED, key => {\n cb(key)\n })\n}\n\nexport function onStoreUpdate(cb: (data: Data) => void) {\n emitter.on(STORE_UPDATED, data => {\n cb(data)\n })\n}\n","import { produce } from 'immer'\nimport { Dispatch, SetStateAction } from './types'\nimport { emitStoreUpdate } from './emitter'\n\n/**\n * store for one key\n */\nexport class Store<S = any> {\n state: S\n setters: Dispatch<SetStateAction<S>>[] = []\n constructor(value: any) {\n this.state = value\n }\n\n private getNextState(value: any): any {\n let nextState: any\n\n // not function\n if (typeof value !== 'function') return value\n\n // can not use immer\n if (typeof this.state !== 'object') return value()\n\n let useImmer = true\n\n const immerState = produce(this.state, draft => {\n const fnValue = value(draft)\n\n // use function return value\n if (fnValue && typeof fnValue === 'object') {\n nextState = fnValue\n useImmer = false\n }\n })\n\n if (useImmer) {\n nextState = immerState\n }\n\n return nextState\n }\n\n setState = (key: any, value: any): any => {\n const nextState = this.getNextState(value)\n\n emitStoreUpdate({ key, nextState })\n\n this.state = nextState\n this.setters.forEach(setter => setter(nextState))\n }\n}\n","import isEqual from 'react-fast-compare'\nimport { Storage } from './Storage'\nimport { Store } from './Store'\nimport { Dispatch, Action } from './types'\n\nimport { emitStoreInit } from './emitter'\n\nexport function createUseStore(useState: any, useEffect: any, useRef: any) {\n return function useStore<S = any>(key: string, value?: S): [S, Dispatch<Action<S>>] {\n const storageStore = Storage.get(key)\n const initalValue = storageStore ? storageStore.state : value\n const { current: initialState } = useRef(initalValue)\n\n // check multi init\n if (!isEqual(initialState, value) && value !== undefined) {\n // TODO: mybe should show tip\n // const initialStateString = JSON.stringify(initialState)\n // const error = new Error(\n // `[stook]: store ${key} is inited with ${initialStateString}, initialState is unnecessary`,\n // )\n // console.warn(error)\n }\n\n Storage.set(key, new Store<S>(initialState))\n\n const newStore = Storage.get(key)\n const [state, set] = useState(initialState)\n const { setters } = newStore\n\n useEffect(() => {\n setters.push(set)\n\n emitStoreInit(key)\n\n return () => {\n setters.splice(setters.indexOf(set), 1)\n }\n }, [])\n\n function act(key: any): Dispatch<Action<S>> {\n return (value: any) => {\n return newStore.setState(key, value)\n }\n }\n\n return [state, act(key)]\n }\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { createUseStore } from './createUseStore'\n\nexport const useStore = createUseStore(useState, useEffect, useRef)\n","import { Storage } from './Storage'\n\nexport function getState<S = any>(key: string) {\n const store = Storage.get<S>(key)\n return store ? store.state : null\n}\n","import { Storage } from './Storage'\n\nexport function mutate<S>(key: string, value?: S) {\n const store = Storage.get(key)\n\n if (store) {\n store.setState(key, value)\n } else {\n // init state, if no store exist\n Storage.set(key, { state: value } as any)\n }\n}\n"],"names":["Storage","set","key","value","store","stores","setState","get","emitter","mitt","STORE_INITED","STORE_UPDATED","emitStoreInit","emit","emitStoreUpdate","data","onStoreInit","cb","on","onStoreUpdate","Store","nextState","getNextState","state","setters","forEach","setter","useImmer","immerState","produce","draft","fnValue","createUseStore","useState","useEffect","useRef","useStore","storageStore","initalValue","initialState","current","isEqual","undefined","newStore","push","splice","indexOf","act","getState","mutate"],"mappings":"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"} | ||
| {"version":3,"file":"stook.esm.js","sources":["../src/Storage.ts","../src/emitter.ts","../src/Store.ts","../src/createUseStore.ts","../src/useStore.ts","../src/getState.ts","../src/mutate.ts"],"sourcesContent":["import { Store } from './Store'\n\ninterface Stores {\n [key: string]: Store\n}\n\n/**\n * Storage for anything\n */\nexport class Storage {\n static stores: Stores = {}\n static set(key: string, value: Store) {\n const store = Storage.stores[key]\n if (!store || !store.setState) {\n Storage.stores[key] = value\n }\n }\n\n static get<S = any>(key: string): Store<S> {\n return Storage.stores[key]\n }\n}\n","import mitt from 'mitt'\n\ninterface Data {\n key: any\n nextState: any\n}\n\nexport const emitter = mitt()\n\nexport const STORE_INITED = 'STORE_INITED'\n\nexport const STORE_UPDATED = 'STORE_UPDATED'\n\nexport function emitStoreInit(key: any) {\n emitter.emit(STORE_INITED, key)\n}\n\nexport function emitStoreUpdate(data: Data) {\n emitter.emit(STORE_UPDATED, data)\n}\n\nexport function onStoreInit(cb: (data: string) => void) {\n emitter.on(STORE_INITED, key => {\n cb(key)\n })\n}\n\nexport function onStoreUpdate(cb: (data: Data) => void) {\n emitter.on(STORE_UPDATED, data => {\n cb(data)\n })\n}\n","import { produce } from 'immer'\nimport { Dispatch, SetStateAction } from './types'\nimport { emitStoreUpdate } from './emitter'\n\n/**\n * store for one key\n */\nexport class Store<S = any> {\n state: S\n setters: Dispatch<SetStateAction<S>>[] = []\n constructor(value: any) {\n this.state = value\n }\n\n private getNextState(value: any): any {\n let nextState: any\n\n // not function\n if (typeof value !== 'function') return value\n\n // can not use immer\n if (typeof this.state !== 'object') return value()\n\n let useImmer = true\n\n const immerState = produce(this.state, draft => {\n const fnValue = value(draft)\n\n // use function return value\n if (fnValue && typeof fnValue === 'object') {\n nextState = fnValue\n useImmer = false\n }\n })\n\n if (useImmer) {\n nextState = immerState\n }\n\n return nextState\n }\n\n setState = (key: any, value: any): any => {\n const nextState = this.getNextState(value)\n\n emitStoreUpdate({ key, nextState })\n\n this.state = nextState\n this.setters.forEach(setter => setter(nextState))\n }\n}\n","import isEqual from 'react-fast-compare'\nimport { Storage } from './Storage'\nimport { Store } from './Store'\nimport { Dispatch, Action } from './types'\n\nimport { emitStoreInit } from './emitter'\n\nexport function createUseStore(useState: any, useEffect: any, useRef: any) {\n return function useStore<S = any>(key: string, value?: S): [S, Dispatch<Action<S>>] {\n const storageStore = Storage.get(key)\n const initalValue = storageStore ? storageStore.state : value\n const { current: initialState } = useRef(initalValue)\n\n // check multi init\n if (!isEqual(initialState, value) && value !== undefined) {\n // TODO: mybe should show tip\n // const initialStateString = JSON.stringify(initialState)\n // const error = new Error(\n // `[stook]: store ${key} is inited with ${initialStateString}, initialState is unnecessary`,\n // )\n // console.warn(error)\n }\n\n Storage.set(key, new Store<S>(initialState))\n\n const newStore = Storage.get(key)\n const [state, set] = useState(initialState)\n const { setters } = newStore\n\n useEffect(() => {\n setters.push(set)\n\n emitStoreInit(key)\n\n return () => {\n setters.splice(setters.indexOf(set), 1)\n }\n }, [])\n\n function act(key: any): Dispatch<Action<S>> {\n return (value: any) => {\n return newStore.setState(key, value)\n }\n }\n\n return [state, act(key)]\n }\n}\n","import { useState, useEffect, useRef } from 'react'\nimport { createUseStore } from './createUseStore'\n\nexport const useStore = createUseStore(useState, useEffect, useRef)\n","import { Storage } from './Storage'\n\nconst undefined_as_any: any = undefined\n\nexport function getState<S = any>(key: string): S {\n const store = Storage.get<S>(key)\n return store ? store.state : undefined_as_any\n}\n","import { Storage } from './Storage'\n\nexport function mutate<S>(key: string, value?: S) {\n const store = Storage.get(key)\n\n if (store && store.setState) {\n store.setState(key, value)\n } else {\n // init state, if no store exist\n Storage.set(key, { state: value } as any)\n }\n}\n"],"names":["Storage","set","key","value","store","stores","setState","get","emitter","mitt","STORE_INITED","STORE_UPDATED","emitStoreInit","emit","emitStoreUpdate","data","onStoreInit","cb","on","onStoreUpdate","Store","nextState","getNextState","state","setters","forEach","setter","useImmer","immerState","produce","draft","fnValue","createUseStore","useState","useEffect","useRef","useStore","storageStore","initalValue","initialState","current","isEqual","undefined","newStore","push","splice","indexOf","act","undefined_as_any","getState","mutate"],"mappings":";;;;;AAMA;;;AAGA,IAAaA,OAAb;;AAAA;;;UAESC,GAFT,GAEE,aAAWC,GAAX,EAAwBC,KAAxB;QACQC,KAAK,GAAGJ,OAAO,CAACK,MAAR,CAAeH,GAAf,CAAd;;QACI,CAACE,KAAD,IAAU,CAACA,KAAK,CAACE,QAArB,EAA+B;MAC7BN,OAAO,CAACK,MAAR,CAAeH,GAAf,IAAsBC,KAAtB;;GALN;;UASSI,GATT,GASE,aAAoBL,GAApB;WACSF,OAAO,CAACK,MAAR,CAAeH,GAAf,CAAP;GAVJ;;;;AACSF,cAAA,GAAiB,EAAjB;;ACHF,IAAMQ,OAAO;;AAAGC,IAAI,EAApB;AAEP,AAAO,IAAMC,YAAY,GAAG,cAArB;AAEP,AAAO,IAAMC,aAAa,GAAG,eAAtB;AAEP,SAAgBC,cAAcV;EAC5BM,OAAO,CAACK,IAAR,CAAaH,YAAb,EAA2BR,GAA3B;;AAGF,SAAgBY,gBAAgBC;EAC9BP,OAAO,CAACK,IAAR,CAAaF,aAAb,EAA4BI,IAA5B;;AAGF,SAAgBC,YAAYC;EAC1BT,OAAO,CAACU,EAAR,CAAWR,YAAX,EAAyB,UAAAR,GAAG;IAC1Be,EAAE,CAACf,GAAD,CAAF;GADF;;AAKF,SAAgBiB,cAAcF;EAC5BT,OAAO,CAACU,EAAR,CAAWP,aAAX,EAA0B,UAAAI,IAAI;IAC5BE,EAAE,CAACF,IAAD,CAAF;GADF;;;ACxBF;;;;AAGA,IAAaK,KAAb;;AAAA;iBAGcjB,KAAZ;;;gBADA,GAAyC,EAAzC;;iBAiCA,GAAW,UAACD,GAAD,EAAWC,KAAX;UACHkB,SAAS,GAAG,KAAI,CAACC,YAAL,CAAkBnB,KAAlB,CAAlB;;MAEAW,eAAe,CAAC;QAAEZ,GAAG,EAAHA,GAAF;QAAOmB,SAAS,EAATA;OAAR,CAAf;MAEA,KAAI,CAACE,KAAL,GAAaF,SAAb;;MACA,KAAI,CAACG,OAAL,CAAaC,OAAb,CAAqB,UAAAC,MAAM;eAAIA,MAAM,CAACL,SAAD,CAAV;OAA3B;KANF;;SA/BOE,KAAL,GAAapB,KAAb;;;;;SAGMmB,YAPV,GAOU,sBAAanB,KAAb;QACFkB,SAAJ;;QAGI,OAAOlB,KAAP,KAAiB,UAArB,EAAiC,OAAOA,KAAP;;QAG7B,OAAO,KAAKoB,KAAZ,KAAsB,QAA1B,EAAoC,OAAOpB,KAAK,EAAZ;QAEhCwB,QAAQ,GAAG,IAAf;QAEMC,UAAU,GAAGC,OAAO,CAAC,KAAKN,KAAN,EAAa,UAAAO,KAAK;UACpCC,OAAO,GAAG5B,KAAK,CAAC2B,KAAD,CAArB;;UAGIC,OAAO,IAAI,OAAOA,OAAP,KAAmB,QAAlC,EAA4C;QAC1CV,SAAS,GAAGU,OAAZ;QACAJ,QAAQ,GAAG,KAAX;;KANsB,CAA1B;;QAUIA,QAAJ,EAAc;MACZN,SAAS,GAAGO,UAAZ;;;WAGKP,SAAP;GAhCJ;;;;;SCAgBW,eAAeC,UAAeC,WAAgBC;SACrD,SAASC,QAAT,CAA2BlC,GAA3B,EAAwCC,KAAxC;QACCkC,YAAY,GAAGrC,OAAO,CAACO,GAAR,CAAYL,GAAZ,CAArB;QACMoC,WAAW,GAAGD,YAAY,GAAGA,YAAY,CAACd,KAAhB,GAAwBpB,KAAxD;;kBACkCgC,MAAM,CAACG,WAAD;QAAvBC,uBAATC;;;QAGJ,CAACC,OAAO,CAACF,YAAD,EAAepC,KAAf,CAAR,IAAiCA,KAAK,KAAKuC,SAA/C,EAA0D;;IAS1D1C,OAAO,CAACC,GAAR,CAAYC,GAAZ,EAAiB,IAAIkB,KAAJ,CAAamB,YAAb,CAAjB;QAEMI,QAAQ,GAAG3C,OAAO,CAACO,GAAR,CAAYL,GAAZ,CAAjB;;oBACqB+B,QAAQ,CAACM,YAAD;QAAtBhB;QAAOtB;;QACNuB,UAAYmB,SAAZnB;IAERU,SAAS,CAAC;MACRV,OAAO,CAACoB,IAAR,CAAa3C,GAAb;MAEAW,aAAa,CAACV,GAAD,CAAb;aAEO;QACLsB,OAAO,CAACqB,MAAR,CAAerB,OAAO,CAACsB,OAAR,CAAgB7C,GAAhB,CAAf,EAAqC,CAArC;OADF;KALO,EAQN,EARM,CAAT;;aAUS8C,GAAT,CAAa7C,GAAb;aACS,UAACC,KAAD;eACEwC,QAAQ,CAACrC,QAAT,CAAkBJ,GAAlB,EAAuBC,KAAvB,CAAP;OADF;;;WAKK,CAACoB,KAAD,EAAQwB,GAAG,CAAC7C,GAAD,CAAX,CAAP;GArCF;;;ICLWkC,QAAQ;;AAAGJ,cAAc,CAACC,QAAD,EAAWC,SAAX,EAAsBC,MAAtB,CAA/B;;ACDP,IAAMa,gBAAgB,GAAQN,SAA9B;AAEA,SAAgBO,SAAkB/C;MAC1BE,KAAK,GAAGJ,OAAO,CAACO,GAAR,CAAeL,GAAf,CAAd;SACOE,KAAK,GAAGA,KAAK,CAACmB,KAAT,GAAiByB,gBAA7B;;;SCJcE,OAAUhD,KAAaC;MAC/BC,KAAK,GAAGJ,OAAO,CAACO,GAAR,CAAYL,GAAZ,CAAd;;MAEIE,KAAK,IAAIA,KAAK,CAACE,QAAnB,EAA6B;IAC3BF,KAAK,CAACE,QAAN,CAAeJ,GAAf,EAAoBC,KAApB;GADF,MAEO;;IAELH,OAAO,CAACC,GAAR,CAAYC,GAAZ,EAAiB;MAAEqB,KAAK,EAAEpB;KAA1B;;;;;;"} |
+3
-2
| { | ||
| "name": "stook", | ||
| "version": "0.2.1", | ||
| "version": "0.2.2", | ||
| "license": "MIT", | ||
@@ -50,3 +50,4 @@ "author": "forsigner", | ||
| "react-fast-compare": "^2.0.4" | ||
| } | ||
| }, | ||
| "gitHead": "ec6094edfe15eac6c3d9d713f658ae3dc7c2955a" | ||
| } |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
36857
4.77%19
5.56%343
0.59%