@hypequery/datasets 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cache/query-signature.d.ts +19 -0
- package/dist/cache/query-signature.d.ts.map +1 -0
- package/dist/cache/query-signature.js +93 -0
- package/dist/cache/semantic-query-cache.d.ts +108 -0
- package/dist/cache/semantic-query-cache.d.ts.map +1 -0
- package/dist/cache/semantic-query-cache.js +184 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +1 -16
- package/dist/executor.d.ts +24 -0
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +83 -17
- package/dist/in-memory-backend.d.ts.map +1 -1
- package/dist/in-memory-backend.js +46 -21
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/types.d.ts +12 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/canonical-json.d.ts +20 -0
- package/dist/utils/canonical-json.d.ts.map +1 -0
- package/dist/utils/canonical-json.js +49 -0
- package/package.json +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical cache keys for semantic queries.
|
|
3
|
+
*
|
|
4
|
+
* A signature captures everything that changes a query's result set: the
|
|
5
|
+
* target (dataset or metric), selected dimensions/measures, filters, ordering,
|
|
6
|
+
* pagination, time grain, the effective tenant scope, and any explicit cache
|
|
7
|
+
* scope (see `SemanticCacheRuntime.scope`). Two calls with the
|
|
8
|
+
* same signature are guaranteed to produce the same rows against the same
|
|
9
|
+
* underlying data, so the signature is safe to use as a result-cache key.
|
|
10
|
+
*
|
|
11
|
+
* Keys are readable canonical strings rather than hashes so stores can inspect
|
|
12
|
+
* them and tests can assert on them; stores are free to hash internally.
|
|
13
|
+
*/
|
|
14
|
+
import type { AnyDatasetInstance, DatasetQuery, ExecutionContext, GrainedMetricRef, MetricQuery, MetricRef } from '../types.js';
|
|
15
|
+
import { stableStringify } from '../utils/canonical-json.js';
|
|
16
|
+
export { stableStringify };
|
|
17
|
+
export declare function buildDatasetQuerySignature(ds: AnyDatasetInstance, query: DatasetQuery, context?: ExecutionContext): string;
|
|
18
|
+
export declare function buildMetricQuerySignature(metric: MetricRef | GrainedMetricRef, query: MetricQuery, context?: ExecutionContext): string;
|
|
19
|
+
//# sourceMappingURL=query-signature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-signature.d.ts","sourceRoot":"","sources":["../../src/cache/query-signature.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAGhB,WAAW,EACX,SAAS,EACV,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,CAAC;AA8C3B,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAiBR;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,GAAG,gBAAgB,EACpC,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAkBR"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical cache keys for semantic queries.
|
|
3
|
+
*
|
|
4
|
+
* A signature captures everything that changes a query's result set: the
|
|
5
|
+
* target (dataset or metric), selected dimensions/measures, filters, ordering,
|
|
6
|
+
* pagination, time grain, the effective tenant scope, and any explicit cache
|
|
7
|
+
* scope (see `SemanticCacheRuntime.scope`). Two calls with the
|
|
8
|
+
* same signature are guaranteed to produce the same rows against the same
|
|
9
|
+
* underlying data, so the signature is safe to use as a result-cache key.
|
|
10
|
+
*
|
|
11
|
+
* Keys are readable canonical strings rather than hashes so stores can inspect
|
|
12
|
+
* them and tests can assert on them; stores are free to hash internally.
|
|
13
|
+
*/
|
|
14
|
+
import { getMetricGrain, getMetricRef } from '../utils/metric-handle.js';
|
|
15
|
+
import { getRuntimeTenantPredicate } from '../utils/tenant-runtime.js';
|
|
16
|
+
import { stableStringify } from '../utils/canonical-json.js';
|
|
17
|
+
export { stableStringify };
|
|
18
|
+
const SIGNATURE_VERSION = 1;
|
|
19
|
+
/**
|
|
20
|
+
* Explicit cache partition. Callers set `cache.scope` when the same semantic
|
|
21
|
+
* query can resolve against different data sources (per-call builder
|
|
22
|
+
* overrides, multiple clients sharing one store).
|
|
23
|
+
*/
|
|
24
|
+
function scopeSignature(context) {
|
|
25
|
+
const cache = context?.cache;
|
|
26
|
+
return cache ? cache.scope ?? null : null;
|
|
27
|
+
}
|
|
28
|
+
function filterSignature(filters) {
|
|
29
|
+
return (filters ?? []).map((filter) => ({
|
|
30
|
+
field: filter.field,
|
|
31
|
+
operator: filter.operator,
|
|
32
|
+
value: filter.value ?? null,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
function orderBySignature(orderBy) {
|
|
36
|
+
return (orderBy ?? []).map((order) => ({
|
|
37
|
+
field: order.field,
|
|
38
|
+
direction: order.direction,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Tenant portion of the key. Only datasets with a `tenantKey` apply the
|
|
43
|
+
* runtime tenant predicate, so tenant-less datasets share entries across
|
|
44
|
+
* callers while tenant-scoped datasets are strictly partitioned per scope.
|
|
45
|
+
*/
|
|
46
|
+
function tenantSignature(ds, context) {
|
|
47
|
+
if (!ds.tenantKey) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const predicate = getRuntimeTenantPredicate(context);
|
|
51
|
+
if (!predicate) {
|
|
52
|
+
// Trusted cross-tenant scope (`scope: 'all'`) or no runtime tenancy.
|
|
53
|
+
return { key: ds.tenantKey, scope: 'all' };
|
|
54
|
+
}
|
|
55
|
+
return { key: ds.tenantKey, operator: predicate.operator, value: predicate.value };
|
|
56
|
+
}
|
|
57
|
+
export function buildDatasetQuerySignature(ds, query, context) {
|
|
58
|
+
return stableStringify({
|
|
59
|
+
v: SIGNATURE_VERSION,
|
|
60
|
+
kind: 'dataset',
|
|
61
|
+
target: ds.name,
|
|
62
|
+
source: ds.source,
|
|
63
|
+
dimensions: query.dimensions ?? null,
|
|
64
|
+
// `null` distinguishes the "all measures" default from an explicit [].
|
|
65
|
+
measures: query.measures ?? null,
|
|
66
|
+
filters: filterSignature(query.filters),
|
|
67
|
+
orderBy: orderBySignature(query.orderBy),
|
|
68
|
+
by: query.by ?? null,
|
|
69
|
+
limit: query.limit ?? null,
|
|
70
|
+
offset: query.offset ?? null,
|
|
71
|
+
tenant: tenantSignature(ds, context),
|
|
72
|
+
scope: scopeSignature(context),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
export function buildMetricQuerySignature(metric, query, context) {
|
|
76
|
+
const ref = getMetricRef(metric);
|
|
77
|
+
const grain = getMetricGrain(metric, query);
|
|
78
|
+
return stableStringify({
|
|
79
|
+
v: SIGNATURE_VERSION,
|
|
80
|
+
kind: 'metric',
|
|
81
|
+
target: `${ref.dataset.name}.${ref.name}`,
|
|
82
|
+
source: ref.dataset.source,
|
|
83
|
+
metricKind: ref.spec.__type,
|
|
84
|
+
dimensions: query.dimensions ?? null,
|
|
85
|
+
filters: filterSignature(query.filters),
|
|
86
|
+
orderBy: orderBySignature(query.orderBy),
|
|
87
|
+
by: grain ?? null,
|
|
88
|
+
limit: query.limit ?? null,
|
|
89
|
+
offset: query.offset ?? null,
|
|
90
|
+
tenant: tenantSignature(ref.dataset, context),
|
|
91
|
+
scope: scopeSignature(context),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic query result cache.
|
|
3
|
+
*
|
|
4
|
+
* Sits between `DatasetClient.execute()` and the underlying query builder /
|
|
5
|
+
* backend, keyed by the canonical query signature (see query-signature.ts).
|
|
6
|
+
* Supports TTL freshness, an optional stale-while-revalidate window, and
|
|
7
|
+
* deduplication of concurrent identical lookups so a burst of the same query
|
|
8
|
+
* executes once — including against async stores, where the in-flight lookup
|
|
9
|
+
* is registered before the store read. Piggybacked callers inherit the
|
|
10
|
+
* initiating caller's TTL resolution.
|
|
11
|
+
*
|
|
12
|
+
* Values are cloned on write and on read: callers can mutate results freely
|
|
13
|
+
* without contaminating the cache, and cached hits never alias each other.
|
|
14
|
+
*/
|
|
15
|
+
export interface SemanticCacheEntry {
|
|
16
|
+
value: unknown;
|
|
17
|
+
storedAt: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Pluggable store. The default is an in-process LRU; provide a custom store
|
|
21
|
+
* (e.g. Redis-backed) for multi-instance deployments. Stores hold opaque
|
|
22
|
+
* entries — freshness is decided by the cache from `storedAt` and the
|
|
23
|
+
* effective TTL, so per-call TTLs work against shared entries.
|
|
24
|
+
*
|
|
25
|
+
* Store errors are non-fatal: a failed read is treated as a miss and a failed
|
|
26
|
+
* write is dropped, so a store outage degrades to uncached execution rather
|
|
27
|
+
* than failing queries.
|
|
28
|
+
*/
|
|
29
|
+
export interface SemanticCacheStore {
|
|
30
|
+
get(key: string): SemanticCacheEntry | undefined | Promise<SemanticCacheEntry | undefined>;
|
|
31
|
+
set(key: string, entry: SemanticCacheEntry): void | Promise<void>;
|
|
32
|
+
delete(key: string): void | Promise<void>;
|
|
33
|
+
clear?(): void | Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
/** Client-level cache defaults (see `CreateDatasetClientOptions.cache`). */
|
|
36
|
+
export interface SemanticCacheOptions {
|
|
37
|
+
/** Fresh window in milliseconds. 0 / omitted = only per-call opt-in caches. */
|
|
38
|
+
ttlMs?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Additional window after `ttlMs` during which a stale result is returned
|
|
41
|
+
* immediately while a background refresh repopulates the entry.
|
|
42
|
+
*/
|
|
43
|
+
staleWhileRevalidateMs?: number;
|
|
44
|
+
/** Max entries for the default in-memory store. Ignored when `store` is set. */
|
|
45
|
+
maxEntries?: number;
|
|
46
|
+
/** Custom store; defaults to an in-process LRU. */
|
|
47
|
+
store?: SemanticCacheStore;
|
|
48
|
+
/**
|
|
49
|
+
* Default cache partition included in every key. Set this when multiple
|
|
50
|
+
* clients pointing at different data sources share one store (e.g. Redis),
|
|
51
|
+
* so identical queries against different backends never collide.
|
|
52
|
+
*/
|
|
53
|
+
scope?: string;
|
|
54
|
+
}
|
|
55
|
+
/** Per-call cache controls, passed via `ExecutionContext.cache`. */
|
|
56
|
+
export interface SemanticCacheRuntime {
|
|
57
|
+
/** Overrides the client-level TTL for this call. */
|
|
58
|
+
ttlMs?: number;
|
|
59
|
+
/** Overrides the client-level stale-while-revalidate window for this call. */
|
|
60
|
+
staleWhileRevalidateMs?: number;
|
|
61
|
+
/**
|
|
62
|
+
* `bypass` skips the cache entirely (no read, no write);
|
|
63
|
+
* `refresh` skips the read but stores the fresh result. Refresh needs a
|
|
64
|
+
* TTL (per-call or client-level) to store under; when neither is
|
|
65
|
+
* configured it executes uncached and logs a one-time warning.
|
|
66
|
+
*/
|
|
67
|
+
mode?: 'bypass' | 'refresh';
|
|
68
|
+
/**
|
|
69
|
+
* Cache partition for this call, mixed into the query signature. Required
|
|
70
|
+
* to cache calls that override the query builder via `runtime.builderFactory`
|
|
71
|
+
* — without it such calls bypass the cache, because the key alone cannot
|
|
72
|
+
* tell two data sources apart.
|
|
73
|
+
*/
|
|
74
|
+
scope?: string;
|
|
75
|
+
}
|
|
76
|
+
/** Cache observability attached to `meta.cache` on cached-path results. */
|
|
77
|
+
export interface SemanticCacheMetaInfo {
|
|
78
|
+
hit: boolean;
|
|
79
|
+
/** Milliseconds since the entry was stored; only on hits. */
|
|
80
|
+
ageMs?: number;
|
|
81
|
+
/** True when served from the stale-while-revalidate window. */
|
|
82
|
+
stale?: boolean;
|
|
83
|
+
}
|
|
84
|
+
export declare function createMemoryCacheStore(options?: {
|
|
85
|
+
maxEntries?: number;
|
|
86
|
+
}): SemanticCacheStore;
|
|
87
|
+
type CacheableResult = {
|
|
88
|
+
meta?: object;
|
|
89
|
+
};
|
|
90
|
+
export declare class SemanticQueryCache {
|
|
91
|
+
private readonly store;
|
|
92
|
+
private readonly defaults;
|
|
93
|
+
private readonly pending;
|
|
94
|
+
private readonly refreshing;
|
|
95
|
+
private warnedRefreshWithoutTtl;
|
|
96
|
+
constructor(options?: SemanticCacheOptions);
|
|
97
|
+
private resolveConfig;
|
|
98
|
+
/**
|
|
99
|
+
* Runs `execute` through the cache. Errors are never cached; concurrent
|
|
100
|
+
* identical misses share one execution.
|
|
101
|
+
*/
|
|
102
|
+
through<T extends CacheableResult>(key: string, execute: () => Promise<T>, runtime?: SemanticCacheRuntime | false): Promise<T>;
|
|
103
|
+
/** Best-effort write: a failing store degrades to "no caching", never a failed call. */
|
|
104
|
+
private writeEntry;
|
|
105
|
+
private refreshInBackground;
|
|
106
|
+
}
|
|
107
|
+
export {};
|
|
108
|
+
//# sourceMappingURL=semantic-query-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-query-cache.d.ts","sourceRoot":"","sources":["../../src/cache/semantic-query-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC3F,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,OAAO,CAAC;IACb,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID,wBAAgB,sBAAsB,CACpC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,kBAAkB,CA+BpB;AAcD,KAAK,eAAe,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAmBzC,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,uBAAuB,CAAS;gBAE5B,OAAO,GAAE,oBAAyB;IAK9C,OAAO,CAAC,aAAa;IA8BrB;;;OAGG;IACG,OAAO,CAAC,CAAC,SAAS,eAAe,EACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,OAAO,CAAC,EAAE,oBAAoB,GAAG,KAAK,GACrC,OAAO,CAAC,CAAC,CAAC;IAgEb,wFAAwF;YAC1E,UAAU;IAQxB,OAAO,CAAC,mBAAmB;CAc5B"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic query result cache.
|
|
3
|
+
*
|
|
4
|
+
* Sits between `DatasetClient.execute()` and the underlying query builder /
|
|
5
|
+
* backend, keyed by the canonical query signature (see query-signature.ts).
|
|
6
|
+
* Supports TTL freshness, an optional stale-while-revalidate window, and
|
|
7
|
+
* deduplication of concurrent identical lookups so a burst of the same query
|
|
8
|
+
* executes once — including against async stores, where the in-flight lookup
|
|
9
|
+
* is registered before the store read. Piggybacked callers inherit the
|
|
10
|
+
* initiating caller's TTL resolution.
|
|
11
|
+
*
|
|
12
|
+
* Values are cloned on write and on read: callers can mutate results freely
|
|
13
|
+
* without contaminating the cache, and cached hits never alias each other.
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_MAX_ENTRIES = 500;
|
|
16
|
+
export function createMemoryCacheStore(options = {}) {
|
|
17
|
+
const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
18
|
+
const entries = new Map();
|
|
19
|
+
return {
|
|
20
|
+
get(key) {
|
|
21
|
+
const entry = entries.get(key);
|
|
22
|
+
if (!entry) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
// LRU: re-insert on access so iteration order tracks recency.
|
|
26
|
+
entries.delete(key);
|
|
27
|
+
entries.set(key, entry);
|
|
28
|
+
return entry;
|
|
29
|
+
},
|
|
30
|
+
set(key, entry) {
|
|
31
|
+
entries.delete(key);
|
|
32
|
+
entries.set(key, entry);
|
|
33
|
+
while (entries.size > maxEntries) {
|
|
34
|
+
const oldest = entries.keys().next().value;
|
|
35
|
+
if (oldest === undefined)
|
|
36
|
+
break;
|
|
37
|
+
entries.delete(oldest);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
delete(key) {
|
|
41
|
+
entries.delete(key);
|
|
42
|
+
},
|
|
43
|
+
clear() {
|
|
44
|
+
entries.clear();
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function isPromise(value) {
|
|
49
|
+
return typeof value?.['then'] === 'function';
|
|
50
|
+
}
|
|
51
|
+
function cloneValue(value) {
|
|
52
|
+
return structuredClone(value);
|
|
53
|
+
}
|
|
54
|
+
function annotate(result, info) {
|
|
55
|
+
return {
|
|
56
|
+
...result,
|
|
57
|
+
// Copy `info`: the same outcome is annotated onto every concurrent
|
|
58
|
+
// caller's result, and results must never alias each other.
|
|
59
|
+
meta: { ...(result.meta ?? {}), cache: { ...info } },
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export class SemanticQueryCache {
|
|
63
|
+
store;
|
|
64
|
+
defaults;
|
|
65
|
+
pending = new Map();
|
|
66
|
+
refreshing = new Set();
|
|
67
|
+
warnedRefreshWithoutTtl = false;
|
|
68
|
+
constructor(options = {}) {
|
|
69
|
+
this.defaults = options;
|
|
70
|
+
this.store = options.store ?? createMemoryCacheStore({ maxEntries: options.maxEntries });
|
|
71
|
+
}
|
|
72
|
+
resolveConfig(runtime) {
|
|
73
|
+
if (runtime === false) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
if (runtime?.mode === 'bypass') {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
const ttlMs = runtime?.ttlMs ?? this.defaults.ttlMs ?? 0;
|
|
80
|
+
if (ttlMs <= 0) {
|
|
81
|
+
// A misconfigured refresh must not fail the request — the fresh result
|
|
82
|
+
// is still correct — but it should not go undiagnosed either.
|
|
83
|
+
if (runtime?.mode === 'refresh' && !this.warnedRefreshWithoutTtl) {
|
|
84
|
+
this.warnedRefreshWithoutTtl = true;
|
|
85
|
+
console.warn("[hypequery/cache] mode 'refresh' has no TTL to store under; executing uncached. " +
|
|
86
|
+
'Pass ttlMs on the call or configure cache.ttlMs on the client.');
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
ttlMs,
|
|
92
|
+
staleWhileRevalidateMs: runtime?.staleWhileRevalidateMs ?? this.defaults.staleWhileRevalidateMs ?? 0,
|
|
93
|
+
mode: runtime?.mode === 'refresh' ? 'refresh' : 'read-write',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Runs `execute` through the cache. Errors are never cached; concurrent
|
|
98
|
+
* identical misses share one execution.
|
|
99
|
+
*/
|
|
100
|
+
async through(key, execute, runtime) {
|
|
101
|
+
const config = this.resolveConfig(runtime);
|
|
102
|
+
if (!config) {
|
|
103
|
+
return execute();
|
|
104
|
+
}
|
|
105
|
+
if (config.mode === 'refresh') {
|
|
106
|
+
// Refresh callers asked for an isolated fresh read: never piggyback on
|
|
107
|
+
// an in-flight miss, just execute and repopulate the entry.
|
|
108
|
+
const value = await execute();
|
|
109
|
+
await this.writeEntry(key, value);
|
|
110
|
+
return annotate(value, { hit: false });
|
|
111
|
+
}
|
|
112
|
+
const inFlight = this.pending.get(key);
|
|
113
|
+
if (inFlight) {
|
|
114
|
+
// Piggyback on the identical in-flight lookup; clone so concurrent
|
|
115
|
+
// callers never share a result object. The outcome (hit, staleness) was
|
|
116
|
+
// resolved with the initiating caller's TTL configuration.
|
|
117
|
+
const shared = await inFlight;
|
|
118
|
+
return annotate(cloneValue(shared.value), shared.info);
|
|
119
|
+
}
|
|
120
|
+
// The pending registration below happens synchronously, before the store
|
|
121
|
+
// read inside the IIFE — that is what makes concurrent identical calls
|
|
122
|
+
// share one execution even with an async store (e.g. Redis), where a
|
|
123
|
+
// read snapshot taken before our write would otherwise miss and re-run.
|
|
124
|
+
const promise = (async () => {
|
|
125
|
+
let entry;
|
|
126
|
+
try {
|
|
127
|
+
// Avoid the extra microtask when the store answers synchronously.
|
|
128
|
+
const read = this.store.get(key);
|
|
129
|
+
entry = isPromise(read) ? await read : read;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Read failed; treat it as a miss so a store outage degrades to
|
|
133
|
+
// "no caching" instead of failing the query.
|
|
134
|
+
}
|
|
135
|
+
if (entry) {
|
|
136
|
+
const ageMs = Date.now() - entry.storedAt;
|
|
137
|
+
if (ageMs <= config.ttlMs) {
|
|
138
|
+
return { value: entry.value, info: { hit: true, ageMs } };
|
|
139
|
+
}
|
|
140
|
+
if (ageMs <= config.ttlMs + config.staleWhileRevalidateMs) {
|
|
141
|
+
this.refreshInBackground(key, execute);
|
|
142
|
+
return { value: entry.value, info: { hit: true, ageMs, stale: true } };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const value = await execute();
|
|
146
|
+
await this.writeEntry(key, value);
|
|
147
|
+
return { value, info: { hit: false } };
|
|
148
|
+
})();
|
|
149
|
+
this.pending.set(key, promise);
|
|
150
|
+
try {
|
|
151
|
+
const outcome = await promise;
|
|
152
|
+
// Hits alias the stored entry and must be cloned; a freshly executed
|
|
153
|
+
// result is owned by this caller.
|
|
154
|
+
const value = outcome.info.hit ? cloneValue(outcome.value) : outcome.value;
|
|
155
|
+
return annotate(value, outcome.info);
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
this.pending.delete(key);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** Best-effort write: a failing store degrades to "no caching", never a failed call. */
|
|
162
|
+
async writeEntry(key, value) {
|
|
163
|
+
try {
|
|
164
|
+
await this.store.set(key, { value: cloneValue(value), storedAt: Date.now() });
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Cache write failed; the fresh result is still returned to the caller.
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
refreshInBackground(key, execute) {
|
|
171
|
+
if (this.refreshing.has(key)) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
this.refreshing.add(key);
|
|
175
|
+
void execute()
|
|
176
|
+
.then((value) => this.writeEntry(key, value))
|
|
177
|
+
.catch(() => {
|
|
178
|
+
// Stale entry stays; the next caller past the SWR window re-executes.
|
|
179
|
+
})
|
|
180
|
+
.finally(() => {
|
|
181
|
+
this.refreshing.delete(key);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
|
package/dist/contract.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { sha256 } from '@noble/hashes/sha2';
|
|
2
2
|
import { bytesToHex } from '@noble/hashes/utils';
|
|
3
3
|
import { getDatasetCatalogs, } from './catalog.js';
|
|
4
|
+
import { sortedRecord, uniqueSorted } from './utils/canonical-json.js';
|
|
4
5
|
/**
|
|
5
6
|
* Version of the semantic contract format. Bump when the serialized shape
|
|
6
7
|
* changes in a way that snapshot consumers must account for.
|
|
@@ -122,22 +123,6 @@ export function contractToStableJson(contract) {
|
|
|
122
123
|
export function hashContract(contract) {
|
|
123
124
|
return bytesToHex(sha256(contractToStableJson(contract)));
|
|
124
125
|
}
|
|
125
|
-
/**
|
|
126
|
-
* Locale-independent string comparison by UTF-16 code unit. Used everywhere the
|
|
127
|
-
* contract sorts, so the content hash is stable across environments (CI ICU
|
|
128
|
-
* versions, locales) rather than depending on `localeCompare`.
|
|
129
|
-
*/
|
|
130
|
-
function compareStrings(left, right) {
|
|
131
|
-
return left < right ? -1 : left > right ? 1 : 0;
|
|
132
|
-
}
|
|
133
|
-
/** Builds an object whose keys are inserted in sorted order for stable JSON. */
|
|
134
|
-
function sortedRecord(entries) {
|
|
135
|
-
return Object.fromEntries([...entries].sort(([left], [right]) => compareStrings(left, right)));
|
|
136
|
-
}
|
|
137
|
-
/** Deduplicates and sorts a list so logically-equal sets serialize identically. */
|
|
138
|
-
function uniqueSorted(values) {
|
|
139
|
-
return Array.from(new Set(values)).sort(compareStrings);
|
|
140
|
-
}
|
|
141
126
|
/** Normalizes SQL escape-hatch whitespace so equivalent SQL hashes identically. */
|
|
142
127
|
function normalizeSql(sql) {
|
|
143
128
|
const lines = sql
|
package/dist/executor.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import type { QueryBuilderFactoryLike, QueryBuilderFactoryInput } from './query-
|
|
|
9
9
|
import type { PlanNode, SemanticBackend } from './semantic-plan.js';
|
|
10
10
|
import { type ValidationResult } from './validation.js';
|
|
11
11
|
import { type DatasetQueryExecutionOptions } from './dataset-query.js';
|
|
12
|
+
import { type SemanticCacheOptions } from './cache/semantic-query-cache.js';
|
|
12
13
|
export interface MetricQueryEngineOptions {
|
|
13
14
|
/** Query builder factory for executing metrics. */
|
|
14
15
|
builderFactory: QueryBuilderFactoryInput;
|
|
@@ -18,6 +19,14 @@ export interface CreateDatasetClientOptions {
|
|
|
18
19
|
queryBuilder?: QueryBuilderFactoryInput;
|
|
19
20
|
/** Semantic backend for executing neutral semantic plans. */
|
|
20
21
|
backend?: SemanticBackend;
|
|
22
|
+
/**
|
|
23
|
+
* Result-cache defaults for this client. Results are keyed by the canonical
|
|
24
|
+
* query signature (target, dimensions, measures, filters, ordering,
|
|
25
|
+
* pagination, grain, and tenant scope). Individual calls can override or
|
|
26
|
+
* bypass via `ExecutionContext.cache`; per-call `{ cache: { ttlMs } }` works
|
|
27
|
+
* even when this option is omitted.
|
|
28
|
+
*/
|
|
29
|
+
cache?: SemanticCacheOptions;
|
|
21
30
|
}
|
|
22
31
|
export type SemanticTarget = MetricRef | GrainedMetricRef | AnyDatasetInstance;
|
|
23
32
|
export type SemanticQuery<TTarget extends SemanticTarget> = TTarget extends AnyDatasetInstance ? DatasetQuery : MetricQuery;
|
|
@@ -55,7 +64,22 @@ export declare class MetricQueryEngine {
|
|
|
55
64
|
}
|
|
56
65
|
export declare class DatasetClientImpl extends MetricQueryEngine implements DatasetClient {
|
|
57
66
|
private backend?;
|
|
67
|
+
private readonly queryCache;
|
|
68
|
+
private readonly cacheEnabledByDefault;
|
|
69
|
+
private readonly defaultCacheScope?;
|
|
58
70
|
constructor(options: CreateDatasetClientOptions);
|
|
71
|
+
/**
|
|
72
|
+
* True when this call can hit the cache — either the client has a default
|
|
73
|
+
* TTL or the call opts in via `context.cache`. Skips signature building for
|
|
74
|
+
* the common uncached path.
|
|
75
|
+
*/
|
|
76
|
+
private isCacheable;
|
|
77
|
+
/**
|
|
78
|
+
* Context used for cache-key building: fills in the client-level default
|
|
79
|
+
* `cache.scope` unless the call sets its own, so clients sharing a custom
|
|
80
|
+
* store can be namespaced apart.
|
|
81
|
+
*/
|
|
82
|
+
private signatureContext;
|
|
59
83
|
planMetric(metric: MetricRef | GrainedMetricRef, query?: MetricQuery, context?: ExecutionContext): PlanNode;
|
|
60
84
|
planDataset(ds: AnyDatasetInstance, query?: DatasetQuery, context?: ExecutionContext): PlanNode;
|
|
61
85
|
/**
|
package/dist/executor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAGhB,kBAAkB,EAClB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAEV,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAgB7E,OAAO,EAIL,KAAK,4BAA4B,EAClC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/executor.js
CHANGED
|
@@ -15,6 +15,8 @@ import { buildDatasetQueryBuilder, runDatasetQuery, validateDatasetQuery, } from
|
|
|
15
15
|
import { buildDatasetPlan, buildMetricPlan, } from './semantic-planner.js';
|
|
16
16
|
import { getRuntimeTenantId, getRuntimeTenantPredicate, validateTenantRuntime, } from './utils/tenant-runtime.js';
|
|
17
17
|
import { applyPagination, overfetchLimit } from './utils/pagination.js';
|
|
18
|
+
import { SemanticQueryCache, } from './cache/semantic-query-cache.js';
|
|
19
|
+
import { buildDatasetQuerySignature, buildMetricQuerySignature, } from './cache/query-signature.js';
|
|
18
20
|
function validateQuery(metric, query, context) {
|
|
19
21
|
const errors = [];
|
|
20
22
|
const ref = getMetricRef(metric);
|
|
@@ -314,6 +316,9 @@ export class MetricQueryEngine {
|
|
|
314
316
|
}
|
|
315
317
|
export class DatasetClientImpl extends MetricQueryEngine {
|
|
316
318
|
backend;
|
|
319
|
+
queryCache;
|
|
320
|
+
cacheEnabledByDefault;
|
|
321
|
+
defaultCacheScope;
|
|
317
322
|
constructor(options) {
|
|
318
323
|
if (!options.queryBuilder && !options.backend) {
|
|
319
324
|
throw new Error('createDatasetClient requires either queryBuilder or backend.');
|
|
@@ -329,6 +334,51 @@ export class DatasetClientImpl extends MetricQueryEngine {
|
|
|
329
334
|
},
|
|
330
335
|
});
|
|
331
336
|
this.backend = options.backend;
|
|
337
|
+
this.queryCache = new SemanticQueryCache(options.cache);
|
|
338
|
+
this.cacheEnabledByDefault = (options.cache?.ttlMs ?? 0) > 0;
|
|
339
|
+
this.defaultCacheScope = options.cache?.scope;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* True when this call can hit the cache — either the client has a default
|
|
343
|
+
* TTL or the call opts in via `context.cache`. Skips signature building for
|
|
344
|
+
* the common uncached path.
|
|
345
|
+
*/
|
|
346
|
+
isCacheable(context) {
|
|
347
|
+
if (context?.cache === false || context?.cache?.mode === 'bypass') {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
const builderOverride = context?.runtime?.builderFactory;
|
|
351
|
+
if (builderOverride &&
|
|
352
|
+
toQueryBuilderFactory(builderOverride) !== this.getBuilderFactory() &&
|
|
353
|
+
context.cache?.scope == null) {
|
|
354
|
+
// A per-call builder override can point at a different data source; the
|
|
355
|
+
// query signature alone cannot tell them apart, so caching is unsafe
|
|
356
|
+
// unless the caller partitions entries with an explicit `cache.scope`.
|
|
357
|
+
// Passing the client's own factory back in is not an override.
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
if (context?.cache?.mode === 'refresh') {
|
|
361
|
+
// Always reach the cache: it warns if refresh has no TTL to write under.
|
|
362
|
+
return true;
|
|
363
|
+
}
|
|
364
|
+
if (context?.cache?.ttlMs != null) {
|
|
365
|
+
return context.cache.ttlMs > 0;
|
|
366
|
+
}
|
|
367
|
+
return this.cacheEnabledByDefault;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Context used for cache-key building: fills in the client-level default
|
|
371
|
+
* `cache.scope` unless the call sets its own, so clients sharing a custom
|
|
372
|
+
* store can be namespaced apart.
|
|
373
|
+
*/
|
|
374
|
+
signatureContext(context) {
|
|
375
|
+
if (this.defaultCacheScope === undefined) {
|
|
376
|
+
return context;
|
|
377
|
+
}
|
|
378
|
+
if (context?.cache === false || context?.cache?.scope != null) {
|
|
379
|
+
return context;
|
|
380
|
+
}
|
|
381
|
+
return { ...context, cache: { ...context?.cache, scope: this.defaultCacheScope } };
|
|
332
382
|
}
|
|
333
383
|
planMetric(metric, query = {}, context) {
|
|
334
384
|
assertMetricHandle(metric);
|
|
@@ -360,31 +410,47 @@ export class DatasetClientImpl extends MetricQueryEngine {
|
|
|
360
410
|
return super.validate(target, query, context);
|
|
361
411
|
}
|
|
362
412
|
executeMetric(metric, query, context) {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
413
|
+
const run = () => {
|
|
414
|
+
if (this.backend) {
|
|
415
|
+
const validation = validateQuery(metric, query, context);
|
|
416
|
+
if (!validation.valid) {
|
|
417
|
+
throw new Error(`Invalid metric query: ${validation.errors.join('; ')}`);
|
|
418
|
+
}
|
|
419
|
+
return this.backend.execute(this.planMetric(metric, query, context));
|
|
367
420
|
}
|
|
368
|
-
return this.
|
|
421
|
+
return this.run(metric, query, context);
|
|
422
|
+
};
|
|
423
|
+
if (!this.isCacheable(context)) {
|
|
424
|
+
return run();
|
|
425
|
+
}
|
|
426
|
+
// Validate semantic rules before cache lookup so invalid queries and
|
|
427
|
+
// missing tenant runtime cannot be served from cache. Avoid this.validate()
|
|
428
|
+
// here because it dry-builds SQL, which is unnecessary on cache hits and
|
|
429
|
+
// invalid for backend-only clients.
|
|
430
|
+
const validation = validateQuery(metric, query, context);
|
|
431
|
+
if (!validation.valid) {
|
|
432
|
+
throw new Error(`Invalid metric query: ${validation.errors.join('; ')}`);
|
|
369
433
|
}
|
|
370
|
-
return this.
|
|
434
|
+
return this.queryCache.through(buildMetricQuerySignature(metric, query, this.signatureContext(context)), run, context?.cache);
|
|
371
435
|
}
|
|
372
436
|
executeDataset(ds, query, context) {
|
|
373
|
-
if (this.backend) {
|
|
374
|
-
const validation = this.validate(ds, query, context);
|
|
375
|
-
if (!validation.valid) {
|
|
376
|
-
throw new Error(`Invalid dataset query: ${validation.errors.join('; ')}`);
|
|
377
|
-
}
|
|
378
|
-
return this.backend.execute(this.planDataset(ds, query, context));
|
|
379
|
-
}
|
|
380
437
|
const validation = this.validate(ds, query, context);
|
|
381
438
|
if (!validation.valid) {
|
|
382
439
|
throw new Error(`Invalid dataset query: ${validation.errors.join('; ')}`);
|
|
383
440
|
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
441
|
+
const run = () => {
|
|
442
|
+
if (this.backend) {
|
|
443
|
+
return this.backend.execute(this.planDataset(ds, query, context));
|
|
444
|
+
}
|
|
445
|
+
return runDatasetQuery(ds, query, {
|
|
446
|
+
builderFactory: resolveBuilderFactory(context, this.getBuilderFactory()),
|
|
447
|
+
context,
|
|
448
|
+
});
|
|
449
|
+
};
|
|
450
|
+
if (!this.isCacheable(context)) {
|
|
451
|
+
return run();
|
|
452
|
+
}
|
|
453
|
+
return this.queryCache.through(buildDatasetQuerySignature(ds, query, this.signatureContext(context)), run, context?.cache);
|
|
388
454
|
}
|
|
389
455
|
toDatasetSQL(ds, query, context) {
|
|
390
456
|
const builder = buildDatasetQueryBuilder(ds, query, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-backend.d.ts","sourceRoot":"","sources":["../src/in-memory-backend.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,eAAe,EAIhB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"in-memory-backend.d.ts","sourceRoot":"","sources":["../src/in-memory-backend.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,eAAe,EAIhB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAoM3D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAuE7E"}
|
|
@@ -159,6 +159,29 @@ function applyOrderLimitOffset(rows, plan) {
|
|
|
159
159
|
}
|
|
160
160
|
return result;
|
|
161
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* The measure/metric columns a plan emits. These carry aggregate values, which
|
|
164
|
+
* ClickHouse serializes as strings over JSON (UInt64, Decimal, ...); the row
|
|
165
|
+
* types in `types.ts` reflect that. We compute and order them numerically (as
|
|
166
|
+
* ClickHouse does in SQL) and only stringify at the output boundary, so this
|
|
167
|
+
* backend stays a faithful double of the real one.
|
|
168
|
+
*/
|
|
169
|
+
function measureColumns(plan) {
|
|
170
|
+
return plan.kind === 'aggregate'
|
|
171
|
+
? plan.aggregations.map((aggregation) => aggregation.name)
|
|
172
|
+
: plan.metrics.map((metric) => metric.name);
|
|
173
|
+
}
|
|
174
|
+
function serializeMeasures(rows, measures) {
|
|
175
|
+
return rows.map((row) => {
|
|
176
|
+
const next = { ...row };
|
|
177
|
+
for (const name of measures) {
|
|
178
|
+
if (next[name] != null) {
|
|
179
|
+
next[name] = String(next[name]);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return next;
|
|
183
|
+
});
|
|
184
|
+
}
|
|
162
185
|
export function createInMemoryBackend(tables) {
|
|
163
186
|
function executeAggregate(plan) {
|
|
164
187
|
const table = tables[plan.source] ?? [];
|
|
@@ -187,31 +210,33 @@ export function createInMemoryBackend(tables) {
|
|
|
187
210
|
});
|
|
188
211
|
return applyOrderLimitOffset(output, plan);
|
|
189
212
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
213
|
+
// Keeps measure values numeric so computation and ordering match ClickHouse's
|
|
214
|
+
// SQL semantics; the public `execute` stringifies them at the output boundary.
|
|
215
|
+
function executeNode(plan) {
|
|
193
216
|
if (plan.kind === 'aggregate') {
|
|
194
|
-
|
|
217
|
+
return executeAggregate(plan);
|
|
195
218
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
if (plan.input.
|
|
201
|
-
|
|
202
|
-
next[plan.input.grain.output] = row[plan.input.grain.output];
|
|
203
|
-
}
|
|
204
|
-
for (const dimension of plan.input.dimensions) {
|
|
205
|
-
next[dimension.name] = row[dimension.name];
|
|
206
|
-
}
|
|
219
|
+
const input = executeNode(plan.input);
|
|
220
|
+
const data = input.map((row) => {
|
|
221
|
+
const next = {};
|
|
222
|
+
if (plan.input.kind === 'aggregate') {
|
|
223
|
+
if (plan.input.grain) {
|
|
224
|
+
next[plan.input.grain.output] = row[plan.input.grain.output];
|
|
207
225
|
}
|
|
208
|
-
for (const
|
|
209
|
-
next[
|
|
226
|
+
for (const dimension of plan.input.dimensions) {
|
|
227
|
+
next[dimension.name] = row[dimension.name];
|
|
210
228
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
229
|
+
}
|
|
230
|
+
for (const metric of plan.metrics) {
|
|
231
|
+
next[metric.name] = evaluateExpression(metric.expression, row);
|
|
232
|
+
}
|
|
233
|
+
return next;
|
|
234
|
+
});
|
|
235
|
+
return applyOrderLimitOffset(data, plan);
|
|
236
|
+
}
|
|
237
|
+
async function execute(plan) {
|
|
238
|
+
const start = Date.now();
|
|
239
|
+
const data = serializeMeasures(executeNode(plan), measureColumns(plan));
|
|
215
240
|
return {
|
|
216
241
|
data: data,
|
|
217
242
|
meta: { timingMs: Date.now() - start },
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,9 @@ export { generateDatasetTools, toOpenAITools, toAISDKTools, toMcpTools, } from '
|
|
|
14
14
|
export type { AISDKToolDefinition, DatasetToolAnalytics, DatasetToolMode, GenerateDatasetToolsOptions, JsonSchema, McpToolDefinition, OpenAIToolDefinition, SemanticToolDefinition, } from './tools.js';
|
|
15
15
|
export { createDatasetClient } from './executor.js';
|
|
16
16
|
export type { DatasetClient, CreateDatasetClientOptions } from './executor.js';
|
|
17
|
+
export { createMemoryCacheStore } from './cache/semantic-query-cache.js';
|
|
18
|
+
export type { SemanticCacheEntry, SemanticCacheMetaInfo, SemanticCacheOptions, SemanticCacheRuntime, SemanticCacheStore, } from './cache/semantic-query-cache.js';
|
|
19
|
+
export { buildDatasetQuerySignature, buildMetricQuerySignature, } from './cache/query-signature.js';
|
|
17
20
|
export { createInMemoryBackend } from './in-memory-backend.js';
|
|
18
21
|
export type { InMemoryTable, InMemoryTables } from './in-memory-backend.js';
|
|
19
22
|
export type { PlanNode, SemanticBackend, SemanticBackendResult, SemanticExpression, SemanticAggregationPlan, SemanticDimensionPlan, SemanticGrainPlan, } from './semantic-plan.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EACL,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAC/B,UAAU,EAAE,QAAQ,EACpB,KAAK,EAAE,KAAK,EAAE,IAAI,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EACzB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAChC,GAAG,EAAE,IAAI,EACT,MAAM,EAAE,KAAK,GACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACrE,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,YAAY,EACZ,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,gBAAgB,EAChB,gCAAgC,EAChC,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,2BAA2B,EAC3B,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -22,6 +22,9 @@ export { serializeSemanticContract, contractToStableJson, hashContract, SEMANTIC
|
|
|
22
22
|
export { generateDatasetTools, toOpenAITools, toAISDKTools, toMcpTools, } from './tools.js';
|
|
23
23
|
// Dataset client
|
|
24
24
|
export { createDatasetClient } from './executor.js';
|
|
25
|
+
// Semantic query result cache
|
|
26
|
+
export { createMemoryCacheStore } from './cache/semantic-query-cache.js';
|
|
27
|
+
export { buildDatasetQuerySignature, buildMetricQuerySignature, } from './cache/query-signature.js';
|
|
25
28
|
export { createInMemoryBackend } from './in-memory-backend.js';
|
|
26
29
|
export { validateFilterValue, matchesFieldType } from './validation.js';
|
|
27
30
|
export { toQueryBuilderFactory } from './query-builder-protocol.js';
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { QueryBuilderFactoryInput } from './query-builder-protocol.js';
|
|
2
|
+
import type { SemanticCacheMetaInfo, SemanticCacheRuntime } from './cache/semantic-query-cache.js';
|
|
2
3
|
import type { SemanticExpression } from './semantic-plan.js';
|
|
3
4
|
export type FieldType = 'string' | 'number' | 'boolean' | 'timestamp';
|
|
4
5
|
export type DimensionType = FieldType;
|
|
@@ -150,6 +151,8 @@ export interface MetricResultMeta {
|
|
|
150
151
|
offset: number;
|
|
151
152
|
hasMore: boolean;
|
|
152
153
|
};
|
|
154
|
+
/** Result-cache observability. Present when the call went through the cache. */
|
|
155
|
+
cache?: SemanticCacheMetaInfo;
|
|
153
156
|
}
|
|
154
157
|
export interface MetricResult<T = Record<string, unknown>> {
|
|
155
158
|
data: T[];
|
|
@@ -172,6 +175,11 @@ export interface SemanticExecutionRuntime {
|
|
|
172
175
|
}
|
|
173
176
|
export interface ExecutionContext {
|
|
174
177
|
runtime?: SemanticExecutionRuntime;
|
|
178
|
+
/**
|
|
179
|
+
* Per-call result-cache controls. `false` bypasses the cache entirely;
|
|
180
|
+
* `{ ttlMs }` opts this call into caching (or overrides the client default).
|
|
181
|
+
*/
|
|
182
|
+
cache?: SemanticCacheRuntime | false;
|
|
175
183
|
}
|
|
176
184
|
export interface SemanticFilterDefinition {
|
|
177
185
|
__type: 'filter_definition';
|
|
@@ -275,7 +283,7 @@ type PeriodSelection<TQuery> = TQuery extends {
|
|
|
275
283
|
export type DatasetRow<TDataset extends DatasetInstance<any, any, any, any>> = {
|
|
276
284
|
[K in DatasetDimensionNames<TDataset>]?: InferDimensionType<TDataset['dimensions'][K]>;
|
|
277
285
|
} & {
|
|
278
|
-
[K in DatasetMeasureNames<TDataset>]?:
|
|
286
|
+
[K in DatasetMeasureNames<TDataset>]?: string;
|
|
279
287
|
} & {
|
|
280
288
|
period?: string;
|
|
281
289
|
};
|
|
@@ -283,7 +291,7 @@ export type DatasetRow<TDataset extends DatasetInstance<any, any, any, any>> = {
|
|
|
283
291
|
export type DatasetRowFor<TDataset extends DatasetInstance<any, any, any, any>, TQuery = DatasetQueryFor<TDataset>> = {
|
|
284
292
|
[K in SelectedDimensions<TDataset, TQuery>]?: InferDimensionType<TDataset['dimensions'][K]>;
|
|
285
293
|
} & {
|
|
286
|
-
[K in SelectedDatasetMeasures<TDataset, TQuery>]?:
|
|
294
|
+
[K in SelectedDatasetMeasures<TDataset, TQuery>]?: string;
|
|
287
295
|
} & PeriodSelection<TQuery>;
|
|
288
296
|
export interface DatasetQueryResultFor<TDataset extends DatasetInstance<any, any, any, any>, TQuery = DatasetQueryFor<TDataset>> {
|
|
289
297
|
data: DatasetRowFor<TDataset, TQuery>[];
|
|
@@ -303,7 +311,7 @@ export interface MetricQueryFor<TDataset extends DatasetInstance<any, any, any,
|
|
|
303
311
|
export type MetricRow<TDataset extends DatasetInstance<any, any, any, any>, TMetricName extends string> = {
|
|
304
312
|
[K in DatasetDimensionNames<TDataset>]?: InferDimensionType<TDataset['dimensions'][K]>;
|
|
305
313
|
} & {
|
|
306
|
-
[K in TMetricName]?:
|
|
314
|
+
[K in TMetricName]?: string;
|
|
307
315
|
} & {
|
|
308
316
|
period?: string;
|
|
309
317
|
};
|
|
@@ -311,7 +319,7 @@ export type MetricRow<TDataset extends DatasetInstance<any, any, any, any>, TMet
|
|
|
311
319
|
export type MetricRowFor<TDataset extends DatasetInstance<any, any, any, any>, TMetricName extends string, TQuery = MetricQueryFor<TDataset, TMetricName>> = {
|
|
312
320
|
[K in SelectedDimensions<TDataset, TQuery>]?: InferDimensionType<TDataset['dimensions'][K]>;
|
|
313
321
|
} & {
|
|
314
|
-
[K in TMetricName]?:
|
|
322
|
+
[K in TMetricName]?: string;
|
|
315
323
|
} & PeriodSelection<TQuery>;
|
|
316
324
|
export interface MetricResultFor<TDataset extends DatasetInstance<any, any, any, any>, TMetricName extends string, TQuery = MetricQueryFor<TDataset, TMetricName>> {
|
|
317
325
|
data: MetricRowFor<TDataset, TMetricName, TQuery>[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACnG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AACtE,MAAM,MAAM,aAAa,GAAG,SAAS,CAAC;AAEtC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB,CAAC,KAAK,SAAS,aAAa,GAAG,aAAa;IAC9E,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,mBAAmB,IAC1D,CAAC,CAAC,WAAW,CAAC,SAAS,QAAQ,GAAG,MAAM,GACxC,CAAC,CAAC,WAAW,CAAC,SAAS,QAAQ,GAAG,MAAM,GACxC,CAAC,CAAC,WAAW,CAAC,SAAS,SAAS,GAAG,OAAO,GAC1C,CAAC,CAAC,WAAW,CAAC,SAAS,WAAW,GAAG,MAAM,GAC3C,KAAK,CAAC;AAER,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACxF,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,MAAM,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,iBAAiB,CAAC,YAAY,SAAS,MAAM,GAAG,MAAM;IACrE,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAClD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,WAAW,CAAC;CAC1D;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,CAAC,YAAY,SAAS,MAAM,GAAG,MAAM,IACnE,eAAe,CACb,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACnC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACjC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,EACtC,YAAY,CACb,CAAC;AAEJ,MAAM,WAAW,SAAS,CACxB,YAAY,SAAS,MAAM,GAAG,MAAM,EACpC,WAAW,SAAS,MAAM,GAAG,MAAM,EACnC,KAAK,SAAS,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,GAAG,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,EACnH,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,oBAAoB,CAAC,YAAY,CAAC;IAElG,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,YAAY,CAAC;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,QAAQ,CAAC;IAClB,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnF,QAAQ,IAAI,cAAc,CAAC;CAC5B;AAED,MAAM,MAAM,aAAa,CACvB,YAAY,SAAS,MAAM,GAAG,MAAM,EACpC,WAAW,SAAS,MAAM,GAAG,MAAM,EACnC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,oBAAoB,CAAC,YAAY,CAAC,IAChG,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;AAEpE,MAAM,MAAM,gBAAgB,CAC1B,YAAY,SAAS,MAAM,GAAG,MAAM,EACpC,WAAW,SAAS,MAAM,GAAG,MAAM,EACnC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,oBAAoB,CAAC,YAAY,CAAC,IAChG,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;AAEpF,MAAM,WAAW,gBAAgB,CAC/B,YAAY,SAAS,MAAM,GAAG,MAAM,EACpC,WAAW,SAAS,MAAM,GAAG,MAAM,EACnC,KAAK,SAAS,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,GAAG,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,EACnH,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,oBAAoB,CAAC,YAAY,CAAC;IAElG,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9D,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,IAAI,cAAc,CAAC;CAC5B;AAED,MAAM,MAAM,YAAY,CACtB,YAAY,SAAS,MAAM,GAAG,MAAM,EACpC,WAAW,SAAS,MAAM,GAAG,MAAM,EACnC,KAAK,SAAS,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,GAAG,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,EACnH,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,oBAAoB,CAAC,YAAY,CAAC,IAChG,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAEzH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY,CAC3B,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,MAAM,GAAG,OAAO;IAEhB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAC3F,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,gFAAgF;IAChF,KAAK,CAAC,EAAE,qBAAqB,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvD,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GACd;IAAE,EAAE,EAAE,MAAM,EAAE,CAAA;CAAE,GAChB;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC;;;OAGG;IACH,KAAK,CAAC,EAAE,oBAAoB,GAAG,KAAK,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;CACxC;AAED,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB,CAC/B,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAEvF,OAAO,EAAE,MAAM,SAAS,GAAG,MAAM,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB,CAAC,YAAY,SAAS,MAAM,GAAG,MAAM;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IAClD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,WAAW,CAAC;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa,CAC5B,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC7F,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACvF,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAErF,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,eAAe,CAC9B,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC7F,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACvF,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACrF,YAAY,SAAS,MAAM,GAAG,MAAM;IAEpC,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,WAAW,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,yBAAyB,CAAC;IACnC,aAAa,EAAE,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,KAAK,SAAS,MAAM,EACzB,UAAU,EAAE,KAAK,EACjB,YAAY,EAAE,gBAAgB,CAAC,SAAS,CAAC,GACxC,aAAa,CAAC,YAAY,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IAC7G,MAAM,CAAC,KAAK,SAAS,MAAM,EACzB,UAAU,EAAE,KAAK,EACjB,YAAY,EAAE,mBAAmB,CAAC,YAAY,CAAC,GAC9C,gBAAgB,CAAC,YAAY,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;CACjH;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAC/C,MAAM,IAAI,eAAe,EAAE,CAAC;IAC5B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAC9C,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACnC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACjC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,EACtC,MAAM,CACP,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAChF,MAAM,QAAQ,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;AAExC,KAAK,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;KAC1D,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;CACnD,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;AAEpB,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;KAC9B,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,KAAK;CACxE,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,KAAK,yBAAyB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC9D;IAAC,eAAe,CAAC,CAAC,CAAC;CAAC,SAAS,CAAC,KAAK,CAAC,GAChC,kBAAkB,CAAC,CAAC,CAAC,GACrB,eAAe,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAejD,6CAA6C;AAC7C,MAAM,MAAM,qBAAqB,CAAC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IACpF,yBAAyB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;AAEpD,2CAA2C;AAC3C,MAAM,MAAM,mBAAmB,CAAC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAClF,yBAAyB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAElD;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,CAAC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAClF,qBAAqB,CAAC,QAAQ,CAAC,GAC/B,mBAAmB,CAAC,QAAQ,CAAC,GAC7B,QAAQ,CAAC;AAEb,8EAA8E;AAC9E,MAAM,WAAW,eAAe,CAAC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IACnF,UAAU,CAAC,EAAE,SAAS,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxD,QAAQ,CAAC,EAAE,SAAS,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpD,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,SAAS,aAAa,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,KAAK,kBAAkB,CACrB,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpD,MAAM,IACJ,MAAM,SAAS;IAAE,UAAU,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAA;CAAE,GACvD,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,GAC/C,KAAK,CAAC;AAEV,KAAK,uBAAuB,CAC1B,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpD,MAAM,IACJ,MAAM,SAAS;IAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAA;CAAE,GACrD,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,GAC7C,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAElC,KAAK,eAAe,CAAC,MAAM,IAAI,MAAM,SAAS;IAAE,EAAE,EAAE,SAAS,CAAA;CAAE,GAC3D;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnB,EAAE,CAAC;AAEP,yEAAyE;AACzE,MAAM,MAAM,UAAU,CAAC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IACvE;KAAG,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC1F;KAAG,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM;CAAE,GACjD;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExB,+DAA+D;AAC/D,MAAM,MAAM,aAAa,CACvB,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpD,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,IAEhC;KAAG,CAAC,IAAI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC/F;KAAG,CAAC,IAAI,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM;CAAE,GAC7D,eAAe,CAAC,MAAM,CAAC,CAAC;AAE5B,MAAM,WAAW,qBAAqB,CACpC,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpD,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC;IAElC,IAAI,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;IACxC,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED,0FAA0F;AAC1F,MAAM,WAAW,cAAc,CAC7B,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpD,WAAW,SAAS,MAAM;IAE1B,UAAU,CAAC,EAAE,SAAS,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,SAAS,aAAa,CAAC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,WAAW,GAAG,QAAQ,CAAC,EAAE,CAAC;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,yFAAyF;AACzF,MAAM,MAAM,SAAS,CACnB,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpD,WAAW,SAAS,MAAM,IAExB;KAAG,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC1F;KAAG,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,MAAM;CAAE,GAC/B;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExB,8DAA8D;AAC9D,MAAM,MAAM,YAAY,CACtB,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpD,WAAW,SAAS,MAAM,EAC1B,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,IAE5C;KAAG,CAAC,IAAI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC/F;KAAG,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,MAAM;CAAE,GAC/B,eAAe,CAAC,MAAM,CAAC,CAAC;AAE5B,MAAM,WAAW,eAAe,CAC9B,QAAQ,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpD,WAAW,SAAS,MAAM,EAC1B,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC;IAE9C,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;IACpD,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical serialization helpers shared by everything that needs stable,
|
|
3
|
+
* environment-independent output — contract hashing (contract.ts) and
|
|
4
|
+
* semantic cache keys (cache/query-signature.ts). Keep ordering logic here so
|
|
5
|
+
* the two paths cannot drift apart.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Locale-independent string comparison by UTF-16 code unit. Used everywhere
|
|
9
|
+
* canonical output sorts, so hashes and cache keys are stable across
|
|
10
|
+
* environments (CI ICU versions, locales) rather than depending on
|
|
11
|
+
* `localeCompare`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function compareStrings(left: string, right: string): number;
|
|
14
|
+
/** Builds an object whose keys are inserted in sorted order for stable JSON. */
|
|
15
|
+
export declare function sortedRecord<T>(entries: [string, T][]): Record<string, T>;
|
|
16
|
+
/** Deduplicates and sorts a list so logically-equal sets serialize identically. */
|
|
17
|
+
export declare function uniqueSorted(values: readonly string[]): string[];
|
|
18
|
+
/** JSON.stringify with recursively sorted object keys, so key order never matters. */
|
|
19
|
+
export declare function stableStringify(value: unknown): string;
|
|
20
|
+
//# sourceMappingURL=canonical-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../../src/utils/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAIzE;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAEhE;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAwBtD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical serialization helpers shared by everything that needs stable,
|
|
3
|
+
* environment-independent output — contract hashing (contract.ts) and
|
|
4
|
+
* semantic cache keys (cache/query-signature.ts). Keep ordering logic here so
|
|
5
|
+
* the two paths cannot drift apart.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Locale-independent string comparison by UTF-16 code unit. Used everywhere
|
|
9
|
+
* canonical output sorts, so hashes and cache keys are stable across
|
|
10
|
+
* environments (CI ICU versions, locales) rather than depending on
|
|
11
|
+
* `localeCompare`.
|
|
12
|
+
*/
|
|
13
|
+
export function compareStrings(left, right) {
|
|
14
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
15
|
+
}
|
|
16
|
+
/** Builds an object whose keys are inserted in sorted order for stable JSON. */
|
|
17
|
+
export function sortedRecord(entries) {
|
|
18
|
+
return Object.fromEntries([...entries].sort(([left], [right]) => compareStrings(left, right)));
|
|
19
|
+
}
|
|
20
|
+
/** Deduplicates and sorts a list so logically-equal sets serialize identically. */
|
|
21
|
+
export function uniqueSorted(values) {
|
|
22
|
+
return Array.from(new Set(values)).sort(compareStrings);
|
|
23
|
+
}
|
|
24
|
+
/** JSON.stringify with recursively sorted object keys, so key order never matters. */
|
|
25
|
+
export function stableStringify(value) {
|
|
26
|
+
if (typeof value === 'bigint') {
|
|
27
|
+
// JSON.stringify throws on bigint. The `n` suffix keeps 1n distinct from
|
|
28
|
+
// both the number 1 and the string "1n" (strings serialize with quotes).
|
|
29
|
+
return `${value}n`;
|
|
30
|
+
}
|
|
31
|
+
if (value === null || typeof value !== 'object') {
|
|
32
|
+
return JSON.stringify(value) ?? 'null';
|
|
33
|
+
}
|
|
34
|
+
if (Array.isArray(value)) {
|
|
35
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
36
|
+
}
|
|
37
|
+
const toJSON = value.toJSON;
|
|
38
|
+
if (typeof toJSON === 'function') {
|
|
39
|
+
// Match JSON.stringify semantics for Dates and other toJSON carriers.
|
|
40
|
+
// Without this, every Date serializes to '{}' (no enumerable props) and
|
|
41
|
+
// distinct date filters collapse onto one cache key.
|
|
42
|
+
return stableStringify(toJSON.call(value));
|
|
43
|
+
}
|
|
44
|
+
const entries = Object.entries(value)
|
|
45
|
+
.filter(([, entryValue]) => entryValue !== undefined)
|
|
46
|
+
.sort(([a], [b]) => compareStrings(a, b))
|
|
47
|
+
.map(([key, entryValue]) => `${JSON.stringify(key)}:${stableStringify(entryValue)}`);
|
|
48
|
+
return `{${entries.join(',')}}`;
|
|
49
|
+
}
|