@bquery/bquery 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +546 -501
  2. package/dist/component/component.d.ts.map +1 -1
  3. package/dist/component/index.d.ts +2 -0
  4. package/dist/component/index.d.ts.map +1 -1
  5. package/dist/component/library.d.ts +34 -0
  6. package/dist/component/library.d.ts.map +1 -0
  7. package/dist/component/types.d.ts +10 -6
  8. package/dist/component/types.d.ts.map +1 -1
  9. package/dist/component-CY5MVoYN.js +531 -0
  10. package/dist/component-CY5MVoYN.js.map +1 -0
  11. package/dist/component.es.mjs +6 -184
  12. package/dist/config-DRmZZno3.js +40 -0
  13. package/dist/config-DRmZZno3.js.map +1 -0
  14. package/dist/core/collection.d.ts +19 -3
  15. package/dist/core/collection.d.ts.map +1 -1
  16. package/dist/core/element.d.ts +23 -4
  17. package/dist/core/element.d.ts.map +1 -1
  18. package/dist/core/index.d.ts +1 -0
  19. package/dist/core/index.d.ts.map +1 -1
  20. package/dist/core/utils/function.d.ts +21 -4
  21. package/dist/core/utils/function.d.ts.map +1 -1
  22. package/dist/core-CK2Mfpf4.js +648 -0
  23. package/dist/core-CK2Mfpf4.js.map +1 -0
  24. package/dist/core-DPdbItcq.js +112 -0
  25. package/dist/core-DPdbItcq.js.map +1 -0
  26. package/dist/core.es.mjs +45 -1218
  27. package/dist/full.d.ts +6 -6
  28. package/dist/full.d.ts.map +1 -1
  29. package/dist/full.es.mjs +98 -92
  30. package/dist/full.iife.js +173 -3
  31. package/dist/full.iife.js.map +1 -1
  32. package/dist/full.umd.js +173 -3
  33. package/dist/full.umd.js.map +1 -1
  34. package/dist/index.es.mjs +143 -139
  35. package/dist/motion/transition.d.ts +1 -1
  36. package/dist/motion/transition.d.ts.map +1 -1
  37. package/dist/motion/types.d.ts +11 -1
  38. package/dist/motion/types.d.ts.map +1 -1
  39. package/dist/motion-C5DRdPnO.js +415 -0
  40. package/dist/motion-C5DRdPnO.js.map +1 -0
  41. package/dist/motion.es.mjs +25 -361
  42. package/dist/object-qGpWr6-J.js +38 -0
  43. package/dist/object-qGpWr6-J.js.map +1 -0
  44. package/dist/platform/announcer.d.ts +59 -0
  45. package/dist/platform/announcer.d.ts.map +1 -0
  46. package/dist/platform/config.d.ts +92 -0
  47. package/dist/platform/config.d.ts.map +1 -0
  48. package/dist/platform/cookies.d.ts +45 -0
  49. package/dist/platform/cookies.d.ts.map +1 -0
  50. package/dist/platform/index.d.ts +8 -0
  51. package/dist/platform/index.d.ts.map +1 -1
  52. package/dist/platform/meta.d.ts +62 -0
  53. package/dist/platform/meta.d.ts.map +1 -0
  54. package/dist/platform/storage.d.ts.map +1 -1
  55. package/dist/platform-B7JhGBc7.js +361 -0
  56. package/dist/platform-B7JhGBc7.js.map +1 -0
  57. package/dist/platform.es.mjs +11 -243
  58. package/dist/reactive/async-data.d.ts +114 -0
  59. package/dist/reactive/async-data.d.ts.map +1 -0
  60. package/dist/reactive/core.d.ts +12 -0
  61. package/dist/reactive/core.d.ts.map +1 -1
  62. package/dist/reactive/effect.d.ts.map +1 -1
  63. package/dist/reactive/index.d.ts +2 -2
  64. package/dist/reactive/index.d.ts.map +1 -1
  65. package/dist/reactive/internals.d.ts +6 -0
  66. package/dist/reactive/internals.d.ts.map +1 -1
  67. package/dist/reactive/signal.d.ts +2 -0
  68. package/dist/reactive/signal.d.ts.map +1 -1
  69. package/dist/reactive-BDya-ia8.js +253 -0
  70. package/dist/reactive-BDya-ia8.js.map +1 -0
  71. package/dist/reactive.es.mjs +18 -34
  72. package/dist/router-CijiICxt.js +188 -0
  73. package/dist/router-CijiICxt.js.map +1 -0
  74. package/dist/router.es.mjs +11 -200
  75. package/dist/sanitize-jyJ2ryE2.js +302 -0
  76. package/dist/sanitize-jyJ2ryE2.js.map +1 -0
  77. package/dist/security/constants.d.ts.map +1 -1
  78. package/dist/security/sanitize-core.d.ts.map +1 -1
  79. package/dist/security.es.mjs +10 -56
  80. package/dist/store-CPK9E62U.js +262 -0
  81. package/dist/store-CPK9E62U.js.map +1 -0
  82. package/dist/store.es.mjs +12 -25
  83. package/dist/view/evaluate.d.ts.map +1 -1
  84. package/dist/view-Cdi0g-qo.js +396 -0
  85. package/dist/view-Cdi0g-qo.js.map +1 -0
  86. package/dist/view.es.mjs +10 -424
  87. package/package.json +136 -132
  88. package/src/component/component.ts +319 -289
  89. package/src/component/index.ts +42 -40
  90. package/src/component/library.ts +504 -0
  91. package/src/component/types.ts +91 -85
  92. package/src/core/collection.ts +44 -4
  93. package/src/core/element.ts +33 -5
  94. package/src/core/index.ts +1 -0
  95. package/src/core/utils/function.ts +56 -15
  96. package/src/full.ts +223 -187
  97. package/src/motion/transition.ts +97 -51
  98. package/src/motion/types.ts +208 -198
  99. package/src/platform/announcer.ts +208 -0
  100. package/src/platform/config.ts +163 -0
  101. package/src/platform/cookies.ts +165 -0
  102. package/src/platform/index.ts +39 -18
  103. package/src/platform/meta.ts +168 -0
  104. package/src/platform/storage.ts +8 -1
  105. package/src/reactive/async-data.ts +486 -0
  106. package/src/reactive/core.ts +21 -0
  107. package/src/reactive/effect.ts +18 -7
  108. package/src/reactive/index.ts +37 -23
  109. package/src/reactive/internals.ts +18 -1
  110. package/src/reactive/signal.ts +29 -20
  111. package/src/security/constants.ts +211 -209
  112. package/src/security/sanitize-core.ts +22 -1
  113. package/src/view/evaluate.ts +29 -13
  114. package/dist/batch-4LAvfLE7.js +0 -13
  115. package/dist/batch-4LAvfLE7.js.map +0 -1
  116. package/dist/component.es.mjs.map +0 -1
  117. package/dist/core-COenAZjD.js +0 -145
  118. package/dist/core-COenAZjD.js.map +0 -1
  119. package/dist/core.es.mjs.map +0 -1
  120. package/dist/full.es.mjs.map +0 -1
  121. package/dist/index.es.mjs.map +0 -1
  122. package/dist/motion.es.mjs.map +0 -1
  123. package/dist/persisted-Dz_ryNuC.js +0 -278
  124. package/dist/persisted-Dz_ryNuC.js.map +0 -1
  125. package/dist/platform.es.mjs.map +0 -1
  126. package/dist/reactive.es.mjs.map +0 -1
  127. package/dist/router.es.mjs.map +0 -1
  128. package/dist/sanitize-1FBEPAFH.js +0 -272
  129. package/dist/sanitize-1FBEPAFH.js.map +0 -1
  130. package/dist/security.es.mjs.map +0 -1
  131. package/dist/store.es.mjs.map +0 -1
  132. package/dist/type-guards-DRma3-Kc.js +0 -16
  133. package/dist/type-guards-DRma3-Kc.js.map +0 -1
  134. package/dist/untrack-BuEQKH7_.js +0 -6
  135. package/dist/untrack-BuEQKH7_.js.map +0 -1
  136. package/dist/view.es.mjs.map +0 -1
  137. package/dist/watch-CXyaBC_9.js +0 -58
  138. package/dist/watch-CXyaBC_9.js.map +0 -1
