@askrjs/askr 0.0.43 → 0.0.44
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/benchmark.js +2 -2
- package/dist/common/ssr.d.ts +22 -1
- package/dist/common/ssr.d.ts.map +1 -1
- package/dist/common/ssr.js +9 -1
- package/dist/common/ssr.js.map +1 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/router/match.js.map +1 -1
- package/dist/router/route.d.ts +4 -0
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/route.js +4 -1
- package/dist/router/route.js.map +1 -1
- package/dist/ssg/batch-render.js +27 -5
- package/dist/ssg/batch-render.js.map +1 -1
- package/dist/ssg/create-static-gen.d.ts.map +1 -1
- package/dist/ssg/create-static-gen.js +6 -4
- package/dist/ssg/create-static-gen.js.map +1 -1
- package/dist/ssg/index.d.ts +2 -1
- package/dist/ssg/resolve-ssg-data.js +18 -1
- package/dist/ssg/resolve-ssg-data.js.map +1 -1
- package/dist/ssg/types.d.ts +3 -0
- package/dist/ssg/types.d.ts.map +1 -1
- package/dist/ssr/context.d.ts +1 -2
- package/dist/ssr/context.d.ts.map +1 -1
- package/dist/ssr/index.d.ts +10 -11
- package/dist/ssr/index.d.ts.map +1 -1
- package/dist/ssr/index.js +104 -68
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/render-resolved.d.ts +1 -1
- package/package.json +2 -2
package/dist/benchmark.js
CHANGED
|
@@ -10,8 +10,8 @@ import { BenchmarkTable } from "./bench/components/benchmark-table.js";
|
|
|
10
10
|
installRendererBridge();
|
|
11
11
|
const benchmarkMetadata = {
|
|
12
12
|
packageName: "@askrjs/askr",
|
|
13
|
-
packageVersion: "0.0.
|
|
14
|
-
buildLabel: "0.0.
|
|
13
|
+
packageVersion: "0.0.44",
|
|
14
|
+
buildLabel: "0.0.44-local"
|
|
15
15
|
};
|
|
16
16
|
function getBenchmarkMetadata() {
|
|
17
17
|
return { ...benchmarkMetadata };
|
package/dist/common/ssr.d.ts
CHANGED
|
@@ -3,6 +3,27 @@
|
|
|
3
3
|
* Common call contracts: SSR types
|
|
4
4
|
*/
|
|
5
5
|
type SSRData = Record<string, unknown>;
|
|
6
|
+
interface DocumentRenderRoute {
|
|
7
|
+
path: string;
|
|
8
|
+
namespace?: string;
|
|
9
|
+
}
|
|
10
|
+
interface DocumentRenderContext {
|
|
11
|
+
mode: 'ssr' | 'ssg';
|
|
12
|
+
url: string;
|
|
13
|
+
pathname: string;
|
|
14
|
+
search: string;
|
|
15
|
+
hash: string;
|
|
16
|
+
params: Record<string, string>;
|
|
17
|
+
data?: SSRData;
|
|
18
|
+
seed: number;
|
|
19
|
+
route: DocumentRenderRoute;
|
|
20
|
+
}
|
|
21
|
+
interface DocumentRenderArgs {
|
|
22
|
+
appHtml: string;
|
|
23
|
+
context: DocumentRenderContext;
|
|
24
|
+
}
|
|
25
|
+
type DocumentRenderer = (args: DocumentRenderArgs) => string;
|
|
26
|
+
declare function renderDocument(document: DocumentRenderer, args: DocumentRenderArgs, apiName: string): string;
|
|
6
27
|
declare const SSR_RENDER_DATA_ATTR = "data-askr-render-data";
|
|
7
28
|
/** Full context for sink-based streaming SSR */
|
|
8
29
|
type SSRContext = {
|
|
@@ -17,5 +38,5 @@ type RenderContext = {
|
|
|
17
38
|
seed: number;
|
|
18
39
|
};
|
|
19
40
|
//#endregion
|
|
20
|
-
export { SSRData };
|
|
41
|
+
export { DocumentRenderArgs, DocumentRenderContext, DocumentRenderer, SSRData };
|
|
21
42
|
//# sourceMappingURL=ssr.d.ts.map
|
package/dist/common/ssr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.d.ts","names":[],"sources":["../../src/common/ssr.ts"],"mappings":";;AAIA;;KAAY,OAAA,GAAU,MAAM;AAAA,
|
|
1
|
+
{"version":3,"file":"ssr.d.ts","names":[],"sources":["../../src/common/ssr.ts"],"mappings":";;AAIA;;KAAY,OAAA,GAAU,MAAM;AAAA,UAEX,mBAAA;EACf,IAAA;EACA,SAAS;AAAA;AAAA,UAGM,qBAAA;EACf,IAAA;EACA,GAAA;EACA,QAAA;EACA,MAAA;EACA,IAAA;EACA,MAAA,EAAQ,MAAA;EACR,IAAA,GAAO,OAAA;EACP,IAAA;EACA,KAAA,EAAO,mBAAA;AAAA;AAAA,UAGQ,kBAAA;EACf,OAAA;EACA,OAAA,EAAS,qBAAqB;AAAA;AAAA,KAGpB,gBAAA,IAAoB,IAAwB,EAAlB,kBAAkB;AAAA,iBAExC,cAAA,CACd,QAAA,EAAU,gBAAA,EACV,IAAA,EAAM,kBAAkB,EACxB,OAAA;AAAA,cA0BW,oBAAA;;KAGD,UAAA;EACV,GAAA;EACA,IAAA;EACA,IAAA,GAAO,OAAA;EACP,MAAA,GAAS,MAAA;EACT,MAAA,GAAS,WAAA;AAAA;;KAIC,aAAA;EACV,IAAI;AAAA"}
|
package/dist/common/ssr.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
//#region src/common/ssr.ts
|
|
2
|
+
function renderDocument(document, args, apiName) {
|
|
3
|
+
const html = document(args);
|
|
4
|
+
if (typeof html !== "string") {
|
|
5
|
+
const received = typeof html === "object" && html !== null && "then" in html && typeof html.then === "function" ? "a Promise-like value" : html === null ? "null" : Array.isArray(html) ? "an array" : typeof html;
|
|
6
|
+
throw new Error(`${apiName} document() must synchronously return a string; received ${received}.`);
|
|
7
|
+
}
|
|
8
|
+
return html;
|
|
9
|
+
}
|
|
2
10
|
const SSR_RENDER_DATA_ATTR = "data-askr-render-data";
|
|
3
11
|
//#endregion
|
|
4
|
-
export { SSR_RENDER_DATA_ATTR };
|
|
12
|
+
export { SSR_RENDER_DATA_ATTR, renderDocument };
|
|
5
13
|
|
|
6
14
|
//# sourceMappingURL=ssr.js.map
|
package/dist/common/ssr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.js","names":[],"sources":["../../src/common/ssr.ts"],"sourcesContent":["/**\n * Common call contracts: SSR types\n */\n\nexport type SSRData = Record<string, unknown>;\n\nexport const SSR_RENDER_DATA_ATTR = 'data-askr-render-data';\n\n/** Full context for sink-based streaming SSR */\nexport type SSRContext = {\n url: string;\n seed: number;\n data?: SSRData;\n params?: Record<string, string>;\n signal?: AbortSignal;\n};\n\n/** Lightweight context for synchronous render passes */\nexport type RenderContext = {\n seed: number;\n};\n"],"mappings":";
|
|
1
|
+
{"version":3,"file":"ssr.js","names":[],"sources":["../../src/common/ssr.ts"],"sourcesContent":["/**\n * Common call contracts: SSR types\n */\n\nexport type SSRData = Record<string, unknown>;\n\nexport interface DocumentRenderRoute {\n path: string;\n namespace?: string;\n}\n\nexport interface DocumentRenderContext {\n mode: 'ssr' | 'ssg';\n url: string;\n pathname: string;\n search: string;\n hash: string;\n params: Record<string, string>;\n data?: SSRData;\n seed: number;\n route: DocumentRenderRoute;\n}\n\nexport interface DocumentRenderArgs {\n appHtml: string;\n context: DocumentRenderContext;\n}\n\nexport type DocumentRenderer = (args: DocumentRenderArgs) => string;\n\nexport function renderDocument(\n document: DocumentRenderer,\n args: DocumentRenderArgs,\n apiName: string\n): string {\n const html = document(args);\n\n if (typeof html !== 'string') {\n const isPromiseLike =\n typeof html === 'object' &&\n html !== null &&\n 'then' in html &&\n typeof html.then === 'function';\n const received = isPromiseLike\n ? 'a Promise-like value'\n : html === null\n ? 'null'\n : Array.isArray(html)\n ? 'an array'\n : typeof html;\n\n throw new Error(\n `${apiName} document() must synchronously return a string; received ${received}.`\n );\n }\n\n return html;\n}\n\nexport const SSR_RENDER_DATA_ATTR = 'data-askr-render-data';\n\n/** Full context for sink-based streaming SSR */\nexport type SSRContext = {\n url: string;\n seed: number;\n data?: SSRData;\n params?: Record<string, string>;\n signal?: AbortSignal;\n};\n\n/** Lightweight context for synchronous render passes */\nexport type RenderContext = {\n seed: number;\n};\n"],"mappings":";AA8BA,SAAgB,eACd,UACA,MACA,SACQ;CACR,MAAM,OAAO,SAAS,IAAI;CAE1B,IAAI,OAAO,SAAS,UAAU;EAM5B,MAAM,WAJJ,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,OAAO,KAAK,SAAS,aAEnB,yBACA,SAAS,OACP,SACA,MAAM,QAAQ,IAAI,IAChB,aACA,OAAO;EAEf,MAAM,IAAI,MACR,GAAG,QAAQ,2DAA2D,SAAS,EACjF;CACF;CAEA,OAAO;AACT;AAEA,MAAa,uBAAuB"}
|
package/dist/data/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/data/index.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/data/index.ts"],"mappings":"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"}
|
package/dist/data/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/data/index.ts"],"sourcesContent":["import { globalScheduler } from '../runtime/scheduler';\nimport {\n claimHookIndex,\n getCurrentComponentInstance,\n type ComponentInstance,\n} from '../runtime/component';\nimport {\n markReadableDerivedSubscribersDirty,\n markReactivePropsDirtySource,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from '../runtime/readable';\nimport { getRenderContext } from '../ssr/context';\nimport { logger } from '../dev/logger';\nimport { emitInvalidation } from './invalidation-listeners';\nimport {\n documentVisible,\n routeActive,\n timer,\n windowFocused,\n type ActivityPredicate,\n} from '../runtime/operations';\n\nexport type QueryConsistency =\n | 'fresh'\n | 'stale'\n | 'refreshing'\n | 'pending-write';\n\nexport type QueryStaleReason = 'aborted' | 'error' | 'inconsistent';\n\nexport interface InvalidateOptions {\n markPendingWrite?: boolean;\n}\n\nexport interface InvalidateOnIntervalOptions extends InvalidateOptions {\n intervalMs: number;\n activeOn?: string | readonly string[];\n visibleOnly?: boolean;\n focusedOnly?: boolean;\n}\n\nexport type QueryKeyPart =\n | string\n | number\n | boolean\n | null\n | undefined\n | readonly QueryKeyPart[]\n | { readonly [key: string]: QueryKeyPart };\n\nexport interface QueryScope {\n key(...parts: QueryKeyPart[]): string;\n prefix(...parts: QueryKeyPart[]): string;\n invalidate(parts: readonly QueryKeyPart[], options?: InvalidateOptions): void;\n}\n\ntype QueryControls = {\n refresh(): Promise<void>;\n};\n\ntype QueryLoading = {\n data: null;\n error: null;\n loading: true;\n refreshing: false;\n stale: false;\n consistency: 'fresh';\n staleReason: null;\n};\n\ntype QueryFresh<T> = {\n data: T;\n error: null;\n loading: false;\n refreshing: false;\n stale: false;\n consistency: 'fresh';\n staleReason: null;\n};\n\ntype QueryRefreshing<T> = {\n data: T;\n error: null;\n loading: false;\n refreshing: true;\n stale: true;\n consistency: 'refreshing';\n staleReason: null;\n};\n\ntype QueryPendingWrite<T> = {\n data: T;\n error: null;\n loading: false;\n refreshing: true;\n stale: true;\n consistency: 'pending-write';\n staleReason: null;\n};\n\ntype QueryStaleValue<T> = {\n data: T;\n error: null;\n loading: false;\n refreshing: false;\n stale: true;\n consistency: 'stale';\n staleReason: 'aborted' | 'inconsistent';\n};\n\ntype QueryStaleErrorWithValue<T> = {\n data: T;\n error: {};\n loading: false;\n refreshing: false;\n stale: true;\n consistency: 'stale';\n staleReason: 'error';\n};\n\ntype QueryStaleError = {\n data: null;\n error: {};\n loading: false;\n refreshing: false;\n stale: true;\n consistency: 'stale';\n staleReason: 'error';\n};\n\nexport type Query<T extends {}> = QueryControls &\n (\n | QueryLoading\n | QueryFresh<T>\n | QueryRefreshing<T>\n | QueryPendingWrite<T>\n | QueryStaleValue<T>\n | QueryStaleErrorWithValue<T>\n | QueryStaleError\n );\n\ntype MutationControls<TInput, TResult> = {\n execute(input: TInput): Promise<TResult>;\n abort(): void;\n reset(): void;\n};\n\ntype MutationIdle = {\n status: 'idle';\n pending: false;\n error: null;\n result: null;\n};\n\ntype MutationPending = {\n status: 'pending';\n pending: true;\n error: null;\n result: null;\n};\n\ntype MutationSuccess<TResult> = {\n status: 'success';\n pending: false;\n error: null;\n result: TResult;\n};\n\ntype MutationError = {\n status: 'error';\n pending: false;\n error: {};\n result: null;\n};\n\nexport type Mutation<TInput, TResult> = MutationControls<TInput, TResult> &\n (MutationIdle | MutationPending | MutationSuccess<TResult> | MutationError);\n\ntype MutationRecord<TResult> = {\n status: 'idle' | 'pending' | 'success' | 'error';\n error: {} | null;\n result: TResult | null;\n};\n\ntype QueryOptions<T> = {\n key: string;\n fetch: (ctx: { signal: AbortSignal }) => Promise<T>;\n isConsistent?: (data: T) => boolean;\n reconcile?: (data: T, ctx: { key: string }) => Promise<boolean> | boolean;\n};\n\ntype MutationOptions<TInput, TResult> = {\n action: (input: TInput, ctx: { signal: AbortSignal }) => Promise<TResult>;\n affects?: (input: TInput, result: TResult) => string[];\n afterSuccess?: 'invalidate';\n};\n\ntype QueryState<T> = {\n data: T | null;\n error: {} | null;\n loading: boolean;\n refreshing: boolean;\n stale: boolean;\n consistency: QueryConsistency;\n staleReason: QueryStaleReason | null;\n};\n\ntype QuerySlot = {\n key: string;\n cell: QueryCell<unknown>;\n};\n\ntype QueryDefinitionField = 'fetch' | 'isConsistent' | 'reconcile';\n\nconst RECONCILE_MAX_ATTEMPTS = 3;\nconst RECONCILE_RETRY_DELAY_MS = 25;\nconst globalQueryCache = new Map<string, QueryCell<unknown>>();\nconst querySlotsByInstance = new WeakMap<\n ComponentInstance,\n Map<number, QuerySlot>\n>();\nconst mutationSlotsByInstance = new WeakMap<\n ComponentInstance,\n Map<number, MutationCell<unknown, unknown>>\n>();\nconst queryCleanupRegistered = new WeakSet<ComponentInstance>();\nconst mutationCleanupRegistered = new WeakSet<ComponentInstance>();\n\nfunction createReadableSource(): ReadableSource<unknown> {\n return (() => undefined) as ReadableSource<unknown>;\n}\n\nfunction getQueryCache(): Map<string, QueryCell<unknown>> {\n return (\n (getRenderContext()?.queryCache as Map<\n string,\n QueryCell<unknown>\n > | null) ?? globalQueryCache\n );\n}\n\nfunction getQuerySlotStore(\n instance: ComponentInstance\n): Map<number, QuerySlot> {\n let store = querySlotsByInstance.get(instance);\n if (!store) {\n store = new Map();\n querySlotsByInstance.set(instance, store);\n }\n return store;\n}\n\nfunction getMutationSlotStore(\n instance: ComponentInstance\n): Map<number, MutationCell<unknown, unknown>> {\n let store = mutationSlotsByInstance.get(instance);\n if (!store) {\n store = new Map();\n mutationSlotsByInstance.set(instance, store);\n }\n return store;\n}\n\nfunction ensureQueryCleanup(instance: ComponentInstance): void {\n if (queryCleanupRegistered.has(instance)) {\n return;\n }\n\n queryCleanupRegistered.add(instance);\n instance.cleanupFns.push(() => {\n const slots = querySlotsByInstance.get(instance);\n if (!slots) {\n queryCleanupRegistered.delete(instance);\n return;\n }\n\n for (const [hookIndex, slot] of slots) {\n slot.cell.detach(instance, hookIndex);\n }\n\n slots.clear();\n querySlotsByInstance.delete(instance);\n queryCleanupRegistered.delete(instance);\n });\n}\n\nfunction ensureMutationCleanup(instance: ComponentInstance): void {\n if (mutationCleanupRegistered.has(instance)) {\n return;\n }\n\n mutationCleanupRegistered.add(instance);\n instance.cleanupFns.push(() => {\n const slots = mutationSlotsByInstance.get(instance);\n if (!slots) {\n mutationCleanupRegistered.delete(instance);\n return;\n }\n\n for (const cell of slots.values()) {\n cell.abort();\n }\n\n slots.clear();\n mutationSlotsByInstance.delete(instance);\n mutationCleanupRegistered.delete(instance);\n });\n}\n\nfunction notifySource(source: ReadableSource<unknown>): void {\n markReadableDerivedSubscribersDirty(source);\n markReactivePropsDirtySource(source);\n notifyReadableReaders(source);\n}\n\nfunction isAbortError(error: unknown, signal: AbortSignal): boolean {\n return (\n signal.aborted ||\n (error instanceof Error && error.name === 'AbortError') ||\n (typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError')\n );\n}\n\nfunction normalizeAsyncDataError(error: unknown, fallbackMessage: string): {} {\n return error ?? new Error(fallbackMessage);\n}\n\nfunction invalidateQueries(prefix: string, markPendingWrite: boolean): void {\n emitInvalidation({ prefix, markPendingWrite });\n\n const cache = getQueryCache();\n\n for (const [key, query] of cache) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n\n if (markPendingWrite) {\n query.markPendingWrite();\n }\n\n void query.refresh();\n }\n}\n\nclass QueryCell<T> {\n private readonly source = createReadableSource();\n private readonly key: string;\n private readonly cache: Map<string, QueryCell<unknown>>;\n private options: QueryOptions<T>;\n private controller: AbortController | null = null;\n private generation = 0;\n private startQueued = false;\n private pendingRefresh: Promise<void> | null = null;\n private pendingRefreshResolve: (() => void) | null = null;\n private reconcileAttemptCount = 0;\n private destroyed = false;\n private ownerCount = 0;\n private readonly owners = new Map<ComponentInstance, Set<number>>();\n private readonly warnedDefinitionConflictKeys = new Set<string>();\n\n private state: QueryState<T> = {\n data: null,\n error: null,\n loading: true,\n refreshing: false,\n stale: false,\n consistency: 'fresh',\n staleReason: null,\n };\n\n constructor(\n options: QueryOptions<T>,\n key: string,\n cache: Map<string, QueryCell<unknown>>\n ) {\n this.options = options;\n this.key = key;\n this.cache = cache;\n }\n\n attach(instance: ComponentInstance, hookIndex: number): void {\n let hooks = this.owners.get(instance);\n if (!hooks) {\n hooks = new Set();\n this.owners.set(instance, hooks);\n }\n\n if (hooks.has(hookIndex)) {\n return;\n }\n\n hooks.add(hookIndex);\n this.ownerCount += 1;\n }\n\n detach(instance: ComponentInstance, hookIndex: number): void {\n const hooks = this.owners.get(instance);\n if (!hooks || !hooks.delete(hookIndex)) {\n return;\n }\n\n this.ownerCount -= 1;\n if (hooks.size === 0) {\n this.owners.delete(instance);\n }\n\n if (this.ownerCount <= 0) {\n this.destroy();\n }\n }\n\n warnOnConflictingDefinition(options: QueryOptions<T>): void {\n const conflicts = this.getDefinitionConflicts(options);\n if (conflicts.length === 0) {\n return;\n }\n\n const conflictKey = conflicts.join(',');\n if (this.warnedDefinitionConflictKeys.has(conflictKey)) {\n return;\n }\n\n this.warnedDefinitionConflictKeys.add(conflictKey);\n\n const callbackLabel =\n conflicts.length === 1\n ? `callback \\`${conflicts[0]}\\``\n : `callbacks ${conflicts.map((field) => `\\`${field}\\``).join(', ')}`;\n\n logger.warn(\n `[askr] Conflicting shared query definition for key \"${this.key}\". ` +\n `Shared queries are canonical by key, so reuse the same ${callbackLabel} ` +\n 'for every reader of that key.'\n );\n }\n\n private destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n this.controller?.abort();\n this.controller = null;\n this.startQueued = false;\n this.reconcileAttemptCount = 0;\n this.ownerCount = 0;\n this.owners.clear();\n this.cache.delete(this.key);\n this.finishPendingRefresh();\n }\n\n private getDefinitionConflicts(\n options: QueryOptions<T>\n ): QueryDefinitionField[] {\n const conflicts: QueryDefinitionField[] = [];\n\n if (this.options.fetch !== options.fetch) {\n conflicts.push('fetch');\n }\n\n if (this.options.isConsistent !== options.isConsistent) {\n conflicts.push('isConsistent');\n }\n\n if (this.options.reconcile !== options.reconcile) {\n conflicts.push('reconcile');\n }\n\n return conflicts;\n }\n\n get data(): T | null {\n recordReadableRead(this.source);\n return this.state.data;\n }\n\n get error(): {} | null {\n recordReadableRead(this.source);\n return this.state.error;\n }\n\n get loading(): boolean {\n recordReadableRead(this.source);\n return this.state.loading;\n }\n\n get refreshing(): boolean {\n recordReadableRead(this.source);\n return this.state.refreshing;\n }\n\n get stale(): boolean {\n recordReadableRead(this.source);\n return this.state.stale;\n }\n\n get consistency(): QueryConsistency {\n recordReadableRead(this.source);\n return this.state.consistency;\n }\n\n get staleReason(): QueryStaleReason | null {\n recordReadableRead(this.source);\n return this.state.staleReason;\n }\n\n ensureStarted(): void {\n if (\n this.destroyed ||\n this.state.data !== null ||\n this.pendingRefresh ||\n this.startQueued\n ) {\n return;\n }\n\n this.queueStart('initial');\n }\n\n refresh(): Promise<void> {\n if (this.destroyed) {\n return Promise.resolve();\n }\n\n if (this.pendingRefresh) {\n return this.pendingRefresh;\n }\n\n this.queueStart('manual');\n return this.pendingRefresh ?? Promise.resolve();\n }\n\n markPendingWrite(): void {\n if (this.destroyed) {\n return;\n }\n\n if (this.state.data === null) {\n return;\n }\n\n this.setState({\n loading: false,\n error: null,\n refreshing: true,\n stale: true,\n consistency: 'pending-write',\n staleReason: null,\n });\n }\n\n private queueStart(\n reason: 'initial' | 'manual' | 'invalidate' | 'pending-write'\n ): void {\n if (this.destroyed) {\n return;\n }\n\n this.startQueued = true;\n this.pendingRefresh = new Promise<void>((resolve) => {\n this.pendingRefreshResolve = resolve;\n globalScheduler.enqueue(() => {\n this.startQueued = false;\n if (this.destroyed) {\n this.finishPendingRefresh();\n return;\n }\n void this.start(reason).finally(() => {\n this.finishPendingRefresh();\n });\n });\n });\n }\n\n private finishPendingRefresh(): void {\n const resolve = this.pendingRefreshResolve;\n this.pendingRefresh = null;\n this.pendingRefreshResolve = null;\n resolve?.();\n }\n\n private setState(next: Partial<QueryState<T>>): void {\n if (this.destroyed) {\n return;\n }\n\n this.state = {\n ...this.state,\n ...next,\n };\n notifySource(this.source);\n }\n\n private async start(\n reason: 'initial' | 'manual' | 'invalidate' | 'pending-write'\n ): Promise<void> {\n if (this.destroyed) {\n return;\n }\n\n this.generation += 1;\n const generation = this.generation;\n\n this.controller?.abort();\n const controller = new AbortController();\n this.controller = controller;\n\n const hasData = this.state.data !== null;\n this.setState({\n loading: !hasData,\n refreshing: hasData,\n stale: hasData,\n consistency:\n reason === 'pending-write'\n ? 'pending-write'\n : hasData\n ? 'refreshing'\n : 'fresh',\n error: null,\n staleReason: null,\n });\n\n let nextData: T;\n try {\n nextData = await this.options.fetch({ signal: controller.signal });\n } catch (error) {\n if (\n this.destroyed ||\n this.generation !== generation ||\n this.controller !== controller\n ) {\n return;\n }\n\n if (isAbortError(error, controller.signal)) {\n this.setState(\n hasData\n ? {\n loading: false,\n refreshing: false,\n stale: true,\n consistency: 'stale',\n error: null,\n staleReason: 'aborted',\n }\n : {\n loading: true,\n refreshing: false,\n stale: false,\n consistency: 'fresh',\n error: null,\n staleReason: null,\n }\n );\n return;\n }\n\n this.setState({\n loading: false,\n refreshing: false,\n stale: true,\n consistency: 'stale',\n error: normalizeAsyncDataError(error, 'Unknown query error'),\n staleReason: 'error',\n });\n return;\n }\n\n if (\n this.destroyed ||\n this.generation !== generation ||\n this.controller !== controller\n ) {\n return;\n }\n\n const isConsistent = this.options.isConsistent?.(nextData) ?? true;\n if (!isConsistent) {\n this.setState({\n data: nextData,\n loading: false,\n refreshing: false,\n stale: true,\n consistency: 'stale',\n staleReason: 'inconsistent',\n });\n await this.reconcile(nextData);\n return;\n }\n\n this.reconcileAttemptCount = 0;\n this.setState({\n data: nextData,\n loading: false,\n refreshing: false,\n stale: false,\n consistency: 'fresh',\n error: null,\n staleReason: null,\n });\n }\n\n private async reconcile(data: T): Promise<void> {\n const shouldRetry =\n this.options.reconcile?.(data, { key: this.options.key }) ?? false;\n\n if (!shouldRetry || this.destroyed) {\n return;\n }\n\n this.reconcileAttemptCount += 1;\n if (this.reconcileAttemptCount > RECONCILE_MAX_ATTEMPTS) {\n this.setState({\n consistency: 'stale',\n refreshing: false,\n staleReason: 'inconsistent',\n });\n return;\n }\n\n await new Promise<void>((resolve) =>\n setTimeout(resolve, RECONCILE_RETRY_DELAY_MS)\n );\n if (this.destroyed || this.state.consistency === 'fresh') {\n return;\n }\n\n await this.refresh();\n }\n}\n\nclass MutationCell<TInput, TResult> {\n private readonly source = createReadableSource();\n private action: MutationOptions<TInput, TResult>['action'];\n private affects?: MutationOptions<TInput, TResult>['affects'];\n private afterSuccess?: MutationOptions<TInput, TResult>['afterSuccess'];\n private controller: AbortController | null = null;\n private generation = 0;\n\n private state: MutationRecord<TResult> = {\n status: 'idle',\n error: null,\n result: null,\n };\n\n constructor(options: MutationOptions<TInput, TResult>) {\n this.action = options.action;\n this.affects = options.affects;\n this.afterSuccess = options.afterSuccess;\n }\n\n setOptions(options: MutationOptions<TInput, TResult>): void {\n this.action = options.action;\n this.affects = options.affects;\n this.afterSuccess = options.afterSuccess;\n }\n\n get status(): 'idle' | 'pending' | 'success' | 'error' {\n recordReadableRead(this.source);\n return this.state.status;\n }\n\n get pending(): boolean {\n recordReadableRead(this.source);\n return this.state.status === 'pending';\n }\n\n get error(): {} | null {\n recordReadableRead(this.source);\n return this.state.error;\n }\n\n get result(): TResult | null {\n recordReadableRead(this.source);\n return this.state.result;\n }\n\n private setState(next: Partial<MutationRecord<TResult>>): void {\n this.state = {\n ...this.state,\n ...next,\n };\n notifySource(this.source);\n }\n\n async execute(input: TInput): Promise<TResult> {\n this.generation += 1;\n const generation = this.generation;\n\n this.controller?.abort();\n const controller = new AbortController();\n this.controller = controller;\n\n this.setState({ status: 'pending', error: null, result: null });\n\n let result: TResult;\n try {\n result = await this.action(input, { signal: controller.signal });\n } catch (error) {\n if (this.generation !== generation || this.controller !== controller) {\n throw error;\n }\n\n if (isAbortError(error, controller.signal)) {\n this.setState({ status: 'idle', error: null });\n throw error;\n }\n\n this.setState({\n status: 'error',\n error: normalizeAsyncDataError(error, 'Unknown mutation error'),\n });\n throw error;\n }\n\n if (this.generation !== generation || this.controller !== controller) {\n return result;\n }\n\n this.setState({ status: 'success', error: null, result });\n\n if (this.afterSuccess === 'invalidate') {\n const prefixes = this.affects?.(input, result) ?? [];\n for (const prefix of new Set(prefixes)) {\n invalidateQueries(prefix, true);\n }\n }\n\n return result;\n }\n\n abort(): void {\n if (this.state.status !== 'pending') {\n return;\n }\n\n this.generation += 1;\n this.controller?.abort();\n this.controller = null;\n this.setState({ status: 'idle', error: null, result: null });\n }\n\n reset(): void {\n this.generation += 1;\n this.controller?.abort();\n this.controller = null;\n this.setState({ status: 'idle', error: null, result: null });\n }\n}\n\nexport function createQuery<T extends {}>(options: QueryOptions<T>): Query<T> {\n const instance = getCurrentComponentInstance();\n const cache = getQueryCache();\n if (!instance) {\n let cell = cache.get(options.key) as QueryCell<T> | undefined;\n if (!cell) {\n cell = new QueryCell(options, options.key, cache);\n cache.set(options.key, cell as QueryCell<unknown>);\n cell.ensureStarted();\n } else {\n cell.warnOnConflictingDefinition(options);\n }\n return cell as unknown as Query<T>;\n }\n\n const hookIndex = claimHookIndex(instance, 'query');\n ensureQueryCleanup(instance);\n\n const slotStore = getQuerySlotStore(instance);\n const existingSlot = slotStore.get(hookIndex);\n if (existingSlot && existingSlot.key === options.key) {\n (existingSlot.cell as QueryCell<T>).warnOnConflictingDefinition(options);\n return existingSlot.cell as unknown as Query<T>;\n }\n\n if (existingSlot) {\n existingSlot.cell.detach(instance, hookIndex);\n }\n\n let cell = cache.get(options.key) as QueryCell<T> | undefined;\n if (!cell) {\n cell = new QueryCell(options, options.key, cache);\n cache.set(options.key, cell as QueryCell<unknown>);\n cell.ensureStarted();\n } else {\n cell.warnOnConflictingDefinition(options);\n }\n\n slotStore.set(hookIndex, {\n key: options.key,\n cell: cell as QueryCell<unknown>,\n });\n cell.attach(instance, hookIndex);\n return cell as unknown as Query<T>;\n}\n\nexport function invalidate(prefix: string, options?: InvalidateOptions): void {\n invalidateQueries(prefix, options?.markPendingWrite ?? false);\n}\n\nfunction serializeQueryKeyNumber(part: number): string {\n if (Number.isNaN(part)) {\n return 'NaN';\n }\n\n if (Object.is(part, -0)) {\n return '-0';\n }\n\n if (part === Infinity) {\n return 'Infinity';\n }\n\n if (part === -Infinity) {\n return '-Infinity';\n }\n\n return String(part);\n}\n\nfunction serializeQueryKeyPart(part: QueryKeyPart): string {\n if (typeof (part as unknown) === 'symbol') {\n throw new Error('[Askr] queryScope() key parts cannot be symbols.');\n }\n\n if (part === null) {\n return 'null';\n }\n\n if (part === undefined) {\n return 'undefined';\n }\n\n switch (typeof part) {\n case 'string':\n return `s=${encodeURIComponent(part)}`;\n case 'number':\n return `n=${serializeQueryKeyNumber(part)}`;\n case 'boolean':\n return `b=${part ? '1' : '0'}`;\n case 'object':\n if (Array.isArray(part)) {\n return `a[${part.map((item) => serializeQueryKeyPart(item)).join(',')}]`;\n }\n\n return `o{${Object.keys(part)\n .sort()\n .map(\n (key) =>\n `${encodeURIComponent(key)}=${serializeQueryKeyPart(part[key])}`\n )\n .join(',')}}`;\n default:\n return String(part);\n }\n}\n\nexport function queryScope(namespace: string): QueryScope {\n if (typeof namespace !== 'string' || namespace.trim().length === 0) {\n throw new Error('[Askr] queryScope() requires a non-empty namespace string.');\n }\n\n const build = (parts: readonly QueryKeyPart[]): string =>\n [namespace, ...parts].map(serializeQueryKeyPart).join(':') + ':';\n\n return {\n key(...parts) {\n return build(parts);\n },\n\n prefix(...parts) {\n return build(parts);\n },\n\n invalidate(parts, options) {\n invalidate(build(parts), options);\n },\n };\n}\n\nconst INVALIDATE_ON_INTERVAL_OPTIONS_ERROR =\n '[Askr] invalidateOnInterval() requires an options object with a finite numeric intervalMs.';\n\nexport function invalidateOnInterval(\n prefix: string,\n options: InvalidateOnIntervalOptions\n): void {\n if (\n !options ||\n typeof options !== 'object' ||\n typeof options.intervalMs !== 'number' ||\n !Number.isFinite(options.intervalMs)\n ) {\n throw new Error(INVALIDATE_ON_INTERVAL_OPTIONS_ERROR);\n }\n\n const when: ActivityPredicate[] = [];\n\n if (options.activeOn) {\n when.push(routeActive(options.activeOn));\n }\n\n if (options.visibleOnly) {\n when.push(documentVisible());\n }\n\n if (options.focusedOnly) {\n when.push(windowFocused());\n }\n\n timer(\n options.intervalMs,\n () => {\n invalidate(prefix, {\n markPendingWrite: options.markPendingWrite,\n });\n },\n when.length > 0 ? { when } : undefined\n );\n}\n\nexport function createMutation<TInput, TResult>(\n options: MutationOptions<TInput, TResult>\n): Mutation<TInput, TResult> {\n const instance = getCurrentComponentInstance();\n\n if (!instance) {\n return new MutationCell(options) as unknown as Mutation<TInput, TResult>;\n }\n\n const hookIndex = claimHookIndex(instance, 'mutation');\n ensureMutationCleanup(instance);\n\n const slotStore = getMutationSlotStore(instance);\n const existing = slotStore.get(hookIndex) as\n | MutationCell<TInput, TResult>\n | undefined;\n if (existing) {\n existing.setOptions(options);\n return existing as unknown as Mutation<TInput, TResult>;\n }\n\n const created = new MutationCell(options);\n slotStore.set(hookIndex, created as MutationCell<unknown, unknown>);\n return created as unknown as Mutation<TInput, TResult>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/data/index.ts"],"sourcesContent":["import { globalScheduler } from '../runtime/scheduler';\nimport {\n claimHookIndex,\n getCurrentComponentInstance,\n type ComponentInstance,\n} from '../runtime/component';\nimport {\n markReadableDerivedSubscribersDirty,\n markReactivePropsDirtySource,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from '../runtime/readable';\nimport { getRenderContext } from '../ssr/context';\nimport { logger } from '../dev/logger';\nimport { emitInvalidation } from './invalidation-listeners';\nimport {\n documentVisible,\n routeActive,\n timer,\n windowFocused,\n type ActivityPredicate,\n} from '../runtime/operations';\n\nexport type QueryConsistency =\n | 'fresh'\n | 'stale'\n | 'refreshing'\n | 'pending-write';\n\nexport type QueryStaleReason = 'aborted' | 'error' | 'inconsistent';\n\nexport interface InvalidateOptions {\n markPendingWrite?: boolean;\n}\n\nexport interface InvalidateOnIntervalOptions extends InvalidateOptions {\n intervalMs: number;\n activeOn?: string | readonly string[];\n visibleOnly?: boolean;\n focusedOnly?: boolean;\n}\n\nexport type QueryKeyPart =\n | string\n | number\n | boolean\n | null\n | undefined\n | readonly QueryKeyPart[]\n | { readonly [key: string]: QueryKeyPart };\n\nexport interface QueryScope {\n key(...parts: QueryKeyPart[]): string;\n prefix(...parts: QueryKeyPart[]): string;\n invalidate(parts: readonly QueryKeyPart[], options?: InvalidateOptions): void;\n}\n\ntype QueryControls = {\n refresh(): Promise<void>;\n};\n\ntype QueryLoading = {\n data: null;\n error: null;\n loading: true;\n refreshing: false;\n stale: false;\n consistency: 'fresh';\n staleReason: null;\n};\n\ntype QueryFresh<T> = {\n data: T;\n error: null;\n loading: false;\n refreshing: false;\n stale: false;\n consistency: 'fresh';\n staleReason: null;\n};\n\ntype QueryRefreshing<T> = {\n data: T;\n error: null;\n loading: false;\n refreshing: true;\n stale: true;\n consistency: 'refreshing';\n staleReason: null;\n};\n\ntype QueryPendingWrite<T> = {\n data: T;\n error: null;\n loading: false;\n refreshing: true;\n stale: true;\n consistency: 'pending-write';\n staleReason: null;\n};\n\ntype QueryStaleValue<T> = {\n data: T;\n error: null;\n loading: false;\n refreshing: false;\n stale: true;\n consistency: 'stale';\n staleReason: 'aborted' | 'inconsistent';\n};\n\ntype QueryStaleErrorWithValue<T> = {\n data: T;\n error: {};\n loading: false;\n refreshing: false;\n stale: true;\n consistency: 'stale';\n staleReason: 'error';\n};\n\ntype QueryStaleError = {\n data: null;\n error: {};\n loading: false;\n refreshing: false;\n stale: true;\n consistency: 'stale';\n staleReason: 'error';\n};\n\nexport type Query<T extends {}> = QueryControls &\n (\n | QueryLoading\n | QueryFresh<T>\n | QueryRefreshing<T>\n | QueryPendingWrite<T>\n | QueryStaleValue<T>\n | QueryStaleErrorWithValue<T>\n | QueryStaleError\n );\n\ntype MutationControls<TInput, TResult> = {\n execute(input: TInput): Promise<TResult>;\n abort(): void;\n reset(): void;\n};\n\ntype MutationIdle = {\n status: 'idle';\n pending: false;\n error: null;\n result: null;\n};\n\ntype MutationPending = {\n status: 'pending';\n pending: true;\n error: null;\n result: null;\n};\n\ntype MutationSuccess<TResult> = {\n status: 'success';\n pending: false;\n error: null;\n result: TResult;\n};\n\ntype MutationError = {\n status: 'error';\n pending: false;\n error: {};\n result: null;\n};\n\nexport type Mutation<TInput, TResult> = MutationControls<TInput, TResult> &\n (MutationIdle | MutationPending | MutationSuccess<TResult> | MutationError);\n\ntype MutationRecord<TResult> = {\n status: 'idle' | 'pending' | 'success' | 'error';\n error: {} | null;\n result: TResult | null;\n};\n\ntype QueryOptions<T> = {\n key: string;\n fetch: (ctx: { signal: AbortSignal }) => Promise<T>;\n isConsistent?: (data: T) => boolean;\n reconcile?: (data: T, ctx: { key: string }) => Promise<boolean> | boolean;\n};\n\ntype MutationOptions<TInput, TResult> = {\n action: (input: TInput, ctx: { signal: AbortSignal }) => Promise<TResult>;\n affects?: (input: TInput, result: TResult) => string[];\n afterSuccess?: 'invalidate';\n};\n\ntype QueryState<T> = {\n data: T | null;\n error: {} | null;\n loading: boolean;\n refreshing: boolean;\n stale: boolean;\n consistency: QueryConsistency;\n staleReason: QueryStaleReason | null;\n};\n\ntype QuerySlot = {\n key: string;\n cell: QueryCell<unknown>;\n};\n\ntype QueryDefinitionField = 'fetch' | 'isConsistent' | 'reconcile';\n\nconst RECONCILE_MAX_ATTEMPTS = 3;\nconst RECONCILE_RETRY_DELAY_MS = 25;\nconst globalQueryCache = new Map<string, QueryCell<unknown>>();\nconst querySlotsByInstance = new WeakMap<\n ComponentInstance,\n Map<number, QuerySlot>\n>();\nconst mutationSlotsByInstance = new WeakMap<\n ComponentInstance,\n Map<number, MutationCell<unknown, unknown>>\n>();\nconst queryCleanupRegistered = new WeakSet<ComponentInstance>();\nconst mutationCleanupRegistered = new WeakSet<ComponentInstance>();\n\nfunction createReadableSource(): ReadableSource<unknown> {\n return (() => undefined) as ReadableSource<unknown>;\n}\n\nfunction getQueryCache(): Map<string, QueryCell<unknown>> {\n return (\n (getRenderContext()?.queryCache as Map<\n string,\n QueryCell<unknown>\n > | null) ?? globalQueryCache\n );\n}\n\nfunction getQuerySlotStore(\n instance: ComponentInstance\n): Map<number, QuerySlot> {\n let store = querySlotsByInstance.get(instance);\n if (!store) {\n store = new Map();\n querySlotsByInstance.set(instance, store);\n }\n return store;\n}\n\nfunction getMutationSlotStore(\n instance: ComponentInstance\n): Map<number, MutationCell<unknown, unknown>> {\n let store = mutationSlotsByInstance.get(instance);\n if (!store) {\n store = new Map();\n mutationSlotsByInstance.set(instance, store);\n }\n return store;\n}\n\nfunction ensureQueryCleanup(instance: ComponentInstance): void {\n if (queryCleanupRegistered.has(instance)) {\n return;\n }\n\n queryCleanupRegistered.add(instance);\n instance.cleanupFns.push(() => {\n const slots = querySlotsByInstance.get(instance);\n if (!slots) {\n queryCleanupRegistered.delete(instance);\n return;\n }\n\n for (const [hookIndex, slot] of slots) {\n slot.cell.detach(instance, hookIndex);\n }\n\n slots.clear();\n querySlotsByInstance.delete(instance);\n queryCleanupRegistered.delete(instance);\n });\n}\n\nfunction ensureMutationCleanup(instance: ComponentInstance): void {\n if (mutationCleanupRegistered.has(instance)) {\n return;\n }\n\n mutationCleanupRegistered.add(instance);\n instance.cleanupFns.push(() => {\n const slots = mutationSlotsByInstance.get(instance);\n if (!slots) {\n mutationCleanupRegistered.delete(instance);\n return;\n }\n\n for (const cell of slots.values()) {\n cell.abort();\n }\n\n slots.clear();\n mutationSlotsByInstance.delete(instance);\n mutationCleanupRegistered.delete(instance);\n });\n}\n\nfunction notifySource(source: ReadableSource<unknown>): void {\n markReadableDerivedSubscribersDirty(source);\n markReactivePropsDirtySource(source);\n notifyReadableReaders(source);\n}\n\nfunction isAbortError(error: unknown, signal: AbortSignal): boolean {\n return (\n signal.aborted ||\n (error instanceof Error && error.name === 'AbortError') ||\n (typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError')\n );\n}\n\nfunction normalizeAsyncDataError(error: unknown, fallbackMessage: string): {} {\n return error ?? new Error(fallbackMessage);\n}\n\nfunction invalidateQueries(prefix: string, markPendingWrite: boolean): void {\n emitInvalidation({ prefix, markPendingWrite });\n\n const cache = getQueryCache();\n\n for (const [key, query] of cache) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n\n if (markPendingWrite) {\n query.markPendingWrite();\n }\n\n void query.refresh();\n }\n}\n\nclass QueryCell<T> {\n private readonly source = createReadableSource();\n private readonly key: string;\n private readonly cache: Map<string, QueryCell<unknown>>;\n private options: QueryOptions<T>;\n private controller: AbortController | null = null;\n private generation = 0;\n private startQueued = false;\n private pendingRefresh: Promise<void> | null = null;\n private pendingRefreshResolve: (() => void) | null = null;\n private reconcileAttemptCount = 0;\n private destroyed = false;\n private ownerCount = 0;\n private readonly owners = new Map<ComponentInstance, Set<number>>();\n private readonly warnedDefinitionConflictKeys = new Set<string>();\n\n private state: QueryState<T> = {\n data: null,\n error: null,\n loading: true,\n refreshing: false,\n stale: false,\n consistency: 'fresh',\n staleReason: null,\n };\n\n constructor(\n options: QueryOptions<T>,\n key: string,\n cache: Map<string, QueryCell<unknown>>\n ) {\n this.options = options;\n this.key = key;\n this.cache = cache;\n }\n\n attach(instance: ComponentInstance, hookIndex: number): void {\n let hooks = this.owners.get(instance);\n if (!hooks) {\n hooks = new Set();\n this.owners.set(instance, hooks);\n }\n\n if (hooks.has(hookIndex)) {\n return;\n }\n\n hooks.add(hookIndex);\n this.ownerCount += 1;\n }\n\n detach(instance: ComponentInstance, hookIndex: number): void {\n const hooks = this.owners.get(instance);\n if (!hooks || !hooks.delete(hookIndex)) {\n return;\n }\n\n this.ownerCount -= 1;\n if (hooks.size === 0) {\n this.owners.delete(instance);\n }\n\n if (this.ownerCount <= 0) {\n this.destroy();\n }\n }\n\n warnOnConflictingDefinition(options: QueryOptions<T>): void {\n const conflicts = this.getDefinitionConflicts(options);\n if (conflicts.length === 0) {\n return;\n }\n\n const conflictKey = conflicts.join(',');\n if (this.warnedDefinitionConflictKeys.has(conflictKey)) {\n return;\n }\n\n this.warnedDefinitionConflictKeys.add(conflictKey);\n\n const callbackLabel =\n conflicts.length === 1\n ? `callback \\`${conflicts[0]}\\``\n : `callbacks ${conflicts.map((field) => `\\`${field}\\``).join(', ')}`;\n\n logger.warn(\n `[askr] Conflicting shared query definition for key \"${this.key}\". ` +\n `Shared queries are canonical by key, so reuse the same ${callbackLabel} ` +\n 'for every reader of that key.'\n );\n }\n\n private destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n this.destroyed = true;\n this.controller?.abort();\n this.controller = null;\n this.startQueued = false;\n this.reconcileAttemptCount = 0;\n this.ownerCount = 0;\n this.owners.clear();\n this.cache.delete(this.key);\n this.finishPendingRefresh();\n }\n\n private getDefinitionConflicts(\n options: QueryOptions<T>\n ): QueryDefinitionField[] {\n const conflicts: QueryDefinitionField[] = [];\n\n if (this.options.fetch !== options.fetch) {\n conflicts.push('fetch');\n }\n\n if (this.options.isConsistent !== options.isConsistent) {\n conflicts.push('isConsistent');\n }\n\n if (this.options.reconcile !== options.reconcile) {\n conflicts.push('reconcile');\n }\n\n return conflicts;\n }\n\n get data(): T | null {\n recordReadableRead(this.source);\n return this.state.data;\n }\n\n get error(): {} | null {\n recordReadableRead(this.source);\n return this.state.error;\n }\n\n get loading(): boolean {\n recordReadableRead(this.source);\n return this.state.loading;\n }\n\n get refreshing(): boolean {\n recordReadableRead(this.source);\n return this.state.refreshing;\n }\n\n get stale(): boolean {\n recordReadableRead(this.source);\n return this.state.stale;\n }\n\n get consistency(): QueryConsistency {\n recordReadableRead(this.source);\n return this.state.consistency;\n }\n\n get staleReason(): QueryStaleReason | null {\n recordReadableRead(this.source);\n return this.state.staleReason;\n }\n\n ensureStarted(): void {\n if (\n this.destroyed ||\n this.state.data !== null ||\n this.pendingRefresh ||\n this.startQueued\n ) {\n return;\n }\n\n this.queueStart('initial');\n }\n\n refresh(): Promise<void> {\n if (this.destroyed) {\n return Promise.resolve();\n }\n\n if (this.pendingRefresh) {\n return this.pendingRefresh;\n }\n\n this.queueStart('manual');\n return this.pendingRefresh ?? Promise.resolve();\n }\n\n markPendingWrite(): void {\n if (this.destroyed) {\n return;\n }\n\n if (this.state.data === null) {\n return;\n }\n\n this.setState({\n loading: false,\n error: null,\n refreshing: true,\n stale: true,\n consistency: 'pending-write',\n staleReason: null,\n });\n }\n\n private queueStart(\n reason: 'initial' | 'manual' | 'invalidate' | 'pending-write'\n ): void {\n if (this.destroyed) {\n return;\n }\n\n this.startQueued = true;\n this.pendingRefresh = new Promise<void>((resolve) => {\n this.pendingRefreshResolve = resolve;\n globalScheduler.enqueue(() => {\n this.startQueued = false;\n if (this.destroyed) {\n this.finishPendingRefresh();\n return;\n }\n void this.start(reason).finally(() => {\n this.finishPendingRefresh();\n });\n });\n });\n }\n\n private finishPendingRefresh(): void {\n const resolve = this.pendingRefreshResolve;\n this.pendingRefresh = null;\n this.pendingRefreshResolve = null;\n resolve?.();\n }\n\n private setState(next: Partial<QueryState<T>>): void {\n if (this.destroyed) {\n return;\n }\n\n this.state = {\n ...this.state,\n ...next,\n };\n notifySource(this.source);\n }\n\n private async start(\n reason: 'initial' | 'manual' | 'invalidate' | 'pending-write'\n ): Promise<void> {\n if (this.destroyed) {\n return;\n }\n\n this.generation += 1;\n const generation = this.generation;\n\n this.controller?.abort();\n const controller = new AbortController();\n this.controller = controller;\n\n const hasData = this.state.data !== null;\n this.setState({\n loading: !hasData,\n refreshing: hasData,\n stale: hasData,\n consistency:\n reason === 'pending-write'\n ? 'pending-write'\n : hasData\n ? 'refreshing'\n : 'fresh',\n error: null,\n staleReason: null,\n });\n\n let nextData: T;\n try {\n nextData = await this.options.fetch({ signal: controller.signal });\n } catch (error) {\n if (\n this.destroyed ||\n this.generation !== generation ||\n this.controller !== controller\n ) {\n return;\n }\n\n if (isAbortError(error, controller.signal)) {\n this.setState(\n hasData\n ? {\n loading: false,\n refreshing: false,\n stale: true,\n consistency: 'stale',\n error: null,\n staleReason: 'aborted',\n }\n : {\n loading: true,\n refreshing: false,\n stale: false,\n consistency: 'fresh',\n error: null,\n staleReason: null,\n }\n );\n return;\n }\n\n this.setState({\n loading: false,\n refreshing: false,\n stale: true,\n consistency: 'stale',\n error: normalizeAsyncDataError(error, 'Unknown query error'),\n staleReason: 'error',\n });\n return;\n }\n\n if (\n this.destroyed ||\n this.generation !== generation ||\n this.controller !== controller\n ) {\n return;\n }\n\n const isConsistent = this.options.isConsistent?.(nextData) ?? true;\n if (!isConsistent) {\n this.setState({\n data: nextData,\n loading: false,\n refreshing: false,\n stale: true,\n consistency: 'stale',\n staleReason: 'inconsistent',\n });\n await this.reconcile(nextData);\n return;\n }\n\n this.reconcileAttemptCount = 0;\n this.setState({\n data: nextData,\n loading: false,\n refreshing: false,\n stale: false,\n consistency: 'fresh',\n error: null,\n staleReason: null,\n });\n }\n\n private async reconcile(data: T): Promise<void> {\n const shouldRetry =\n this.options.reconcile?.(data, { key: this.options.key }) ?? false;\n\n if (!shouldRetry || this.destroyed) {\n return;\n }\n\n this.reconcileAttemptCount += 1;\n if (this.reconcileAttemptCount > RECONCILE_MAX_ATTEMPTS) {\n this.setState({\n consistency: 'stale',\n refreshing: false,\n staleReason: 'inconsistent',\n });\n return;\n }\n\n await new Promise<void>((resolve) =>\n setTimeout(resolve, RECONCILE_RETRY_DELAY_MS)\n );\n if (this.destroyed || this.state.consistency === 'fresh') {\n return;\n }\n\n await this.refresh();\n }\n}\n\nclass MutationCell<TInput, TResult> {\n private readonly source = createReadableSource();\n private action: MutationOptions<TInput, TResult>['action'];\n private affects?: MutationOptions<TInput, TResult>['affects'];\n private afterSuccess?: MutationOptions<TInput, TResult>['afterSuccess'];\n private controller: AbortController | null = null;\n private generation = 0;\n\n private state: MutationRecord<TResult> = {\n status: 'idle',\n error: null,\n result: null,\n };\n\n constructor(options: MutationOptions<TInput, TResult>) {\n this.action = options.action;\n this.affects = options.affects;\n this.afterSuccess = options.afterSuccess;\n }\n\n setOptions(options: MutationOptions<TInput, TResult>): void {\n this.action = options.action;\n this.affects = options.affects;\n this.afterSuccess = options.afterSuccess;\n }\n\n get status(): 'idle' | 'pending' | 'success' | 'error' {\n recordReadableRead(this.source);\n return this.state.status;\n }\n\n get pending(): boolean {\n recordReadableRead(this.source);\n return this.state.status === 'pending';\n }\n\n get error(): {} | null {\n recordReadableRead(this.source);\n return this.state.error;\n }\n\n get result(): TResult | null {\n recordReadableRead(this.source);\n return this.state.result;\n }\n\n private setState(next: Partial<MutationRecord<TResult>>): void {\n this.state = {\n ...this.state,\n ...next,\n };\n notifySource(this.source);\n }\n\n async execute(input: TInput): Promise<TResult> {\n this.generation += 1;\n const generation = this.generation;\n\n this.controller?.abort();\n const controller = new AbortController();\n this.controller = controller;\n\n this.setState({ status: 'pending', error: null, result: null });\n\n let result: TResult;\n try {\n result = await this.action(input, { signal: controller.signal });\n } catch (error) {\n if (this.generation !== generation || this.controller !== controller) {\n throw error;\n }\n\n if (isAbortError(error, controller.signal)) {\n this.setState({ status: 'idle', error: null });\n throw error;\n }\n\n this.setState({\n status: 'error',\n error: normalizeAsyncDataError(error, 'Unknown mutation error'),\n });\n throw error;\n }\n\n if (this.generation !== generation || this.controller !== controller) {\n return result;\n }\n\n this.setState({ status: 'success', error: null, result });\n\n if (this.afterSuccess === 'invalidate') {\n const prefixes = this.affects?.(input, result) ?? [];\n for (const prefix of new Set(prefixes)) {\n invalidateQueries(prefix, true);\n }\n }\n\n return result;\n }\n\n abort(): void {\n if (this.state.status !== 'pending') {\n return;\n }\n\n this.generation += 1;\n this.controller?.abort();\n this.controller = null;\n this.setState({ status: 'idle', error: null, result: null });\n }\n\n reset(): void {\n this.generation += 1;\n this.controller?.abort();\n this.controller = null;\n this.setState({ status: 'idle', error: null, result: null });\n }\n}\n\nexport function createQuery<T extends {}>(options: QueryOptions<T>): Query<T> {\n const instance = getCurrentComponentInstance();\n const cache = getQueryCache();\n if (!instance) {\n let cell = cache.get(options.key) as QueryCell<T> | undefined;\n if (!cell) {\n cell = new QueryCell(options, options.key, cache);\n cache.set(options.key, cell as QueryCell<unknown>);\n cell.ensureStarted();\n } else {\n cell.warnOnConflictingDefinition(options);\n }\n return cell as unknown as Query<T>;\n }\n\n const hookIndex = claimHookIndex(instance, 'query');\n ensureQueryCleanup(instance);\n\n const slotStore = getQuerySlotStore(instance);\n const existingSlot = slotStore.get(hookIndex);\n if (existingSlot && existingSlot.key === options.key) {\n (existingSlot.cell as QueryCell<T>).warnOnConflictingDefinition(options);\n return existingSlot.cell as unknown as Query<T>;\n }\n\n if (existingSlot) {\n existingSlot.cell.detach(instance, hookIndex);\n }\n\n let cell = cache.get(options.key) as QueryCell<T> | undefined;\n if (!cell) {\n cell = new QueryCell(options, options.key, cache);\n cache.set(options.key, cell as QueryCell<unknown>);\n cell.ensureStarted();\n } else {\n cell.warnOnConflictingDefinition(options);\n }\n\n slotStore.set(hookIndex, {\n key: options.key,\n cell: cell as QueryCell<unknown>,\n });\n cell.attach(instance, hookIndex);\n return cell as unknown as Query<T>;\n}\n\nexport function invalidate(prefix: string, options?: InvalidateOptions): void {\n invalidateQueries(prefix, options?.markPendingWrite ?? false);\n}\n\nfunction serializeQueryKeyNumber(part: number): string {\n if (Number.isNaN(part)) {\n return 'NaN';\n }\n\n if (Object.is(part, -0)) {\n return '-0';\n }\n\n if (part === Infinity) {\n return 'Infinity';\n }\n\n if (part === -Infinity) {\n return '-Infinity';\n }\n\n return String(part);\n}\n\nfunction serializeQueryKeyPart(part: QueryKeyPart): string {\n if (typeof (part as unknown) === 'symbol') {\n throw new Error('[Askr] queryScope() key parts cannot be symbols.');\n }\n\n if (part === null) {\n return 'null';\n }\n\n if (part === undefined) {\n return 'undefined';\n }\n\n switch (typeof part) {\n case 'string':\n return `s=${encodeURIComponent(part)}`;\n case 'number':\n return `n=${serializeQueryKeyNumber(part)}`;\n case 'boolean':\n return `b=${part ? '1' : '0'}`;\n case 'object':\n if (Array.isArray(part)) {\n return `a[${part.map((item) => serializeQueryKeyPart(item)).join(',')}]`;\n }\n\n return `o{${Object.keys(part)\n .sort()\n .map(\n (key) =>\n `${encodeURIComponent(key)}=${serializeQueryKeyPart(part[key])}`\n )\n .join(',')}}`;\n default:\n return String(part);\n }\n}\n\nexport function queryScope(namespace: string): QueryScope {\n if (typeof namespace !== 'string' || namespace.trim().length === 0) {\n throw new Error(\n '[Askr] queryScope() requires a non-empty namespace string.'\n );\n }\n\n const build = (parts: readonly QueryKeyPart[]): string =>\n [namespace, ...parts].map(serializeQueryKeyPart).join(':') + ':';\n\n return {\n key(...parts) {\n return build(parts);\n },\n\n prefix(...parts) {\n return build(parts);\n },\n\n invalidate(parts, options) {\n invalidate(build(parts), options);\n },\n };\n}\n\nconst INVALIDATE_ON_INTERVAL_OPTIONS_ERROR =\n '[Askr] invalidateOnInterval() requires an options object with a finite numeric intervalMs.';\n\nexport function invalidateOnInterval(\n prefix: string,\n options: InvalidateOnIntervalOptions\n): void {\n if (\n !options ||\n typeof options !== 'object' ||\n typeof options.intervalMs !== 'number' ||\n !Number.isFinite(options.intervalMs)\n ) {\n throw new Error(INVALIDATE_ON_INTERVAL_OPTIONS_ERROR);\n }\n\n const when: ActivityPredicate[] = [];\n\n if (options.activeOn) {\n when.push(routeActive(options.activeOn));\n }\n\n if (options.visibleOnly) {\n when.push(documentVisible());\n }\n\n if (options.focusedOnly) {\n when.push(windowFocused());\n }\n\n timer(\n options.intervalMs,\n () => {\n invalidate(prefix, {\n markPendingWrite: options.markPendingWrite,\n });\n },\n when.length > 0 ? { when } : undefined\n );\n}\n\nexport function createMutation<TInput, TResult>(\n options: MutationOptions<TInput, TResult>\n): Mutation<TInput, TResult> {\n const instance = getCurrentComponentInstance();\n\n if (!instance) {\n return new MutationCell(options) as unknown as Mutation<TInput, TResult>;\n }\n\n const hookIndex = claimHookIndex(instance, 'mutation');\n ensureMutationCleanup(instance);\n\n const slotStore = getMutationSlotStore(instance);\n const existing = slotStore.get(hookIndex) as\n | MutationCell<TInput, TResult>\n | undefined;\n if (existing) {\n existing.setOptions(options);\n return existing as unknown as Mutation<TInput, TResult>;\n }\n\n const created = new MutationCell(options);\n slotStore.set(hookIndex, created as MutationCell<unknown, unknown>);\n return created as unknown as Mutation<TInput, TResult>;\n}\n"],"mappings":"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"}
|
package/dist/router/match.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"match.js","names":[],"sources":["../../src/router/match.ts"],"sourcesContent":["/**\n * Path matching, segment parsing, and specificity scoring.\n */\n\nimport type { ParsedSegment } from '../common/router';\n\nexport function splitPathSegments(path: string): string[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n if (!normalized || normalized === '/') {\n return [];\n }\n\n const withoutLeadingSlash = normalized.startsWith('/')\n ? normalized.slice(1)\n : normalized;\n\n return withoutLeadingSlash.length === 0 ? [] : withoutLeadingSlash.split('/');\n}\n\nexport function normalizeRouteSegmentName(value: string): string {\n return value.trim();\n}\n\n/**\n * Parse a route template path into typed segments.\n *\n * @example\n * parseSegments('/users/{id}') // [{kind:'static',value:'users'},{kind:'param',value:'id'}]\n * parseSegments('/*') // [{kind:'catchall',value:'*'}]\n * parseSegments('/posts/*') // [{kind:'static',value:'posts'},{kind:'wildcard',value:'*'}]\n * parseSegments('/files/{*path}') // [{kind:'static',value:'files'},{kind:'splat',value:'path'}]\n */\nexport function parseSegments(path: string): ParsedSegment[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n const parts = normalized.split('/').filter(Boolean);\n\n // Bare catch-all: /*\n if (parts.length === 1 && parts[0] === '*') {\n return [{ kind: 'catchall', value: '*' }];\n }\n\n return parts.map((segment): ParsedSegment => {\n if (segment.startsWith('{') && segment.endsWith('}')) {\n const value = normalizeRouteSegmentName(segment.slice(1, -1));\n if (value.startsWith('*')) {\n return {\n kind: 'splat',\n value: normalizeRouteSegmentName(value.slice(1)),\n };\n }\n return { kind: 'param', value };\n }\n if (segment === '*') {\n return { kind: 'wildcard', value: '*' };\n }\n return { kind: 'static', value: segment };\n });\n}\n\n/**\n * Compute a numeric specificity rank from a parsed segment list.\n *\n * Scoring: static = 3, param = 2, wildcard = 1, catchall = 0.\n * Higher rank wins when multiple routes match the same path.\n */\nexport function computeRank(segments: ParsedSegment[]): number {\n if (segments.length === 1 && segments[0].kind === 'catchall') return -1;\n let score = 0;\n for (const seg of segments) {\n if (seg.kind === 'static') score += 3;\n else if (seg.kind === 'param') score += 2;\n else if (seg.kind === 'wildcard') score += 1;\n else if (seg.kind === 'splat') score -= 0.5;\n // catchall contributes 0 per segment but is handled above\n }\n return score;\n}\n\n/** Reused frozen empty params object — returned for purely-static (no-capture) routes. */\nconst emptyParams: Record<string, string> = Object.freeze(\n Object.create(null) as Record<string, string>\n);\n\n/** Returned for every failed match — avoids per-call allocation. */\nconst noMatch: MatchResult = Object.freeze({\n matched: false,\n params: emptyParams,\n});\n\nfunction decodeRouteParam(part: string): string {\n if (!part.includes('%')) {\n return part;\n }\n\n try {\n return decodeURIComponent(part);\n } catch {\n return part;\n }\n}\n\n/**\n * Match pre-split URL parts against pre-parsed route segments.\n *\n * This is the hot-path matcher used by `resolveRoute` and\n * `resolveRouteFromRoutes`. Callers split the URL path **once** and reuse\n * `urlParts` across all route comparisons in a single resolution call.\n *\n * - Returns a params object (possibly the shared `{}`) on match.\n * - Returns `null` on no match.\n * - Params are allocated lazily — purely-static routes return the frozen\n * empty sentinel without any heap allocation.\n */\nexport function matchSegments(\n urlParts: string[],\n segments: ParsedSegment[]\n): Record<string, string> | null {\n // catch-all /* — matches every URL at any depth\n if (segments.length === 1 && segments[0].kind === 'catchall') {\n return {\n '*':\n urlParts.length === 0\n ? '/'\n : urlParts.length === 1\n ? urlParts[0]\n : '/' + urlParts.join('/'),\n };\n }\n\n const splatIndex = segments.findIndex((segment) => segment.kind === 'splat');\n if (splatIndex !== -1) {\n if (splatIndex !== segments.length - 1) {\n return null;\n }\n if (urlParts.length < splatIndex) {\n return null;\n }\n } else if (urlParts.length !== segments.length) {\n return null;\n }\n\n // non-catchall: part count must equal segment count\n\n // Walk segments; allocate the params object lazily on first capture\n let params: Record<string, string> | null = null;\n\n const normalizeCapturedSplatParts = (parts: string[]): string[] => {\n let start = 0;\n while (start < parts.length && parts[start] === '') {\n start += 1;\n }\n\n return start === 0 ? parts : parts.slice(start);\n };\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const part = urlParts[i];\n if (seg.kind === 'static') {\n if (seg.value !== part) return null;\n } else if (seg.kind === 'splat') {\n if (params === null) params = {};\n params[seg.value] = normalizeCapturedSplatParts(
|
|
1
|
+
{"version":3,"file":"match.js","names":[],"sources":["../../src/router/match.ts"],"sourcesContent":["/**\n * Path matching, segment parsing, and specificity scoring.\n */\n\nimport type { ParsedSegment } from '../common/router';\n\nexport function splitPathSegments(path: string): string[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n if (!normalized || normalized === '/') {\n return [];\n }\n\n const withoutLeadingSlash = normalized.startsWith('/')\n ? normalized.slice(1)\n : normalized;\n\n return withoutLeadingSlash.length === 0 ? [] : withoutLeadingSlash.split('/');\n}\n\nexport function normalizeRouteSegmentName(value: string): string {\n return value.trim();\n}\n\n/**\n * Parse a route template path into typed segments.\n *\n * @example\n * parseSegments('/users/{id}') // [{kind:'static',value:'users'},{kind:'param',value:'id'}]\n * parseSegments('/*') // [{kind:'catchall',value:'*'}]\n * parseSegments('/posts/*') // [{kind:'static',value:'posts'},{kind:'wildcard',value:'*'}]\n * parseSegments('/files/{*path}') // [{kind:'static',value:'files'},{kind:'splat',value:'path'}]\n */\nexport function parseSegments(path: string): ParsedSegment[] {\n const normalized =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n\n const parts = normalized.split('/').filter(Boolean);\n\n // Bare catch-all: /*\n if (parts.length === 1 && parts[0] === '*') {\n return [{ kind: 'catchall', value: '*' }];\n }\n\n return parts.map((segment): ParsedSegment => {\n if (segment.startsWith('{') && segment.endsWith('}')) {\n const value = normalizeRouteSegmentName(segment.slice(1, -1));\n if (value.startsWith('*')) {\n return {\n kind: 'splat',\n value: normalizeRouteSegmentName(value.slice(1)),\n };\n }\n return { kind: 'param', value };\n }\n if (segment === '*') {\n return { kind: 'wildcard', value: '*' };\n }\n return { kind: 'static', value: segment };\n });\n}\n\n/**\n * Compute a numeric specificity rank from a parsed segment list.\n *\n * Scoring: static = 3, param = 2, wildcard = 1, catchall = 0.\n * Higher rank wins when multiple routes match the same path.\n */\nexport function computeRank(segments: ParsedSegment[]): number {\n if (segments.length === 1 && segments[0].kind === 'catchall') return -1;\n let score = 0;\n for (const seg of segments) {\n if (seg.kind === 'static') score += 3;\n else if (seg.kind === 'param') score += 2;\n else if (seg.kind === 'wildcard') score += 1;\n else if (seg.kind === 'splat') score -= 0.5;\n // catchall contributes 0 per segment but is handled above\n }\n return score;\n}\n\n/** Reused frozen empty params object — returned for purely-static (no-capture) routes. */\nconst emptyParams: Record<string, string> = Object.freeze(\n Object.create(null) as Record<string, string>\n);\n\n/** Returned for every failed match — avoids per-call allocation. */\nconst noMatch: MatchResult = Object.freeze({\n matched: false,\n params: emptyParams,\n});\n\nfunction decodeRouteParam(part: string): string {\n if (!part.includes('%')) {\n return part;\n }\n\n try {\n return decodeURIComponent(part);\n } catch {\n return part;\n }\n}\n\n/**\n * Match pre-split URL parts against pre-parsed route segments.\n *\n * This is the hot-path matcher used by `resolveRoute` and\n * `resolveRouteFromRoutes`. Callers split the URL path **once** and reuse\n * `urlParts` across all route comparisons in a single resolution call.\n *\n * - Returns a params object (possibly the shared `{}`) on match.\n * - Returns `null` on no match.\n * - Params are allocated lazily — purely-static routes return the frozen\n * empty sentinel without any heap allocation.\n */\nexport function matchSegments(\n urlParts: string[],\n segments: ParsedSegment[]\n): Record<string, string> | null {\n // catch-all /* — matches every URL at any depth\n if (segments.length === 1 && segments[0].kind === 'catchall') {\n return {\n '*':\n urlParts.length === 0\n ? '/'\n : urlParts.length === 1\n ? urlParts[0]\n : '/' + urlParts.join('/'),\n };\n }\n\n const splatIndex = segments.findIndex((segment) => segment.kind === 'splat');\n if (splatIndex !== -1) {\n if (splatIndex !== segments.length - 1) {\n return null;\n }\n if (urlParts.length < splatIndex) {\n return null;\n }\n } else if (urlParts.length !== segments.length) {\n return null;\n }\n\n // non-catchall: part count must equal segment count\n\n // Walk segments; allocate the params object lazily on first capture\n let params: Record<string, string> | null = null;\n\n const normalizeCapturedSplatParts = (parts: string[]): string[] => {\n let start = 0;\n while (start < parts.length && parts[start] === '') {\n start += 1;\n }\n\n return start === 0 ? parts : parts.slice(start);\n };\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const part = urlParts[i];\n if (seg.kind === 'static') {\n if (seg.value !== part) return null;\n } else if (seg.kind === 'splat') {\n if (params === null) params = {};\n params[seg.value] = normalizeCapturedSplatParts(\n urlParts.slice(i).map(decodeRouteParam)\n ).join('/');\n return params;\n } else {\n if (params === null) params = {};\n if (seg.kind === 'param') {\n params[seg.value] = decodeRouteParam(part);\n } else {\n // wildcard\n params['*'] = part;\n }\n }\n }\n return params ?? emptyParams;\n}\n\nexport interface MatchResult {\n matched: boolean;\n params: Record<string, string>;\n}\n\n/**\n * Match a path against a route pattern and extract params\n *\n * @example\n * match('/users/123', '/users/{id}')\n * // → { matched: true, params: { id: '123' } }\n *\n * match('/posts/hello-world/edit', '/posts/{slug}/{action}')\n * // → { matched: true, params: { slug: 'hello-world', action: 'edit' } }\n *\n * match('/users', '/posts/{id}')\n * // → { matched: false, params: {} }\n */\nexport function match(path: string, pattern: string): MatchResult {\n // Normalize trailing slashes\n const normalizedPath =\n path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path;\n const normalizedPattern =\n pattern.endsWith('/') && pattern !== '/' ? pattern.slice(0, -1) : pattern;\n\n const pathSegments = splitPathSegments(normalizedPath);\n const patternSegments = parseSegments(normalizedPattern);\n const params = matchSegments(pathSegments, patternSegments);\n\n return params === null ? noMatch : { matched: true, params };\n}\n"],"mappings":"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"}
|
package/dist/router/route.d.ts
CHANGED
|
@@ -140,6 +140,10 @@ declare function resolveRouteRequest(target: string, options?: RouteRequestOptio
|
|
|
140
140
|
* a rank that cannot beat the current best match.
|
|
141
141
|
*/
|
|
142
142
|
declare function resolveRouteFromRoutes(pathname: string, routeList: readonly Route[]): ResolvedRoute | null;
|
|
143
|
+
declare function _resolveRouteMatchFromRoutes(pathname: string, routeList: readonly Route[]): {
|
|
144
|
+
route: Route;
|
|
145
|
+
params: Record<string, string>;
|
|
146
|
+
} | null;
|
|
143
147
|
//#endregion
|
|
144
148
|
export { Outlet, clearRoutes, currentRoute, fallback, getManifest, getRoutes, group, index, lazy, page, registerRoutes, route };
|
|
145
149
|
//# sourceMappingURL=route.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","names":[],"sources":["../../src/router/route.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"route.d.ts","names":[],"sources":["../../src/router/route.ts"],"mappings":"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"}
|
package/dist/router/route.js
CHANGED
|
@@ -845,7 +845,10 @@ function resolveRouteFromRoutes(pathname, routeList) {
|
|
|
845
845
|
params: match.params
|
|
846
846
|
} : null;
|
|
847
847
|
}
|
|
848
|
+
function _resolveRouteMatchFromRoutes(pathname, routeList) {
|
|
849
|
+
return findBestResolvedRouteFromRoutes(pathname, routeList);
|
|
850
|
+
}
|
|
848
851
|
//#endregion
|
|
849
|
-
export { Outlet, _applyManifest, _drainLazy, _setActiveRouteAuthOptions, _snapshotLazy, clearRoutes, computeRouteActivityMatches, currentRoute, fallback, getManifest, getRoutes, group, index, lazy, lockRouteRegistration, page, registerRoutes, resolveRouteFromRoutes, resolveRouteRequest, route, setServerLocation, syncCurrentRouteSnapshot };
|
|
852
|
+
export { Outlet, _applyManifest, _drainLazy, _resolveRouteMatchFromRoutes, _setActiveRouteAuthOptions, _snapshotLazy, clearRoutes, computeRouteActivityMatches, currentRoute, fallback, getManifest, getRoutes, group, index, lazy, lockRouteRegistration, page, registerRoutes, resolveRouteFromRoutes, resolveRouteRequest, route, setServerLocation, syncCurrentRouteSnapshot };
|
|
850
853
|
|
|
851
854
|
//# sourceMappingURL=route.js.map
|