qortex-core 0.1.5 → 0.1.7

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/README.md CHANGED
@@ -20,255 +20,11 @@
20
20
  pnpm add qortex-core
21
21
  ```
22
22
 
23
- ```ts
24
- import { queryManager } from "qortex-core";
23
+ ## 📚 Documentation
25
24
 
26
- // Set global defaults for all queries
27
- queryManager.setDefaultConfig({
28
- staleTime: 5 * 60 * 1000, // 5 minutes default
29
- throttleTime: 100, // 100ms throttle
30
- usePreviousDataOnError: true
31
- });
25
+ **Complete documentation, examples, and API reference available at:**
32
26
 
33
- // Register a fetcher
34
- queryManager.registerFetcher(["todos"], {
35
- fetcher: async () => {
36
- const response = await fetch("/api/todos");
37
- return response.json();
38
- },
39
- placeholderData: [] // Uses global staleTime: 5 minutes
40
- });
41
-
42
- // Fetch data
43
- const todos = await queryManager.fetchQuery(["todos"]);
44
- console.log("Todos loaded:", todos);
45
- ```
46
-
47
- ## 🔐 Perfect for Authentication
48
-
49
- ```ts
50
- // Auth service - update from anywhere
51
- class AuthService {
52
- async login(email: string, password: string) {
53
- const { user, token } = await fetch("/api/auth/login", {
54
- method: "POST",
55
- body: JSON.stringify({ email, password })
56
- }).then(r => r.json());
57
-
58
- // 🎯 Update auth state - accessible everywhere!
59
- queryManager.setQueryData(["auth", "user"], user);
60
- queryManager.setQueryData(["auth", "isAuthenticated"], true);
61
- }
62
-
63
- logout() {
64
- // 🎯 Clear auth state from anywhere
65
- queryManager.setQueryData(["auth", "user"], null);
66
- queryManager.setQueryData(["auth", "isAuthenticated"], false);
67
- }
68
- }
69
-
70
- // Access from any environment
71
- // React
72
- function useAuth() {
73
- const user = queryManager.getQueryData(["auth", "user"]);
74
- const isAuthenticated = queryManager.getQueryData(["auth", "isAuthenticated"]);
75
- return { user, isAuthenticated };
76
- }
77
-
78
- // React with hooks (qortex-react package)
79
- import { useQuery, useQueryData } from "qortex-react";
80
-
81
- function AuthComponent() {
82
- const { data: user, isLoading } = useQuery(["auth", "user"]);
83
- const isAuthenticated = useQueryData(["auth", "isAuthenticated"]);
84
-
85
- if (isLoading) return <div>Loading...</div>;
86
- return <div>Welcome {user?.name}</div>;
87
- }
88
-
89
- // Vue
90
- function useAuth() {
91
- const user = ref(queryManager.getQueryData(["auth", "user"]));
92
- const isAuthenticated = ref(queryManager.getQueryData(["auth", "isAuthenticated"]));
93
-
94
- queryManager.subscribeQuery(["auth", "user"], (state) => {
95
- user.value = state.data;
96
- console.log("Auth state:", state.isSuccess, state.isLoading);
97
- });
98
-
99
- return { user, isAuthenticated };
100
- }
101
-
102
- // Vanilla JS
103
- function checkAuth() {
104
- const user = queryManager.getQueryData(["auth", "user"]);
105
- const isAuthenticated = queryManager.getQueryData(["auth", "isAuthenticated"]);
106
- return { user, isAuthenticated };
107
- }
108
- ```
109
-
110
- ## 🎨 API Reference
111
-
112
- ### `queryManager.registerFetcher(key, options)`
113
-
114
- ```ts
115
- queryManager.registerFetcher(key, {
116
- fetcher: async () => Promise<T>,
117
- staleTime?: number, // Default: 0
118
- placeholderData?: T,
119
- enabled?: boolean // Default: true
120
- });
121
- ```
122
-
123
- ### `queryManager.fetchQuery(key, options?)`
124
-
125
- ```ts
126
- const data = await queryManager.fetchQuery(key, {
127
- fetcher?: Fetcher<T>,
128
- staleTime?: number
129
- });
130
- ```
131
-
132
- ### `queryManager.setQueryData(key, data)`
133
-
134
- ```ts
135
- // Direct update
136
- queryManager.setQueryData(["todos"], newTodos);
137
-
138
- // Functional update
139
- queryManager.setQueryData(["todos"], (oldData) => [
140
- ...(oldData || []),
141
- newTodo
142
- ]);
143
- ```
144
-
145
- ### `queryManager.getQueryData(key)`
146
-
147
- ```ts
148
- const user = queryManager.getQueryData(["auth", "user"]);
149
- const isAuthenticated = queryManager.getQueryData(["auth", "isAuthenticated"]);
150
- ```
151
-
152
- ### React Hooks (qortex-react package)
153
-
154
- ```tsx
155
- import { useQuery, useQueryData } from "qortex-react";
156
-
157
- // Full query state with loading, error, refetch
158
- const { data, isLoading, error, refetch } = useQuery(["todos"]);
159
-
160
- // Just the data - simpler API
161
- const todos = useQueryData(["todos"]);
162
- ```
163
-
164
- ### `queryManager.subscribeQuery(key, callback, options?)`
165
-
166
- Subscribe to query state changes with flexible callback signatures.
167
-
168
- ```ts
169
- // Callback receives the current state
170
- const unsubscribe = queryManager.subscribeQuery(["todos"], (state) => {
171
- console.log("State changed:", state);
172
- console.log("Data:", state.data);
173
- console.log("Loading:", state.isLoading);
174
- console.log("Success:", state.isSuccess);
175
- });
176
-
177
- // With fetcher for automatic type inference
178
- const unsubscribe = queryManager.subscribeQuery(["todos"], (state) => {
179
- console.log("Todos:", state.data); // Automatically typed
180
- }, { fetcher: fetchTodos });
181
- ```
182
-
183
- ### `queryManager.setDefaultConfig(config)`
184
-
185
- Set global default configuration for all queries.
186
-
187
- ```ts
188
- queryManager.setDefaultConfig({
189
- staleTime: 5 * 60 * 1000, // 5 minutes
190
- refetchOnSubscribe: "stale",
191
- throttleTime: 100, // 100ms throttle
192
- usePreviousDataOnError: true,
193
- equalityFn: shallowEqual
194
- });
195
- ```
196
-
197
- **Available options:**
198
- - `enabled?: boolean` - Whether queries are enabled by default
199
- - `refetchOnSubscribe?: "stale" | "always" | false` - Default refetch behavior
200
- - `staleTime?: number` - Default time before data is considered stale
201
- - `usePreviousDataOnError?: boolean` - Keep previous data on error
202
- - `usePlaceholderOnError?: boolean` - Use placeholder data on error
203
- - `equalityFn?: EqualityFn<any>` - Default equality function
204
- - `throttleTime?: number` - Default throttle time for duplicate request prevention
205
-
206
- ## 🎯 More Examples
207
-
208
- ### WebSocket Updates
209
-
210
- ```ts
211
- // Update data from WebSocket
212
- const ws = new WebSocket("ws://localhost:8080");
213
- ws.onmessage = (event) => {
214
- const data = JSON.parse(event.data);
215
- queryManager.setQueryData(["live-stats"], data);
216
- };
217
-
218
- // Access from any environment
219
- const stats = queryManager.getQueryData(["live-stats"]);
220
- console.log("Users online:", stats?.users);
221
- ```
222
-
223
- ### Cross-Framework Data Sharing
224
-
225
- ```ts
226
- // React component updates data
227
- function ReactComponent() {
228
- const updateTheme = () => {
229
- queryManager.setQueryData(["user", "preferences"], { theme: "dark" });
230
- };
231
- return <button onClick={updateTheme}>Update Theme</button>;
232
- }
233
-
234
- // Vue component automatically reflects changes
235
- function VueComponent() {
236
- const preferences = ref(queryManager.getQueryData(["user", "preferences"]));
237
-
238
- queryManager.subscribeQuery(["user", "preferences"], (state) => {
239
- preferences.value = state.data;
240
- });
241
-
242
- return { preferences };
243
- }
244
-
245
- // Vanilla JS also gets updates
246
- function vanillaJSFunction() {
247
- const preferences = queryManager.getQueryData(["user", "preferences"]);
248
- console.log("Current theme:", preferences?.theme);
249
- }
250
- ```
251
-
252
- ## 🎭 TypeScript Support
253
-
254
- ```ts
255
- interface User {
256
- id: string;
257
- name: string;
258
- email: string;
259
- }
260
-
261
- // Type-safe usage
262
- queryManager.registerFetcher<User[]>(["users"], {
263
- fetcher: async (): Promise<User[]> => {
264
- const response = await fetch("/api/users");
265
- return response.json();
266
- }
267
- });
268
-
269
- const users = await queryManager.fetchQuery<User[]>(["users"]);
270
- // users is typed as User[] | undefined
271
- ```
27
+ ### 🌐 [qortex.darshannaik.com](https://qortex.darshannaik.com)
272
28
 
273
29
  ## 📄 License
274
30
 
@@ -276,10 +32,12 @@ MIT License - feel free to use this in your projects! 🎉
276
32
 
277
33
  ## 🎯 Support
278
34
 
279
- Need help? Have questions?
35
+ Need help? Have questions? Want to chat about data fetching strategies?
280
36
 
37
+ - 📚 **Documentation**: [qortex.darshannaik.com](https://qortex.darshannaik.com)
281
38
  - 📧 **Email**: [darshannaik.com](https://darshannaik.com)
282
39
  - 🐛 **Issues**: [GitHub Issues](https://github.com/Darshan-Naik/qortex/issues)
40
+ - 💬 **Discussions**: [GitHub Discussions](https://github.com/Darshan-Naik/qortex/discussions)
283
41
  - 🌟 **Repository**: [https://github.com/Darshan-Naik/qortex](https://github.com/Darshan-Naik/qortex)
284
42
 
285
43
  ---
@@ -287,4 +45,4 @@ Need help? Have questions?
287
45
  <div align="center">
288
46
  <p>Made with ❤️ by <a href="https://darshannaik.com">Darshan</a></p>
289
47
  <p>⭐ Star this repo if you found it helpful!</p>
290
- </div>
48
+ </div>
package/index.d.ts CHANGED
@@ -80,7 +80,7 @@ type QueryState<T = any, E = Error> = {
80
80
  * Core query manager that handles caching, fetching, and state management
81
81
  * Implements robust throttling and race condition prevention
82
82
  */
83
- declare class QueryManager {
83
+ declare class QueryManagerCore {
84
84
  private cache;
85
85
  private subs;
86
86
  private lastReturnedState;
@@ -180,7 +180,43 @@ declare class QueryManager {
180
180
  */
181
181
  private handleMountLogic;
182
182
  }
183
- declare const queryManager: QueryManager;
183
+
184
+ declare const _queryManager: QueryManagerCore;
185
+ declare const registerFetcher: {
186
+ <T = any>(key: QueryKey, opts: QueryOptions<T>): void;
187
+ <F extends Fetcher>(key: QueryKey, opts: QueryOptions<InferFetcherResult<F>> & {
188
+ fetcher: F;
189
+ }): void;
190
+ };
191
+ declare const fetchQuery: {
192
+ <T = any>(key: QueryKey, opts?: QueryOptions<T>): Promise<T>;
193
+ <F extends Fetcher>(key: QueryKey, opts: QueryOptions<InferFetcherResult<F>> & {
194
+ fetcher: F;
195
+ }): Promise<InferFetcherResult<F>>;
196
+ };
197
+ declare const setQueryData: <T = any>(key: QueryKey, data: T) => void;
198
+ declare const getQueryData: {
199
+ <T = any>(key: QueryKey, opts?: QueryOptions<T>): T | undefined;
200
+ <F extends Fetcher>(key: QueryKey, opts: QueryOptions<InferFetcherResult<F>> & {
201
+ fetcher: F;
202
+ }): InferFetcherResult<F> | undefined;
203
+ };
204
+ declare const getQueryState: {
205
+ <T = unknown>(key: QueryKey, opts?: QueryOptions<T>): QueryState<T>;
206
+ <F extends Fetcher>(key: QueryKey, opts: QueryOptions<InferFetcherResult<F>> & {
207
+ fetcher: F;
208
+ }): QueryState<InferFetcherResult<F>>;
209
+ };
210
+ declare const invalidateQuery: (key: QueryKey) => void;
211
+ declare const subscribeQuery: {
212
+ (key: QueryKey, cb: (state: QueryState<any>) => void): () => void;
213
+ <F extends Fetcher>(key: QueryKey, cb: (state: QueryState<InferFetcherResult<F>>) => void, opts: QueryOptions<InferFetcherResult<F>> & {
214
+ fetcher: F;
215
+ }): () => void;
216
+ <T = any>(key: QueryKey, cb: (state: QueryState<T>) => void, opts?: QueryOptions<T>): () => void;
217
+ };
218
+ declare const setDefaultConfig: ({ throttleTime, ...config }: DefaultConfig) => void;
219
+ declare const dangerClearCache: () => void;
184
220
 
185
221
  /**
186
222
  * Normalizes query keys to a consistent string format for internal storage
@@ -188,4 +224,4 @@ declare const queryManager: QueryManager;
188
224
  */
189
225
  declare function serializeKey(key: QueryKey): string;
190
226
 
191
- export { DefaultConfig, EqualityFn, Fetcher, InferFetcherResult, QueryKey, QueryManager, QueryOptions, QueryState, QueryStatus, queryManager, serializeKey };
227
+ export { DefaultConfig, EqualityFn, Fetcher, InferFetcherResult, QueryKey, QueryManagerCore, QueryOptions, QueryState, QueryStatus, _queryManager, dangerClearCache, fetchQuery, getQueryData, getQueryState, invalidateQuery, registerFetcher, serializeKey, setDefaultConfig, setQueryData, subscribeQuery };
package/index.js CHANGED
@@ -20,9 +20,18 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
- QueryManager: () => QueryManager,
24
- queryManager: () => queryManager,
25
- serializeKey: () => serializeKey
23
+ QueryManagerCore: () => QueryManagerCore,
24
+ _queryManager: () => _queryManager,
25
+ dangerClearCache: () => dangerClearCache,
26
+ fetchQuery: () => fetchQuery,
27
+ getQueryData: () => getQueryData,
28
+ getQueryState: () => getQueryState,
29
+ invalidateQuery: () => invalidateQuery,
30
+ registerFetcher: () => registerFetcher,
31
+ serializeKey: () => serializeKey,
32
+ setDefaultConfig: () => setDefaultConfig,
33
+ setQueryData: () => setQueryData,
34
+ subscribeQuery: () => subscribeQuery
26
35
  });
27
36
  module.exports = __toCommonJS(src_exports);
28
37
 
@@ -120,8 +129,8 @@ function warnNoFetcherOrData(key) {
120
129
  );
121
130
  }
122
131
 
123
- // src/queryManager.ts
124
- var QueryManager = class {
132
+ // src/queryManagerCore.ts
133
+ var QueryManagerCore = class {
125
134
  constructor() {
126
135
  this.cache = /* @__PURE__ */ new Map();
127
136
  this.subs = /* @__PURE__ */ new Map();
@@ -196,13 +205,8 @@ var QueryManager = class {
196
205
  cb(publicState);
197
206
  }
198
207
  registerFetcher(key, opts) {
199
- this.ensureState(key, opts);
200
- if (opts.enabled !== false) {
201
- try {
202
- void this.fetchQuery(key);
203
- } catch {
204
- }
205
- }
208
+ const state = this.ensureState(key, opts);
209
+ this.handleMountLogic(key, state);
206
210
  }
207
211
  fetchQuery(key, opts) {
208
212
  const state = this.ensureState(key, opts);
@@ -318,10 +322,31 @@ var QueryManager = class {
318
322
  }
319
323
  }
320
324
  };
321
- var queryManager = new QueryManager();
325
+ var queryManagerCore_default = QueryManagerCore;
326
+
327
+ // src/queryManager.ts
328
+ var _queryManager = new queryManagerCore_default();
329
+ var registerFetcher = _queryManager.registerFetcher.bind(_queryManager);
330
+ var fetchQuery = _queryManager.fetchQuery.bind(_queryManager);
331
+ var setQueryData = _queryManager.setQueryData.bind(_queryManager);
332
+ var getQueryData = _queryManager.getQueryData.bind(_queryManager);
333
+ var getQueryState = _queryManager.getQueryState.bind(_queryManager);
334
+ var invalidateQuery = _queryManager.invalidateQuery.bind(_queryManager);
335
+ var subscribeQuery = _queryManager.subscribeQuery.bind(_queryManager);
336
+ var setDefaultConfig = _queryManager.setDefaultConfig.bind(_queryManager);
337
+ var dangerClearCache = _queryManager.dangerClearCache.bind(_queryManager);
322
338
  // Annotate the CommonJS export names for ESM import in node:
323
339
  0 && (module.exports = {
324
- QueryManager,
325
- queryManager,
326
- serializeKey
340
+ QueryManagerCore,
341
+ _queryManager,
342
+ dangerClearCache,
343
+ fetchQuery,
344
+ getQueryData,
345
+ getQueryState,
346
+ invalidateQuery,
347
+ registerFetcher,
348
+ serializeKey,
349
+ setDefaultConfig,
350
+ setQueryData,
351
+ subscribeQuery
327
352
  });
package/index.mjs CHANGED
@@ -92,8 +92,8 @@ function warnNoFetcherOrData(key) {
92
92
  );
93
93
  }
94
94
 
95
- // src/queryManager.ts
96
- var QueryManager = class {
95
+ // src/queryManagerCore.ts
96
+ var QueryManagerCore = class {
97
97
  constructor() {
98
98
  this.cache = /* @__PURE__ */ new Map();
99
99
  this.subs = /* @__PURE__ */ new Map();
@@ -168,13 +168,8 @@ var QueryManager = class {
168
168
  cb(publicState);
169
169
  }
170
170
  registerFetcher(key, opts) {
171
- this.ensureState(key, opts);
172
- if (opts.enabled !== false) {
173
- try {
174
- void this.fetchQuery(key);
175
- } catch {
176
- }
177
- }
171
+ const state = this.ensureState(key, opts);
172
+ this.handleMountLogic(key, state);
178
173
  }
179
174
  fetchQuery(key, opts) {
180
175
  const state = this.ensureState(key, opts);
@@ -290,9 +285,30 @@ var QueryManager = class {
290
285
  }
291
286
  }
292
287
  };
293
- var queryManager = new QueryManager();
288
+ var queryManagerCore_default = QueryManagerCore;
289
+
290
+ // src/queryManager.ts
291
+ var _queryManager = new queryManagerCore_default();
292
+ var registerFetcher = _queryManager.registerFetcher.bind(_queryManager);
293
+ var fetchQuery = _queryManager.fetchQuery.bind(_queryManager);
294
+ var setQueryData = _queryManager.setQueryData.bind(_queryManager);
295
+ var getQueryData = _queryManager.getQueryData.bind(_queryManager);
296
+ var getQueryState = _queryManager.getQueryState.bind(_queryManager);
297
+ var invalidateQuery = _queryManager.invalidateQuery.bind(_queryManager);
298
+ var subscribeQuery = _queryManager.subscribeQuery.bind(_queryManager);
299
+ var setDefaultConfig = _queryManager.setDefaultConfig.bind(_queryManager);
300
+ var dangerClearCache = _queryManager.dangerClearCache.bind(_queryManager);
294
301
  export {
295
- QueryManager,
296
- queryManager,
297
- serializeKey
302
+ QueryManagerCore,
303
+ _queryManager,
304
+ dangerClearCache,
305
+ fetchQuery,
306
+ getQueryData,
307
+ getQueryState,
308
+ invalidateQuery,
309
+ registerFetcher,
310
+ serializeKey,
311
+ setDefaultConfig,
312
+ setQueryData,
313
+ subscribeQuery
298
314
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qortex-core",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Framework-agnostic query cache & fetch registry (MFE friendly).",
5
5
  "main": "index.js",
6
6
  "module": "index.mjs",