@warp-drive-mirror/core 5.10.0-alpha.21 → 5.10.0-alpha.23
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/{-private-CvZfrDZl.js → -private-DhEjiHue.js} +2 -2
- package/dist/{-private-CvZfrDZl.js.map → -private-DhEjiHue.js.map} +1 -1
- package/dist/build-config/babel-macros.d.ts +5 -0
- package/dist/build-config/canary-features.d.ts +5 -0
- package/dist/build-config/debugging.d.ts +59 -0
- package/dist/build-config/deprecations.d.ts +5 -0
- package/dist/build-config.d.ts +17 -0
- package/dist/{concepts-vh86nAcd.d.ts → concepts-Db9ssz1h.d.ts} +3 -3
- package/dist/{concepts-vh86nAcd.d.ts.map → concepts-Db9ssz1h.d.ts.map} +1 -1
- package/dist/configure.d.ts +8 -0
- package/dist/configure.js +1 -1
- package/dist/{document-B8Fup751.d.ts → document-BUmwSPVO.d.ts} +2 -2
- package/dist/{document-B8Fup751.d.ts.map → document-BUmwSPVO.d.ts.map} +1 -1
- package/dist/{fields-r1rZJB9d.d.ts → fields-B-jO-dzB.d.ts} +111 -47
- package/dist/fields-B-jO-dzB.d.ts.map +1 -0
- package/dist/graph/-private.d.ts +1 -1
- package/dist/graph/-private.js +33 -20
- package/dist/graph/-private.js.map +1 -1
- package/dist/{graph-BqxaFjEb.d.ts → graph-CoQhsOgT.d.ts} +3 -3
- package/dist/{graph-BqxaFjEb.d.ts.map → graph-CoQhsOgT.d.ts.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/{internal-D_WIXC4r.d.ts → internal-BrC3kM86.d.ts} +20 -6
- package/dist/internal-BrC3kM86.d.ts.map +1 -0
- package/dist/reactive/-private.d.ts +1 -1
- package/dist/reactive.d.ts +276 -1
- package/dist/reactive.js +2 -2
- package/dist/{request-CxtnNIIp.js → request-qKqD2aCa.js} +2 -2
- package/dist/{request-CxtnNIIp.js.map → request-qKqD2aCa.js.map} +1 -1
- package/dist/request.d.ts +9 -1
- package/dist/request.js +1 -1
- package/dist/signals/-leaked.d.ts +15 -1
- package/dist/signals/-leaked.d.ts.map +1 -1
- package/dist/signals/-leaked.js +1 -1
- package/dist/{src-ccp1WKyt.js → src-spa19bCt.js} +30 -13
- package/dist/src-spa19bCt.js.map +1 -0
- package/dist/store/-private.d.ts +1 -1
- package/dist/store/-private.js +1 -1
- package/dist/store.d.ts +6 -1
- package/dist/types/-private.js +1 -1
- package/dist/types/cache/relationship.d.ts +5 -0
- package/dist/types/cache.d.ts +6 -1
- package/dist/types/graph.d.ts +6 -1
- package/dist/types/record.d.ts +5 -0
- package/dist/types/request.d.ts +1 -1
- package/dist/types/schema/concepts.d.ts +6 -1
- package/dist/types/schema/fields.d.ts +2 -2
- package/dist/types/schema/fields.js +82 -23
- package/dist/types/schema/fields.js.map +1 -1
- package/dist/types/schema/schema-service.d.ts +6 -1
- package/dist/types/spec/document.d.ts +1 -1
- package/dist/types/spec/error.d.ts +4 -0
- package/dist/types/spec/json-api-raw.d.ts +5 -0
- package/dist/types.d.ts +9 -1
- package/dist/unpkg/{dev-deprecated/-private-B4pCmkq-.js → dev/-private-BJ2WIhKs.js} +2 -2
- package/dist/unpkg/dev/{-private-B4pCmkq-.js.map → -private-BJ2WIhKs.js.map} +1 -1
- package/dist/unpkg/dev/configure.js +1 -1
- package/dist/unpkg/dev/graph/-private.js +34 -21
- package/dist/unpkg/dev/graph/-private.js.map +1 -1
- package/dist/unpkg/dev/index.js +1 -1
- package/dist/unpkg/dev/reactive.js +2 -2
- package/dist/unpkg/dev/{request-oWpijCPQ.js → request-6lzVjHLN.js} +2 -2
- package/dist/unpkg/{dev-deprecated/request-oWpijCPQ.js.map → dev/request-6lzVjHLN.js.map} +1 -1
- package/dist/unpkg/dev/request.js +1 -1
- package/dist/unpkg/dev/signals/-leaked.js +1 -1
- package/dist/unpkg/dev/{src-C4ET4R1n.js → src-D1dbEzXb.js} +31 -14
- package/dist/unpkg/dev/src-D1dbEzXb.js.map +1 -0
- package/dist/unpkg/dev/store/-private.js +1 -1
- package/dist/unpkg/dev/{store-dZViNfMK.js → store-DVS3G92Q.js} +2 -2
- package/dist/unpkg/dev/{store-dZViNfMK.js.map → store-DVS3G92Q.js.map} +1 -1
- package/dist/unpkg/dev/store.js +1 -1
- package/dist/unpkg/dev/types/-private.js +1 -1
- package/dist/unpkg/dev/types/schema/fields.js +82 -23
- package/dist/unpkg/dev/types/schema/fields.js.map +1 -1
- package/dist/unpkg/{dev/-private-B4pCmkq-.js → dev-deprecated/-private-BJ2WIhKs.js} +2 -2
- package/dist/unpkg/dev-deprecated/{-private-B4pCmkq-.js.map → -private-BJ2WIhKs.js.map} +1 -1
- package/dist/unpkg/dev-deprecated/configure.js +1 -1
- package/dist/unpkg/dev-deprecated/graph/-private.js +34 -21
- package/dist/unpkg/dev-deprecated/graph/-private.js.map +1 -1
- package/dist/unpkg/dev-deprecated/index.js +1 -1
- package/dist/unpkg/dev-deprecated/reactive.js +2 -2
- package/dist/unpkg/dev-deprecated/{request-oWpijCPQ.js → request-6lzVjHLN.js} +2 -2
- package/dist/unpkg/{dev/request-oWpijCPQ.js.map → dev-deprecated/request-6lzVjHLN.js.map} +1 -1
- package/dist/unpkg/dev-deprecated/request.js +1 -1
- package/dist/unpkg/dev-deprecated/signals/-leaked.js +1 -1
- package/dist/unpkg/dev-deprecated/{src-jHpowq3S.js → src-Tvv7X1KB.js} +30 -13
- package/dist/unpkg/dev-deprecated/src-Tvv7X1KB.js.map +1 -0
- package/dist/unpkg/dev-deprecated/store/-private.js +1 -1
- package/dist/unpkg/dev-deprecated/types/-private.js +1 -1
- package/dist/unpkg/dev-deprecated/types/schema/fields.js +82 -23
- package/dist/unpkg/dev-deprecated/types/schema/fields.js.map +1 -1
- package/dist/unpkg/{prod-deprecated/-private-CrUi_3E_.js → prod/-private-Dg07O05r.js} +2 -2
- package/dist/unpkg/{prod-deprecated/-private-CrUi_3E_.js.map → prod/-private-Dg07O05r.js.map} +1 -1
- package/dist/unpkg/prod/configure.js +1 -1
- package/dist/unpkg/prod/graph/-private.js +27 -12
- package/dist/unpkg/prod/graph/-private.js.map +1 -1
- package/dist/unpkg/prod/index.js +1 -1
- package/dist/unpkg/prod/reactive.js +2 -2
- package/dist/unpkg/{prod-deprecated/request-Cgw3j6Dx.js → prod/request-edWLn9JK.js} +2 -2
- package/dist/unpkg/prod/{request-Cgw3j6Dx.js.map → request-edWLn9JK.js.map} +1 -1
- package/dist/unpkg/prod/request.js +1 -1
- package/dist/unpkg/prod/signals/-leaked.js +1 -1
- package/dist/unpkg/prod/{src-DFmPDGQ6.js → src-BIRx6kC-.js} +33 -12
- package/dist/unpkg/prod/src-BIRx6kC-.js.map +1 -0
- package/dist/unpkg/prod/store/-private.js +1 -1
- package/dist/unpkg/prod/types/-private.js +1 -1
- package/dist/unpkg/prod/types/schema/fields.js +82 -23
- package/dist/unpkg/prod/types/schema/fields.js.map +1 -1
- package/dist/unpkg/{prod/-private-CrUi_3E_.js → prod-deprecated/-private-Dg07O05r.js} +2 -2
- package/dist/unpkg/{prod/-private-CrUi_3E_.js.map → prod-deprecated/-private-Dg07O05r.js.map} +1 -1
- package/dist/unpkg/prod-deprecated/configure.js +1 -1
- package/dist/unpkg/prod-deprecated/graph/-private.js +27 -12
- package/dist/unpkg/prod-deprecated/graph/-private.js.map +1 -1
- package/dist/unpkg/prod-deprecated/index.js +1 -1
- package/dist/unpkg/prod-deprecated/reactive.js +2 -2
- package/dist/unpkg/{prod/request-Cgw3j6Dx.js → prod-deprecated/request-edWLn9JK.js} +2 -2
- package/dist/unpkg/prod-deprecated/{request-Cgw3j6Dx.js.map → request-edWLn9JK.js.map} +1 -1
- package/dist/unpkg/prod-deprecated/request.js +1 -1
- package/dist/unpkg/prod-deprecated/signals/-leaked.js +1 -1
- package/dist/unpkg/prod-deprecated/{src-BgQLcshl.js → src-0f4an0QR.js} +33 -12
- package/dist/unpkg/prod-deprecated/src-0f4an0QR.js.map +1 -0
- package/dist/unpkg/prod-deprecated/store/-private.js +1 -1
- package/dist/unpkg/prod-deprecated/types/-private.js +1 -1
- package/dist/unpkg/prod-deprecated/types/schema/fields.js +82 -23
- package/dist/unpkg/prod-deprecated/types/schema/fields.js.map +1 -1
- package/package.json +4 -4
- package/dist/fields-r1rZJB9d.d.ts.map +0 -1
- package/dist/internal-D_WIXC4r.d.ts.map +0 -1
- package/dist/src-ccp1WKyt.js.map +0 -1
- package/dist/unpkg/dev/src-C4ET4R1n.js.map +0 -1
- package/dist/unpkg/dev-deprecated/src-jHpowq3S.js.map +0 -1
- package/dist/unpkg/prod/src-DFmPDGQ6.js.map +0 -1
- package/dist/unpkg/prod-deprecated/src-BgQLcshl.js.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { D as setIdentifierResetMethod, E as setIdentifierGenerationMethod, F as recordIdentifierFor, L as storeFor, O as setIdentifierUpdateMethod, T as setIdentifierForgetMethod, _ as Store, g as CacheHandler, k as setKeyInfoForResource, n as RequestManager, r as Fetch, t as useRecommendedStore } from "./src-
|
|
1
|
+
import { D as setIdentifierResetMethod, E as setIdentifierGenerationMethod, F as recordIdentifierFor, L as storeFor, O as setIdentifierUpdateMethod, T as setIdentifierForgetMethod, _ as Store, g as CacheHandler, k as setKeyInfoForResource, n as RequestManager, r as Fetch, t as useRecommendedStore } from "./src-0f4an0QR.js";
|
|
2
2
|
|
|
3
3
|
export { CacheHandler, Fetch, RequestManager, Store, recordIdentifierFor as cacheKeyFor, recordIdentifierFor, setIdentifierForgetMethod, setIdentifierGenerationMethod, setIdentifierResetMethod, setIdentifierUpdateMethod, setKeyInfoForResource, storeFor, useRecommendedStore };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { d as getRequestState, t as getPromiseState, u as createRequestSubscription } from "./-private-
|
|
1
|
+
import { d as getRequestState, t as getPromiseState, u as createRequestSubscription } from "./-private-Dg07O05r.js";
|
|
2
2
|
import { t as Checkout } from "./-private-BiuED7nc.js";
|
|
3
|
-
import { a as fromIdentity, c as instantiateRecord, d as commit, i as SchemaService, l as teardownRecord, o as registerDerivations, s as withDefaults, u as checkout } from "./src-
|
|
3
|
+
import { a as fromIdentity, c as instantiateRecord, d as commit, i as SchemaService, l as teardownRecord, o as registerDerivations, s as withDefaults, u as checkout } from "./src-0f4an0QR.js";
|
|
4
4
|
|
|
5
5
|
export { Checkout, SchemaService, checkout, commit, createRequestSubscription, fromIdentity, getPromiseState, getRequestState, instantiateRecord, registerDerivations, teardownRecord, withDefaults };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getOrSetGlobal, getOrSetUniversal } from "./types/-private.js";
|
|
2
1
|
import { IS_FUTURE, STRUCTURED } from "./types/request.js";
|
|
2
|
+
import { getOrSetGlobal, getOrSetUniversal } from "./types/-private.js";
|
|
3
3
|
|
|
4
4
|
// src/request/-private/context.ts
|
|
5
5
|
function upgradeHeaders(headers) {
|
|
@@ -519,4 +519,4 @@ function withReactiveResponse(obj) {
|
|
|
519
519
|
const withBrand = withResponseType;
|
|
520
520
|
|
|
521
521
|
export { upgradePromise as a, executeNextHandler as c, getRequestResult as d, setPromiseResult as f, createDeferred as i, clearRequestResult as l, withReactiveResponse as n, DOMError as o, cloneResponseProperties as p, withResponseType as r, IS_CACHE_HANDLER as s, withBrand as t, getPromiseResult as u };
|
|
522
|
-
//# sourceMappingURL=request-
|
|
522
|
+
//# sourceMappingURL=request-edWLn9JK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-Cgw3j6Dx.js","names":["SkipCache","deepFreeze","createDeferred","upgradeHeaders","headers","clone","Headers","toJSON","Array","from","cloneResponseProperties","response","ok","redirected","status","statusText","type","url","ContextOwner","hasSetStream","hasSetResponse","hasSubscribers","stream","nextCalled","constructor","request","god","isRoot","requestId","id","controller","promise","sizeHint","signal","addEventListener","abort","reason","enhancedRequest","Object","assign","then","hasRequestedStream","getResponse","getStream","hint","get","parseInt","setStream","Promise","resolve","resolveStream","setResponse","Response","responseData","Context","owner","isCacheHandler","___owner","_isCacheHandler","_finalized","setIdentifier","identifier","_finalize","getOrSetUniversal","PromiseCache","WeakMap","RequestMap","Map","setRequestResult","requestId","result","set","clearRequestResult","delete","getRequestResult","get","setPromiseResult","promise","getPromiseResult","getOrSetGlobal","STRUCTURED","Context","ContextOwner","assertValidRequest","createFuture","isFuture","setRequestResult","IS_CACHE_HANDLER","Symbol","DOMError","DOMException","Error","curryFuture","owner","inbound","outbound","setStream","getStream","then","doc","document","request","response","content","resolve","error","isDoc","god","stream","e","Object","assign","message","getResponse","reject","promise","ensureDoc","isError","enhanceReason","reason","name","handleOutcome","controller","signal","aborted","isCacheHandler","handler","index","Boolean","executeNextHandler","wares","i","next","r","nextCalled","_isCacheHandler","context","outcome","_finalize","Promise","requestId","result","future","IS_FUTURE","enhanceReason","isFuture","maybe","Boolean","Promise","createDeferred","resolve","reject","promise","res","rej","upgradePromise","future","getStream","abort","onFinalize","id","lid","requester","createFuture","owner","deferred","cbs","finally","resolveStream","forEach","cb","fn","push","reason","requestId","god","identifier","createDeferred","setPromiseResult","getPromiseResult","withResponseType","obj","withReactiveResponse","withBrand"],"sources":["../../../src/request/-private/context.ts","../../../src/request/-private/promise-cache.ts","../../../src/request/-private/utils.ts","../../../src/request/-private/future.ts","../../../src/request.ts"],"sourcesContent":["import { DEBUG } from '@warp-drive-mirror/core/build-config/env';\nimport { assert } from '@warp-drive-mirror/core/build-config/macros';\n\nimport type { RequestKey } from '../../types/identifier';\nimport type { ImmutableHeaders, ImmutableRequestInfo, RequestInfo, ResponseInfo } from '../../types/request';\nimport { SkipCache } from '../../types/request';\nimport { deepFreeze } from './debug';\nimport { createDeferred } from './future';\nimport type { DeferredStream, GodContext } from './types';\n\nexport function upgradeHeaders(headers: Headers | ImmutableHeaders): ImmutableHeaders {\n (headers as ImmutableHeaders).clone = () => {\n return new Headers(headers);\n };\n (headers as ImmutableHeaders).toJSON = () => {\n return Array.from(headers as unknown as Iterable<[string, string]>);\n };\n return headers as ImmutableHeaders;\n}\n\nexport function cloneResponseProperties(response: Response): ResponseInfo {\n const { headers, ok, redirected, status, statusText, type, url } = response;\n upgradeHeaders(headers);\n return {\n headers: headers as ImmutableHeaders,\n ok,\n redirected,\n status,\n statusText,\n type,\n url,\n };\n}\n\nexport class ContextOwner {\n hasSetStream = false;\n hasSetResponse = false;\n hasSubscribers = false;\n stream: DeferredStream = createDeferred<ReadableStream | null>();\n response: ResponseInfo | null = null;\n declare request: ImmutableRequestInfo;\n declare enhancedRequest: ImmutableRequestInfo;\n nextCalled = 0;\n declare god: GodContext;\n declare controller: AbortController;\n declare requestId: number;\n declare isRoot: boolean;\n\n constructor(request: RequestInfo, god: GodContext, isRoot = false) {\n this.isRoot = isRoot;\n this.requestId = god.id;\n this.controller = request.controller || god.controller;\n this.stream.promise.sizeHint = 0;\n\n if (request.controller) {\n if (request.controller !== god.controller) {\n god.controller.signal.addEventListener('abort', () => {\n this.controller.abort(god.controller.signal.reason);\n });\n }\n delete request.controller;\n }\n let enhancedRequest: ImmutableRequestInfo = Object.assign(\n { signal: this.controller.signal },\n request\n ) as ImmutableRequestInfo;\n if (DEBUG) {\n if (!request?.cacheOptions?.[SkipCache]) {\n request = deepFreeze(request);\n enhancedRequest = deepFreeze(enhancedRequest);\n }\n } else {\n if (request.headers) {\n upgradeHeaders(request.headers);\n }\n }\n this.enhancedRequest = enhancedRequest;\n this.request = request as ImmutableRequestInfo;\n this.god = god;\n this.stream.promise = this.stream.promise.then((stream: ReadableStream | null) => {\n if (this.god.stream === stream && this.hasSubscribers) {\n this.god.stream = null;\n }\n return stream;\n });\n }\n\n get hasRequestedStream(): boolean {\n return this.god.hasRequestedStream;\n }\n\n getResponse(): ResponseInfo | null {\n if (this.hasSetResponse) {\n return this.response;\n }\n if (this.nextCalled === 1) {\n return this.god.response;\n }\n return null;\n }\n getStream(): Promise<ReadableStream | null> {\n if (this.isRoot) {\n this.god.hasRequestedStream = true;\n }\n if (!this.hasSetResponse) {\n const hint = this.god.response?.headers?.get('content-length');\n this.stream.promise.sizeHint = hint ? parseInt(hint, 10) : 0;\n }\n this.hasSubscribers = true;\n return this.stream.promise;\n }\n abort(reason: DOMException): void {\n this.controller.abort(reason);\n }\n\n setStream(stream: ReadableStream | Promise<ReadableStream | null> | null): void {\n if (!this.hasSetStream) {\n this.hasSetStream = true;\n\n if (!(stream instanceof Promise)) {\n this.god.stream = stream;\n }\n // @ts-expect-error\n this.stream.resolve(stream);\n }\n }\n\n resolveStream(): void {\n this.setStream(this.nextCalled === 1 ? this.god.stream : null);\n }\n\n setResponse(response: ResponseInfo | Response | null): void {\n if (this.hasSetResponse) {\n if (DEBUG) {\n throw new Error(`Cannot setResponse when a response has already been set`);\n }\n return;\n }\n this.hasSetResponse = true;\n if (response instanceof Response) {\n // TODO potentially avoid cloning in prod\n let responseData = cloneResponseProperties(response);\n\n if (DEBUG) {\n responseData = deepFreeze(responseData);\n }\n this.response = responseData;\n this.god.response = responseData;\n const sizeHint = response.headers?.get('content-length');\n this.stream.promise.sizeHint = sizeHint ? parseInt(sizeHint, 10) : 0;\n } else {\n this.response = response;\n this.god.response = response;\n }\n }\n}\n\n/**\n * The context object given to each {@link Handler} (or {@link CacheHandler})\n * as it processes a request. It exposes the (immutable, enhanced) request\n * along with the methods a handler uses to build up the {@link Future} and\n * {@link StructuredDataDocument} that will ultimately be returned by the\n * {@link RequestManager}.\n *\n * @summary The per-request object passed to each handler, exposing the immutable request plus methods to\n * set the response, stream, and request key.\n * @public\n */\nexport class Context {\n /** @internal */\n declare private ___owner: ContextOwner;\n /**\n * A readonly, immutable version of the request being handled, including\n * any defaults or enhancements applied by the {@link RequestManager}.\n *\n * @public\n */\n declare request: ImmutableRequestInfo;\n /**\n * The id of this request as assigned by the {@link RequestManager}. Not\n * unique across manager instances.\n *\n * @public\n */\n declare id: number;\n /** @internal */\n declare private _isCacheHandler: boolean;\n /** @internal */\n declare private _finalized: boolean;\n\n constructor(owner: ContextOwner, isCacheHandler: boolean) {\n this.id = owner.requestId;\n this.___owner = owner;\n this.request = owner.enhancedRequest;\n this._isCacheHandler = isCacheHandler;\n this._finalized = false;\n }\n /**\n * Set the response stream for this request. May be called at most once,\n * and may be called at any point up until the handler's `request` method\n * resolves.\n *\n * @public\n */\n setStream(stream: ReadableStream | Promise<ReadableStream | null>): void {\n this.___owner.setStream(stream);\n }\n /**\n * Set the {@link ResponseInfo} (or raw `Response`) associated with this\n * request. Used to populate the response information available on the\n * resulting {@link StructuredDataDocument}.\n *\n * @public\n */\n setResponse(response: ResponseInfo | Response | null): void {\n this.___owner.setResponse(response);\n }\n\n /**\n * Associate a {@link RequestKey} with this request. May only be called\n * synchronously from a {@link CacheHandler}.\n *\n * @public\n */\n setIdentifier(identifier: RequestKey): void {\n assert(\n `setIdentifier may only be used synchronously from a CacheHandler`,\n identifier && this._isCacheHandler && !this._finalized\n );\n this.___owner.god.identifier = identifier;\n }\n\n /**\n * Whether the application (or a downstream handler) has requested access\n * to the response stream via {@link Future.getStream}. Handlers can use\n * this to avoid the cost of streaming when nothing will consume it.\n *\n * @public\n */\n get hasRequestedStream(): boolean {\n return this.___owner.hasRequestedStream;\n }\n\n /** @private */\n _finalize(): void {\n this._finalized = true;\n }\n}\nexport type HandlerRequestContext = Context;\n","import { getOrSetUniversal } from '../../types/-private';\n\nexport type CacheResult<T = unknown, E = unknown> = { isError: true; result: E } | { isError: false; result: T };\n\n/**\n * The minimal, structural subset of the `Promise` interface required to be\n * cached and inspected by {@link setPromiseResult} / {@link getPromiseResult}\n * (and by `getPromiseState`). Anything that is at least `then`/`catch`/`finally`\n * \"shaped\" (including a real `Promise` or {@link Future}) satisfies this.\n *\n * @summary Any promise-like value with `then`, `catch`, and `finally`, as accepted by the promise-result\n * cache and `getPromiseState`.\n * @public\n */\nexport type Awaitable<T = unknown, E = unknown> = {\n /**\n * Registers fulfillment/rejection handlers, `Promise.prototype.then`-style.\n *\n * @public\n */\n then: (onFulfilled: (value: T) => unknown, onRejected: (reason: E) => unknown) => unknown;\n /**\n * Registers a rejection handler, `Promise.prototype.catch`-style.\n *\n * @public\n */\n catch: (onRejected: (reason: E) => unknown) => unknown;\n /**\n * Registers a handler run on settlement, `Promise.prototype.finally`-style.\n *\n * @public\n */\n finally: (onFinally: () => unknown) => unknown;\n};\n\nexport const PromiseCache: WeakMap<Awaitable, CacheResult> = getOrSetUniversal(\n 'PromiseCache',\n new WeakMap<Awaitable, CacheResult>()\n);\nexport const RequestMap: Map<number, CacheResult> = getOrSetUniversal('RequestMap', new Map<number, CacheResult>());\n\nexport function setRequestResult(requestId: number, result: CacheResult): void {\n RequestMap.set(requestId, result);\n}\nexport function clearRequestResult(requestId: number): void {\n RequestMap.delete(requestId);\n}\nexport function getRequestResult(requestId: number): CacheResult | undefined {\n return RequestMap.get(requestId);\n}\n\n/**\n * Cache the settled result (or error) of a promise-like value so that its\n * outcome can be synchronously read later via {@link getPromiseResult},\n * without needing to await it again.\n *\n * @summary Records a promise's settled value or error so it can later be read synchronously with\n * `getPromiseResult`.\n * @public\n */\nexport function setPromiseResult(promise: Promise<unknown> | Awaitable, result: CacheResult): void {\n PromiseCache.set(promise, result);\n}\n\n/**\n * Synchronously read the settled result (or error) previously recorded for\n * a promise-like value via {@link setPromiseResult}, if any.\n *\n * @summary Synchronously returns the settled value or error previously recorded for a promise, or\n * `undefined` if none was recorded.\n * @public\n */\nexport function getPromiseResult<T, E>(promise: Promise<T> | Awaitable<T, E>): CacheResult<T, E> | undefined {\n return PromiseCache.get(promise) as CacheResult<T, E> | undefined;\n}\n","import { DEBUG } from '@warp-drive-mirror/core/build-config/env';\n\nimport { getOrSetGlobal } from '../../types/-private';\nimport type {\n RequestInfo,\n StructuredDataDocument,\n StructuredDocument,\n StructuredErrorDocument,\n} from '../../types/request';\nimport { STRUCTURED } from '../../types/request';\nimport { Context, ContextOwner } from './context';\nimport { assertValidRequest } from './debug';\n// oxlint-disable-next-line no-unused-vars\nimport type { Fetch } from './fetch.ts';\nimport { createFuture, isFuture } from './future';\nimport { setRequestResult } from './promise-cache';\nimport type { DeferredFuture, Future, GodContext, Handler } from './types';\n\nexport const IS_CACHE_HANDLER: '___(unique) Symbol(IS_CACHE_HANDLER)' = getOrSetGlobal(\n 'IS_CACHE_HANDLER',\n Symbol('IS_CACHE_HANDLER')\n);\n\n/**\n * A ponyfill for the global {@link DOMException} constructor.\n *\n * Some non-DOM environments (e.g. React Native, some Node/worker\n * environments) don't provide `DOMException` as a global, which would\n * otherwise throw a `ReferenceError` the first time any code referenced it\n * (for instance when classifying an abort/network error). `DOMError` falls\n * back to the global {@link Error} constructor in that case so callers can\n * uniformly use `new DOMError(...)` / `error instanceof DOMError` without\n * guarding for the global's presence themselves.\n *\n * @internal\n */\nexport const DOMError: typeof DOMException =\n typeof DOMException !== 'undefined' ? DOMException : (Error as unknown as typeof DOMException);\nexport function curryFuture<T>(owner: ContextOwner, inbound: Future<T>, outbound: DeferredFuture<T>): Future<T> {\n owner.setStream(inbound.getStream());\n\n inbound.then(\n (doc: StructuredDataDocument<T>) => {\n const document = {\n [STRUCTURED]: true as const,\n request: owner.request,\n response: doc.response,\n content: doc.content,\n };\n outbound.resolve(document);\n },\n (error: Error & StructuredErrorDocument) => {\n if (isDoc(error)) {\n owner.setStream(owner.god.stream);\n }\n if (!error || !(error instanceof Error)) {\n try {\n throw new Error(error ? error : `Request Rejected with an Unknown Error`);\n } catch (e: unknown) {\n if (error && typeof error === 'object') {\n Object.assign(e as Error, error);\n (e as Error & StructuredErrorDocument).message =\n (error as Error).message || `Request Rejected with an Unknown Error`;\n }\n error = e as Error & StructuredErrorDocument;\n }\n }\n\n error[STRUCTURED] = true;\n error.request = owner.request;\n error.response = owner.getResponse();\n error.error = error.error || error.message;\n\n outbound.reject(error);\n }\n );\n return outbound.promise;\n}\n\nfunction isDoc<T>(doc: T | StructuredDataDocument<T>): doc is StructuredDataDocument<T> {\n return doc && (doc as StructuredDataDocument<T>)[STRUCTURED] === true;\n}\n\nfunction ensureDoc<T>(owner: ContextOwner, content: T | Error, isError: boolean): StructuredDocument<T> {\n if (isDoc(content)) {\n return content as StructuredDocument<T>;\n }\n\n if (isError) {\n return {\n [STRUCTURED]: true,\n request: owner.request,\n response: owner.getResponse(),\n error: content as Error,\n } as StructuredErrorDocument<T>;\n }\n\n return {\n [STRUCTURED]: true,\n request: owner.request,\n response: owner.getResponse(),\n content: content as T,\n };\n}\n\n/**\n * Additional properties exposed on errors thrown by the\n * {@link Fetch | Fetch Handler}.\n *\n * In the case of an Abort or system/browser level issue,\n * this extends {@link DOMException}.\n *\n * Else it extends from {@link AggregateError} if the\n * response includes an array of errors, falling back\n * to {@link Error} as its base.\n *\n * @summary The shape of errors thrown by the Fetch handler for failed, aborted, or network-errored\n * requests, carrying the HTTP `status` and `statusText`.\n */\nexport interface FetchError extends DOMException {\n /**\n * Alias for {@link FetchError.status | status}.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status)\n */\n code: number;\n /**\n * The name associated to the {@link FetchError.status | status code}.\n *\n * Typically this will be of the formula `StatusTextError` for instance\n * a 404 status with status text of `Not Found` would have the name\n * `NotFoundError`.\n */\n name: string;\n /**\n * The http status code associated to the returned error.\n *\n * Browser/System level network errors will often have an error code of `0` or `5`.\n * Aborted requests will have an error code of `20`.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status)\n */\n status: number;\n /**\n * The Status Text associated to the {@link FetchError.status | status code}\n * for the error.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/statusText)\n *\n */\n statusText: string;\n /**\n * A property signifying that an Error uses the {@link FetchError}\n * interface.\n */\n isRequestError: true;\n}\n\nexport function enhanceReason(reason?: string): DOMException {\n const error = new DOMError(reason || 'The user aborted a request.', 'AbortError');\n // `DOMError` may be the `Error` constructor as a fallback, whose\n // constructor doesn't accept a `name`, so set it explicitly in that case.\n // We can't unconditionally assign `error.name` here: when `DOMError` is\n // the real `DOMException`, `name` is already `'AbortError'` (set by its\n // constructor) *and* `DOMException.prototype.name` is a getter-only\n // accessor with no setter, so reassigning it throws a `TypeError` in\n // strict-mode JS (which is how our ES modules run) - even when assigning\n // the very same value it already holds.\n if (error.name !== 'AbortError') {\n (error as unknown as { name: string }).name = 'AbortError';\n }\n return error;\n}\n\nexport function handleOutcome<T>(\n owner: ContextOwner,\n inbound: Promise<T | StructuredDataDocument<T>>,\n outbound: DeferredFuture<T>\n): Future<T> {\n inbound.then(\n (content: T | StructuredDataDocument<T>) => {\n if (owner.controller.signal.aborted) {\n // the next function did not respect the signal, we handle it here\n outbound.reject(enhanceReason(owner.controller.signal.reason as string));\n return;\n }\n if (isDoc(content)) {\n owner.setStream(owner.god.stream);\n content = content.content;\n }\n const document = {\n [STRUCTURED]: true as const,\n request: owner.request,\n response: owner.getResponse(),\n content,\n };\n outbound.resolve(document);\n },\n (error: Error & StructuredErrorDocument) => {\n if (isDoc(error)) {\n owner.setStream(owner.god.stream);\n }\n if (!error || !(error instanceof Error)) {\n try {\n throw new Error(error ? error : `Request Rejected with an Unknown Error`);\n } catch (e: unknown) {\n if (error && typeof error === 'object') {\n Object.assign(e as Error, error);\n (e as Error & StructuredErrorDocument).message =\n (error as Error).message || `Request Rejected with an Unknown Error`;\n }\n error = e as Error & StructuredErrorDocument;\n }\n }\n\n error[STRUCTURED] = true;\n error.request = owner.request;\n error.response = owner.getResponse();\n error.error = error.error || error.message;\n outbound.reject(error);\n }\n );\n return outbound.promise;\n}\n\nfunction isCacheHandler(handler: Handler & { [IS_CACHE_HANDLER]?: boolean }, index: number): boolean {\n return index === 0 && Boolean(handler[IS_CACHE_HANDLER]);\n}\n\nexport function executeNextHandler<T>(\n wares: Readonly<Handler[]>,\n request: RequestInfo,\n i: number,\n god: GodContext\n): Future<T> {\n if (DEBUG) {\n if (i === wares.length) {\n throw new Error(`No handler was able to handle this request.`);\n }\n assertValidRequest(request, false);\n }\n const owner = new ContextOwner(request, god, i === 0);\n\n function next(r: RequestInfo): Future<T> {\n owner.nextCalled++;\n return executeNextHandler(wares, r, i + 1, god);\n }\n\n const _isCacheHandler = isCacheHandler(wares[i], i);\n const context = new Context(owner, _isCacheHandler);\n let outcome: Promise<T | StructuredDataDocument<T>> | Future<T>;\n try {\n outcome = wares[i].request<T>(context, next);\n if (_isCacheHandler) {\n context._finalize();\n }\n if (!!outcome && _isCacheHandler) {\n if (!(outcome instanceof Promise)) {\n setRequestResult(owner.requestId, { isError: false, result: ensureDoc(owner, outcome, false) });\n outcome = Promise.resolve(outcome);\n }\n } else if (DEBUG) {\n if (!outcome || (!(outcome instanceof Promise) && !(typeof outcome === 'object' && 'then' in outcome))) {\n // oxlint-disable-next-line no-console\n console.log({ request, handler: wares[i], outcome });\n if (outcome === undefined) {\n throw new Error(`Expected handler.request to return a promise, instead received undefined.`);\n }\n throw new Error(`Expected handler.request to return a promise, instead received a synchronous value.`);\n }\n }\n } catch (e) {\n if (_isCacheHandler) {\n setRequestResult(owner.requestId, { isError: true, result: ensureDoc(owner, e, true) });\n }\n // oxlint-disable-next-line typescript/prefer-promise-reject-errors\n outcome = Promise.reject<StructuredDataDocument<T>>(e);\n }\n const future = createFuture<T>(owner);\n\n if (isFuture<T>(outcome)) {\n return curryFuture(owner, outcome, future);\n }\n\n return handleOutcome(owner, outcome, future);\n}\n","import { DEBUG } from '@warp-drive-mirror/build-config/env';\n\nimport { IS_FUTURE, type StructuredDocument } from '../../types/request';\nimport type { ContextOwner } from './context';\nimport type { Deferred, DeferredFuture, Future } from './types';\nimport { enhanceReason } from './utils';\n\nexport function isFuture<T>(maybe: unknown): maybe is Future<T> {\n return Boolean(maybe && maybe instanceof Promise && (maybe as Future<T>)[IS_FUTURE] === true);\n}\n\n/**\n * Create a {@link Deferred}: a promise along with the `resolve`/`reject`\n * callbacks that settle it, so the promise can be handed out before the\n * work that will settle it has started.\n *\n * @summary Creates a promise together with its `resolve` and `reject` callbacks so it can be handed out\n * before it is settled.\n * @public\n */\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (v: T) => void;\n let reject!: (v: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { resolve, reject, promise };\n}\n\nexport function upgradePromise<T>(promise: Promise<StructuredDocument<T>>, future: Future<T>): Future<T> {\n (promise as Future<T>)[IS_FUTURE] = true;\n // oxlint-disable-next-line typescript/unbound-method\n (promise as Future<T>).getStream = future.getStream;\n // oxlint-disable-next-line typescript/unbound-method\n (promise as Future<T>).abort = future.abort;\n // oxlint-disable-next-line typescript/unbound-method\n (promise as Future<T>).onFinalize = future.onFinalize;\n (promise as Future<T>).id = future.id;\n (promise as Future<T>).lid = future.lid;\n (promise as Future<T>).requester = future.requester;\n\n if (DEBUG) {\n // @ts-expect-error\n promise.toJSON = () => {\n const id = 'Future<' + (promise as Future<T>).id + '>';\n if ((promise as Future<T>).lid) {\n return `${id} (${(promise as Future<T>).lid!.lid})`;\n }\n return id;\n };\n }\n\n return promise as Future<T>;\n}\n\nexport function createFuture<T>(owner: ContextOwner): DeferredFuture<T> {\n const deferred = createDeferred<T>() as unknown as DeferredFuture<T>;\n let { promise } = deferred;\n let cbs: Array<() => void> | undefined;\n promise = promise.finally(() => {\n owner.resolveStream();\n if (cbs) {\n cbs.forEach((cb) => cb());\n }\n }) as Future<T>;\n promise.onFinalize = (fn: () => void) => {\n cbs = cbs || [];\n cbs.push(fn);\n };\n promise[IS_FUTURE] = true;\n promise.getStream = () => {\n return owner.getStream();\n };\n promise.abort = (reason?: string) => {\n owner.abort(enhanceReason(reason));\n };\n promise.id = owner.requestId;\n promise.lid = owner.god.identifier;\n promise.requester = owner.god.requester;\n\n if (DEBUG) {\n // @ts-expect-error\n promise.toJSON = () => {\n const id = 'Future<' + promise.id + '>';\n if (promise.lid) {\n return `${id} (${promise.lid.lid})`;\n }\n return id;\n };\n }\n\n deferred.promise = promise;\n return deferred;\n}\n","/**\n * The [Making Requests](/guides/the-manual/requests/) guide teaches the request layer\n * these types and helpers belong to.\n *\n * @module\n * @summary Request-layer types such as `Future`, `Handler` and `Context`, plus `withResponseType` and\n * `withReactiveResponse` for typing the response a request resolves with.\n */\n\nimport type { ReactiveDataDocument } from './reactive.ts';\nimport type { RequestInfo } from './types/request.ts';\nimport type { Meta } from './types/spec/json-api-raw.ts';\nimport type { RequestSignature } from './types/symbols.ts';\n\nexport { createDeferred } from './request/-private/future.ts';\nexport type {\n Future,\n Handler,\n CacheHandler,\n NextFn,\n Deferred,\n ManagedRequestPriority,\n} from './request/-private/types.ts';\nexport { setPromiseResult, getPromiseResult } from './request/-private/promise-cache.ts';\nexport type { Awaitable } from './request/-private/promise-cache.ts';\nexport type { Context } from './request/-private/context.ts';\n\n/**\n * Brands the supplied object with the supplied response type.\n *\n * Call it inside a [builder](/guides/the-manual/requests/builders), so the type is part of\n * the builder's contract and every caller gets it through inference. Calling it inline\n * where the request is made is a cast. The [Typing Requests](/guides/the-manual/requests/typing-requests)\n * guide shows how to use it.\n *\n * ```ts\n * import type { ReactiveDataDocument } from '@warp-drive-mirror/core/reactive';\n * import { withResponseType } from '@warp-drive-mirror/core/request';\n * import type { User } from '#/data/user.ts'\n *\n * export function getUser(id: string) {\n * return withResponseType<ReactiveDataDocument<User>>({ url: `/users/${id}` });\n * }\n *\n * const result = await store.request(getUser('1'));\n *\n * result.content.data; // will have type User\n * ```\n *\n * @summary Types a request object with the response type that `store.request` or `RequestManager.request`\n * should resolve with; no runtime effect.\n */\nexport function withResponseType<T>(obj: RequestInfo): RequestInfo<T> & {\n /** The branded response type. Present only at the type level; carries no runtime value. */\n [RequestSignature]: T;\n} {\n return obj as RequestInfo<T> & {\n [RequestSignature]: T;\n };\n}\n\n/**\n * Brands the supplied object with the supplied response type\n * wrapped in {@link ReactiveDataDocument}. This is a convenience for\n * the common case of using {@link withResponseType} with `ReactiveDataDocument`.\n *\n * Like `withResponseType`, call it inside a [builder](/guides/the-manual/requests/builders)\n * rather than where the request is made. The\n * [Typing Requests](/guides/the-manual/requests/typing-requests#typing-reactive-responses)\n * guide shows how to use it.\n *\n * ```ts\n * import { withReactiveResponse } from '@warp-drive-mirror/core/request';\n * import type { User } from '#/data/user.ts'\n *\n * export function getUser(id: string) {\n * return withReactiveResponse<User>({ url: `/users/${id}` });\n * }\n *\n * const result = await store.request(getUser('1'));\n *\n * result.content.data; // will have type User\n * ```\n *\n * Pass a second type param to declare the `meta` the endpoint returns:\n *\n * ```ts\n * type PageMeta = { page: { limit: number; offset: number }; total?: number };\n *\n * export function getUsers() {\n * return withReactiveResponse<User[], PageMeta>({ url: '/users' });\n * }\n *\n * const result = await store.request(getUsers());\n *\n * result.content.meta?.total; // number | undefined\n * ```\n *\n * @summary Types a request object so its response resolves as a `ReactiveDataDocument` of the given\n * data and meta types; no runtime effect.\n * @public\n */\nexport function withReactiveResponse<\n T,\n M extends Meta | undefined = Meta | undefined,\n E extends object = object,\n EM extends Meta | undefined = M,\n>(\n obj: RequestInfo\n): RequestInfo<ReactiveDataDocument<T, M, E, EM>> & {\n /** The branded response type. Present only at the type level; carries no runtime value. */\n [RequestSignature]: ReactiveDataDocument<T, M, E, EM>;\n} {\n return obj as RequestInfo<ReactiveDataDocument<T, M, E, EM>> & {\n [RequestSignature]: ReactiveDataDocument<T, M, E, EM>;\n };\n}\n\n/**\n * @summary Deprecated alias for `withResponseType`, which types a request object with its expected\n * response type.\n * @deprecated use {@link withResponseType} instead\n */\nexport const withBrand: typeof withResponseType = withResponseType;\n"],"mappings":";;;;AAUA,SAAgBG,eAAeC,SAAuD;CACnFA,QAA6BC,cAAc;EAC1C,OAAO,IAAIC,QAAQF,OAAO;CAC5B;CACCA,QAA6BG,eAAe;EAC3C,OAAOC,MAAMC,KAAKL,OAAgD;CACpE;CACA,OAAOA;AACT;AAEA,SAAgBM,wBAAwBC,UAAkC;CACxE,MAAM,EAAEP,SAASQ,IAAIC,YAAYC,QAAQC,YAAYC,MAAMC,QAAQN;CACnER,eAAeC,OAAO;CACtB,OAAO;EACIA;EACTQ;EACAC;EACAC;EACAC;EACAC;EACAC;CACF;AACF;AAEA,IAAaC,eAAb,MAA0B;CACxBC,eAAe;CACfC,iBAAiB;CACjBC,iBAAiB;CACjBC,SAAyBpB,eAAsC;CAC/DS,WAAgC;CAGhCY,aAAa;CAMbC,YAAYC,SAAsBC,KAAiBC,SAAS,OAAO;EACjE,KAAKA,SAASA;EACd,KAAKC,YAAYF,IAAIG;EACrB,KAAKC,aAAaL,QAAQK,cAAcJ,IAAII;EAC5C,KAAKR,OAAOS,QAAQC,WAAW;EAE/B,IAAIP,QAAQK,YAAY;GACtB,IAAIL,QAAQK,eAAeJ,IAAII,YAC7BJ,IAAII,WAAWG,OAAOC,iBAAiB,eAAe;IACpD,KAAKJ,WAAWK,MAAMT,IAAII,WAAWG,OAAOG,MAAM;GACpD,CAAC;GAEH,OAAOX,QAAQK;EACjB;EACA,IAAIO,kBAAwCC,OAAOC,OACjD,EAAEN,QAAQ,KAAKH,WAAWG,OAAO,GACjCR,OACF;EAOE,IAAIA,QAAQrB,SACVD,eAAesB,QAAQrB,OAAO;EAGlC,KAAKiC,kBAAkBA;EACvB,KAAKZ,UAAUA;EACf,KAAKC,MAAMA;EACX,KAAKJ,OAAOS,UAAU,KAAKT,OAAOS,QAAQS,MAAMlB,WAAkC;GAChF,IAAI,KAAKI,IAAIJ,WAAWA,UAAU,KAAKD,gBACrC,KAAKK,IAAIJ,SAAS;GAEpB,OAAOA;EACT,CAAC;CACH;CAEA,IAAImB,qBAA8B;EAChC,OAAO,KAAKf,IAAIe;CAClB;CAEAC,cAAmC;EACjC,IAAI,KAAKtB,gBACP,OAAO,KAAKT;EAEd,IAAI,KAAKY,eAAe,GACtB,OAAO,KAAKG,IAAIf;EAElB,OAAO;CACT;CACAgC,YAA4C;EAC1C,IAAI,KAAKhB,QACP,KAAKD,IAAIe,qBAAqB;EAEhC,IAAI,CAAC,KAAKrB,gBAAgB;GACxB,MAAMwB,OAAO,KAAKlB,IAAIf,UAAUP,SAASyC,IAAI,gBAAgB;GAC7D,KAAKvB,OAAOS,QAAQC,WAAWY,OAAOE,SAASF,MAAM,EAAE,IAAI;EAC7D;EACA,KAAKvB,iBAAiB;EACtB,OAAO,KAAKC,OAAOS;CACrB;CACAI,MAAMC,QAA4B;EAChC,KAAKN,WAAWK,MAAMC,MAAM;CAC9B;CAEAW,UAAUzB,QAAsE;EAC9E,IAAI,CAAC,KAAKH,cAAc;GACtB,KAAKA,eAAe;GAEpB,IAAI,EAAEG,kBAAkB0B,UACtB,KAAKtB,IAAIJ,SAASA;GAGpB,KAAKA,OAAO2B,QAAQ3B,MAAM;EAC5B;CACF;CAEA4B,gBAAsB;EACpB,KAAKH,UAAU,KAAKxB,eAAe,IAAI,KAAKG,IAAIJ,SAAS,IAAI;CAC/D;CAEA6B,YAAYxC,UAAgD;EAC1D,IAAI,KAAKS,gBAIP;EAEF,KAAKA,iBAAiB;EACtB,IAAIT,oBAAoByC,UAAU;GAEhC,IAAIC,eAAe3C,wBAAwBC,QAAQ;GAKnD,KAAKA,WAAW0C;GAChB,KAAK3B,IAAIf,WAAW0C;GACpB,MAAMrB,WAAWrB,SAASP,SAASyC,IAAI,gBAAgB;GACvD,KAAKvB,OAAOS,QAAQC,WAAWA,WAAWc,SAASd,UAAU,EAAE,IAAI;EACrE,OAAO;GACL,KAAKrB,WAAWA;GAChB,KAAKe,IAAIf,WAAWA;EACtB;CACF;AACF;;;;;;;;;;;;AAaA,IAAa2C,UAAb,MAAqB;;;;;;;;;;;;;;;;CAsBnB9B,YAAY+B,OAAqBC,gBAAyB;EACxD,KAAK3B,KAAK0B,MAAM3B;EAChB,KAAK6B,WAAWF;EAChB,KAAK9B,UAAU8B,MAAMlB;EACrB,KAAKqB,kBAAkBF;EACvB,KAAKG,aAAa;CACpB;;;;;;;;CAQAZ,UAAUzB,QAA+D;EACvE,KAAKmC,SAASV,UAAUzB,MAAM;CAChC;;;;;;;;CAQA6B,YAAYxC,UAAgD;EAC1D,KAAK8C,SAASN,YAAYxC,QAAQ;CACpC;;;;;;;CAQAiD,cAAcC,YAA8B;EAK1C,KAAKJ,SAAS/B,IAAImC,aAAaA;CACjC;;;;;;;;CASA,IAAIpB,qBAA8B;EAChC,OAAO,KAAKgB,SAAShB;CACvB;;CAGAqB,YAAkB;EAChB,KAAKH,aAAa;CACpB;AACF;;;;;;;;;;;;;ACpNA,MAAaK,eAAgDD,kBAC3D,gCACA,IAAIE,QAAgC,CACtC;AACA,MAAaC,aAAuCH,kBAAkB,8BAAc,IAAII,IAAyB,CAAC;AAElH,SAAgBC,iBAAiBC,WAAmBC,QAA2B;CAC7EJ,WAAWK,IAAIF,WAAWC,MAAM;AAClC;AACA,SAAgBE,mBAAmBH,WAAyB;CAC1DH,WAAWO,OAAOJ,SAAS;AAC7B;AACA,SAAgBK,iBAAiBL,WAA4C;CAC3E,OAAOH,WAAWS,IAAIN,SAAS;AACjC;;;;;;;;;;AAWA,SAAgBO,iBAAiBC,SAAuCP,QAA2B;CACjGN,aAAaO,IAAIM,SAASP,MAAM;AAClC;;;;;;;;;AAUA,SAAgBQ,iBAAuBD,SAAsE;CAC3G,OAAOb,aAAaW,IAAIE,OAAO;AACjC;;;ACxDA,MAAaU,mBAA2DR,eACtE,oBACAS,OAAO,kBAAkB,CAC3B;;;;;;;;;;;;;;AAeA,MAAaC,WACX,OAAOC,iBAAiB,cAAcA,eAAgBC;AACxD,SAAgBC,YAAeC,OAAqBC,SAAoBC,UAAwC;CAC9GF,MAAMG,UAAUF,QAAQG,UAAU,CAAC;CAEnCH,QAAQI,MACLC,QAAmC;EAClC,MAAMC,WAAW;IACdpB,aAAa;GACdqB,SAASR,MAAMQ;GACfC,UAAUH,IAAIG;GACdC,SAASJ,IAAII;EACf;EACAR,SAASS,QAAQJ,QAAQ;CAC3B,IACCK,UAA2C;EAC1C,IAAIC,MAAMD,KAAK,GACbZ,MAAMG,UAAUH,MAAMc,IAAIC,MAAM;EAElC,IAAI,CAACH,SAAS,EAAEA,iBAAiBd,QAC/B,IAAI;GACF,MAAM,IAAIA,MAAMc,QAAQA,QAAQ,wCAAwC;EAC1E,SAASI,GAAY;GACnB,IAAIJ,SAAS,OAAOA,UAAU,UAAU;IACtCK,OAAOC,OAAOF,GAAYJ,KAAK;IAC9BI,EAAsCG,UACpCP,MAAgBO,WAAW;GAChC;GACAP,QAAQI;EACV;EAGFJ,MAAMzB,cAAc;EACpByB,MAAMJ,UAAUR,MAAMQ;EACtBI,MAAMH,WAAWT,MAAMoB,YAAY;EACnCR,MAAMA,QAAQA,MAAMA,SAASA,MAAMO;EAEnCjB,SAASmB,OAAOT,KAAK;CACvB,CACF;CACA,OAAOV,SAASoB;AAClB;AAEA,SAAST,MAASP,KAAsE;CACtF,OAAOA,OAAQA,IAAkCnB,gBAAgB;AACnE;AAEA,SAASoC,UAAavB,OAAqBU,SAAoBc,SAAyC;CACtG,IAAIX,MAAMH,OAAO,GACf,OAAOA;CAGT,IAAIc,SACF,OAAO;GACJrC,aAAa;EACdqB,SAASR,MAAMQ;EACfC,UAAUT,MAAMoB,YAAY;EAC5BR,OAAOF;CACT;CAGF,OAAO;GACJvB,aAAa;EACdqB,SAASR,MAAMQ;EACfC,UAAUT,MAAMoB,YAAY;EACnBV;CACX;AACF;;;;;;;;;;;;;;;AAuDA,SAAgBe,cAAcC,QAA+B;CAC3D,MAAMd,QAAQ,IAAIhB,SAAS8B,UAAU,+BAA+B,YAAY;CAShF,IAAId,MAAMe,SAAS,cAChBf,MAAsCe,OAAO;CAEhD,OAAOf;AACT;AAEA,SAAgBgB,cACd5B,OACAC,SACAC,UACW;CACXD,QAAQI,MACLK,YAA2C;EAC1C,IAAIV,MAAM6B,WAAWC,OAAOC,SAAS;GAEnC7B,SAASmB,OAAOI,cAAczB,MAAM6B,WAAWC,OAAOJ,MAAgB,CAAC;GACvE;EACF;EACA,IAAIb,MAAMH,OAAO,GAAG;GAClBV,MAAMG,UAAUH,MAAMc,IAAIC,MAAM;GAChCL,UAAUA,QAAQA;EACpB;EACA,MAAMH,WAAW;IACdpB,aAAa;GACdqB,SAASR,MAAMQ;GACfC,UAAUT,MAAMoB,YAAY;GAC5BV;EACF;EACAR,SAASS,QAAQJ,QAAQ;CAC3B,IACCK,UAA2C;EAC1C,IAAIC,MAAMD,KAAK,GACbZ,MAAMG,UAAUH,MAAMc,IAAIC,MAAM;EAElC,IAAI,CAACH,SAAS,EAAEA,iBAAiBd,QAC/B,IAAI;GACF,MAAM,IAAIA,MAAMc,QAAQA,QAAQ,wCAAwC;EAC1E,SAASI,GAAY;GACnB,IAAIJ,SAAS,OAAOA,UAAU,UAAU;IACtCK,OAAOC,OAAOF,GAAYJ,KAAK;IAC9BI,EAAsCG,UACpCP,MAAgBO,WAAW;GAChC;GACAP,QAAQI;EACV;EAGFJ,MAAMzB,cAAc;EACpByB,MAAMJ,UAAUR,MAAMQ;EACtBI,MAAMH,WAAWT,MAAMoB,YAAY;EACnCR,MAAMA,QAAQA,MAAMA,SAASA,MAAMO;EACnCjB,SAASmB,OAAOT,KAAK;CACvB,CACF;CACA,OAAOV,SAASoB;AAClB;AAEA,SAASU,eAAeC,SAAqDC,OAAwB;CACnG,OAAOA,UAAU,KAAKC,QAAQF,QAAQvC,iBAAiB;AACzD;AAEA,SAAgB0C,mBACdC,OACA7B,SACA8B,GACAxB,KACW;CAOX,MAAMd,QAAQ,IAAIX,aAAamB,SAASM,KAAKwB,MAAM,CAAC;CAEpD,SAASC,KAAKC,GAA2B;EACvCxC,MAAMyC;EACN,OAAOL,mBAAmBC,OAAOG,GAAGF,IAAI,GAAGxB,GAAG;CAChD;CAEA,MAAM4B,kBAAkBV,eAAeK,MAAMC,IAAIA,CAAC;CAClD,MAAMK,UAAU,IAAIvD,QAAQY,OAAO0C,eAAe;CAClD,IAAIE;CACJ,IAAI;EACFA,UAAUP,MAAMC,EAAE,CAAC9B,QAAWmC,SAASJ,IAAI;EAC3C,IAAIG,iBACFC,QAAQE,UAAU;EAEpB,IAAI,CAAC,CAACD,WAAWF,iBACf;OAAI,EAAEE,mBAAmBE,UAAU;IACjCrD,iBAAiBO,MAAM+C,WAAW;KAAEvB,SAAS;KAAOwB,QAAQzB,UAAUvB,OAAO4C,SAAS,KAAK;IAAE,CAAC;IAC9FA,UAAUE,QAAQnC,QAAQiC,OAAO;GACnC;;CAWJ,SAAS5B,GAAG;EACV,IAAI0B,iBACFjD,iBAAiBO,MAAM+C,WAAW;GAAEvB,SAAS;GAAMwB,QAAQzB,UAAUvB,OAAOgB,GAAG,IAAI;EAAE,CAAC;EAGxF4B,UAAUE,QAAQzB,OAAkCL,CAAC;CACvD;CACA,MAAMiC,SAAS1D,aAAgBS,KAAK;CAEpC,IAAIR,SAAYoD,OAAO,GACrB,OAAO7C,YAAYC,OAAO4C,SAASK,MAAM;CAG3C,OAAOrB,cAAc5B,OAAO4C,SAASK,MAAM;AAC7C;;;ACtRA,SAAgBG,SAAYC,OAAoC;CAC9D,OAAOC,QAAQD,SAASA,iBAAiBE,WAAYF,MAAoBH,eAAe,IAAI;AAC9F;;;;;;;;;;AAWA,SAAgBM,iBAAiC;CAC/C,IAAIC;CACJ,IAAIC;CACJ,MAAMC,UAAU,IAAIJ,SAAYK,KAAKC,QAAQ;EAC3CJ,UAAUG;EACVF,SAASG;CACX,CAAC;CACD,OAAO;EAAEJ;EAASC;EAAQC;CAAQ;AACpC;AAEA,SAAgBG,eAAkBH,SAAyCI,QAA8B;CACtGJ,QAAsBT,aAAa;CAEnCS,QAAsBK,YAAYD,OAAOC;CAEzCL,QAAsBM,QAAQF,OAAOE;CAErCN,QAAsBO,aAAaH,OAAOG;CAC1CP,QAAsBQ,KAAKJ,OAAOI;CAClCR,QAAsBS,MAAML,OAAOK;CACnCT,QAAsBU,YAAYN,OAAOM;CAa1C,OAAOV;AACT;AAEA,SAAgBW,aAAgBC,OAAwC;CACtE,MAAMC,WAAWhB,eAAkB;CACnC,IAAI,EAAEG,YAAYa;CAClB,IAAIC;CACJd,UAAUA,QAAQe,cAAc;EAC9BH,MAAMI,cAAc;EACpB,IAAIF,KACFA,IAAIG,SAASC,OAAOA,GAAG,CAAC;CAE5B,CAAC;CACDlB,QAAQO,cAAcY,OAAmB;EACvCL,MAAMA,OAAO,CAAA;EACbA,IAAIM,KAAKD,EAAE;CACb;CACAnB,QAAQT,aAAa;CACrBS,QAAQK,kBAAkB;EACxB,OAAOO,MAAMP,UAAU;CACzB;CACAL,QAAQM,SAASe,WAAoB;EACnCT,MAAMN,MAAMd,cAAc6B,MAAM,CAAC;CACnC;CACArB,QAAQQ,KAAKI,MAAMU;CACnBtB,QAAQS,MAAMG,MAAMW,IAAIC;CACxBxB,QAAQU,YAAYE,MAAMW,IAAIb;CAa9BG,SAASb,UAAUA;CACnB,OAAOa;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1CA,SAAgBe,iBAAoBC,KAGlC;CACA,OAAOA;AAGT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,SAAgBC,qBAMdD,KAIA;CACA,OAAOA;AAGT;;;;;;AAOA,MAAaE,YAAqCH"}
|
|
1
|
+
{"version":3,"file":"request-edWLn9JK.js","names":["SkipCache","deepFreeze","createDeferred","upgradeHeaders","headers","clone","Headers","toJSON","Array","from","cloneResponseProperties","response","ok","redirected","status","statusText","type","url","ContextOwner","hasSetStream","hasSetResponse","hasSubscribers","stream","nextCalled","constructor","request","god","isRoot","requestId","id","controller","promise","sizeHint","signal","addEventListener","abort","reason","enhancedRequest","Object","assign","then","hasRequestedStream","getResponse","getStream","hint","get","parseInt","setStream","Promise","resolve","resolveStream","setResponse","Response","responseData","Context","owner","isCacheHandler","___owner","_isCacheHandler","_finalized","setIdentifier","identifier","_finalize","getOrSetUniversal","PromiseCache","WeakMap","RequestMap","Map","setRequestResult","requestId","result","set","clearRequestResult","delete","getRequestResult","get","setPromiseResult","promise","getPromiseResult","getOrSetGlobal","STRUCTURED","Context","ContextOwner","assertValidRequest","createFuture","isFuture","setRequestResult","IS_CACHE_HANDLER","Symbol","DOMError","DOMException","Error","curryFuture","owner","inbound","outbound","setStream","getStream","then","doc","document","request","response","content","resolve","error","isDoc","god","stream","e","Object","assign","message","getResponse","reject","promise","ensureDoc","isError","enhanceReason","reason","name","handleOutcome","controller","signal","aborted","isCacheHandler","handler","index","Boolean","executeNextHandler","wares","i","next","r","nextCalled","_isCacheHandler","context","outcome","_finalize","Promise","requestId","result","future","IS_FUTURE","enhanceReason","isFuture","maybe","Boolean","Promise","createDeferred","resolve","reject","promise","res","rej","upgradePromise","future","getStream","abort","onFinalize","id","lid","requester","createFuture","owner","deferred","cbs","finally","resolveStream","forEach","cb","fn","push","reason","requestId","god","identifier","createDeferred","setPromiseResult","getPromiseResult","withResponseType","obj","withReactiveResponse","withBrand"],"sources":["../../../src/request/-private/context.ts","../../../src/request/-private/promise-cache.ts","../../../src/request/-private/utils.ts","../../../src/request/-private/future.ts","../../../src/request.ts"],"sourcesContent":["import { DEBUG } from '@warp-drive-mirror/core/build-config/env';\nimport { assert } from '@warp-drive-mirror/core/build-config/macros';\n\nimport type { RequestKey } from '../../types/identifier';\nimport type { ImmutableHeaders, ImmutableRequestInfo, RequestInfo, ResponseInfo } from '../../types/request';\nimport { SkipCache } from '../../types/request';\nimport { deepFreeze } from './debug';\nimport { createDeferred } from './future';\nimport type { DeferredStream, GodContext } from './types';\n\nexport function upgradeHeaders(headers: Headers | ImmutableHeaders): ImmutableHeaders {\n (headers as ImmutableHeaders).clone = () => {\n return new Headers(headers);\n };\n (headers as ImmutableHeaders).toJSON = () => {\n return Array.from(headers as unknown as Iterable<[string, string]>);\n };\n return headers as ImmutableHeaders;\n}\n\nexport function cloneResponseProperties(response: Response): ResponseInfo {\n const { headers, ok, redirected, status, statusText, type, url } = response;\n upgradeHeaders(headers);\n return {\n headers: headers as ImmutableHeaders,\n ok,\n redirected,\n status,\n statusText,\n type,\n url,\n };\n}\n\nexport class ContextOwner {\n hasSetStream = false;\n hasSetResponse = false;\n hasSubscribers = false;\n stream: DeferredStream = createDeferred<ReadableStream | null>();\n response: ResponseInfo | null = null;\n declare request: ImmutableRequestInfo;\n declare enhancedRequest: ImmutableRequestInfo;\n nextCalled = 0;\n declare god: GodContext;\n declare controller: AbortController;\n declare requestId: number;\n declare isRoot: boolean;\n\n constructor(request: RequestInfo, god: GodContext, isRoot = false) {\n this.isRoot = isRoot;\n this.requestId = god.id;\n this.controller = request.controller || god.controller;\n this.stream.promise.sizeHint = 0;\n\n if (request.controller) {\n if (request.controller !== god.controller) {\n god.controller.signal.addEventListener('abort', () => {\n this.controller.abort(god.controller.signal.reason);\n });\n }\n delete request.controller;\n }\n let enhancedRequest: ImmutableRequestInfo = Object.assign(\n { signal: this.controller.signal },\n request\n ) as ImmutableRequestInfo;\n if (DEBUG) {\n if (!request?.cacheOptions?.[SkipCache]) {\n request = deepFreeze(request);\n enhancedRequest = deepFreeze(enhancedRequest);\n }\n } else {\n if (request.headers) {\n upgradeHeaders(request.headers);\n }\n }\n this.enhancedRequest = enhancedRequest;\n this.request = request as ImmutableRequestInfo;\n this.god = god;\n this.stream.promise = this.stream.promise.then((stream: ReadableStream | null) => {\n if (this.god.stream === stream && this.hasSubscribers) {\n this.god.stream = null;\n }\n return stream;\n });\n }\n\n get hasRequestedStream(): boolean {\n return this.god.hasRequestedStream;\n }\n\n getResponse(): ResponseInfo | null {\n if (this.hasSetResponse) {\n return this.response;\n }\n if (this.nextCalled === 1) {\n return this.god.response;\n }\n return null;\n }\n getStream(): Promise<ReadableStream | null> {\n if (this.isRoot) {\n this.god.hasRequestedStream = true;\n }\n if (!this.hasSetResponse) {\n const hint = this.god.response?.headers?.get('content-length');\n this.stream.promise.sizeHint = hint ? parseInt(hint, 10) : 0;\n }\n this.hasSubscribers = true;\n return this.stream.promise;\n }\n abort(reason: DOMException): void {\n this.controller.abort(reason);\n }\n\n setStream(stream: ReadableStream | Promise<ReadableStream | null> | null): void {\n if (!this.hasSetStream) {\n this.hasSetStream = true;\n\n if (!(stream instanceof Promise)) {\n this.god.stream = stream;\n }\n // @ts-expect-error\n this.stream.resolve(stream);\n }\n }\n\n resolveStream(): void {\n this.setStream(this.nextCalled === 1 ? this.god.stream : null);\n }\n\n setResponse(response: ResponseInfo | Response | null): void {\n if (this.hasSetResponse) {\n if (DEBUG) {\n throw new Error(`Cannot setResponse when a response has already been set`);\n }\n return;\n }\n this.hasSetResponse = true;\n if (response instanceof Response) {\n // TODO potentially avoid cloning in prod\n let responseData = cloneResponseProperties(response);\n\n if (DEBUG) {\n responseData = deepFreeze(responseData);\n }\n this.response = responseData;\n this.god.response = responseData;\n const sizeHint = response.headers?.get('content-length');\n this.stream.promise.sizeHint = sizeHint ? parseInt(sizeHint, 10) : 0;\n } else {\n this.response = response;\n this.god.response = response;\n }\n }\n}\n\n/**\n * The context object given to each {@link Handler} (or {@link CacheHandler})\n * as it processes a request. It exposes the (immutable, enhanced) request\n * along with the methods a handler uses to build up the {@link Future} and\n * {@link StructuredDataDocument} that will ultimately be returned by the\n * {@link RequestManager}.\n *\n * @summary The per-request object passed to each handler, exposing the immutable request plus methods to\n * set the response, stream, and request key.\n * @public\n */\nexport class Context {\n /** @internal */\n declare private ___owner: ContextOwner;\n /**\n * A readonly, immutable version of the request being handled, including\n * any defaults or enhancements applied by the {@link RequestManager}.\n *\n * @public\n */\n declare request: ImmutableRequestInfo;\n /**\n * The id of this request as assigned by the {@link RequestManager}. Not\n * unique across manager instances.\n *\n * @public\n */\n declare id: number;\n /** @internal */\n declare private _isCacheHandler: boolean;\n /** @internal */\n declare private _finalized: boolean;\n\n constructor(owner: ContextOwner, isCacheHandler: boolean) {\n this.id = owner.requestId;\n this.___owner = owner;\n this.request = owner.enhancedRequest;\n this._isCacheHandler = isCacheHandler;\n this._finalized = false;\n }\n /**\n * Set the response stream for this request. May be called at most once,\n * and may be called at any point up until the handler's `request` method\n * resolves.\n *\n * @public\n */\n setStream(stream: ReadableStream | Promise<ReadableStream | null>): void {\n this.___owner.setStream(stream);\n }\n /**\n * Set the {@link ResponseInfo} (or raw `Response`) associated with this\n * request. Used to populate the response information available on the\n * resulting {@link StructuredDataDocument}.\n *\n * @public\n */\n setResponse(response: ResponseInfo | Response | null): void {\n this.___owner.setResponse(response);\n }\n\n /**\n * Associate a {@link RequestKey} with this request. May only be called\n * synchronously from a {@link CacheHandler}.\n *\n * @public\n */\n setIdentifier(identifier: RequestKey): void {\n assert(\n `setIdentifier may only be used synchronously from a CacheHandler`,\n identifier && this._isCacheHandler && !this._finalized\n );\n this.___owner.god.identifier = identifier;\n }\n\n /**\n * Whether the application (or a downstream handler) has requested access\n * to the response stream via {@link Future.getStream}. Handlers can use\n * this to avoid the cost of streaming when nothing will consume it.\n *\n * @public\n */\n get hasRequestedStream(): boolean {\n return this.___owner.hasRequestedStream;\n }\n\n /** @private */\n _finalize(): void {\n this._finalized = true;\n }\n}\nexport type HandlerRequestContext = Context;\n","import { getOrSetUniversal } from '../../types/-private';\n\nexport type CacheResult<T = unknown, E = unknown> = { isError: true; result: E } | { isError: false; result: T };\n\n/**\n * The minimal, structural subset of the `Promise` interface required to be\n * cached and inspected by {@link setPromiseResult} / {@link getPromiseResult}\n * (and by `getPromiseState`). Anything that is at least `then`/`catch`/`finally`\n * \"shaped\" (including a real `Promise` or {@link Future}) satisfies this.\n *\n * @summary Any promise-like value with `then`, `catch`, and `finally`, as accepted by the promise-result\n * cache and `getPromiseState`.\n * @public\n */\nexport type Awaitable<T = unknown, E = unknown> = {\n /**\n * Registers fulfillment/rejection handlers, `Promise.prototype.then`-style.\n *\n * @public\n */\n then: (onFulfilled: (value: T) => unknown, onRejected: (reason: E) => unknown) => unknown;\n /**\n * Registers a rejection handler, `Promise.prototype.catch`-style.\n *\n * @public\n */\n catch: (onRejected: (reason: E) => unknown) => unknown;\n /**\n * Registers a handler run on settlement, `Promise.prototype.finally`-style.\n *\n * @public\n */\n finally: (onFinally: () => unknown) => unknown;\n};\n\nexport const PromiseCache: WeakMap<Awaitable, CacheResult> = getOrSetUniversal(\n 'PromiseCache',\n new WeakMap<Awaitable, CacheResult>()\n);\nexport const RequestMap: Map<number, CacheResult> = getOrSetUniversal('RequestMap', new Map<number, CacheResult>());\n\nexport function setRequestResult(requestId: number, result: CacheResult): void {\n RequestMap.set(requestId, result);\n}\nexport function clearRequestResult(requestId: number): void {\n RequestMap.delete(requestId);\n}\nexport function getRequestResult(requestId: number): CacheResult | undefined {\n return RequestMap.get(requestId);\n}\n\n/**\n * Cache the settled result (or error) of a promise-like value so that its\n * outcome can be synchronously read later via {@link getPromiseResult},\n * without needing to await it again.\n *\n * @summary Records a promise's settled value or error so it can later be read synchronously with\n * `getPromiseResult`.\n * @public\n */\nexport function setPromiseResult(promise: Promise<unknown> | Awaitable, result: CacheResult): void {\n PromiseCache.set(promise, result);\n}\n\n/**\n * Synchronously read the settled result (or error) previously recorded for\n * a promise-like value via {@link setPromiseResult}, if any.\n *\n * @summary Synchronously returns the settled value or error previously recorded for a promise, or\n * `undefined` if none was recorded.\n * @public\n */\nexport function getPromiseResult<T, E>(promise: Promise<T> | Awaitable<T, E>): CacheResult<T, E> | undefined {\n return PromiseCache.get(promise) as CacheResult<T, E> | undefined;\n}\n","import { DEBUG } from '@warp-drive-mirror/core/build-config/env';\n\nimport { getOrSetGlobal } from '../../types/-private';\nimport type {\n RequestInfo,\n StructuredDataDocument,\n StructuredDocument,\n StructuredErrorDocument,\n} from '../../types/request';\nimport { STRUCTURED } from '../../types/request';\nimport { Context, ContextOwner } from './context';\nimport { assertValidRequest } from './debug';\n// oxlint-disable-next-line no-unused-vars\nimport type { Fetch } from './fetch.ts';\nimport { createFuture, isFuture } from './future';\nimport { setRequestResult } from './promise-cache';\nimport type { DeferredFuture, Future, GodContext, Handler } from './types';\n\nexport const IS_CACHE_HANDLER: '___(unique) Symbol(IS_CACHE_HANDLER)' = getOrSetGlobal(\n 'IS_CACHE_HANDLER',\n Symbol('IS_CACHE_HANDLER')\n);\n\n/**\n * A ponyfill for the global {@link DOMException} constructor.\n *\n * Some non-DOM environments (e.g. React Native, some Node/worker\n * environments) don't provide `DOMException` as a global, which would\n * otherwise throw a `ReferenceError` the first time any code referenced it\n * (for instance when classifying an abort/network error). `DOMError` falls\n * back to the global {@link Error} constructor in that case so callers can\n * uniformly use `new DOMError(...)` / `error instanceof DOMError` without\n * guarding for the global's presence themselves.\n *\n * @internal\n */\nexport const DOMError: typeof DOMException =\n typeof DOMException !== 'undefined' ? DOMException : (Error as unknown as typeof DOMException);\nexport function curryFuture<T>(owner: ContextOwner, inbound: Future<T>, outbound: DeferredFuture<T>): Future<T> {\n owner.setStream(inbound.getStream());\n\n inbound.then(\n (doc: StructuredDataDocument<T>) => {\n const document = {\n [STRUCTURED]: true as const,\n request: owner.request,\n response: doc.response,\n content: doc.content,\n };\n outbound.resolve(document);\n },\n (error: Error & StructuredErrorDocument) => {\n if (isDoc(error)) {\n owner.setStream(owner.god.stream);\n }\n if (!error || !(error instanceof Error)) {\n try {\n throw new Error(error ? error : `Request Rejected with an Unknown Error`);\n } catch (e: unknown) {\n if (error && typeof error === 'object') {\n Object.assign(e as Error, error);\n (e as Error & StructuredErrorDocument).message =\n (error as Error).message || `Request Rejected with an Unknown Error`;\n }\n error = e as Error & StructuredErrorDocument;\n }\n }\n\n error[STRUCTURED] = true;\n error.request = owner.request;\n error.response = owner.getResponse();\n error.error = error.error || error.message;\n\n outbound.reject(error);\n }\n );\n return outbound.promise;\n}\n\nfunction isDoc<T>(doc: T | StructuredDataDocument<T>): doc is StructuredDataDocument<T> {\n return doc && (doc as StructuredDataDocument<T>)[STRUCTURED] === true;\n}\n\nfunction ensureDoc<T>(owner: ContextOwner, content: T | Error, isError: boolean): StructuredDocument<T> {\n if (isDoc(content)) {\n return content as StructuredDocument<T>;\n }\n\n if (isError) {\n return {\n [STRUCTURED]: true,\n request: owner.request,\n response: owner.getResponse(),\n error: content as Error,\n } as StructuredErrorDocument<T>;\n }\n\n return {\n [STRUCTURED]: true,\n request: owner.request,\n response: owner.getResponse(),\n content: content as T,\n };\n}\n\n/**\n * Additional properties exposed on errors thrown by the\n * {@link Fetch | Fetch Handler}.\n *\n * In the case of an Abort or system/browser level issue,\n * this extends {@link DOMException}.\n *\n * Else it extends from {@link AggregateError} if the\n * response includes an array of errors, falling back\n * to {@link Error} as its base.\n *\n * @summary The shape of errors thrown by the Fetch handler for failed, aborted, or network-errored\n * requests, carrying the HTTP `status` and `statusText`.\n */\nexport interface FetchError extends DOMException {\n /**\n * Alias for {@link FetchError.status | status}.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status)\n */\n code: number;\n /**\n * The name associated to the {@link FetchError.status | status code}.\n *\n * Typically this will be of the formula `StatusTextError` for instance\n * a 404 status with status text of `Not Found` would have the name\n * `NotFoundError`.\n */\n name: string;\n /**\n * The http status code associated to the returned error.\n *\n * Browser/System level network errors will often have an error code of `0` or `5`.\n * Aborted requests will have an error code of `20`.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/status)\n */\n status: number;\n /**\n * The Status Text associated to the {@link FetchError.status | status code}\n * for the error.\n *\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Response/statusText)\n *\n */\n statusText: string;\n /**\n * A property signifying that an Error uses the {@link FetchError}\n * interface.\n */\n isRequestError: true;\n}\n\nexport function enhanceReason(reason?: string): DOMException {\n const error = new DOMError(reason || 'The user aborted a request.', 'AbortError');\n // `DOMError` may be the `Error` constructor as a fallback, whose\n // constructor doesn't accept a `name`, so set it explicitly in that case.\n // We can't unconditionally assign `error.name` here: when `DOMError` is\n // the real `DOMException`, `name` is already `'AbortError'` (set by its\n // constructor) *and* `DOMException.prototype.name` is a getter-only\n // accessor with no setter, so reassigning it throws a `TypeError` in\n // strict-mode JS (which is how our ES modules run) - even when assigning\n // the very same value it already holds.\n if (error.name !== 'AbortError') {\n (error as unknown as { name: string }).name = 'AbortError';\n }\n return error;\n}\n\nexport function handleOutcome<T>(\n owner: ContextOwner,\n inbound: Promise<T | StructuredDataDocument<T>>,\n outbound: DeferredFuture<T>\n): Future<T> {\n inbound.then(\n (content: T | StructuredDataDocument<T>) => {\n if (owner.controller.signal.aborted) {\n // the next function did not respect the signal, we handle it here\n outbound.reject(enhanceReason(owner.controller.signal.reason as string));\n return;\n }\n if (isDoc(content)) {\n owner.setStream(owner.god.stream);\n content = content.content;\n }\n const document = {\n [STRUCTURED]: true as const,\n request: owner.request,\n response: owner.getResponse(),\n content,\n };\n outbound.resolve(document);\n },\n (error: Error & StructuredErrorDocument) => {\n if (isDoc(error)) {\n owner.setStream(owner.god.stream);\n }\n if (!error || !(error instanceof Error)) {\n try {\n throw new Error(error ? error : `Request Rejected with an Unknown Error`);\n } catch (e: unknown) {\n if (error && typeof error === 'object') {\n Object.assign(e as Error, error);\n (e as Error & StructuredErrorDocument).message =\n (error as Error).message || `Request Rejected with an Unknown Error`;\n }\n error = e as Error & StructuredErrorDocument;\n }\n }\n\n error[STRUCTURED] = true;\n error.request = owner.request;\n error.response = owner.getResponse();\n error.error = error.error || error.message;\n outbound.reject(error);\n }\n );\n return outbound.promise;\n}\n\nfunction isCacheHandler(handler: Handler & { [IS_CACHE_HANDLER]?: boolean }, index: number): boolean {\n return index === 0 && Boolean(handler[IS_CACHE_HANDLER]);\n}\n\nexport function executeNextHandler<T>(\n wares: Readonly<Handler[]>,\n request: RequestInfo,\n i: number,\n god: GodContext\n): Future<T> {\n if (DEBUG) {\n if (i === wares.length) {\n throw new Error(`No handler was able to handle this request.`);\n }\n assertValidRequest(request, false);\n }\n const owner = new ContextOwner(request, god, i === 0);\n\n function next(r: RequestInfo): Future<T> {\n owner.nextCalled++;\n return executeNextHandler(wares, r, i + 1, god);\n }\n\n const _isCacheHandler = isCacheHandler(wares[i], i);\n const context = new Context(owner, _isCacheHandler);\n let outcome: Promise<T | StructuredDataDocument<T>> | Future<T>;\n try {\n outcome = wares[i].request<T>(context, next);\n if (_isCacheHandler) {\n context._finalize();\n }\n if (!!outcome && _isCacheHandler) {\n if (!(outcome instanceof Promise)) {\n setRequestResult(owner.requestId, { isError: false, result: ensureDoc(owner, outcome, false) });\n outcome = Promise.resolve(outcome);\n }\n } else if (DEBUG) {\n if (!outcome || (!(outcome instanceof Promise) && !(typeof outcome === 'object' && 'then' in outcome))) {\n // oxlint-disable-next-line no-console\n console.log({ request, handler: wares[i], outcome });\n if (outcome === undefined) {\n throw new Error(`Expected handler.request to return a promise, instead received undefined.`);\n }\n throw new Error(`Expected handler.request to return a promise, instead received a synchronous value.`);\n }\n }\n } catch (e) {\n if (_isCacheHandler) {\n setRequestResult(owner.requestId, { isError: true, result: ensureDoc(owner, e, true) });\n }\n // oxlint-disable-next-line typescript/prefer-promise-reject-errors\n outcome = Promise.reject<StructuredDataDocument<T>>(e);\n }\n const future = createFuture<T>(owner);\n\n if (isFuture<T>(outcome)) {\n return curryFuture(owner, outcome, future);\n }\n\n return handleOutcome(owner, outcome, future);\n}\n","import { DEBUG } from '@warp-drive-mirror/build-config/env';\n\nimport { IS_FUTURE, type StructuredDocument } from '../../types/request';\nimport type { ContextOwner } from './context';\nimport type { Deferred, DeferredFuture, Future } from './types';\nimport { enhanceReason } from './utils';\n\nexport function isFuture<T>(maybe: unknown): maybe is Future<T> {\n return Boolean(maybe && maybe instanceof Promise && (maybe as Future<T>)[IS_FUTURE] === true);\n}\n\n/**\n * Create a {@link Deferred}: a promise along with the `resolve`/`reject`\n * callbacks that settle it, so the promise can be handed out before the\n * work that will settle it has started.\n *\n * @summary Creates a promise together with its `resolve` and `reject` callbacks so it can be handed out\n * before it is settled.\n * @public\n */\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (v: T) => void;\n let reject!: (v: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { resolve, reject, promise };\n}\n\nexport function upgradePromise<T>(promise: Promise<StructuredDocument<T>>, future: Future<T>): Future<T> {\n (promise as Future<T>)[IS_FUTURE] = true;\n // oxlint-disable-next-line typescript/unbound-method\n (promise as Future<T>).getStream = future.getStream;\n // oxlint-disable-next-line typescript/unbound-method\n (promise as Future<T>).abort = future.abort;\n // oxlint-disable-next-line typescript/unbound-method\n (promise as Future<T>).onFinalize = future.onFinalize;\n (promise as Future<T>).id = future.id;\n (promise as Future<T>).lid = future.lid;\n (promise as Future<T>).requester = future.requester;\n\n if (DEBUG) {\n // @ts-expect-error\n promise.toJSON = () => {\n const id = 'Future<' + (promise as Future<T>).id + '>';\n if ((promise as Future<T>).lid) {\n return `${id} (${(promise as Future<T>).lid!.lid})`;\n }\n return id;\n };\n }\n\n return promise as Future<T>;\n}\n\nexport function createFuture<T>(owner: ContextOwner): DeferredFuture<T> {\n const deferred = createDeferred<T>() as unknown as DeferredFuture<T>;\n let { promise } = deferred;\n let cbs: Array<() => void> | undefined;\n promise = promise.finally(() => {\n owner.resolveStream();\n if (cbs) {\n cbs.forEach((cb) => cb());\n }\n }) as Future<T>;\n promise.onFinalize = (fn: () => void) => {\n cbs = cbs || [];\n cbs.push(fn);\n };\n promise[IS_FUTURE] = true;\n promise.getStream = () => {\n return owner.getStream();\n };\n promise.abort = (reason?: string) => {\n owner.abort(enhanceReason(reason));\n };\n promise.id = owner.requestId;\n promise.lid = owner.god.identifier;\n promise.requester = owner.god.requester;\n\n if (DEBUG) {\n // @ts-expect-error\n promise.toJSON = () => {\n const id = 'Future<' + promise.id + '>';\n if (promise.lid) {\n return `${id} (${promise.lid.lid})`;\n }\n return id;\n };\n }\n\n deferred.promise = promise;\n return deferred;\n}\n","/**\n * The [Making Requests](/guides/the-manual/requests/) guide teaches the request layer\n * these types and helpers belong to.\n *\n * @module\n * @summary Request-layer types such as `Future`, `Handler` and `Context`, plus `withResponseType` and\n * `withReactiveResponse` for typing the response a request resolves with.\n */\n\nimport type { ReactiveDataDocument } from './reactive.ts';\nimport type { RequestInfo } from './types/request.ts';\nimport type { Meta } from './types/spec/json-api-raw.ts';\nimport type { RequestSignature } from './types/symbols.ts';\n\nexport { createDeferred } from './request/-private/future.ts';\nexport type {\n Future,\n Handler,\n CacheHandler,\n NextFn,\n Deferred,\n ManagedRequestPriority,\n} from './request/-private/types.ts';\nexport { setPromiseResult, getPromiseResult } from './request/-private/promise-cache.ts';\nexport type { Awaitable } from './request/-private/promise-cache.ts';\nexport type { Context } from './request/-private/context.ts';\n\n/**\n * Brands the supplied object with the supplied response type.\n *\n * Call it inside a [builder](/guides/the-manual/requests/builders), so the type is part of\n * the builder's contract and every caller gets it through inference. Calling it inline\n * where the request is made is a cast. The [Typing Requests](/guides/the-manual/requests/typing-requests)\n * guide shows how to use it.\n *\n * ```ts\n * import type { ReactiveDataDocument } from '@warp-drive-mirror/core/reactive';\n * import { withResponseType } from '@warp-drive-mirror/core/request';\n * import type { User } from '#/data/user.ts'\n *\n * export function getUser(id: string) {\n * return withResponseType<ReactiveDataDocument<User>>({ url: `/users/${id}` });\n * }\n *\n * const result = await store.request(getUser('1'));\n *\n * result.content.data; // will have type User\n * ```\n *\n * @summary Types a request object with the response type that `store.request` or `RequestManager.request`\n * should resolve with; no runtime effect.\n */\nexport function withResponseType<T>(obj: RequestInfo): RequestInfo<T> & {\n /** The branded response type. Present only at the type level; carries no runtime value. */\n [RequestSignature]: T;\n} {\n return obj as RequestInfo<T> & {\n [RequestSignature]: T;\n };\n}\n\n/**\n * Brands the supplied object with the supplied response type\n * wrapped in {@link ReactiveDataDocument}. This is a convenience for\n * the common case of using {@link withResponseType} with `ReactiveDataDocument`.\n *\n * Like `withResponseType`, call it inside a [builder](/guides/the-manual/requests/builders)\n * rather than where the request is made. The\n * [Typing Requests](/guides/the-manual/requests/typing-requests#typing-reactive-responses)\n * guide shows how to use it.\n *\n * ```ts\n * import { withReactiveResponse } from '@warp-drive-mirror/core/request';\n * import type { User } from '#/data/user.ts'\n *\n * export function getUser(id: string) {\n * return withReactiveResponse<User>({ url: `/users/${id}` });\n * }\n *\n * const result = await store.request(getUser('1'));\n *\n * result.content.data; // will have type User\n * ```\n *\n * Pass a second type param to declare the `meta` the endpoint returns:\n *\n * ```ts\n * type PageMeta = { page: { limit: number; offset: number }; total?: number };\n *\n * export function getUsers() {\n * return withReactiveResponse<User[], PageMeta>({ url: '/users' });\n * }\n *\n * const result = await store.request(getUsers());\n *\n * result.content.meta?.total; // number | undefined\n * ```\n *\n * @summary Types a request object so its response resolves as a `ReactiveDataDocument` of the given\n * data and meta types; no runtime effect.\n * @public\n */\nexport function withReactiveResponse<\n T,\n M extends Meta | undefined = Meta | undefined,\n E extends object = object,\n EM extends Meta | undefined = M,\n>(\n obj: RequestInfo\n): RequestInfo<ReactiveDataDocument<T, M, E, EM>> & {\n /** The branded response type. Present only at the type level; carries no runtime value. */\n [RequestSignature]: ReactiveDataDocument<T, M, E, EM>;\n} {\n return obj as RequestInfo<ReactiveDataDocument<T, M, E, EM>> & {\n [RequestSignature]: ReactiveDataDocument<T, M, E, EM>;\n };\n}\n\n/**\n * @summary Deprecated alias for `withResponseType`, which types a request object with its expected\n * response type.\n * @deprecated use {@link withResponseType} instead\n */\nexport const withBrand: typeof withResponseType = withResponseType;\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { f as setPromiseResult, i as createDeferred, n as withReactiveResponse, r as withResponseType, t as withBrand, u as getPromiseResult } from "./request-
|
|
1
|
+
import { f as setPromiseResult, i as createDeferred, n as withReactiveResponse, r as withResponseType, t as withBrand, u as getPromiseResult } from "./request-edWLn9JK.js";
|
|
2
2
|
|
|
3
3
|
export { createDeferred, getPromiseResult, setPromiseResult, withBrand, withReactiveResponse, withResponseType };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { D as notifyInternalSignal, E as makeInitializer, O as peekInternalSignal, P as waitFor, T as getOrCreateInternalSignal, _ as entangleSignal, a as getPaginationState, b as signal, c as getPaginationCache, h as defineSignal, i as getPaginationLinks, k as withSignalStore, l as DISPOSE, m as defineNonEnumerableSignal, n as createPaginationLinksSubscription, o as clearPaginationCache, p as defineGate, r as createPaginationSubscription, s as defaultPageHints, v as gate, y as memoized } from "../-private-
|
|
1
|
+
import { D as notifyInternalSignal, E as makeInitializer, O as peekInternalSignal, P as waitFor, T as getOrCreateInternalSignal, _ as entangleSignal, a as getPaginationState, b as signal, c as getPaginationCache, h as defineSignal, i as getPaginationLinks, k as withSignalStore, l as DISPOSE, m as defineNonEnumerableSignal, n as createPaginationLinksSubscription, o as clearPaginationCache, p as defineGate, r as createPaginationSubscription, s as defaultPageHints, v as gate, y as memoized } from "../-private-Dg07O05r.js";
|
|
2
2
|
|
|
3
3
|
export { DISPOSE, clearPaginationCache, createPaginationLinksSubscription, createPaginationSubscription, defaultPageHints, defineGate, defineNonEnumerableSignal, defineSignal, entangleSignal, gate, getOrCreateInternalSignal, getPaginationCache, getPaginationLinks, getPaginationState, makeInitializer, memoized, notifyInternalSignal, peekInternalSignal, signal, waitFor, withSignalStore };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { A as ARRAY_SIGNAL, C as createInternalMemo, D as notifyInternalSignal, F as willSyncFlushWatchers, O as peekInternalSignal, S as consumeInternalSignal, T as getOrCreateInternalSignal, _ as entangleSignal, f as createSignalDescriptor, g as entangleInitiallyStaleSignal, h as defineSignal, j as OBJECT_SIGNAL, k as withSignalStore, p as defineGate, w as createInternalSignal, x as Signals } from "./-private-CrUi_3E_.js";
|
|
1
|
+
import { A as ARRAY_SIGNAL, C as createInternalMemo, D as notifyInternalSignal, F as willSyncFlushWatchers, O as peekInternalSignal, S as consumeInternalSignal, T as getOrCreateInternalSignal, _ as entangleSignal, f as createSignalDescriptor, g as entangleInitiallyStaleSignal, h as defineSignal, j as OBJECT_SIGNAL, k as withSignalStore, p as defineGate, w as createInternalSignal, x as Signals } from "./-private-Dg07O05r.js";
|
|
3
2
|
import { EnableHydration, STRUCTURED, SkipCache } from "./types/request.js";
|
|
4
|
-
import {
|
|
3
|
+
import { isManyKind, isRelationshipKind, isResourceSchema, isSingleKind } from "./types/schema/fields.js";
|
|
4
|
+
import { a as upgradePromise, c as executeNextHandler, d as getRequestResult, f as setPromiseResult, l as clearRequestResult, o as DOMError, p as cloneResponseProperties, s as IS_CACHE_HANDLER, t as withBrand } from "./request-edWLn9JK.js";
|
|
5
5
|
import { a as SOURCE, i as Destroy, n as Commit, r as Context, t as Checkout } from "./-private-BiuED7nc.js";
|
|
6
|
+
import { getOrSetGlobal, peekTransient, peekUniversalTransient, setTransient, setUniversalTransient } from "./types/-private.js";
|
|
6
7
|
import { CACHE_OWNER } from "./types/identifier.js";
|
|
7
8
|
import { dasherize } from "./utils/string.js";
|
|
8
9
|
import { RecordStore, Type } from "./types/symbols.js";
|
|
9
|
-
import { isResourceSchema } from "./types/schema/fields.js";
|
|
10
10
|
import { t as DefaultCachePolicy } from "./store-Bz9R5hGB.js";
|
|
11
11
|
import { setIsMaybeMirage } from "./types/runtime.js";
|
|
12
12
|
import * as _importSync20 from "@ember/object";
|
|
@@ -1437,15 +1437,26 @@ function _flushNotification(cache, cacheKey, value, key, channels) {
|
|
|
1437
1437
|
}
|
|
1438
1438
|
const callbacks = cache.get(cacheKey);
|
|
1439
1439
|
if (!callbacks || !callbacks.length) return false;
|
|
1440
|
+
const channel = channels ? resolveChannel(channels) : void 0;
|
|
1440
1441
|
callbacks.forEach((cb) => {
|
|
1441
1442
|
if (channels) {
|
|
1442
1443
|
const subscriberChannel = cb.channel;
|
|
1443
1444
|
if (!shouldDeliverToChannel(channels, subscriberChannel)) return;
|
|
1444
1445
|
}
|
|
1445
|
-
cb(cacheKey, value, key);
|
|
1446
|
+
cb(cacheKey, value, key, channel);
|
|
1446
1447
|
});
|
|
1447
1448
|
return true;
|
|
1448
1449
|
}
|
|
1450
|
+
/**
|
|
1451
|
+
* Collapses a {@link ChannelSet} into the single channel to hand to subscribers:
|
|
1452
|
+
* the channel itself when every coalesced touch carried the same one, otherwise
|
|
1453
|
+
* `undefined` (an unscoped touch, or touches on both channels).
|
|
1454
|
+
*/
|
|
1455
|
+
function resolveChannel(channels) {
|
|
1456
|
+
if (channels.size !== 1 || channels.has(UnscopedChannel)) return;
|
|
1457
|
+
const [channel] = channels;
|
|
1458
|
+
return channel;
|
|
1459
|
+
}
|
|
1449
1460
|
function hasSubscribers(cache, cacheKey, value) {
|
|
1450
1461
|
const hasSubscriber = Boolean(cache.get(cacheKey)?.length);
|
|
1451
1462
|
if (hasSubscriber || !isCacheOperationValue(value)) return hasSubscriber;
|
|
@@ -3451,8 +3462,8 @@ function normalizeProperties(store, identifier, properties) {
|
|
|
3451
3462
|
const prop = keys[i];
|
|
3452
3463
|
const field = defs.get(prop);
|
|
3453
3464
|
if (!field) continue;
|
|
3454
|
-
if (field.kind
|
|
3455
|
-
else if (field.kind
|
|
3465
|
+
if (isManyKind(field.kind)) properties[prop] = extractIdentifiersFromRecords$1(properties[prop]);
|
|
3466
|
+
else if (isSingleKind(field.kind)) properties[prop] = extractIdentifierFromRecord$1(properties[prop]);
|
|
3456
3467
|
}
|
|
3457
3468
|
}
|
|
3458
3469
|
}
|
|
@@ -6287,6 +6298,16 @@ function registerDerivations(schema) {
|
|
|
6287
6298
|
schema.registerDerivation(_constructor);
|
|
6288
6299
|
}
|
|
6289
6300
|
/**
|
|
6301
|
+
* A relationship field capable of declaring `options.as`, marking it as a
|
|
6302
|
+
* concrete implementation of an abstract polymorphic type.
|
|
6303
|
+
*/
|
|
6304
|
+
function isAbstractTypeImplementerField(field) {
|
|
6305
|
+
return isRelationshipKind(field.kind);
|
|
6306
|
+
}
|
|
6307
|
+
function isLegacyRelationshipField(field) {
|
|
6308
|
+
return field.kind === "belongsTo" || field.kind === "hasMany";
|
|
6309
|
+
}
|
|
6310
|
+
/**
|
|
6290
6311
|
* Defines how to convert a `GenericField`, `ObjectField`, or `ArrayField`
|
|
6291
6312
|
* between the raw value `T` stored in the cache and the presentation value
|
|
6292
6313
|
* `PT` exposed on the record.
|
|
@@ -6400,8 +6421,8 @@ var SchemaService = class {
|
|
|
6400
6421
|
for (const field of schema.fields) {
|
|
6401
6422
|
fields.set(field.name, field);
|
|
6402
6423
|
if (field.kind === "attribute") attributes[field.name] = field;
|
|
6403
|
-
else if (field
|
|
6404
|
-
relationships[field.name] = field;
|
|
6424
|
+
else if (isAbstractTypeImplementerField(field)) {
|
|
6425
|
+
if (isLegacyRelationshipField(field)) relationships[field.name] = field;
|
|
6405
6426
|
if (field.options?.as) abstractImplementations.push(field);
|
|
6406
6427
|
}
|
|
6407
6428
|
}
|
|
@@ -6409,7 +6430,7 @@ var SchemaService = class {
|
|
|
6409
6430
|
if (implementerFields) {
|
|
6410
6431
|
for (const [name, contribution] of implementerFields) if (!fields.get(name)) {
|
|
6411
6432
|
fields.set(name, contribution.field);
|
|
6412
|
-
relationships[name] = contribution.field;
|
|
6433
|
+
if (isLegacyRelationshipField(contribution.field)) relationships[name] = contribution.field;
|
|
6413
6434
|
}
|
|
6414
6435
|
}
|
|
6415
6436
|
const cacheFields = null;
|
|
@@ -6465,7 +6486,7 @@ var SchemaService = class {
|
|
|
6465
6486
|
}
|
|
6466
6487
|
if (abstractSchema.fields.get(field.name)) return;
|
|
6467
6488
|
abstractSchema.fields.set(field.name, abstractField);
|
|
6468
|
-
abstractSchema.relationships[field.name] = abstractField;
|
|
6489
|
+
if (isLegacyRelationshipField(abstractField)) abstractSchema.relationships[field.name] = abstractField;
|
|
6469
6490
|
if (abstractSchema.finalized) abstractSchema.cacheFields = getCacheFields(abstractSchema);
|
|
6470
6491
|
}
|
|
6471
6492
|
/**
|
|
@@ -7268,4 +7289,4 @@ function useRecommendedStore(options, StoreKlass = Store) {
|
|
|
7268
7289
|
}
|
|
7269
7290
|
|
|
7270
7291
|
export { normalizeModelName as A, isRequestKey as C, setIdentifierResetMethod as D, setIdentifierGenerationMethod as E, recordIdentifierFor as F, setRecordIdentifier as I, storeFor as L, ensureStringId as M, StoreMap as N, setIdentifierUpdateMethod as O, _clearCaches as P, assertPrivateCapabilities as R, fieldValueIdentity as S, setIdentifierForgetMethod as T, Store as _, fromIdentity as a, RecordArrayManager as b, instantiateRecord as c, commit as d, log as f, CacheHandler as g, constructResource as h, SchemaService as i, coerceId as j, setKeyInfoForResource as k, teardownRecord as l, createLegacyManyArray as m, RequestManager as n, registerDerivations as o, logGroup as p, Fetch as r, withDefaults as s, useRecommendedStore as t, checkout as u, assertPrivateStore as v, isResourceKey as w, fastPush as x, isPrivateStore as y };
|
|
7271
|
-
//# sourceMappingURL=src-
|
|
7292
|
+
//# sourceMappingURL=src-0f4an0QR.js.map
|