@sylwellsoftware/glue 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,262 @@
1
+ var g = Object.defineProperty;
2
+ var v = (t, s, e) => s in t ? g(t, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[s] = e;
3
+ var n = (t, s, e) => v(t, typeof s != "symbol" ? s + "" : s, e);
4
+ import { B as w, F as p, a as y, E, b } from "./emitter-upM7NC28.js";
5
+ import { D as _, c as x, d as D } from "./emitter-upM7NC28.js";
6
+ class H extends w {
7
+ constructor(e) {
8
+ if (e == null || typeof e != "object" || Array.isArray(e))
9
+ throw new TypeError("LiveQuery options must be an object");
10
+ const {
11
+ handler: r,
12
+ args: i = {},
13
+ autoFetch: o = !0,
14
+ keepPreviousValue: f = !0,
15
+ owner: l,
16
+ purpose: c = "live query",
17
+ trace: u
18
+ } = e;
19
+ if (r == null || typeof r.fetch != "function")
20
+ throw new TypeError("LiveQuery handler must implement fetch()");
21
+ R(i);
22
+ super(void 0, {
23
+ fetchState: p.Initial,
24
+ error: null,
25
+ owner: l,
26
+ purpose: c,
27
+ ...u === void 0 ? {} : { trace: u }
28
+ });
29
+ n(this, "handler");
30
+ n(this, "args");
31
+ n(this, "keepPreviousValue");
32
+ n(this, "lastSuccessfulValue");
33
+ n(this, "argumentUnsubscribers");
34
+ n(this, "requestId", 0);
35
+ n(this, "abortController", null);
36
+ /** Exposed for deterministic tests; consumers should use refresh()/retry(). */
37
+ n(this, "_activeRequest", null);
38
+ this.handler = r, this.args = { ...i }, this.keepPreviousValue = f, this.lastSuccessfulValue = void 0, this.argumentUnsubscribers = Object.values(this.args).map(
39
+ (h) => h.subscribe(({ event: a }) => {
40
+ this.refresh(a);
41
+ }, { emitCurrent: !1 })
42
+ ), o && (this._activeRequest = this.refresh("initial fetch"));
43
+ }
44
+ get argumentValues() {
45
+ return Object.fromEntries(
46
+ Object.entries(this.args).map(([e, r]) => [e, r.get()])
47
+ );
48
+ }
49
+ refresh(e = "refresh") {
50
+ var h;
51
+ if (this.isDisposed) return Promise.resolve(void 0);
52
+ const r = ++this.requestId;
53
+ (h = this.abortController) == null || h.abort();
54
+ const i = q();
55
+ this.abortController = i;
56
+ const o = e instanceof y ? e : null, f = o ? "query arguments changed" : e, l = this.keepPreviousValue ? this.lastSuccessfulValue : void 0;
57
+ this.setSnapshot({
58
+ value: l,
59
+ fetchState: p.Loading,
60
+ error: null,
61
+ cause: f,
62
+ parentEvent: o
63
+ });
64
+ const c = this.createEvent("query fetch", o, this.argumentValues), u = Promise.resolve().then(() => this.handler.fetch(this.argumentValues, {
65
+ signal: i.signal,
66
+ event: c
67
+ })).then((a) => {
68
+ if (this.isCurrentRequest(r, i))
69
+ return this.lastSuccessfulValue = a, this.setSnapshot({
70
+ value: a,
71
+ fetchState: p.Ready,
72
+ error: null,
73
+ cause: "query succeeded",
74
+ parentEvent: c
75
+ }), a;
76
+ }).catch((a) => {
77
+ !this.isCurrentRequest(r, i) || S(a) || this.setSnapshot({
78
+ value: this.keepPreviousValue ? this.lastSuccessfulValue : void 0,
79
+ fetchState: p.Error,
80
+ error: a,
81
+ cause: "query failed",
82
+ parentEvent: c
83
+ });
84
+ }).finally(() => {
85
+ this.isCurrentRequest(r, i) && (this.abortController = null, this._activeRequest = null);
86
+ });
87
+ return this._activeRequest = u, u;
88
+ }
89
+ retry(e = "retry") {
90
+ return this.refresh(e);
91
+ }
92
+ dispose() {
93
+ var e;
94
+ if (!this.isDisposed) {
95
+ this.requestId += 1, (e = this.abortController) == null || e.abort(), this.abortController = null, this._activeRequest = null;
96
+ for (const r of this.argumentUnsubscribers) r();
97
+ this.argumentUnsubscribers = [], super.dispose();
98
+ }
99
+ }
100
+ isCurrentRequest(e, r) {
101
+ return !this.isDisposed && e === this.requestId && r === this.abortController && !r.signal.aborted;
102
+ }
103
+ }
104
+ function R(t) {
105
+ if (t == null || typeof t != "object" || Array.isArray(t))
106
+ throw new TypeError("LiveQuery args must be a named record of emitters");
107
+ for (const [s, e] of Object.entries(t))
108
+ if (e == null || typeof Reflect.get(e, "get") != "function" || typeof Reflect.get(e, "subscribe") != "function")
109
+ throw new TypeError(`LiveQuery argument ${s} must be an emitter`);
110
+ }
111
+ function q() {
112
+ const t = Reflect.get(globalThis, "AbortController");
113
+ if (typeof t != "function")
114
+ throw new Error("LiveQuery requires AbortController in this runtime");
115
+ return new t();
116
+ }
117
+ function S(t) {
118
+ return t instanceof Error && t.name === "AbortError";
119
+ }
120
+ class z extends E {
121
+ constructor(e, r, i = {}) {
122
+ if (typeof e != "string" || e.length === 0)
123
+ throw new TypeError("QueryArg name must be a non-empty string");
124
+ if (r == null || typeof r.get != "function" || typeof r.subscribe != "function")
125
+ throw new TypeError("QueryArg source must be an emitter");
126
+ super(r.get(), {
127
+ ...i,
128
+ fetchState: r.getFetchState(),
129
+ error: r.getError(),
130
+ purpose: i.purpose ?? `query argument: ${e}`
131
+ });
132
+ n(this, "name");
133
+ n(this, "sourceUnsubscribe");
134
+ this.name = e, this.sourceUnsubscribe = r.subscribe((o) => {
135
+ this.setWithState(
136
+ o.value,
137
+ o.fetchState,
138
+ o.error,
139
+ o.event
140
+ );
141
+ }, { emitCurrent: !1 });
142
+ }
143
+ dispose() {
144
+ var e;
145
+ this.isDisposed || ((e = this.sourceUnsubscribe) == null || e.call(this), this.sourceUnsubscribe = null, super.dispose());
146
+ }
147
+ }
148
+ class T {
149
+ fetch(s, e = {}) {
150
+ throw new Error("fetch() must be implemented");
151
+ }
152
+ }
153
+ class U extends Error {
154
+ constructor(e) {
155
+ super(`HTTP ${e ?? "unknown"}`);
156
+ n(this, "status");
157
+ this.name = "HttpError", this.status = e;
158
+ }
159
+ }
160
+ class I extends T {
161
+ constructor(e) {
162
+ super();
163
+ n(this, "url");
164
+ n(this, "baseUrl");
165
+ n(this, "fetchImplementation");
166
+ n(this, "serialize");
167
+ n(this, "trace");
168
+ const r = typeof e == "string" ? { url: e } : e;
169
+ if (r == null || typeof r != "object")
170
+ throw new TypeError("RestQueryHandler requires a URL or options object");
171
+ if (typeof r.url != "string" || r.url.length === 0)
172
+ throw new TypeError("RestQueryHandler url must be a non-empty string");
173
+ if (this.url = r.url, this.baseUrl = r.baseUrl ?? V(), this.fetchImplementation = r.fetch ?? j(), this.serialize = r.serialize ?? A, this.trace = r.trace ?? !1, typeof this.fetchImplementation != "function")
174
+ throw new TypeError("RestQueryHandler requires an injected fetch implementation");
175
+ if (typeof this.serialize != "function")
176
+ throw new TypeError("RestQueryHandler serialize must be a function");
177
+ }
178
+ async fetch(e, r = {}) {
179
+ if (e == null || typeof e != "object" || Array.isArray(e))
180
+ throw new TypeError("REST query args must be a named record");
181
+ const i = Q(this.url, this.baseUrl), o = this.serialize(i, e) ?? i, f = d();
182
+ if (!(o instanceof f))
183
+ throw new TypeError("REST serializer must mutate or return a URL");
184
+ const l = r.event ?? null;
185
+ if (this.trace || l || b.hasSubscribers) {
186
+ const h = new y({
187
+ owner: this,
188
+ purpose: "REST fetch",
189
+ value: o.toString(),
190
+ cause: "fetch called",
191
+ parent: l
192
+ });
193
+ l || b.emit(h);
194
+ }
195
+ const c = r.signal === void 0 ? {} : { signal: r.signal }, u = await this.fetchImplementation(o.toString(), c);
196
+ if (!(u != null && u.ok)) throw new U(u == null ? void 0 : u.status);
197
+ return await u.json();
198
+ }
199
+ }
200
+ function A(t, s) {
201
+ for (const [e, r] of Object.entries(s))
202
+ m(t.searchParams, e, r);
203
+ return t;
204
+ }
205
+ function m(t, s, e) {
206
+ if (e !== void 0) {
207
+ if (e === null) {
208
+ t.append(s, "");
209
+ return;
210
+ }
211
+ if (Array.isArray(e)) {
212
+ for (const r of e) m(t, s, r);
213
+ return;
214
+ }
215
+ if (typeof e == "object") {
216
+ t.append(s, JSON.stringify(e));
217
+ return;
218
+ }
219
+ t.append(s, String(e));
220
+ }
221
+ }
222
+ function Q(t, s) {
223
+ const e = d();
224
+ try {
225
+ return new e(t);
226
+ } catch (r) {
227
+ if (s == null)
228
+ throw new TypeError(`Relative REST URL requires baseUrl: ${t}`, { cause: r });
229
+ return new e(t, s);
230
+ }
231
+ }
232
+ function d() {
233
+ const t = Reflect.get(globalThis, "URL");
234
+ if (typeof t != "function")
235
+ throw new Error("RestQueryHandler requires URL in this runtime");
236
+ return t;
237
+ }
238
+ function V() {
239
+ const t = Reflect.get(globalThis, "location");
240
+ if (t == null || typeof t != "object" && typeof t != "function")
241
+ return;
242
+ const s = Reflect.get(t, "href");
243
+ return typeof s == "string" ? s : void 0;
244
+ }
245
+ function j() {
246
+ return Reflect.get(globalThis, "fetch");
247
+ }
248
+ export {
249
+ w as BaseEmitter,
250
+ _ as DerivedEmitter,
251
+ E as Emitter,
252
+ y as EventBubble,
253
+ b as EventBus,
254
+ p as FetchState,
255
+ x as FetchStateValues,
256
+ H as LiveQuery,
257
+ z as QueryArg,
258
+ T as QueryHandler,
259
+ I as RestQueryHandler,
260
+ D as combineFetchStates
261
+ };
262
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/emitters/liveQuery.ts","../src/queryhandling/queryArg.ts","../src/queryhandling/queryHandler.ts","../src/queryhandling/restQueryHandler.ts"],"sourcesContent":["import {EventBubble} from '../debugging/eventBubble.js'\nimport {FetchState} from '../enums/fetchState.js'\nimport type {QueryHandlerLike, QueryRequestOptions, QueryValues} from '../queryhandling/queryHandler.js'\nimport {BaseEmitter} from './baseEmitter.js'\nimport type {EmitterValue, ReadableEmitter} from './baseEmitter.js'\n\nexport type QueryArgumentEmitters = Record<string, ReadableEmitter<unknown, unknown>>\n\nexport type QueryArgumentValues<TArguments extends QueryArgumentEmitters> = {\n [TName in keyof TArguments]: EmitterValue<TArguments[TName]>\n}\n\nexport interface LiveQueryOptions<\n TResult,\n TArguments extends QueryArgumentEmitters,\n> {\n handler: QueryHandlerLike<QueryArgumentValues<TArguments>, TResult>\n args?: TArguments\n autoFetch?: boolean\n keepPreviousValue?: boolean\n owner?: unknown\n purpose?: string\n trace?: boolean\n}\n\ninterface AbortControllerLike {\n readonly signal: QueryRequestOptions['signal'] & {readonly aborted: boolean}\n abort(): void\n}\n\ninterface AbortControllerConstructor {\n new(): AbortControllerLike\n}\n\n/** Reactive, abortable query driven by a named record of emitter arguments. */\nexport class LiveQuery<\n TResult,\n TArguments extends QueryArgumentEmitters = Record<string, never>,\n> extends BaseEmitter<TResult | undefined, unknown> {\n readonly handler: QueryHandlerLike<QueryArgumentValues<TArguments>, TResult>\n readonly args: TArguments\n readonly keepPreviousValue: boolean\n private lastSuccessfulValue: TResult | undefined\n private argumentUnsubscribers: Array<() => void>\n private requestId = 0\n private abortController: AbortControllerLike | null = null\n /** Exposed for deterministic tests; consumers should use refresh()/retry(). */\n _activeRequest: Promise<TResult | undefined> | null = null\n\n constructor(options: LiveQueryOptions<TResult, TArguments>) {\n if (options == null || typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('LiveQuery options must be an object')\n }\n const {\n handler,\n args = {} as TArguments,\n autoFetch = true,\n keepPreviousValue = true,\n owner,\n purpose = 'live query',\n trace,\n } = options\n if (handler == null || typeof handler.fetch !== 'function') {\n throw new TypeError('LiveQuery handler must implement fetch()')\n }\n assertNamedArgs(args)\n\n super(undefined, {\n fetchState: FetchState.Initial,\n error: null,\n owner,\n purpose,\n ...(trace === undefined ? {} : {trace}),\n })\n this.handler = handler\n this.args = {...args}\n this.keepPreviousValue = keepPreviousValue\n this.lastSuccessfulValue = undefined\n this.argumentUnsubscribers = Object.values(this.args).map((argument) =>\n argument.subscribe(({event}) => {\n void this.refresh(event)\n }, {emitCurrent: false}),\n )\n\n if (autoFetch) this._activeRequest = this.refresh('initial fetch')\n }\n\n get argumentValues(): QueryArgumentValues<TArguments> {\n return Object.fromEntries(\n Object.entries(this.args).map(([name, argument]) => [name, argument.get()]),\n ) as QueryArgumentValues<TArguments>\n }\n\n refresh(eventOrCause: EventBubble<unknown> | unknown = 'refresh'): Promise<TResult | undefined> {\n if (this.isDisposed) return Promise.resolve(undefined)\n\n const requestId = ++this.requestId\n this.abortController?.abort()\n const controller = createAbortController()\n this.abortController = controller\n const parentEvent = eventOrCause instanceof EventBubble ? eventOrCause : null\n const cause = parentEvent ? 'query arguments changed' : eventOrCause\n const loadingValue = this.keepPreviousValue\n ? this.lastSuccessfulValue\n : undefined\n this.setSnapshot({\n value: loadingValue,\n fetchState: FetchState.Loading,\n error: null,\n cause,\n parentEvent,\n })\n const queryEvent = this.createEvent('query fetch', parentEvent, this.argumentValues)\n\n const request = Promise.resolve()\n .then(() => this.handler.fetch(this.argumentValues, {\n signal: controller.signal,\n event: queryEvent,\n }))\n .then((result) => {\n if (!this.isCurrentRequest(requestId, controller)) return undefined\n this.lastSuccessfulValue = result\n this.setSnapshot({\n value: result,\n fetchState: FetchState.Ready,\n error: null,\n cause: 'query succeeded',\n parentEvent: queryEvent,\n })\n return result\n })\n .catch((error: unknown) => {\n if (!this.isCurrentRequest(requestId, controller) || isAbortError(error)) {\n return undefined\n }\n this.setSnapshot({\n value: this.keepPreviousValue ? this.lastSuccessfulValue : undefined,\n fetchState: FetchState.Error,\n error,\n cause: 'query failed',\n parentEvent: queryEvent,\n })\n return undefined\n })\n .finally(() => {\n if (this.isCurrentRequest(requestId, controller)) {\n this.abortController = null\n this._activeRequest = null\n }\n })\n\n this._activeRequest = request\n return request\n }\n\n retry(eventOrCause: EventBubble<unknown> | unknown = 'retry'): Promise<TResult | undefined> {\n return this.refresh(eventOrCause)\n }\n\n override dispose(): void {\n if (this.isDisposed) return\n this.requestId += 1\n this.abortController?.abort()\n this.abortController = null\n this._activeRequest = null\n for (const unsubscribe of this.argumentUnsubscribers) unsubscribe()\n this.argumentUnsubscribers = []\n super.dispose()\n }\n\n private isCurrentRequest(requestId: number, controller: AbortControllerLike): boolean {\n return !this.isDisposed\n && requestId === this.requestId\n && controller === this.abortController\n && !controller.signal.aborted\n }\n}\n\nfunction assertNamedArgs(args: unknown): asserts args is QueryArgumentEmitters {\n if (args == null || typeof args !== 'object' || Array.isArray(args)) {\n throw new TypeError('LiveQuery args must be a named record of emitters')\n }\n for (const [name, argument] of Object.entries(args)) {\n if (argument == null\n || typeof Reflect.get(argument, 'get') !== 'function'\n || typeof Reflect.get(argument, 'subscribe') !== 'function') {\n throw new TypeError(`LiveQuery argument ${name} must be an emitter`)\n }\n }\n}\n\nfunction createAbortController(): AbortControllerLike {\n const constructor = Reflect.get(globalThis, 'AbortController')\n if (typeof constructor !== 'function') {\n throw new Error('LiveQuery requires AbortController in this runtime')\n }\n return new (constructor as AbortControllerConstructor)()\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError'\n}\n\n// QueryArgumentValues always produces a record, but keeping this assertion near\n// the handler boundary makes that relationship explicit in emitted declarations.\ntype _QueryValuesProof<T extends QueryValues> = T\ntype _LiveQueryValuesAreRecords<TArgs extends QueryArgumentEmitters> =\n _QueryValuesProof<QueryArgumentValues<TArgs>>\n","import {Emitter} from '../emitters/emitter.js'\nimport type {EmitterOptions, ReadableEmitter} from '../emitters/baseEmitter.js'\n\n/** A named reactive value used by LiveQuery. */\nexport class QueryArg<TValue, TError = unknown> extends Emitter<TValue, TError> {\n readonly name: string\n private sourceUnsubscribe: (() => void) | null\n\n constructor(\n name: string,\n source: ReadableEmitter<TValue, TError>,\n options: EmitterOptions<TValue, TError> = {},\n ) {\n if (typeof name !== 'string' || name.length === 0) {\n throw new TypeError('QueryArg name must be a non-empty string')\n }\n if (source == null\n || typeof source.get !== 'function'\n || typeof source.subscribe !== 'function') {\n throw new TypeError('QueryArg source must be an emitter')\n }\n\n super(source.get(), {\n ...options,\n fetchState: source.getFetchState(),\n error: source.getError(),\n purpose: options.purpose ?? `query argument: ${name}`,\n })\n this.name = name\n this.sourceUnsubscribe = source.subscribe((notification) => {\n this.setWithState(\n notification.value,\n notification.fetchState,\n notification.error,\n notification.event,\n )\n }, {emitCurrent: false})\n }\n\n override dispose(): void {\n if (this.isDisposed) return\n this.sourceUnsubscribe?.()\n this.sourceUnsubscribe = null\n super.dispose()\n }\n}\n","import type {EventBubble} from '../debugging/eventBubble.js'\n\nexport type QueryValues = Record<string, unknown>\n\n/** Minimal web-platform shape so Glue core does not require DOM declarations. */\nexport interface AbortSignalLike {\n readonly aborted: boolean\n}\n\nexport interface QueryRequestOptions {\n signal?: AbortSignalLike\n event?: EventBubble<unknown> | null\n}\n\nexport interface QueryHandlerLike<\n TArguments extends QueryValues,\n TResult,\n> {\n fetch(\n args: TArguments,\n options?: QueryRequestOptions,\n ): TResult | PromiseLike<TResult>\n}\n\n/** Interface/base class for asynchronous query adapters. */\nexport class QueryHandler<\n TArguments extends QueryValues = QueryValues,\n TResult = unknown,\n> implements QueryHandlerLike<TArguments, TResult> {\n fetch(_args: TArguments, _options: QueryRequestOptions = {}): TResult | PromiseLike<TResult> {\n throw new Error('fetch() must be implemented')\n }\n}\n","import {EventBubble} from '../debugging/eventBubble.js'\nimport {EventBus} from '../debugging/eventBus.js'\nimport {QueryHandler} from './queryHandler.js'\nimport type {AbortSignalLike, QueryRequestOptions, QueryValues} from './queryHandler.js'\n\nexport interface SearchParamsLike {\n append(name: string, value: string): void\n set(name: string, value: string): void\n}\n\nexport interface UrlLike {\n readonly searchParams: SearchParamsLike\n toString(): string\n}\n\nexport interface JsonResponseLike<TResult> {\n readonly ok: boolean\n readonly status?: number\n json(): TResult | PromiseLike<TResult>\n}\n\nexport type FetchLike<TResult> = {\n bivarianceHack(\n url: string,\n options?: {signal?: AbortSignalLike | null},\n ): JsonResponseLike<TResult>\n | JsonResponseLike<unknown>\n | PromiseLike<JsonResponseLike<TResult> | JsonResponseLike<unknown>>\n}['bivarianceHack']\n\nexport type QuerySerializer<TArguments extends QueryValues> = (\n url: UrlLike,\n args: TArguments,\n) => void | UrlLike\n\nexport interface RestQueryHandlerOptions<\n TArguments extends QueryValues,\n TResult,\n> {\n url: string\n baseUrl?: string\n fetch?: FetchLike<TResult>\n serialize?: QuerySerializer<TArguments>\n trace?: boolean\n}\n\ninterface UrlConstructor {\n new(url: string, base?: string): UrlLike\n}\n\nclass HttpError extends Error {\n readonly status: number | undefined\n\n constructor(status: number | undefined) {\n super(`HTTP ${status ?? 'unknown'}`)\n this.name = 'HttpError'\n this.status = status\n }\n}\n\n/** Fetch-based JSON query adapter with injectable environment capabilities. */\nexport class RestQueryHandler<\n TArguments extends QueryValues = QueryValues,\n TResult = unknown,\n> extends QueryHandler<TArguments, TResult> {\n readonly url: string\n readonly baseUrl: string | undefined\n readonly fetchImplementation: FetchLike<TResult>\n readonly serialize: QuerySerializer<TArguments>\n readonly trace: boolean\n\n constructor(options: string | RestQueryHandlerOptions<TArguments, TResult>) {\n super()\n const normalized = typeof options === 'string' ? {url: options} : options\n if (normalized == null || typeof normalized !== 'object') {\n throw new TypeError('RestQueryHandler requires a URL or options object')\n }\n if (typeof normalized.url !== 'string' || normalized.url.length === 0) {\n throw new TypeError('RestQueryHandler url must be a non-empty string')\n }\n\n this.url = normalized.url\n this.baseUrl = normalized.baseUrl ?? getLocationHref()\n this.fetchImplementation = normalized.fetch ?? getGlobalFetch<TResult>()\n this.serialize = normalized.serialize ?? serializeQuery\n this.trace = normalized.trace ?? false\n\n if (typeof this.fetchImplementation !== 'function') {\n throw new TypeError('RestQueryHandler requires an injected fetch implementation')\n }\n if (typeof this.serialize !== 'function') {\n throw new TypeError('RestQueryHandler serialize must be a function')\n }\n }\n\n override async fetch(args: TArguments, options: QueryRequestOptions = {}): Promise<TResult> {\n if (args == null || typeof args !== 'object' || Array.isArray(args)) {\n throw new TypeError('REST query args must be a named record')\n }\n\n const url = resolveUrl(this.url, this.baseUrl)\n const serialized = this.serialize(url, args) ?? url\n const Url = getUrlConstructor()\n if (!(serialized instanceof Url)) {\n throw new TypeError('REST serializer must mutate or return a URL')\n }\n\n const parent = options.event ?? null\n if (this.trace || parent || EventBus.hasSubscribers) {\n const event = new EventBubble({\n owner: this,\n purpose: 'REST fetch',\n value: serialized.toString(),\n cause: 'fetch called',\n parent,\n })\n if (!parent) EventBus.emit(event)\n }\n\n const fetchOptions = options.signal === undefined ? {} : {signal: options.signal}\n const response = await this.fetchImplementation(serialized.toString(), fetchOptions)\n if (!response?.ok) throw new HttpError(response?.status)\n return await response.json() as TResult\n }\n}\n\nfunction serializeQuery<TArguments extends QueryValues>(\n url: UrlLike,\n args: TArguments,\n): UrlLike {\n for (const [key, value] of Object.entries(args)) {\n appendValue(url.searchParams, key, value)\n }\n return url\n}\n\nfunction appendValue(params: SearchParamsLike, key: string, value: unknown): void {\n if (value === undefined) return\n if (value === null) {\n params.append(key, '')\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) appendValue(params, key, item)\n return\n }\n if (typeof value === 'object') {\n params.append(key, JSON.stringify(value))\n return\n }\n params.append(key, String(value))\n}\n\nfunction resolveUrl(url: string, baseUrl: string | undefined): UrlLike {\n const Url = getUrlConstructor()\n try {\n return new Url(url)\n } catch (error) {\n if (baseUrl == null) {\n throw new TypeError(`Relative REST URL requires baseUrl: ${url}`, {cause: error})\n }\n return new Url(url, baseUrl)\n }\n}\n\nfunction getUrlConstructor(): UrlConstructor {\n const constructor = Reflect.get(globalThis, 'URL')\n if (typeof constructor !== 'function') {\n throw new Error('RestQueryHandler requires URL in this runtime')\n }\n return constructor as UrlConstructor\n}\n\nfunction getLocationHref(): string | undefined {\n const location = Reflect.get(globalThis, 'location')\n if (location == null || (typeof location !== 'object' && typeof location !== 'function')) {\n return undefined\n }\n const href = Reflect.get(location, 'href')\n return typeof href === 'string' ? href : undefined\n}\n\nfunction getGlobalFetch<TResult>(): FetchLike<TResult> {\n const implementation = Reflect.get(globalThis, 'fetch')\n return implementation as unknown as FetchLike<TResult>\n}\n"],"names":["LiveQuery","BaseEmitter","options","handler","args","autoFetch","keepPreviousValue","owner","purpose","trace","assertNamedArgs","FetchState","__publicField","argument","event","name","eventOrCause","requestId","_a","controller","createAbortController","parentEvent","EventBubble","cause","loadingValue","queryEvent","request","result","error","isAbortError","unsubscribe","constructor","QueryArg","Emitter","source","notification","QueryHandler","_args","_options","HttpError","status","RestQueryHandler","normalized","getLocationHref","getGlobalFetch","serializeQuery","url","resolveUrl","serialized","Url","getUrlConstructor","parent","EventBus","fetchOptions","response","key","value","appendValue","params","item","baseUrl","location","href"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Emitter } from '../emitters/emitter.js';
2
+ import type { EmitterOptions, ReadableEmitter } from '../emitters/baseEmitter.js';
3
+ /** A named reactive value used by LiveQuery. */
4
+ export declare class QueryArg<TValue, TError = unknown> extends Emitter<TValue, TError> {
5
+ readonly name: string;
6
+ private sourceUnsubscribe;
7
+ constructor(name: string, source: ReadableEmitter<TValue, TError>, options?: EmitterOptions<TValue, TError>);
8
+ dispose(): void;
9
+ }
10
+ //# sourceMappingURL=queryArg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryArg.d.ts","sourceRoot":"","sources":["../../src/queryhandling/queryArg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,wBAAwB,CAAA;AAC9C,OAAO,KAAK,EAAC,cAAc,EAAE,eAAe,EAAC,MAAM,4BAA4B,CAAA;AAE/E,gDAAgD;AAChD,qBAAa,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAE,SAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,iBAAiB,CAAqB;gBAG1C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,OAAO,GAAE,cAAc,CAAC,MAAM,EAAE,MAAM,CAAM;IA4BvC,OAAO,IAAI,IAAI;CAM3B"}
@@ -0,0 +1,18 @@
1
+ import type { EventBubble } from '../debugging/eventBubble.js';
2
+ export type QueryValues = Record<string, unknown>;
3
+ /** Minimal web-platform shape so Glue core does not require DOM declarations. */
4
+ export interface AbortSignalLike {
5
+ readonly aborted: boolean;
6
+ }
7
+ export interface QueryRequestOptions {
8
+ signal?: AbortSignalLike;
9
+ event?: EventBubble<unknown> | null;
10
+ }
11
+ export interface QueryHandlerLike<TArguments extends QueryValues, TResult> {
12
+ fetch(args: TArguments, options?: QueryRequestOptions): TResult | PromiseLike<TResult>;
13
+ }
14
+ /** Interface/base class for asynchronous query adapters. */
15
+ export declare class QueryHandler<TArguments extends QueryValues = QueryValues, TResult = unknown> implements QueryHandlerLike<TArguments, TResult> {
16
+ fetch(_args: TArguments, _options?: QueryRequestOptions): TResult | PromiseLike<TResult>;
17
+ }
18
+ //# sourceMappingURL=queryHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryHandler.d.ts","sourceRoot":"","sources":["../../src/queryhandling/queryHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,6BAA6B,CAAA;AAE5D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD,iFAAiF;AACjF,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;CACtC;AAED,MAAM,WAAW,gBAAgB,CAC7B,UAAU,SAAS,WAAW,EAC9B,OAAO;IAEP,KAAK,CACD,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC9B,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;CACpC;AAED,4DAA4D;AAC5D,qBAAa,YAAY,CACrB,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,OAAO,GAAG,OAAO,CACnB,YAAW,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;IAC9C,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,GAAE,mBAAwB,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;CAG/F"}
@@ -0,0 +1,39 @@
1
+ import { QueryHandler } from './queryHandler.js';
2
+ import type { AbortSignalLike, QueryRequestOptions, QueryValues } from './queryHandler.js';
3
+ export interface SearchParamsLike {
4
+ append(name: string, value: string): void;
5
+ set(name: string, value: string): void;
6
+ }
7
+ export interface UrlLike {
8
+ readonly searchParams: SearchParamsLike;
9
+ toString(): string;
10
+ }
11
+ export interface JsonResponseLike<TResult> {
12
+ readonly ok: boolean;
13
+ readonly status?: number;
14
+ json(): TResult | PromiseLike<TResult>;
15
+ }
16
+ export type FetchLike<TResult> = {
17
+ bivarianceHack(url: string, options?: {
18
+ signal?: AbortSignalLike | null;
19
+ }): JsonResponseLike<TResult> | JsonResponseLike<unknown> | PromiseLike<JsonResponseLike<TResult> | JsonResponseLike<unknown>>;
20
+ }['bivarianceHack'];
21
+ export type QuerySerializer<TArguments extends QueryValues> = (url: UrlLike, args: TArguments) => void | UrlLike;
22
+ export interface RestQueryHandlerOptions<TArguments extends QueryValues, TResult> {
23
+ url: string;
24
+ baseUrl?: string;
25
+ fetch?: FetchLike<TResult>;
26
+ serialize?: QuerySerializer<TArguments>;
27
+ trace?: boolean;
28
+ }
29
+ /** Fetch-based JSON query adapter with injectable environment capabilities. */
30
+ export declare class RestQueryHandler<TArguments extends QueryValues = QueryValues, TResult = unknown> extends QueryHandler<TArguments, TResult> {
31
+ readonly url: string;
32
+ readonly baseUrl: string | undefined;
33
+ readonly fetchImplementation: FetchLike<TResult>;
34
+ readonly serialize: QuerySerializer<TArguments>;
35
+ readonly trace: boolean;
36
+ constructor(options: string | RestQueryHandlerOptions<TArguments, TResult>);
37
+ fetch(args: TArguments, options?: QueryRequestOptions): Promise<TResult>;
38
+ }
39
+ //# sourceMappingURL=restQueryHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restQueryHandler.d.ts","sourceRoot":"","sources":["../../src/queryhandling/restQueryHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAC,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAExF,MAAM,WAAW,gBAAgB;IAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACzC;AAED,MAAM,WAAW,OAAO;IACpB,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAA;IACvC,QAAQ,IAAI,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB,CAAC,OAAO;IACrC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,IAAI,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;CACzC;AAED,MAAM,MAAM,SAAS,CAAC,OAAO,IAAI;IAC7B,cAAc,CACV,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;KAAC,GAC5C,gBAAgB,CAAC,OAAO,CAAC,GACtB,gBAAgB,CAAC,OAAO,CAAC,GACzB,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;CAC3E,CAAC,gBAAgB,CAAC,CAAA;AAEnB,MAAM,MAAM,eAAe,CAAC,UAAU,SAAS,WAAW,IAAI,CAC1D,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,UAAU,KACf,IAAI,GAAG,OAAO,CAAA;AAEnB,MAAM,WAAW,uBAAuB,CACpC,UAAU,SAAS,WAAW,EAC9B,OAAO;IAEP,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IAC1B,SAAS,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAA;IACvC,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAgBD,+EAA+E;AAC/E,qBAAa,gBAAgB,CACzB,UAAU,SAAS,WAAW,GAAG,WAAW,EAC5C,OAAO,GAAG,OAAO,CACnB,SAAQ,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IAChD,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,CAAA;IAC/C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;gBAEX,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC;IAwB3D,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;CA6B9F"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@sylwellsoftware/glue",
3
+ "private": false,
4
+ "version": "0.1.0-alpha.1",
5
+ "description": "Experimental platform-neutral reactive values, derived state, live queries, and causal tracing.",
6
+ "license": "Apache-2.0",
7
+ "author": {
8
+ "name": "Sylwell Software",
9
+ "email": "npm@sylwellsoftware.com",
10
+ "url": "https://sylwellsoftware.com"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/sylwellsoftware/gluefrayjs.git",
15
+ "directory": "packages/glue"
16
+ },
17
+ "homepage": "https://github.com/sylwellsoftware/gluefrayjs#readme",
18
+ "bugs": {
19
+ "url": "https://github.com/sylwellsoftware/gluefrayjs/issues"
20
+ },
21
+ "keywords": [
22
+ "reactive",
23
+ "state-management",
24
+ "typescript"
25
+ ],
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "main": "dist/index.js",
30
+ "module": "dist/index.js",
31
+ "types": "dist/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.js"
36
+ },
37
+ "./experimental": {
38
+ "types": "./dist/experimental.d.ts",
39
+ "import": "./dist/experimental.js"
40
+ }
41
+ },
42
+ "files": [
43
+ "dist",
44
+ "EXPERIMENTAL.md",
45
+ "LICENSE",
46
+ "NOTICE"
47
+ ],
48
+ "type": "module",
49
+ "devDependencies": {
50
+ "vite": "^6.3.5"
51
+ },
52
+ "engines": {
53
+ "node": ">=22",
54
+ "pnpm": ">=10"
55
+ },
56
+ "scripts": {
57
+ "build": "vite build && tsc -p tsconfig.build.json",
58
+ "test": "node --import tsx --test test/*.test.ts",
59
+ "test:types:consumer": "tsc -p test-types/consumer/tsconfig.json --noEmit",
60
+ "typecheck": "tsc -p tsconfig.json --noEmit",
61
+ "watch": "vite build --watch"
62
+ }
63
+ }