@context-query/react 0.1.0 → 0.2.0-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/hooks.d.ts CHANGED
@@ -1,3 +1,6 @@
1
1
  import { TStateImpl } from "@context-query/core";
2
2
  import { createContextQuery } from "./context";
3
- export declare function createUseContextQuery<TState extends TStateImpl>(contexts: ReturnType<typeof createContextQuery<TState>>): <TKey extends keyof TState>(key: TKey) => [TState[TKey], (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => boolean];
3
+ export declare function createUseContextQuery<TState extends TStateImpl>(contexts: ReturnType<typeof createContextQuery<TState>>): {
4
+ useContextBatchQuery: () => (value: TState | ((prev: TState) => TState)) => boolean;
5
+ useContextQuery: <TKey extends keyof TState>(key: TKey) => [TState[TKey], (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => boolean];
6
+ };
package/dist/index.d.ts CHANGED
@@ -2,4 +2,5 @@ import { TStateImpl } from "@context-query/core";
2
2
  export declare function createContextQuery<TState extends TStateImpl>(): {
3
3
  Provider: import("react").FC<import("./provider").ProviderProps<TState>>;
4
4
  useContextQuery: <TKey extends keyof TState>(key: TKey) => [TState[TKey], (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => boolean];
5
+ useContextBatchQuery: () => (value: TState | ((prev: TState) => TState)) => boolean;
5
6
  };
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{useContext as t,useState as e,useEffect as r,useCallback as n,createContext as s,useRef as i,useMemo as o}from"react";import{jsx as u}from"react/jsx-runtime";var c,a={};var l=(c||(c=1,a.ContextQueryStore=class{state;listeners;constructor(t){this.state=t,this.listeners=new Map}getState(){return this.state}getStateByKey(t){return this.state[t]}updateState(t){const e={...this.state};return this.state={...t},Object.keys(t).forEach((t=>{e[t]!==this.state[t]&&this.notifyListeners(t)})),!0}setState(t,e){return this.state[t]!==e&&(this.state={...this.state,[t]:e},this.notifyListeners(t),!0)}notifyListeners(t){const e=this.listeners.get(t);if(e){const r=this.state[t];e.forEach((t=>t(r)))}}subscribe(t,e){const r=r=>{e(t,r)};return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(r),{unsubscribe:()=>{const e=this.listeners.get(t);e&&(e.delete(r),0===e.size&&this.listeners.delete(t))}}}}),a);function h(){const t={StoreContext:s(null),ContextQuerySubscriptionContext:s(null)},e=(t=>{const{StoreContext:e,ContextQuerySubscriptionContext:n}=t;return function({children:t,initialState:s}){const c=i(null),a=i(null);c.current||(c.current=new l.ContextQueryStore(s),a.current=s),r((()=>{c.current&&!Object.is(a.current,s)&&(c.current.updateState(s),a.current=s)}),[s]);const h=o((()=>({subscribe:c.current?c.current.subscribe.bind(c.current):null})),[c.current]);return u(e.Provider,{value:c.current,children:u(n.Provider,{value:h,children:t})})}})(t);return{Provider:e,contexts:t}}function b(){const{Provider:s,contexts:i}=h(),o=function(s){const{StoreContext:i,ContextQuerySubscriptionContext:o}=s;return function(s){const u=t(i),c=t(o);if(!u)throw new Error("useContextQuery must be used within a ContextQueryProvider");if(!c||!c.subscribe)throw new Error("ContextQuerySubscriptionContext not properly initialized");const[a,l]=e((()=>u.getStateByKey(s)));return r((()=>{if(!c.subscribe)return;const t=c.subscribe(s,((t,e)=>{l(e)}));return()=>{t.unsubscribe()}}),[s,c.subscribe,u]),[a,n((t=>{if("function"==typeof t){const e=t,r=u.getStateByKey(s);return u.setState(s,e(r))}return u.setState(s,t)}),[s,u])]}}(i);return{Provider:s,useContextQuery:o}}export{b as createContextQuery};
1
+ import{useState as t,useEffect as e,useCallback as r,useContext as n,createContext as s,useRef as i,useMemo as u}from"react";import{jsx as o}from"react/jsx-runtime";var c,a={};var h=(c||(c=1,a.ContextQueryStore=class{state;listeners;constructor(t){this.state=t,this.listeners=new Map}getState(){return this.state}getStateByKey(t){return this.state[t]}updateState(t){const e={...this.state};return this.state={...t},Object.keys(t).forEach((t=>{Object.is(e[t],this.state[t])||this.notifyListeners(t)})),!0}setState(t,e){return!Object.is(this.state[t],e)&&(this.state={...this.state,[t]:e},this.notifyListeners(t),!0)}notifyListeners(t){const e=this.listeners.get(t);if(e){const r=this.state[t];e.forEach((t=>t(r)))}}subscribe(t,e){const r=r=>{e(t,r)};return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(r),{unsubscribe:()=>{const e=this.listeners.get(t);e&&(e.delete(r),0===e.size&&this.listeners.delete(t))}}}}),a);function b(){const t={StoreContext:s(null),ContextQuerySubscriptionContext:s(null)},r=(t=>{const{StoreContext:r,ContextQuerySubscriptionContext:n}=t;return function({children:t,initialState:s}){const c=i(null),a=i(null);c.current||(c.current=new h.ContextQueryStore(s),a.current=s),e((()=>{c.current&&!Object.is(a.current,s)&&(c.current.updateState(s),a.current=s)}),[s]);const b=u((()=>({subscribe:c.current?c.current.subscribe.bind(c.current):null})),[c.current]);return o(r.Provider,{value:c.current,children:o(n.Provider,{value:b,children:t})})}})(t);return{Provider:r,contexts:t}}function l(){const{Provider:s,contexts:i}=b(),{useContextQuery:u,useContextBatchQuery:o}=function(s){const{StoreContext:i,ContextQuerySubscriptionContext:u}=s,o=()=>{const t=n(i),e=n(u);if(!t)throw new Error("useContextQuery must be used within a ContextQueryProvider");if(!e||!e.subscribe)throw new Error("ContextQuerySubscriptionContext not properly initialized");return{store:t,subscription:e}};return{useContextBatchQuery:()=>{const{store:t}=o();return r((e=>{if("function"==typeof e){const r=e,n=t.getState();return t.updateState(r(n))}return t.updateState(e)}),[t])},useContextQuery:n=>{const{store:s,subscription:i}=o(),[u,c]=t((()=>s.getStateByKey(n)));return e((()=>{if(!i.subscribe)return;const t=i.subscribe(n,((t,e)=>{c(e)}));return()=>{t.unsubscribe()}}),[n,i.subscribe,s]),[u,r((t=>{if("function"==typeof t){const e=t,r=s.getStateByKey(n);return s.setState(n,e(r))}return s.setState(n,t)}),[n,s])]}}}(i);return{Provider:s,useContextQuery:u,useContextBatchQuery:o}}export{l as createContextQuery};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../core/dist/index.js","../src/provider.tsx","../src/context.ts","../src/index.ts","../src/hooks.ts"],"sourcesContent":["\"use strict\";exports.ContextQueryStore=class{state;listeners;constructor(t){this.state=t,this.listeners=new Map}getState(){return this.state}getStateByKey(t){return this.state[t]}updateState(t){const s={...this.state};this.state={...t};return Object.keys(t).forEach((t=>{s[t]!==this.state[t]&&this.notifyListeners(t)})),!0}setState(t,s){return this.state[t]!==s&&(this.state={...this.state,[t]:s},this.notifyListeners(t),!0)}notifyListeners(t){const s=this.listeners.get(t);if(s){const e=this.state[t];s.forEach((t=>t(e)))}}subscribe(t,s){const e=e=>{s(t,e)};this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e);return{unsubscribe:()=>{const s=this.listeners.get(t);s&&(s.delete(e),0===s.size&&this.listeners.delete(t))}}}};\n//# sourceMappingURL=index.js.map\n","import { ContextQueryStore, TStateImpl } from \"@context-query/core\";\nimport { FC, PropsWithChildren, useEffect, useMemo, useRef } from \"react\";\nimport { createContextQuery } from \"./context\";\n\nexport interface ProviderProps<TState extends TStateImpl>\n extends PropsWithChildren {\n initialState: TState;\n}\n\nexport const createContextQueryProvider = <TState extends TStateImpl>(\n contexts: ReturnType<typeof createContextQuery<TState>>\n): FC<ProviderProps<TState>> => {\n const { StoreContext, ContextQuerySubscriptionContext } = contexts;\n\n return function ContextQueryProvider({\n children,\n initialState,\n }: ProviderProps<TState>) {\n const storeRef = useRef<ContextQueryStore<TState> | null>(null);\n const previousStateRef = useRef<TState | null>(null);\n\n if (!storeRef.current) {\n storeRef.current = new ContextQueryStore<TState>(initialState);\n previousStateRef.current = initialState;\n }\n\n useEffect(() => {\n if (\n storeRef.current &&\n !Object.is(previousStateRef.current, initialState)\n ) {\n storeRef.current.updateState(initialState);\n previousStateRef.current = initialState;\n }\n }, [initialState]);\n\n const contextQuerySubscriptionContextValue = useMemo(\n () => ({\n subscribe: storeRef.current\n ? storeRef.current.subscribe.bind(storeRef.current)\n : null,\n }),\n [storeRef.current]\n );\n\n return (\n <StoreContext.Provider value={storeRef.current}>\n <ContextQuerySubscriptionContext.Provider\n value={contextQuerySubscriptionContextValue}\n >\n {children}\n </ContextQuerySubscriptionContext.Provider>\n </StoreContext.Provider>\n );\n };\n};\n\nexport function createReactContextQuery<TState extends TStateImpl>() {\n const contexts = createContextQuery<TState>();\n const ContextQueryProvider = createContextQueryProvider<TState>(contexts);\n\n return {\n Provider: ContextQueryProvider,\n contexts,\n };\n}\n","import type { ContextQueryStore, TStateImpl } from \"@context-query/core\";\nimport { createContext } from \"react\";\n\nexport const createContextQuery = <TState extends TStateImpl>() => {\n const StoreContext = createContext<ContextQueryStore<TState> | null>(null);\n const ContextQuerySubscriptionContext = createContext<{\n subscribe: ContextQueryStore<TState>[\"subscribe\"] | null;\n } | null>(null);\n\n return {\n StoreContext,\n ContextQuerySubscriptionContext,\n };\n};\n","import { TStateImpl } from \"@context-query/core\";\nimport { createUseContextQuery } from \"./hooks\";\nimport { createReactContextQuery } from \"./provider\";\n\nexport function createContextQuery<TState extends TStateImpl>() {\n const { Provider, contexts } = createReactContextQuery<TState>();\n\n const useContextQuery = createUseContextQuery<TState>(contexts);\n\n return {\n Provider,\n useContextQuery,\n };\n}\n","import { TStateImpl } from \"@context-query/core\";\nimport { useCallback, useContext, useEffect, useState } from \"react\";\nimport { createContextQuery } from \"./context\";\n\nexport function createUseContextQuery<TState extends TStateImpl>(\n contexts: ReturnType<typeof createContextQuery<TState>>\n) {\n const { StoreContext, ContextQuerySubscriptionContext } = contexts;\n\n return function useContextQuery<TKey extends keyof TState>(\n key: TKey\n ): [\n TState[TKey],\n (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => boolean,\n ] {\n const store = useContext(StoreContext);\n const subscription = useContext(ContextQuerySubscriptionContext);\n\n if (!store) {\n throw new Error(\n \"useContextQuery must be used within a ContextQueryProvider\"\n );\n }\n\n if (!subscription || !subscription.subscribe) {\n throw new Error(\n \"ContextQuerySubscriptionContext not properly initialized\"\n );\n }\n\n const [state, setLocalState] = useState<TState[TKey]>(() =>\n store.getStateByKey(key)\n );\n\n useEffect(() => {\n const handleChange = (_: TKey, newValue: TState[TKey]) => {\n setLocalState(newValue);\n };\n\n if (!subscription.subscribe) return;\n\n const sub = subscription.subscribe(key, handleChange);\n\n return () => {\n sub.unsubscribe();\n };\n }, [key, subscription.subscribe, store]);\n\n const setState = useCallback(\n (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => {\n if (typeof value === \"function\") {\n const updateFn = value as (prev: TState[TKey]) => TState[TKey];\n const currentValue = store.getStateByKey(key);\n return store.setState(key, updateFn(currentValue));\n }\n return store.setState(key, value);\n },\n [key, store]\n );\n\n return [state, setState];\n };\n}\n"],"names":["dist","ContextQueryStore","state","listeners","constructor","t","this","Map","getState","getStateByKey","updateState","s","Object","keys","forEach","notifyListeners","setState","get","e","subscribe","has","set","Set","add","unsubscribe","delete","size","createReactContextQuery","contexts","StoreContext","createContext","ContextQuerySubscriptionContext","ContextQueryProvider","children","initialState","storeRef","useRef","previousStateRef","current","useEffect","is","contextQuerySubscriptionContextValue","useMemo","bind","_jsx","Provider","value","createContextQueryProvider","createContextQuery","useContextQuery","key","store","useContext","subscription","Error","setLocalState","useState","sub","_","newValue","useCallback","updateFn","currentValue","createUseContextQuery"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../../node_modules/.pnpm/@context-query+core@0.1.0-dev.1/node_modules/@context-query/core/dist/index.js","../src/provider.tsx","../src/context.ts","../src/index.ts","../src/hooks.ts"],"sourcesContent":["\"use strict\";exports.ContextQueryStore=class{state;listeners;constructor(t){this.state=t,this.listeners=new Map}getState(){return this.state}getStateByKey(t){return this.state[t]}updateState(t){const s={...this.state};this.state={...t};return Object.keys(t).forEach((t=>{Object.is(s[t],this.state[t])||this.notifyListeners(t)})),!0}setState(t,s){return!Object.is(this.state[t],s)&&(this.state={...this.state,[t]:s},this.notifyListeners(t),!0)}notifyListeners(t){const s=this.listeners.get(t);if(s){const e=this.state[t];s.forEach((t=>t(e)))}}subscribe(t,s){const e=e=>{s(t,e)};this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e);return{unsubscribe:()=>{const s=this.listeners.get(t);s&&(s.delete(e),0===s.size&&this.listeners.delete(t))}}}};\n//# sourceMappingURL=index.js.map\n","import { ContextQueryStore, TStateImpl } from \"@context-query/core\";\nimport { FC, PropsWithChildren, useEffect, useMemo, useRef } from \"react\";\nimport { createContextQuery } from \"./context\";\n\nexport interface ProviderProps<TState extends TStateImpl>\n extends PropsWithChildren {\n initialState: TState;\n}\n\nexport const createContextQueryProvider = <TState extends TStateImpl>(\n contexts: ReturnType<typeof createContextQuery<TState>>\n): FC<ProviderProps<TState>> => {\n const { StoreContext, ContextQuerySubscriptionContext } = contexts;\n\n return function ContextQueryProvider({\n children,\n initialState,\n }: ProviderProps<TState>) {\n const storeRef = useRef<ContextQueryStore<TState> | null>(null);\n const previousStateRef = useRef<TState | null>(null);\n\n if (!storeRef.current) {\n storeRef.current = new ContextQueryStore<TState>(initialState);\n previousStateRef.current = initialState;\n }\n\n useEffect(() => {\n if (\n storeRef.current &&\n !Object.is(previousStateRef.current, initialState)\n ) {\n storeRef.current.updateState(initialState);\n previousStateRef.current = initialState;\n }\n }, [initialState]);\n\n const contextQuerySubscriptionContextValue = useMemo(\n () => ({\n subscribe: storeRef.current\n ? storeRef.current.subscribe.bind(storeRef.current)\n : null,\n }),\n [storeRef.current]\n );\n\n return (\n <StoreContext.Provider value={storeRef.current}>\n <ContextQuerySubscriptionContext.Provider\n value={contextQuerySubscriptionContextValue}\n >\n {children}\n </ContextQuerySubscriptionContext.Provider>\n </StoreContext.Provider>\n );\n };\n};\n\nexport function createReactContextQuery<TState extends TStateImpl>() {\n const contexts = createContextQuery<TState>();\n const ContextQueryProvider = createContextQueryProvider<TState>(contexts);\n\n return {\n Provider: ContextQueryProvider,\n contexts,\n };\n}\n","import type { ContextQueryStore, TStateImpl } from \"@context-query/core\";\nimport { createContext } from \"react\";\n\nexport const createContextQuery = <TState extends TStateImpl>() => {\n const StoreContext = createContext<ContextQueryStore<TState> | null>(null);\n const ContextQuerySubscriptionContext = createContext<{\n subscribe: ContextQueryStore<TState>[\"subscribe\"] | null;\n } | null>(null);\n\n return {\n StoreContext,\n ContextQuerySubscriptionContext,\n };\n};\n","import { TStateImpl } from \"@context-query/core\";\nimport { createUseContextQuery } from \"./hooks\";\nimport { createReactContextQuery } from \"./provider\";\n\nexport function createContextQuery<TState extends TStateImpl>() {\n const { Provider, contexts } = createReactContextQuery<TState>();\n\n const { useContextQuery, useContextBatchQuery } =\n createUseContextQuery<TState>(contexts);\n\n return {\n Provider,\n useContextQuery,\n useContextBatchQuery,\n };\n}\n","import { TStateImpl } from \"@context-query/core\";\nimport { useCallback, useContext, useEffect, useState } from \"react\";\nimport { createContextQuery } from \"./context\";\n\nexport function createUseContextQuery<TState extends TStateImpl>(\n contexts: ReturnType<typeof createContextQuery<TState>>\n) {\n const { StoreContext, ContextQuerySubscriptionContext } = contexts;\n\n const useLocalContexts = () => {\n const store = useContext(StoreContext);\n const subscription = useContext(ContextQuerySubscriptionContext);\n\n if (!store) {\n throw new Error(\n \"useContextQuery must be used within a ContextQueryProvider\"\n );\n }\n\n if (!subscription || !subscription.subscribe) {\n throw new Error(\n \"ContextQuerySubscriptionContext not properly initialized\"\n );\n }\n\n return { store, subscription };\n };\n\n const useContextBatchQuery = () => {\n const { store } = useLocalContexts();\n const setState = useCallback(\n (value: TState | ((prev: TState) => TState)) => {\n if (typeof value === \"function\") {\n const updateFn = value as (prev: TState) => TState;\n const currentValue = store.getState();\n return store.updateState(updateFn(currentValue));\n }\n return store.updateState(value);\n },\n [store]\n );\n\n return setState;\n };\n\n const useContextQuery = <TKey extends keyof TState>(\n key: TKey\n ): [\n TState[TKey],\n (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => boolean,\n ] => {\n const { store, subscription } = useLocalContexts();\n const [state, setLocalState] = useState<TState[TKey]>(() =>\n store.getStateByKey(key)\n );\n\n useEffect(() => {\n const handleChange = (_: TKey, newValue: TState[TKey]) => {\n setLocalState(newValue);\n };\n\n if (!subscription.subscribe) return;\n\n const sub = subscription.subscribe(key, handleChange);\n\n return () => {\n sub.unsubscribe();\n };\n }, [key, subscription.subscribe, store]);\n\n const setState = useCallback(\n (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => {\n if (typeof value === \"function\") {\n const updateFn = value as (prev: TState[TKey]) => TState[TKey];\n const currentValue = store.getStateByKey(key);\n return store.setState(key, updateFn(currentValue));\n }\n return store.setState(key, value);\n },\n [key, store]\n );\n\n return [state, setState];\n };\n\n return {\n useContextBatchQuery,\n useContextQuery,\n };\n}\n"],"names":["dist","ContextQueryStore","state","listeners","constructor","t","this","Map","getState","getStateByKey","updateState","s","Object","keys","forEach","is","notifyListeners","setState","get","e","subscribe","has","set","Set","add","unsubscribe","delete","size","createReactContextQuery","contexts","StoreContext","createContext","ContextQuerySubscriptionContext","ContextQueryProvider","children","initialState","storeRef","useRef","previousStateRef","current","useEffect","contextQuerySubscriptionContextValue","useMemo","bind","_jsx","Provider","value","createContextQueryProvider","createContextQuery","useContextQuery","useContextBatchQuery","useLocalContexts","store","useContext","subscription","Error","useCallback","updateFn","currentValue","key","setLocalState","useState","sub","_","newValue","createUseContextQuery"],"mappings":"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","x_google_ignoreList":[0]}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var t=require("react"),e=require("react/jsx-runtime");var r,s={};var n=(r||(r=1,s.ContextQueryStore=class{state;listeners;constructor(t){this.state=t,this.listeners=new Map}getState(){return this.state}getStateByKey(t){return this.state[t]}updateState(t){const e={...this.state};return this.state={...t},Object.keys(t).forEach((t=>{e[t]!==this.state[t]&&this.notifyListeners(t)})),!0}setState(t,e){return this.state[t]!==e&&(this.state={...this.state,[t]:e},this.notifyListeners(t),!0)}notifyListeners(t){const e=this.listeners.get(t);if(e){const r=this.state[t];e.forEach((t=>t(r)))}}subscribe(t,e){const r=r=>{e(t,r)};return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(r),{unsubscribe:()=>{const e=this.listeners.get(t);e&&(e.delete(r),0===e.size&&this.listeners.delete(t))}}}}),s);function i(){const r={StoreContext:t.createContext(null),ContextQuerySubscriptionContext:t.createContext(null)},s=(r=>{const{StoreContext:s,ContextQuerySubscriptionContext:i}=r;return function({children:r,initialState:u}){const o=t.useRef(null),c=t.useRef(null);o.current||(o.current=new n.ContextQueryStore(u),c.current=u),t.useEffect((()=>{o.current&&!Object.is(c.current,u)&&(o.current.updateState(u),c.current=u)}),[u]);const a=t.useMemo((()=>({subscribe:o.current?o.current.subscribe.bind(o.current):null})),[o.current]);return e.jsx(s.Provider,{value:o.current,children:e.jsx(i.Provider,{value:a,children:r})})}})(r);return{Provider:s,contexts:r}}exports.createContextQuery=function(){const{Provider:e,contexts:r}=i(),s=function(e){const{StoreContext:r,ContextQuerySubscriptionContext:s}=e;return function(e){const n=t.useContext(r),i=t.useContext(s);if(!n)throw new Error("useContextQuery must be used within a ContextQueryProvider");if(!i||!i.subscribe)throw new Error("ContextQuerySubscriptionContext not properly initialized");const[u,o]=t.useState((()=>n.getStateByKey(e)));return t.useEffect((()=>{if(!i.subscribe)return;const t=i.subscribe(e,((t,e)=>{o(e)}));return()=>{t.unsubscribe()}}),[e,i.subscribe,n]),[u,t.useCallback((t=>{if("function"==typeof t){const r=t,s=n.getStateByKey(e);return n.setState(e,r(s))}return n.setState(e,t)}),[e,n])]}}(r);return{Provider:e,useContextQuery:s}};
1
+ "use strict";var t=require("react"),e=require("react/jsx-runtime");var r,s={};var n=(r||(r=1,s.ContextQueryStore=class{state;listeners;constructor(t){this.state=t,this.listeners=new Map}getState(){return this.state}getStateByKey(t){return this.state[t]}updateState(t){const e={...this.state};return this.state={...t},Object.keys(t).forEach((t=>{Object.is(e[t],this.state[t])||this.notifyListeners(t)})),!0}setState(t,e){return!Object.is(this.state[t],e)&&(this.state={...this.state,[t]:e},this.notifyListeners(t),!0)}notifyListeners(t){const e=this.listeners.get(t);if(e){const r=this.state[t];e.forEach((t=>t(r)))}}subscribe(t,e){const r=r=>{e(t,r)};return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(r),{unsubscribe:()=>{const e=this.listeners.get(t);e&&(e.delete(r),0===e.size&&this.listeners.delete(t))}}}}),s);function u(){const r={StoreContext:t.createContext(null),ContextQuerySubscriptionContext:t.createContext(null)},s=(r=>{const{StoreContext:s,ContextQuerySubscriptionContext:u}=r;return function({children:r,initialState:i}){const o=t.useRef(null),c=t.useRef(null);o.current||(o.current=new n.ContextQueryStore(i),c.current=i),t.useEffect((()=>{o.current&&!Object.is(c.current,i)&&(o.current.updateState(i),c.current=i)}),[i]);const a=t.useMemo((()=>({subscribe:o.current?o.current.subscribe.bind(o.current):null})),[o.current]);return e.jsx(s.Provider,{value:o.current,children:e.jsx(u.Provider,{value:a,children:r})})}})(r);return{Provider:s,contexts:r}}exports.createContextQuery=function(){const{Provider:e,contexts:r}=u(),{useContextQuery:s,useContextBatchQuery:n}=function(e){const{StoreContext:r,ContextQuerySubscriptionContext:s}=e,n=()=>{const e=t.useContext(r),n=t.useContext(s);if(!e)throw new Error("useContextQuery must be used within a ContextQueryProvider");if(!n||!n.subscribe)throw new Error("ContextQuerySubscriptionContext not properly initialized");return{store:e,subscription:n}};return{useContextBatchQuery:()=>{const{store:e}=n();return t.useCallback((t=>{if("function"==typeof t){const r=t,s=e.getState();return e.updateState(r(s))}return e.updateState(t)}),[e])},useContextQuery:e=>{const{store:r,subscription:s}=n(),[u,i]=t.useState((()=>r.getStateByKey(e)));return t.useEffect((()=>{if(!s.subscribe)return;const t=s.subscribe(e,((t,e)=>{i(e)}));return()=>{t.unsubscribe()}}),[e,s.subscribe,r]),[u,t.useCallback((t=>{if("function"==typeof t){const s=t,n=r.getStateByKey(e);return r.setState(e,s(n))}return r.setState(e,t)}),[e,r])]}}}(r);return{Provider:e,useContextQuery:s,useContextBatchQuery:n}};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../core/dist/index.js","../src/provider.tsx","../src/context.ts","../src/index.ts","../src/hooks.ts"],"sourcesContent":["\"use strict\";exports.ContextQueryStore=class{state;listeners;constructor(t){this.state=t,this.listeners=new Map}getState(){return this.state}getStateByKey(t){return this.state[t]}updateState(t){const s={...this.state};this.state={...t};return Object.keys(t).forEach((t=>{s[t]!==this.state[t]&&this.notifyListeners(t)})),!0}setState(t,s){return this.state[t]!==s&&(this.state={...this.state,[t]:s},this.notifyListeners(t),!0)}notifyListeners(t){const s=this.listeners.get(t);if(s){const e=this.state[t];s.forEach((t=>t(e)))}}subscribe(t,s){const e=e=>{s(t,e)};this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e);return{unsubscribe:()=>{const s=this.listeners.get(t);s&&(s.delete(e),0===s.size&&this.listeners.delete(t))}}}};\n//# sourceMappingURL=index.js.map\n","import { ContextQueryStore, TStateImpl } from \"@context-query/core\";\nimport { FC, PropsWithChildren, useEffect, useMemo, useRef } from \"react\";\nimport { createContextQuery } from \"./context\";\n\nexport interface ProviderProps<TState extends TStateImpl>\n extends PropsWithChildren {\n initialState: TState;\n}\n\nexport const createContextQueryProvider = <TState extends TStateImpl>(\n contexts: ReturnType<typeof createContextQuery<TState>>\n): FC<ProviderProps<TState>> => {\n const { StoreContext, ContextQuerySubscriptionContext } = contexts;\n\n return function ContextQueryProvider({\n children,\n initialState,\n }: ProviderProps<TState>) {\n const storeRef = useRef<ContextQueryStore<TState> | null>(null);\n const previousStateRef = useRef<TState | null>(null);\n\n if (!storeRef.current) {\n storeRef.current = new ContextQueryStore<TState>(initialState);\n previousStateRef.current = initialState;\n }\n\n useEffect(() => {\n if (\n storeRef.current &&\n !Object.is(previousStateRef.current, initialState)\n ) {\n storeRef.current.updateState(initialState);\n previousStateRef.current = initialState;\n }\n }, [initialState]);\n\n const contextQuerySubscriptionContextValue = useMemo(\n () => ({\n subscribe: storeRef.current\n ? storeRef.current.subscribe.bind(storeRef.current)\n : null,\n }),\n [storeRef.current]\n );\n\n return (\n <StoreContext.Provider value={storeRef.current}>\n <ContextQuerySubscriptionContext.Provider\n value={contextQuerySubscriptionContextValue}\n >\n {children}\n </ContextQuerySubscriptionContext.Provider>\n </StoreContext.Provider>\n );\n };\n};\n\nexport function createReactContextQuery<TState extends TStateImpl>() {\n const contexts = createContextQuery<TState>();\n const ContextQueryProvider = createContextQueryProvider<TState>(contexts);\n\n return {\n Provider: ContextQueryProvider,\n contexts,\n };\n}\n","import type { ContextQueryStore, TStateImpl } from \"@context-query/core\";\nimport { createContext } from \"react\";\n\nexport const createContextQuery = <TState extends TStateImpl>() => {\n const StoreContext = createContext<ContextQueryStore<TState> | null>(null);\n const ContextQuerySubscriptionContext = createContext<{\n subscribe: ContextQueryStore<TState>[\"subscribe\"] | null;\n } | null>(null);\n\n return {\n StoreContext,\n ContextQuerySubscriptionContext,\n };\n};\n","import { TStateImpl } from \"@context-query/core\";\nimport { createUseContextQuery } from \"./hooks\";\nimport { createReactContextQuery } from \"./provider\";\n\nexport function createContextQuery<TState extends TStateImpl>() {\n const { Provider, contexts } = createReactContextQuery<TState>();\n\n const useContextQuery = createUseContextQuery<TState>(contexts);\n\n return {\n Provider,\n useContextQuery,\n };\n}\n","import { TStateImpl } from \"@context-query/core\";\nimport { useCallback, useContext, useEffect, useState } from \"react\";\nimport { createContextQuery } from \"./context\";\n\nexport function createUseContextQuery<TState extends TStateImpl>(\n contexts: ReturnType<typeof createContextQuery<TState>>\n) {\n const { StoreContext, ContextQuerySubscriptionContext } = contexts;\n\n return function useContextQuery<TKey extends keyof TState>(\n key: TKey\n ): [\n TState[TKey],\n (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => boolean,\n ] {\n const store = useContext(StoreContext);\n const subscription = useContext(ContextQuerySubscriptionContext);\n\n if (!store) {\n throw new Error(\n \"useContextQuery must be used within a ContextQueryProvider\"\n );\n }\n\n if (!subscription || !subscription.subscribe) {\n throw new Error(\n \"ContextQuerySubscriptionContext not properly initialized\"\n );\n }\n\n const [state, setLocalState] = useState<TState[TKey]>(() =>\n store.getStateByKey(key)\n );\n\n useEffect(() => {\n const handleChange = (_: TKey, newValue: TState[TKey]) => {\n setLocalState(newValue);\n };\n\n if (!subscription.subscribe) return;\n\n const sub = subscription.subscribe(key, handleChange);\n\n return () => {\n sub.unsubscribe();\n };\n }, [key, subscription.subscribe, store]);\n\n const setState = useCallback(\n (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => {\n if (typeof value === \"function\") {\n const updateFn = value as (prev: TState[TKey]) => TState[TKey];\n const currentValue = store.getStateByKey(key);\n return store.setState(key, updateFn(currentValue));\n }\n return store.setState(key, value);\n },\n [key, store]\n );\n\n return [state, setState];\n };\n}\n"],"names":["dist","ContextQueryStore","state","listeners","constructor","t","this","Map","getState","getStateByKey","updateState","s","Object","keys","forEach","notifyListeners","setState","get","e","subscribe","has","set","Set","add","unsubscribe","delete","size","createReactContextQuery","contexts","StoreContext","createContext","ContextQuerySubscriptionContext","ContextQueryProvider","children","initialState","storeRef","useRef","previousStateRef","current","useEffect","is","contextQuerySubscriptionContextValue","useMemo","bind","_jsx","Provider","value","createContextQueryProvider","useContextQuery","key","store","useContext","subscription","Error","setLocalState","useState","sub","_","newValue","useCallback","updateFn","currentValue","createUseContextQuery"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../node_modules/.pnpm/@context-query+core@0.1.0-dev.1/node_modules/@context-query/core/dist/index.js","../src/provider.tsx","../src/context.ts","../src/index.ts","../src/hooks.ts"],"sourcesContent":["\"use strict\";exports.ContextQueryStore=class{state;listeners;constructor(t){this.state=t,this.listeners=new Map}getState(){return this.state}getStateByKey(t){return this.state[t]}updateState(t){const s={...this.state};this.state={...t};return Object.keys(t).forEach((t=>{Object.is(s[t],this.state[t])||this.notifyListeners(t)})),!0}setState(t,s){return!Object.is(this.state[t],s)&&(this.state={...this.state,[t]:s},this.notifyListeners(t),!0)}notifyListeners(t){const s=this.listeners.get(t);if(s){const e=this.state[t];s.forEach((t=>t(e)))}}subscribe(t,s){const e=e=>{s(t,e)};this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e);return{unsubscribe:()=>{const s=this.listeners.get(t);s&&(s.delete(e),0===s.size&&this.listeners.delete(t))}}}};\n//# sourceMappingURL=index.js.map\n","import { ContextQueryStore, TStateImpl } from \"@context-query/core\";\nimport { FC, PropsWithChildren, useEffect, useMemo, useRef } from \"react\";\nimport { createContextQuery } from \"./context\";\n\nexport interface ProviderProps<TState extends TStateImpl>\n extends PropsWithChildren {\n initialState: TState;\n}\n\nexport const createContextQueryProvider = <TState extends TStateImpl>(\n contexts: ReturnType<typeof createContextQuery<TState>>\n): FC<ProviderProps<TState>> => {\n const { StoreContext, ContextQuerySubscriptionContext } = contexts;\n\n return function ContextQueryProvider({\n children,\n initialState,\n }: ProviderProps<TState>) {\n const storeRef = useRef<ContextQueryStore<TState> | null>(null);\n const previousStateRef = useRef<TState | null>(null);\n\n if (!storeRef.current) {\n storeRef.current = new ContextQueryStore<TState>(initialState);\n previousStateRef.current = initialState;\n }\n\n useEffect(() => {\n if (\n storeRef.current &&\n !Object.is(previousStateRef.current, initialState)\n ) {\n storeRef.current.updateState(initialState);\n previousStateRef.current = initialState;\n }\n }, [initialState]);\n\n const contextQuerySubscriptionContextValue = useMemo(\n () => ({\n subscribe: storeRef.current\n ? storeRef.current.subscribe.bind(storeRef.current)\n : null,\n }),\n [storeRef.current]\n );\n\n return (\n <StoreContext.Provider value={storeRef.current}>\n <ContextQuerySubscriptionContext.Provider\n value={contextQuerySubscriptionContextValue}\n >\n {children}\n </ContextQuerySubscriptionContext.Provider>\n </StoreContext.Provider>\n );\n };\n};\n\nexport function createReactContextQuery<TState extends TStateImpl>() {\n const contexts = createContextQuery<TState>();\n const ContextQueryProvider = createContextQueryProvider<TState>(contexts);\n\n return {\n Provider: ContextQueryProvider,\n contexts,\n };\n}\n","import type { ContextQueryStore, TStateImpl } from \"@context-query/core\";\nimport { createContext } from \"react\";\n\nexport const createContextQuery = <TState extends TStateImpl>() => {\n const StoreContext = createContext<ContextQueryStore<TState> | null>(null);\n const ContextQuerySubscriptionContext = createContext<{\n subscribe: ContextQueryStore<TState>[\"subscribe\"] | null;\n } | null>(null);\n\n return {\n StoreContext,\n ContextQuerySubscriptionContext,\n };\n};\n","import { TStateImpl } from \"@context-query/core\";\nimport { createUseContextQuery } from \"./hooks\";\nimport { createReactContextQuery } from \"./provider\";\n\nexport function createContextQuery<TState extends TStateImpl>() {\n const { Provider, contexts } = createReactContextQuery<TState>();\n\n const { useContextQuery, useContextBatchQuery } =\n createUseContextQuery<TState>(contexts);\n\n return {\n Provider,\n useContextQuery,\n useContextBatchQuery,\n };\n}\n","import { TStateImpl } from \"@context-query/core\";\nimport { useCallback, useContext, useEffect, useState } from \"react\";\nimport { createContextQuery } from \"./context\";\n\nexport function createUseContextQuery<TState extends TStateImpl>(\n contexts: ReturnType<typeof createContextQuery<TState>>\n) {\n const { StoreContext, ContextQuerySubscriptionContext } = contexts;\n\n const useLocalContexts = () => {\n const store = useContext(StoreContext);\n const subscription = useContext(ContextQuerySubscriptionContext);\n\n if (!store) {\n throw new Error(\n \"useContextQuery must be used within a ContextQueryProvider\"\n );\n }\n\n if (!subscription || !subscription.subscribe) {\n throw new Error(\n \"ContextQuerySubscriptionContext not properly initialized\"\n );\n }\n\n return { store, subscription };\n };\n\n const useContextBatchQuery = () => {\n const { store } = useLocalContexts();\n const setState = useCallback(\n (value: TState | ((prev: TState) => TState)) => {\n if (typeof value === \"function\") {\n const updateFn = value as (prev: TState) => TState;\n const currentValue = store.getState();\n return store.updateState(updateFn(currentValue));\n }\n return store.updateState(value);\n },\n [store]\n );\n\n return setState;\n };\n\n const useContextQuery = <TKey extends keyof TState>(\n key: TKey\n ): [\n TState[TKey],\n (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => boolean,\n ] => {\n const { store, subscription } = useLocalContexts();\n const [state, setLocalState] = useState<TState[TKey]>(() =>\n store.getStateByKey(key)\n );\n\n useEffect(() => {\n const handleChange = (_: TKey, newValue: TState[TKey]) => {\n setLocalState(newValue);\n };\n\n if (!subscription.subscribe) return;\n\n const sub = subscription.subscribe(key, handleChange);\n\n return () => {\n sub.unsubscribe();\n };\n }, [key, subscription.subscribe, store]);\n\n const setState = useCallback(\n (value: TState[TKey] | ((prev: TState[TKey]) => TState[TKey])) => {\n if (typeof value === \"function\") {\n const updateFn = value as (prev: TState[TKey]) => TState[TKey];\n const currentValue = store.getStateByKey(key);\n return store.setState(key, updateFn(currentValue));\n }\n return store.setState(key, value);\n },\n [key, store]\n );\n\n return [state, setState];\n };\n\n return {\n useContextBatchQuery,\n useContextQuery,\n };\n}\n"],"names":["dist","ContextQueryStore","state","listeners","constructor","t","this","Map","getState","getStateByKey","updateState","s","Object","keys","forEach","is","notifyListeners","setState","get","e","subscribe","has","set","Set","add","unsubscribe","delete","size","createReactContextQuery","contexts","StoreContext","createContext","ContextQuerySubscriptionContext","ContextQueryProvider","children","initialState","storeRef","useRef","previousStateRef","current","useEffect","contextQuerySubscriptionContextValue","useMemo","bind","_jsx","Provider","value","createContextQueryProvider","useContextQuery","useContextBatchQuery","useLocalContexts","store","useContext","subscription","Error","useCallback","updateFn","currentValue","key","setLocalState","useState","sub","_","newValue","createUseContextQuery"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@context-query/react",
3
- "version": "0.1.0",
3
+ "version": "0.2.0-dev.2",
4
4
  "license": "MIT",
5
5
  "description": "React bindings for ContextQuery",
6
6
  "author": "Minyeoung Seo <tjalsdud89@naver.com>",
@@ -30,7 +30,7 @@
30
30
  "react": "^18.0.0 || ^19.0.0"
31
31
  },
32
32
  "dependencies": {
33
- "@context-query/core": "latest",
33
+ "@context-query/core": "0.2.0-dev.2",
34
34
  "react": "^18.3.1"
35
35
  },
36
36
  "devDependencies": {