@@ -1,245 +1,13 @@
1
- class d {
2
- constructor(e) {
3
- this.bucketName = e, this.dbPromise = null, this.storeName = "blobs";
4
- }
5
- openDB() {
6
- if (this.dbPromise) return this.dbPromise;
7
- const e = `bquery-bucket-${this.bucketName}`;
8
- return this.dbPromise = new Promise((t, s) => {
9
- const n = indexedDB.open(e, 1);
10
- n.onupgradeneeded = () => {
11
- const i = n.result;
12
- i.objectStoreNames.contains(this.storeName) || i.createObjectStore(this.storeName);
13
- }, n.onsuccess = () => t(n.result), n.onerror = () => s(n.error);
14
- }), this.dbPromise;
15
- }
16
- async withStore(e, t) {
17
- const s = await this.openDB();
18
- return new Promise((n, i) => {
19
- const a = s.transaction(this.storeName, e).objectStore(this.storeName), o = t(a);
20
- o.onsuccess = () => n(o.result), o.onerror = () => i(o.error);
21
- });
22
- }
23
- async put(e, t) {
24
- await this.withStore("readwrite", (s) => s.put(t, e));
25
- }
26
- async get(e) {
27
- return await this.withStore("readonly", (s) => s.get(e)) ?? null;
28
- }
29
- async remove(e) {
30
- await this.withStore("readwrite", (t) => t.delete(e));
31
- }
32
- async keys() {
33
- return (await this.withStore("readonly", (t) => t.getAllKeys())).map((t) => String(t));
34
- }
35
- }
36
- const y = {
37
- /**
38
- * Open or create a storage bucket.
39
- * @param name - Bucket name
40
- * @returns Bucket instance for blob operations
41
- */
42
- async open(r) {
43
- return new d(r);
44
- }
45
- };
46
- class h {
47
- constructor(e) {
48
- this.cache = e;
49
- }
50
- async add(e) {
51
- await this.cache.add(e);
52
- }
53
- async addAll(e) {
54
- await this.cache.addAll(e);
55
- }
56
- async put(e, t) {
57
- await this.cache.put(e, t);
58
- }
59
- async match(e) {
60
- return this.cache.match(e);
61
- }
62
- async remove(e) {
63
- return this.cache.delete(e);
64
- }
65
- async keys() {
66
- return (await this.cache.keys()).map((t) => t.url);
67
- }
68
- }
69
- const m = {
70
- /**
71
- * Check if Cache Storage API is supported.
72
- * @returns True if caches API is available
73
- */
74
- isSupported() {
75
- return "caches" in window;
76
- },
77
- /**
78
- * Open or create a named cache.
79
- * @param name - Cache name
80
- * @returns CacheHandle for cache operations
81
- */
82
- async open(r) {
83
- if (!this.isSupported())
84
- throw new Error("bQuery: Cache Storage API not supported");
85
- const e = await caches.open(r);
86
- return new h(e);
87
- },
88
- /**
89
- * Delete a named cache.
90
- * @param name - Cache name to delete
91
- * @returns True if the cache was deleted
92
- */
93
- async delete(r) {
94
- return this.isSupported() ? caches.delete(r) : !1;
95
- },
96
- /**
97
- * List all cache names.
98
- * @returns Array of cache names
99
- */
100
- async keys() {
101
- return this.isSupported() ? caches.keys() : [];
102
- }
103
- }, S = {
104
- /**
105
- * Check if notifications are supported.
106
- * @returns True if Notification API is available
107
- */
108
- isSupported() {
109
- return "Notification" in window;
110
- },
111
- /**
112
- * Get current permission status.
113
- * @returns Current permission state
114
- */
115
- getPermission() {
116
- return this.isSupported() ? Notification.permission : "denied";
117
- },
118
- /**
119
- * Request notification permission from the user.
120
- * @returns Promise resolving to the permission result
121
- */
122
- async requestPermission() {
123
- return this.isSupported() ? Notification.permission === "granted" ? "granted" : Notification.permission === "denied" ? "denied" : Notification.requestPermission() : "denied";
124
- },
125
- /**
126
- * Send a notification.
127
- * Requires 'granted' permission.
128
- * @param title - Notification title
129
- * @param options - Optional notification settings
130
- * @returns The Notification instance or null if not permitted
131
- */
132
- send(r, e) {
133
- return this.isSupported() ? Notification.permission !== "granted" ? (console.warn("bQuery: Notification permission not granted"), null) : new Notification(r, e) : (console.warn("bQuery: Notifications not supported in this browser"), null);
134
- }
135
- };
136
- class c {
137
- constructor(e) {
138
- this.storage = e;
139
- }
140
- async get(e) {
141
- const t = this.storage.getItem(e);
142
- if (t === null) return null;
143
- try {
144
- return JSON.parse(t);
145
- } catch {
146
- return t;
147
- }
148
- }
149
- async set(e, t) {
150
- const s = typeof t == "string" ? t : JSON.stringify(t);
151
- this.storage.setItem(e, s);
152
- }
153
- async remove(e) {
154
- this.storage.removeItem(e);
155
- }
156
- async clear() {
157
- this.storage.clear();
158
- }
159
- async keys() {
160
- return Object.keys(this.storage);
161
- }
162
- }
163
- class l extends c {
164
- constructor() {
165
- super(localStorage);
166
- }
167
- }
168
- class p extends c {
169
- constructor() {
170
- super(sessionStorage);
171
- }
172
- }
173
- class w {
174
- constructor(e) {
175
- this.options = e, this.dbPromise = null;
176
- }
177
- /**
178
- * Opens or creates the IndexedDB database.
179
- */
180
- openDB() {
181
- return this.dbPromise ? this.dbPromise : (this.dbPromise = new Promise((e, t) => {
182
- const s = indexedDB.open(this.options.name, this.options.version ?? 1);
183
- s.onupgradeneeded = () => {
184
- const n = s.result;
185
- n.objectStoreNames.contains(this.options.store) || n.createObjectStore(this.options.store);
186
- }, s.onsuccess = () => e(s.result), s.onerror = () => t(s.error);
187
- }), this.dbPromise);
188
- }
189
- /**
190
- * Executes a transaction on the object store.
191
- */
192
- async withStore(e, t) {
193
- const s = await this.openDB();
194
- return new Promise((n, i) => {
195
- const a = s.transaction(this.options.store, e).objectStore(this.options.store), o = t(a);
196
- o.onsuccess = () => n(o.result), o.onerror = () => i(o.error);
197
- });
198
- }
199
- async get(e) {
200
- return await this.withStore("readonly", (s) => s.get(e)) ?? null;
201
- }
202
- async set(e, t) {
203
- await this.withStore("readwrite", (s) => s.put(t, e));
204
- }
205
- async remove(e) {
206
- await this.withStore("readwrite", (t) => t.delete(e));
207
- }
208
- async clear() {
209
- await this.withStore("readwrite", (e) => e.clear());
210
- }
211
- async keys() {
212
- return (await this.withStore("readonly", (t) => t.getAllKeys())).map((t) => String(t));
213
- }
214
- }
215
- const b = {
216
- /**
217
- * Create a localStorage adapter.
218
- * @returns StorageAdapter wrapping localStorage
219
- */
220
- local() {
221
- return new l();
222
- },
223
- /**
224
- * Create a sessionStorage adapter.
225
- * @returns StorageAdapter wrapping sessionStorage
226
- */
227
- session() {
228
- return new p();
229
- },
230
- /**
231
- * Create an IndexedDB adapter with key-value interface.
232
- * @param options - Database and store configuration
233
- * @returns StorageAdapter wrapping IndexedDB
234
- */
235
- indexedDB(r) {
236
- return new w(r);
237
- }
238
- };
1
+ import { n as a, t as s } from "./config-DRmZZno3.js";
2
+ import { a as i, i as n, n as t, o as r, r as f, s as u, t as c } from "./platform-B7JhGBc7.js";
239
3
  export {
240
- y as buckets,
241
- m as cache,
242
- S as notifications,
243
- b as storage
4
+ u as buckets,
5
+ r as cache,
6
+ s as defineBqueryConfig,
7
+ t as definePageMeta,
8
+ a as getBqueryConfig,
9
+ n as notifications,
10
+ c as storage,
11
+ f as useAnnouncer,
12
+ i as useCookie
244
13
  };
245
- //# sourceMappingURL=platform.es.mjs.map
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Async data and fetch composables built on bQuery signals.
3
+ *
4
+ * @module bquery/reactive
5
+ */
6
+ import { type BqueryFetchParseAs } from '../platform/config';
7
+ import { Signal } from './core';
8
+ /** Allowed status values for async composables. */
9
+ export type AsyncDataStatus = 'idle' | 'pending' | 'success' | 'error';
10
+ /** Reactive source types that can trigger refreshes. */
11
+ export type AsyncWatchSource = (() => unknown) | {
12
+ value: unknown;
13
+ };
14
+ /** Options shared by async composables. */
15
+ export interface UseAsyncDataOptions<TResult, TData = TResult> {
16
+ /** Run the handler immediately (default: true). */
17
+ immediate?: boolean;
18
+ /** Default data value before the first successful execution. */
19
+ defaultValue?: TData;
20
+ /** Optional reactive sources that trigger refreshes when they change. */
21
+ watch?: AsyncWatchSource[];
22
+ /** Transform the resolved value before storing it. */
23
+ transform?: (value: TResult) => TData;
24
+ /** Called after a successful execution. */
25
+ onSuccess?: (value: TData) => void;
26
+ /** Called after a failed execution. */
27
+ onError?: (error: Error) => void;
28
+ }
29
+ /** Return value of useAsyncData() and useFetch(). */
30
+ export interface AsyncDataState<TData> {
31
+ /** Reactive data signal. */
32
+ data: Signal<TData | undefined>;
33
+ /** Last error encountered by the composable. */
34
+ error: Signal<Error | null>;
35
+ /** Current lifecycle status. */
36
+ status: Signal<AsyncDataStatus>;
37
+ /** Computed boolean that mirrors `status === 'pending'`. */
38
+ pending: {
39
+ readonly value: boolean;
40
+ peek(): boolean;
41
+ };
42
+ /** Execute the handler manually. Returns the cached data value when called after dispose(). */
43
+ execute: () => Promise<TData | undefined>;
44
+ /** Alias for execute(). */
45
+ refresh: () => Promise<TData | undefined>;
46
+ /** Clear data, error, and status back to the initial state. */
47
+ clear: () => void;
48
+ /** Dispose reactive watchers and prevent future executions. */
49
+ dispose: () => void;
50
+ }
51
+ /** Options for useFetch(). */
52
+ export interface UseFetchOptions<TResponse = unknown, TData = TResponse> extends UseAsyncDataOptions<TResponse, TData>, Omit<RequestInit, 'body' | 'headers'> {
53
+ /** Base URL prepended to relative URLs. */
54
+ baseUrl?: string;
55
+ /** Query parameters appended to the request URL. */
56
+ query?: Record<string, unknown>;
57
+ /** Request headers. */
58
+ headers?: HeadersInit;
59
+ /** Request body, including plain objects for JSON requests. */
60
+ body?: BodyInit | Record<string, unknown> | unknown[] | null;
61
+ /** Override the parser used for the response body. */
62
+ parseAs?: BqueryFetchParseAs;
63
+ /** Custom fetch implementation for testing or adapters. */
64
+ fetcher?: typeof fetch;
65
+ }
66
+ /** Input accepted by useFetch(). */
67
+ export type FetchInput = string | URL | Request | (() => string | URL | Request);
68
+ /**
69
+ * Create a reactive wrapper around an async resolver.
70
+ *
71
+ * @template TResult - Raw result type returned by the handler
72
+ * @template TData - Stored data type after optional transformation
73
+ * @param handler - Async function to execute
74
+ * @param options - Execution, transform, and refresh options
75
+ * @returns Reactive data state with execute(), refresh(), and clear()
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * const user = useAsyncData(() => fetch('/api/user').then((res) => res.json()));
80
+ * ```
81
+ */
82
+ export declare const useAsyncData: <TResult, TData = TResult>(handler: () => Promise<TResult>, options?: UseAsyncDataOptions<TResult, TData>) => AsyncDataState<TData>;
83
+ /**
84
+ * Reactive fetch composable using the browser Fetch API.
85
+ *
86
+ * @template TResponse - Raw parsed response type
87
+ * @template TData - Stored response type after optional transformation
88
+ * @param input - Request URL, Request object, or lazy input factory
89
+ * @param options - Request and reactive state options
90
+ * @returns Reactive fetch state with execute(), refresh(), and clear()
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * const users = useFetch<{ id: number; name: string }[]>('/api/users');
95
+ * ```
96
+ */
97
+ export declare const useFetch: <TResponse = unknown, TData = TResponse>(input: FetchInput, options?: UseFetchOptions<TResponse, TData>) => AsyncDataState<TData>;
98
+ /**
99
+ * Create a preconfigured useFetch() helper.
100
+ *
101
+ * @param defaults - Default request options merged into every useFetch() call
102
+ * @returns A useFetch-compatible function with merged defaults
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * const useApiFetch = createUseFetch({ baseUrl: 'https://api.example.com' });
107
+ * const profile = useApiFetch('/profile');
108
+ * ```
109
+ */
110
+ /** Overload for factories without a configured transform, preserving per-call `TResponse -> TData` inference. */
111
+ export declare function createUseFetch<TDefaultResponse = unknown>(defaults?: UseFetchOptions<TDefaultResponse, TDefaultResponse>): <TResponse = TDefaultResponse, TData = TResponse>(input: FetchInput, options?: UseFetchOptions<TResponse, TData>) => AsyncDataState<TData>;
112
+ /** Overload for factories with a configured transform, preserving the transformed factory data type by default. */
113
+ export declare function createUseFetch<TDefaultResponse = unknown, TDefaultData = TDefaultResponse>(defaults: UseFetchOptions<TDefaultResponse, TDefaultData>): <TResponse = TDefaultResponse, TData = TDefaultData>(input: FetchInput, options?: UseFetchOptions<TResponse, TData>) => AsyncDataState<TData>;
114
+ //# sourceMappingURL=async-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-data.d.ts","sourceRoot":"","sources":["../../src/reactive/async-data.ts"],"names":[],"mappings":"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"}
@@ -43,6 +43,18 @@ export declare class Signal<T> implements ReactiveSource {
43
43
  * @param updater - Function that receives current value and returns new value
44
44
  */
45
45
  update(updater: (current: T) => T): void;
46
+ /**
47
+ * Removes all subscribers from this signal.
48
+ * Use this when a signal is no longer needed to prevent memory leaks.
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const count = signal(0);
53
+ * effect(() => console.log(count.value));
54
+ * count.dispose(); // All subscribers removed
55
+ * ```
56
+ */
57
+ dispose(): void;
46
58
  /**
47
59
  * Removes an observer from this signal's subscriber set.
48
60
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/reactive/core.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC,CAAE,YAAW,cAAc;IAOlC,OAAO,CAAC,MAAM;IAN1B,OAAO,CAAC,WAAW,CAAyB;IAE5C;;;OAGG;gBACiB,MAAM,EAAE,CAAC;IAE7B;;;OAGG;IACH,IAAI,KAAK,IAAI,CAAC,CAOb;IAED;;;OAGG;IACH,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,EAQhB;IAED;;;;;OAKG;IACH,IAAI,IAAI,CAAC;IAIT;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI;IAIxC;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;CAGxC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,CAAsB,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/reactive/core.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC,CAAE,YAAW,cAAc;IAOlC,OAAO,CAAC,MAAM;IAN1B,OAAO,CAAC,WAAW,CAAyB;IAE5C;;;OAGG;gBACiB,MAAM,EAAE,CAAC;IAE7B;;;OAGG;IACH,IAAI,KAAK,IAAI,CAAC,CAOb;IAED;;;OAGG;IACH,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,EAQhB;IAED;;;;;OAKG;IACH,IAAI,IAAI,CAAC;IAIT;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI;IAIxC;;;;;;;;;;OAUG;IACH,OAAO,IAAI,IAAI;IASf;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;CAGxC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,CAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../../src/reactive/effect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAsC,MAAM,aAAa,CAAC;AAE5E;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,IAAI,MAAM,IAAI,GAAG,SAAS,KAAG,SA2BnD,CAAC"}
1
+ {"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../../src/reactive/effect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAsC,MAAM,aAAa,CAAC;AAE5E;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,IAAI,MAAM,IAAI,GAAG,SAAS,KAAG,SAsCnD,CAAC"}
@@ -3,6 +3,6 @@
3
3
  *
4
4
  * @module bquery/reactive
5
5
  */
6
- export { Computed, Signal, batch, computed, effect, isComputed, isSignal, linkedSignal, persistedSignal, readonly, signal, untrack, watch, } from './signal';
7
- export type { CleanupFn, LinkedSignal, Observer, ReadonlySignal } from './signal';
6
+ export { Computed, Signal, batch, computed, createUseFetch, effect, isComputed, isSignal, linkedSignal, persistedSignal, readonly, signal, useAsyncData, useFetch, untrack, watch, } from './signal';
7
+ export type { AsyncDataState, AsyncDataStatus, AsyncWatchSource, CleanupFn, FetchInput, LinkedSignal, Observer, ReadonlySignal, UseAsyncDataOptions, UseFetchOptions, } from './signal';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reactive/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,MAAM,EACN,OAAO,EACP,KAAK,GACN,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reactive/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,cAAc,EACd,MAAM,EACN,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,KAAK,GACN,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,UAAU,CAAC"}
@@ -28,6 +28,12 @@ export declare const endBatch: () => void;
28
28
  * @internal
29
29
  */
30
30
  export declare const registerDependency: (observer: Observer, source: ReactiveSource) => void;
31
+ /**
32
+ * Removes a specific source from an observer's dependency set.
33
+ * Used when a source (e.g. Signal) is disposed to prevent stale references.
34
+ * @internal
35
+ */
36
+ export declare const removeDependency: (observer: Observer, source: ReactiveSource) => void;
31
37
  /**
32
38
  * Clears all dependencies for an observer, unsubscribing from all sources.
33
39
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../../src/reactive/internals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAClC,MAAM,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC;AAEnC;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvC;AASD,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,UAAU,QAAQ,EAAE,IAAI,MAAM,CAAC,KAAG,CAO1D,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,QAAQ,GAAG,SACR,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,KAAG,CAUvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,UAAU,QAAQ,KAAG,IAMrD,CAAC;AASF,eAAO,MAAM,UAAU,QAAO,IAE7B,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAO,IAK3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,QAAQ,EAAE,QAAQ,cAAc,KAAG,IAO/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,QAAQ,KAAG,IAQtD,CAAC"}
1
+ {"version":3,"file":"internals.d.ts","sourceRoot":"","sources":["../../src/reactive/internals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC;AAClC,MAAM,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC;AAEnC;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvC;AASD,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,UAAU,QAAQ,EAAE,IAAI,MAAM,CAAC,KAAG,CAO1D,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,QAAQ,GAAG,SACR,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,KAAG,CAUvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,UAAU,QAAQ,KAAG,IAMrD,CAAC;AAaF,eAAO,MAAM,UAAU,QAAO,IAE7B,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAO,IAM3B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,QAAQ,EAAE,QAAQ,cAAc,KAAG,IAO/E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,QAAQ,EAAE,QAAQ,cAAc,KAAG,IAK7E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,QAAQ,KAAG,IAQtD,CAAC"}
@@ -4,6 +4,7 @@
4
4
  * @module bquery/reactive
5
5
  */
6
6
  export { batch } from './batch';
7
+ export { createUseFetch, useAsyncData, useFetch } from './async-data';
7
8
  export { Computed, computed } from './computed';
8
9
  export { Signal, signal } from './core';
9
10
  export { effect } from './effect';
@@ -14,6 +15,7 @@ export { isComputed, isSignal } from './type-guards';
14
15
  export { untrack } from './untrack';
15
16
  export { watch } from './watch';
16
17
  export type { CleanupFn, Observer } from './internals';
18
+ export type { AsyncDataState, AsyncDataStatus, AsyncWatchSource, FetchInput, UseAsyncDataOptions, UseFetchOptions, } from './async-data';
17
19
  export type { LinkedSignal } from './linked';
18
20
  export type { ReadonlySignal } from './readonly';
19
21
  //# sourceMappingURL=signal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/reactive/signal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/reactive/signal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EACV,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}