@rocicorp/zero 1.10.0-canary.20 → 1.10.0-canary.22
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/out/analyze-query/src/analyze-cli.js +2 -2
- package/out/analyze-query/src/analyze-cli.js.map +1 -1
- package/out/replicache/src/dag/gc.d.ts.map +1 -1
- package/out/replicache/src/dag/gc.js +2 -1
- package/out/replicache/src/dag/gc.js.map +1 -1
- package/out/replicache/src/dag/invalid-ref-count-error.d.ts +12 -0
- package/out/replicache/src/dag/invalid-ref-count-error.d.ts.map +1 -0
- package/out/replicache/src/dag/invalid-ref-count-error.js +19 -0
- package/out/replicache/src/dag/invalid-ref-count-error.js.map +1 -0
- package/out/replicache/src/dag/store-impl.d.ts +12 -2
- package/out/replicache/src/dag/store-impl.d.ts.map +1 -1
- package/out/replicache/src/dag/store-impl.js +22 -8
- package/out/replicache/src/dag/store-impl.js.map +1 -1
- package/out/replicache/src/db/rebase.d.ts +14 -2
- package/out/replicache/src/db/rebase.d.ts.map +1 -1
- package/out/replicache/src/db/rebase.js +27 -5
- package/out/replicache/src/db/rebase.js.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts +15 -5
- package/out/replicache/src/kv/idb-store-with-mem-fallback.d.ts.map +1 -1
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js +25 -25
- package/out/replicache/src/kv/idb-store-with-mem-fallback.js.map +1 -1
- package/out/replicache/src/kv/idb-store.d.ts +9 -0
- package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
- package/out/replicache/src/kv/idb-store.js +14 -2
- package/out/replicache/src/kv/idb-store.js.map +1 -1
- package/out/replicache/src/kv/mem-store.d.ts +1 -0
- package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
- package/out/replicache/src/kv/mem-store.js +3 -0
- package/out/replicache/src/kv/mem-store.js.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.js +1 -1
- package/out/replicache/src/kv/op-sqlite/store.js.map +1 -1
- package/out/replicache/src/kv/sqlite-store.d.ts +2 -1
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/kv/sqlite-store.js +6 -1
- package/out/replicache/src/kv/sqlite-store.js.map +1 -1
- package/out/replicache/src/kv/store.d.ts +6 -0
- package/out/replicache/src/kv/store.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.d.ts +10 -5
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.js +16 -9
- package/out/replicache/src/persist/collect-idb-databases.js.map +1 -1
- package/out/replicache/src/persist/persist.d.ts.map +1 -1
- package/out/replicache/src/persist/persist.js +12 -5
- package/out/replicache/src/persist/persist.js.map +1 -1
- package/out/replicache/src/persist/refresh.js +6 -2
- package/out/replicache/src/persist/refresh.js.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts +14 -3
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.js +108 -11
- package/out/replicache/src/replicache-impl.js.map +1 -1
- package/out/replicache/src/replicache-options.d.ts +9 -0
- package/out/replicache/src/replicache-options.d.ts.map +1 -1
- package/out/shared/src/arrays.js +1 -15
- package/out/shared/src/arrays.js.map +1 -1
- package/out/shared/src/hash.d.ts +1 -0
- package/out/shared/src/hash.d.ts.map +1 -1
- package/out/shared/src/hash.js +10 -28
- package/out/shared/src/hash.js.map +1 -1
- package/out/shared/src/iterables.d.ts +2 -0
- package/out/shared/src/iterables.d.ts.map +1 -1
- package/out/shared/src/iterables.js +18 -1
- package/out/shared/src/iterables.js.map +1 -1
- package/out/shared/src/json.d.ts.map +1 -1
- package/out/shared/src/json.js +2 -2
- package/out/shared/src/json.js.map +1 -1
- package/out/shared/src/ring-buffer.d.ts +8 -0
- package/out/shared/src/ring-buffer.d.ts.map +1 -1
- package/out/shared/src/ring-buffer.js +22 -1
- package/out/shared/src/ring-buffer.js.map +1 -1
- package/out/shared/src/xxhash32.d.ts +36 -0
- package/out/shared/src/xxhash32.d.ts.map +1 -0
- package/out/shared/src/xxhash32.js +51 -0
- package/out/shared/src/xxhash32.js.map +1 -0
- package/out/z2s/src/compiler.js +1 -1
- package/out/zero/package.js +1 -1
- package/out/zero/package.js.map +1 -1
- package/out/zero-cache/src/auth/read-authorizer.js +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js +3 -2
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +2 -2
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +3 -3
- package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.js +1 -1
- package/out/zero-cache/src/services/run-ast.js +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +6 -10
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -1
- package/out/zero-cache/src/workers/connection.js +3 -3
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-client/src/client/connection-manager.d.ts +20 -0
- package/out/zero-client/src/client/connection-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-manager.js +32 -14
- package/out/zero-client/src/client/connection-manager.js.map +1 -1
- package/out/zero-client/src/client/connection-status-enum.d.ts +2 -0
- package/out/zero-client/src/client/connection-status-enum.d.ts.map +1 -1
- package/out/zero-client/src/client/connection-status-enum.js +3 -1
- package/out/zero-client/src/client/connection-status-enum.js.map +1 -1
- package/out/zero-client/src/client/connection.d.ts +6 -0
- package/out/zero-client/src/client/connection.d.ts.map +1 -1
- package/out/zero-client/src/client/connection.js +2 -1
- package/out/zero-client/src/client/connection.js.map +1 -1
- package/out/zero-client/src/client/context.d.ts +8 -11
- package/out/zero-client/src/client/context.d.ts.map +1 -1
- package/out/zero-client/src/client/context.js +11 -15
- package/out/zero-client/src/client/context.js.map +1 -1
- package/out/zero-client/src/client/custom.js +2 -2
- package/out/zero-client/src/client/custom.js.map +1 -1
- package/out/zero-client/src/client/error.js +1 -1
- package/out/zero-client/src/client/mutator-proxy.d.ts.map +1 -1
- package/out/zero-client/src/client/mutator-proxy.js +2 -1
- package/out/zero-client/src/client/mutator-proxy.js.map +1 -1
- package/out/zero-client/src/client/options.d.ts +3 -0
- package/out/zero-client/src/client/options.d.ts.map +1 -1
- package/out/zero-client/src/client/options.js.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts +2 -0
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.js +48 -9
- package/out/zero-client/src/client/query-manager.js.map +1 -1
- package/out/zero-client/src/client/version.js +1 -1
- package/out/zero-client/src/client/zero-rep.d.ts +1 -0
- package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-rep.js +7 -5
- package/out/zero-client/src/client/zero-rep.js.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +18 -3
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.js +59 -12
- package/out/zero-client/src/client/zero.js.map +1 -1
- package/out/zero-client/src/types/query-result.d.ts +2 -0
- package/out/zero-client/src/types/query-result.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.d.ts +64 -1
- package/out/zero-protocol/src/ast.d.ts.map +1 -1
- package/out/zero-protocol/src/ast.js +223 -51
- package/out/zero-protocol/src/ast.js.map +1 -1
- package/out/zero-protocol/src/query-hash-visitor.d.ts +81 -0
- package/out/zero-protocol/src/query-hash-visitor.d.ts.map +1 -0
- package/out/zero-protocol/src/query-hash-visitor.js +324 -0
- package/out/zero-protocol/src/query-hash-visitor.js.map +1 -0
- package/out/zero-protocol/src/query-hash.d.ts +7 -2
- package/out/zero-protocol/src/query-hash.d.ts.map +1 -1
- package/out/zero-protocol/src/query-hash.js +12 -9
- package/out/zero-protocol/src/query-hash.js.map +1 -1
- package/out/zero-react/src/use-query.d.ts +5 -4
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react/src/use-query.js +86 -9
- package/out/zero-react/src/use-query.js.map +1 -1
- package/out/zero-solid/src/solid-view.d.ts +10 -0
- package/out/zero-solid/src/solid-view.d.ts.map +1 -1
- package/out/zero-solid/src/solid-view.js +27 -0
- package/out/zero-solid/src/solid-view.js.map +1 -1
- package/out/zero-solid/src/use-query.js +5 -3
- package/out/zero-solid/src/use-query.js.map +1 -1
- package/out/zql/src/ivm/array-view.d.ts +10 -0
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +20 -8
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/cap.d.ts.map +1 -1
- package/out/zql/src/ivm/cap.js +5 -3
- package/out/zql/src/ivm/cap.js.map +1 -1
- package/out/zql/src/ivm/deferred-input.d.ts.map +1 -1
- package/out/zql/src/ivm/deferred-input.js +3 -2
- package/out/zql/src/ivm/deferred-input.js.map +1 -1
- package/out/zql/src/ivm/exists.d.ts +1 -1
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js +1 -1
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/ivm/fan-in.d.ts +2 -2
- package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-in.js +6 -5
- package/out/zql/src/ivm/fan-in.js.map +1 -1
- package/out/zql/src/ivm/fan-out.d.ts +2 -2
- package/out/zql/src/ivm/fan-out.d.ts.map +1 -1
- package/out/zql/src/ivm/fan-out.js.map +1 -1
- package/out/zql/src/ivm/filter-operators.d.ts +4 -4
- package/out/zql/src/ivm/filter-operators.d.ts.map +1 -1
- package/out/zql/src/ivm/filter-operators.js +10 -8
- package/out/zql/src/ivm/filter-operators.js.map +1 -1
- package/out/zql/src/ivm/filter.d.ts +2 -2
- package/out/zql/src/ivm/filter.d.ts.map +1 -1
- package/out/zql/src/ivm/filter.js +7 -4
- package/out/zql/src/ivm/filter.js.map +1 -1
- package/out/zql/src/ivm/flipped-join.js +2 -2
- package/out/zql/src/ivm/flipped-join.js.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.d.ts.map +1 -1
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js +6 -4
- package/out/zql/src/ivm/maybe-split-and-push-edit-change.js.map +1 -1
- package/out/zql/src/ivm/memory-source.d.ts +2 -2
- package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
- package/out/zql/src/ivm/memory-source.js +9 -9
- package/out/zql/src/ivm/memory-source.js.map +1 -1
- package/out/zql/src/ivm/take.d.ts.map +1 -1
- package/out/zql/src/ivm/take.js +3 -4
- package/out/zql/src/ivm/take.js.map +1 -1
- package/out/zql/src/ivm/union-fan-in.d.ts.map +1 -1
- package/out/zql/src/ivm/union-fan-in.js +9 -7
- package/out/zql/src/ivm/union-fan-in.js.map +1 -1
- package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
- package/out/zql/src/ivm/view-apply-change.js +3 -3
- package/out/zql/src/ivm/view-apply-change.js.map +1 -1
- package/out/zql/src/mutate/mutator-registry.d.ts.map +1 -1
- package/out/zql/src/mutate/mutator-registry.js +2 -2
- package/out/zql/src/mutate/mutator-registry.js.map +1 -1
- package/out/zql/src/query/query-delegate-base.d.ts +2 -0
- package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate-base.js +58 -31
- package/out/zql/src/query/query-delegate-base.js.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +11 -1
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +25 -14
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +414 -94
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query-internals.d.ts +21 -11
- package/out/zql/src/query/query-internals.d.ts.map +1 -1
- package/out/zql/src/query/query-internals.js.map +1 -1
- package/out/zql/src/query/query-transitions.d.ts +171 -0
- package/out/zql/src/query/query-transitions.d.ts.map +1 -0
- package/out/zql/src/query/query-transitions.js +207 -0
- package/out/zql/src/query/query-transitions.js.map +1 -0
- package/out/zql/src/query/query.d.ts +7 -1
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.d.ts +3 -2
- package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
- package/out/zql/src/query/runnable-query-impl.js +23 -2
- package/out/zql/src/query/runnable-query-impl.js.map +1 -1
- package/out/zql/src/query/typed-view.d.ts +1 -1
- package/out/zql/src/query/typed-view.d.ts.map +1 -1
- package/out/zqlite/src/table-source.d.ts.map +1 -1
- package/out/zqlite/src/table-source.js +7 -5
- package/out/zqlite/src/table-source.js.map +1 -1
- package/package.json +1 -1
package/out/shared/src/arrays.js
CHANGED
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
import { assert } from "./asserts.js";
|
|
2
2
|
//#region ../shared/src/arrays.ts
|
|
3
|
-
/**
|
|
4
|
-
* Returns `arr` as is if none of the elements are `undefined`.
|
|
5
|
-
* Otherwise returns a new array with only defined elements in `arr`.
|
|
6
|
-
*/
|
|
7
|
-
function defined(arr) {
|
|
8
|
-
let i = arr.findIndex((x) => x === void 0);
|
|
9
|
-
if (i < 0) return arr;
|
|
10
|
-
const defined = arr.slice(0, i);
|
|
11
|
-
for (i++; i < arr.length; i++) {
|
|
12
|
-
const x = arr[i];
|
|
13
|
-
if (x !== void 0) defined.push(x);
|
|
14
|
-
}
|
|
15
|
-
return defined;
|
|
16
|
-
}
|
|
17
3
|
function areEqual(arr1, arr2) {
|
|
18
4
|
return arr1.length === arr2.length && arr1.every((e, i) => e === arr2[i]);
|
|
19
5
|
}
|
|
@@ -40,6 +26,6 @@ function groupBy(arr, keyFn) {
|
|
|
40
26
|
return groups;
|
|
41
27
|
}
|
|
42
28
|
//#endregion
|
|
43
|
-
export { areEqual,
|
|
29
|
+
export { areEqual, groupBy, last, zip };
|
|
44
30
|
|
|
45
31
|
//# sourceMappingURL=arrays.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.js","names":[],"sources":["../../../../shared/src/arrays.ts"],"sourcesContent":["import {assert} from './asserts.ts';\n\n/**\n * Returns `arr` as is if none of the elements are `undefined`.\n * Otherwise returns a new array with only defined elements in `arr`.\n */\nexport function defined<T>(arr: (T | undefined)[]): T[] {\n // avoid an array copy if possible\n let i = arr.findIndex(x => x === undefined);\n if (i < 0) {\n return arr as T[];\n }\n const defined: T[] = arr.slice(0, i) as T[];\n for (i++; i < arr.length; i++) {\n const x = arr[i];\n if (x !== undefined) {\n defined.push(x);\n }\n }\n return defined;\n}\n\nexport function areEqual<T>(arr1: readonly T[], arr2: readonly T[]): boolean {\n return arr1.length === arr2.length && arr1.every((e, i) => e === arr2[i]);\n}\n\nexport function zip<T1, T2>(a1: readonly T1[], a2: readonly T2[]): [T1, T2][] {\n assert(a1.length === a2.length, 'zip: arrays must have equal length');\n const result: [T1, T2][] = [];\n for (let i = 0; i < a1.length; i++) {\n result.push([a1[i], a2[i]]);\n }\n return result;\n}\n\nexport function last<T>(arr: T[]): T | undefined {\n return arr.at(-1);\n}\n\nexport function groupBy<T, K>(\n arr: readonly T[],\n keyFn: (el: T) => K,\n): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const el of arr) {\n const key = keyFn(el);\n let group = groups.get(key);\n if (group === undefined) {\n group = [];\n groups.set(key, group);\n }\n group.push(el);\n }\n return groups;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"arrays.js","names":[],"sources":["../../../../shared/src/arrays.ts"],"sourcesContent":["import {assert} from './asserts.ts';\n\n/**\n * Returns `arr` as is if none of the elements are `undefined`.\n * Otherwise returns a new array with only defined elements in `arr`.\n */\nexport function defined<T>(arr: (T | undefined)[]): T[] {\n // avoid an array copy if possible\n let i = arr.findIndex(x => x === undefined);\n if (i < 0) {\n return arr as T[];\n }\n const defined: T[] = arr.slice(0, i) as T[];\n for (i++; i < arr.length; i++) {\n const x = arr[i];\n if (x !== undefined) {\n defined.push(x);\n }\n }\n return defined;\n}\n\nexport function areEqual<T>(arr1: readonly T[], arr2: readonly T[]): boolean {\n return arr1.length === arr2.length && arr1.every((e, i) => e === arr2[i]);\n}\n\nexport function zip<T1, T2>(a1: readonly T1[], a2: readonly T2[]): [T1, T2][] {\n assert(a1.length === a2.length, 'zip: arrays must have equal length');\n const result: [T1, T2][] = [];\n for (let i = 0; i < a1.length; i++) {\n result.push([a1[i], a2[i]]);\n }\n return result;\n}\n\nexport function last<T>(arr: T[]): T | undefined {\n return arr.at(-1);\n}\n\nexport function groupBy<T, K>(\n arr: readonly T[],\n keyFn: (el: T) => K,\n): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const el of arr) {\n const key = keyFn(el);\n let group = groups.get(key);\n if (group === undefined) {\n group = [];\n groups.set(key, group);\n }\n group.push(el);\n }\n return groups;\n}\n"],"mappings":";;AAsBA,SAAgB,SAAY,MAAoB,MAA6B;CAC3E,OAAO,KAAK,WAAW,KAAK,UAAU,KAAK,OAAO,GAAG,MAAM,MAAM,KAAK,EAAE;AAC1E;AAEA,SAAgB,IAAY,IAAmB,IAA+B;CAC5E,OAAO,GAAG,WAAW,GAAG,QAAQ,oCAAoC;CACpE,MAAM,SAAqB,CAAC;CAC5B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,KAC7B,OAAO,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;CAE5B,OAAO;AACT;AAEA,SAAgB,KAAQ,KAAyB;CAC/C,OAAO,IAAI,GAAG,EAAE;AAClB;AAEA,SAAgB,QACd,KACA,OACa;CACb,MAAM,yBAAS,IAAI,IAAY;CAC/B,KAAK,MAAM,MAAM,KAAK;EACpB,MAAM,MAAM,MAAM,EAAE;EACpB,IAAI,QAAQ,OAAO,IAAI,GAAG;EAC1B,IAAI,UAAU,KAAA,GAAW;GACvB,QAAQ,CAAC;GACT,OAAO,IAAI,KAAK,KAAK;EACvB;EACA,MAAM,KAAK,EAAE;CACf;CACA,OAAO;AACT"}
|
package/out/shared/src/hash.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../shared/src/hash.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../shared/src/hash.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,WAG5B,CAAC;AACF,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,WAAe,CAAC;AAC7C,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,WAAe,CAAC;AAkJ9C,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC"}
|
package/out/shared/src/hash.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { PRIME32_1, PRIME32_2, PRIME32_3, PRIME32_4, PRIME32_5, avalanche32, round32 } from "./xxhash32.js";
|
|
1
2
|
//#region ../shared/src/hash.ts
|
|
2
3
|
var h32 = (s) => {
|
|
3
4
|
digest(s, 1);
|
|
@@ -5,23 +6,11 @@ var h32 = (s) => {
|
|
|
5
6
|
};
|
|
6
7
|
var h64 = (s) => wide(s, 2);
|
|
7
8
|
var h128 = (s) => wide(s, 4);
|
|
8
|
-
var PRIME32_1 = 2654435761;
|
|
9
|
-
var PRIME32_2 = 2246822519;
|
|
10
|
-
var PRIME32_3 = 3266489917;
|
|
11
|
-
var PRIME32_4 = 668265263;
|
|
12
|
-
var PRIME32_5 = 374761393;
|
|
13
9
|
var MAX_WORDS = 4;
|
|
14
10
|
var accs = new Int32Array(MAX_WORDS);
|
|
15
11
|
var stripes = new Int32Array(MAX_WORDS * 4);
|
|
16
12
|
var digests = new Uint32Array(MAX_WORDS);
|
|
17
13
|
var encoder;
|
|
18
|
-
function round(acc, lane) {
|
|
19
|
-
const laneN0 = lane & 65535;
|
|
20
|
-
const laneN1 = lane >>> 16;
|
|
21
|
-
acc = acc + (laneN0 * PRIME32_2 + (laneN1 * PRIME32_2 << 16)) & 4294967295;
|
|
22
|
-
acc = acc << 13 | acc >>> 19;
|
|
23
|
-
return (acc & 65535) * PRIME32_1 + ((acc >>> 16) * PRIME32_1 << 16) & 4294967295;
|
|
24
|
-
}
|
|
25
14
|
/**
|
|
26
15
|
* xxHash32 over the UTF-8 bytes of `str` under seeds `0..words-1`, leaving the
|
|
27
16
|
* digests in `digests[0..words)`.
|
|
@@ -53,10 +42,10 @@ function digest(str, words) {
|
|
|
53
42
|
const l3 = b[offset + 12] | b[offset + 13] << 8 | b[offset + 14] << 16 | b[offset + 15] << 24;
|
|
54
43
|
for (let w = 0; w < words; w++) {
|
|
55
44
|
const base = w << 2;
|
|
56
|
-
stripes[base] =
|
|
57
|
-
stripes[base + 1] =
|
|
58
|
-
stripes[base + 2] =
|
|
59
|
-
stripes[base + 3] =
|
|
45
|
+
stripes[base] = round32(stripes[base], l0);
|
|
46
|
+
stripes[base + 1] = round32(stripes[base + 1], l1);
|
|
47
|
+
stripes[base + 2] = round32(stripes[base + 2], l2);
|
|
48
|
+
stripes[base + 3] = round32(stripes[base + 3], l3);
|
|
60
49
|
}
|
|
61
50
|
}
|
|
62
51
|
for (let w = 0; w < words; w++) {
|
|
@@ -75,27 +64,20 @@ function digest(str, words) {
|
|
|
75
64
|
const laneN1 = b[offset + 2] + (b[offset + 3] << 8);
|
|
76
65
|
const laneP = laneN0 * PRIME32_3 + (laneN1 * PRIME32_3 << 16);
|
|
77
66
|
for (let w = 0; w < words; w++) {
|
|
78
|
-
let acc = accs[w] + laneP
|
|
67
|
+
let acc = accs[w] + laneP | 0;
|
|
79
68
|
acc = acc << 17 | acc >>> 15;
|
|
80
|
-
accs[w] = (acc
|
|
69
|
+
accs[w] = Math.imul(acc, PRIME32_4);
|
|
81
70
|
}
|
|
82
71
|
}
|
|
83
72
|
for (; offset < len; ++offset) {
|
|
84
73
|
const lane = b[offset];
|
|
85
74
|
for (let w = 0; w < words; w++) {
|
|
86
|
-
let acc = accs[w] + lane
|
|
75
|
+
let acc = accs[w] + Math.imul(lane, PRIME32_5) | 0;
|
|
87
76
|
acc = acc << 11 | acc >>> 21;
|
|
88
|
-
accs[w] = (acc
|
|
77
|
+
accs[w] = Math.imul(acc, PRIME32_1);
|
|
89
78
|
}
|
|
90
79
|
}
|
|
91
|
-
for (let w = 0; w < words; w++)
|
|
92
|
-
let acc = accs[w];
|
|
93
|
-
acc = acc ^ acc >>> 15;
|
|
94
|
-
acc = ((acc & 65535) * PRIME32_2 & 4294967295) + ((acc >>> 16) * PRIME32_2 << 16);
|
|
95
|
-
acc = acc ^ acc >>> 13;
|
|
96
|
-
acc = ((acc & 65535) * PRIME32_3 & 4294967295) + ((acc >>> 16) * PRIME32_3 << 16);
|
|
97
|
-
digests[w] = acc ^ acc >>> 16;
|
|
98
|
-
}
|
|
80
|
+
for (let w = 0; w < words; w++) digests[w] = avalanche32(accs[w]);
|
|
99
81
|
}
|
|
100
82
|
/**
|
|
101
83
|
* A hash wider than 32 bits, folding `words` digests together highest seed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","names":[],"sources":["../../../../shared/src/hash.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"hash.js","names":[],"sources":["../../../../shared/src/hash.ts"],"sourcesContent":["import {\n avalanche32,\n PRIME32_1,\n PRIME32_2,\n PRIME32_3,\n PRIME32_4,\n PRIME32_5,\n round32,\n} from './xxhash32.ts';\n\nexport const h32 = (s: string) => {\n digest(s, 1);\n return digests[0];\n};\nexport const h64 = (s: string) => wide(s, 2);\nexport const h128 = (s: string) => wide(s, 4);\n\nconst MAX_WORDS = 4;\n\n// `digest` is synchronous and does not recurse, so these can be reused across\n// calls instead of allocated per call.\nconst accs = new Int32Array(MAX_WORDS);\nconst stripes = new Int32Array(MAX_WORDS * 4);\nconst digests = new Uint32Array(MAX_WORDS);\nlet encoder: TextEncoder | undefined;\n\n/**\n * xxHash32 over the UTF-8 bytes of `str` under seeds `0..words-1`, leaving the\n * digests in `digests[0..words)`.\n *\n * A seed only changes the initial accumulator values, so every word digests the\n * same input lanes. This walks the bytes once, advancing all `words` sets of\n * accumulators per lane, and UTF-8 encodes the string once. The result is\n * identical to `words` separate `xxHash32(str, i)` calls — which is what this\n * used to delegate to, and what `hash.test.ts` checks it still matches.\n */\nfunction digest(str: string, words: number): void {\n const b = (encoder ??= new TextEncoder()).encode(str);\n const len = b.length;\n\n for (let w = 0; w < words; w++) {\n accs[w] = (w + PRIME32_5) & 0xffffffff;\n }\n\n let offset = 0;\n\n /*\n Step 2. Process stripes\n A stripe is a contiguous segment of 16 bytes, evenly divided into 4 lanes\n of 4 bytes each, each lane updating its own accumulator. Inputs shorter\n than a stripe skip straight to step 4 with a single accumulator.\n */\n if (len >= 16) {\n for (let w = 0; w < words; w++) {\n const base = w << 2;\n stripes[base] = (w + PRIME32_1 + PRIME32_2) & 0xffffffff;\n stripes[base + 1] = (w + PRIME32_2) & 0xffffffff;\n stripes[base + 2] = w;\n stripes[base + 3] = (w - PRIME32_1) & 0xffffffff;\n }\n\n const limit = len - 16;\n for (; offset <= limit; offset += 16) {\n const l0 =\n b[offset] |\n (b[offset + 1] << 8) |\n (b[offset + 2] << 16) |\n (b[offset + 3] << 24);\n const l1 =\n b[offset + 4] |\n (b[offset + 5] << 8) |\n (b[offset + 6] << 16) |\n (b[offset + 7] << 24);\n const l2 =\n b[offset + 8] |\n (b[offset + 9] << 8) |\n (b[offset + 10] << 16) |\n (b[offset + 11] << 24);\n const l3 =\n b[offset + 12] |\n (b[offset + 13] << 8) |\n (b[offset + 14] << 16) |\n (b[offset + 15] << 24);\n for (let w = 0; w < words; w++) {\n const base = w << 2;\n stripes[base] = round32(stripes[base], l0);\n stripes[base + 1] = round32(stripes[base + 1], l1);\n stripes[base + 2] = round32(stripes[base + 2], l2);\n stripes[base + 3] = round32(stripes[base + 3], l3);\n }\n }\n\n /*\n Step 3. Accumulator convergence\n acc = (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18);\n */\n for (let w = 0; w < words; w++) {\n const base = w << 2;\n const s0 = stripes[base];\n const s1 = stripes[base + 1];\n const s2 = stripes[base + 2];\n const s3 = stripes[base + 3];\n accs[w] =\n (((s0 << 1) | (s0 >>> 31)) +\n ((s1 << 7) | (s1 >>> 25)) +\n ((s2 << 12) | (s2 >>> 20)) +\n ((s3 << 18) | (s3 >>> 14))) &\n 0xffffffff;\n }\n }\n\n // Step 4. Add input length.\n for (let w = 0; w < words; w++) {\n accs[w] = (accs[w] + len) & 0xffffffff;\n }\n\n // Step 5. Consume the remaining input, 4 bytes at a time and then 1 at a time.\n const limit4 = len - 4;\n for (; offset <= limit4; offset += 4) {\n const laneN0 = b[offset] + (b[offset + 1] << 8);\n const laneN1 = b[offset + 2] + (b[offset + 3] << 8);\n const laneP = laneN0 * PRIME32_3 + ((laneN1 * PRIME32_3) << 16);\n for (let w = 0; w < words; w++) {\n let acc = (accs[w] + laneP) | 0;\n acc = (acc << 17) | (acc >>> 15);\n accs[w] = Math.imul(acc, PRIME32_4);\n }\n }\n\n for (; offset < len; ++offset) {\n const lane = b[offset];\n for (let w = 0; w < words; w++) {\n let acc = (accs[w] + Math.imul(lane, PRIME32_5)) | 0;\n acc = (acc << 11) | (acc >>> 21);\n accs[w] = Math.imul(acc, PRIME32_1);\n }\n }\n\n // Step 6. Final mix (avalanche). The Uint32Array store turns any negatives\n // back into a positive number.\n for (let w = 0; w < words; w++) {\n digests[w] = avalanche32(accs[w]);\n }\n}\n\n/**\n * A hash wider than 32 bits, folding `words` digests together highest seed\n * first.\n */\nfunction wide(str: string, words: number): bigint {\n digest(str, words);\n let result = 0n;\n for (let w = 0; w < words; w++) {\n result = (result << 32n) + BigInt(digests[w]);\n }\n return result;\n}\n\n// Re-exported for zero-protocol's AST hash, which cannot import xxhash32.ts\n// directly without tripping a tsc 7.0.2 bug (see the import comment in\n// zero-protocol/src/query-hash-visitor.ts).\nexport {avalanche32, PRIME32_1, PRIME32_5, round32} from './xxhash32.ts';\n"],"mappings":"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"}
|
|
@@ -16,5 +16,7 @@ export declare function wrapIterable<T>(iter: Iterable<T>): IteratorWithHelpers<
|
|
|
16
16
|
*/
|
|
17
17
|
export declare function toSorted<T>(iter: Iterable<T>, compare?: (a: T, b: T) => number): T[];
|
|
18
18
|
export declare function some<T>(iterable: Iterable<T>, predicate: (item: T, index: number) => boolean): boolean;
|
|
19
|
+
export declare const emptyIterator: IterableIterator<any, undefined, any>;
|
|
20
|
+
export declare function makeEmptyIteratorWithReturn<T>(value: T): IterableIterator<any, T, any>;
|
|
19
21
|
export {};
|
|
20
22
|
//# sourceMappingURL=iterables.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iterables.d.ts","sourceRoot":"","sources":["../../../../shared/src/iterables.ts"],"names":[],"mappings":"AAAA,wBAAiB,aAAa,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,2BAIxD;AAwBD,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAK3D;AAED,wBAAiB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAOzD;AAKD,KAAK,mBAAmB,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;IAC1C,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC;IACnD,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC;CAC7C,CAAC;AA6CF,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GAC/B,CAAC,EAAE,CAGL;AAED,wBAAgB,IAAI,CAAC,CAAC,EACpB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAC7C,OAAO,CAQT"}
|
|
1
|
+
{"version":3,"file":"iterables.d.ts","sourceRoot":"","sources":["../../../../shared/src/iterables.ts"],"names":[],"mappings":"AAAA,wBAAiB,aAAa,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,2BAIxD;AAwBD,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAK3D;AAED,wBAAiB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAOzD;AAKD,KAAK,mBAAmB,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;IAC1C,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACpE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC;IACnD,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC;CAC7C,CAAC;AA6CF,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GAC/B,CAAC,EAAE,CAGL;AAED,wBAAgB,IAAI,CAAC,CAAC,EACpB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAC7C,OAAO,CAQT;AAuBD,eAAO,MAAM,aAAa,EAAE,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CACxB,CAAC;AAEzC,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,KAAK,EAAE,CAAC,GAEP,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAE/B"}
|
|
@@ -55,7 +55,24 @@ function some(iterable, predicate) {
|
|
|
55
55
|
for (const item of iterable) if (predicate(item, index++)) return true;
|
|
56
56
|
return false;
|
|
57
57
|
}
|
|
58
|
+
var EmptyIteratorWithReturn = class {
|
|
59
|
+
value;
|
|
60
|
+
done = true;
|
|
61
|
+
constructor(value) {
|
|
62
|
+
this.value = value;
|
|
63
|
+
}
|
|
64
|
+
[Symbol.iterator]() {
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
next() {
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
var emptyIterator = new EmptyIteratorWithReturn(void 0);
|
|
72
|
+
function makeEmptyIteratorWithReturn(value) {
|
|
73
|
+
return new EmptyIteratorWithReturn(value);
|
|
74
|
+
}
|
|
58
75
|
//#endregion
|
|
59
|
-
export { joinIterables, once, some, toSorted, wrapIterable };
|
|
76
|
+
export { emptyIterator, joinIterables, makeEmptyIteratorWithReturn, once, some, toSorted, wrapIterable };
|
|
60
77
|
|
|
61
78
|
//# sourceMappingURL=iterables.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iterables.js","names":["#iterator"],"sources":["../../../../shared/src/iterables.ts"],"sourcesContent":["export function* joinIterables<T>(...iters: Iterable<T>[]) {\n for (const iter of iters) {\n yield* iter;\n }\n}\n\nfunction* filterIter<T>(\n iter: Iterable<T>,\n p: (t: T, index: number) => boolean,\n): Iterable<T> {\n let index = 0;\n for (const t of iter) {\n if (p(t, index++)) {\n yield t;\n }\n }\n}\n\nfunction* mapIter<T, U>(\n iter: Iterable<T>,\n f: (t: T, index: number) => U,\n): Iterable<U> {\n let index = 0;\n for (const t of iter) {\n yield f(t, index++);\n }\n}\n\nexport function first<T>(stream: Iterable<T>): T | undefined {\n const it = stream[Symbol.iterator]();\n const {value} = it.next();\n it.return?.();\n return value;\n}\n\nexport function* once<T>(stream: Iterable<T>): Iterable<T> {\n const it = stream[Symbol.iterator]();\n const {value} = it.next();\n if (value !== undefined) {\n yield value;\n }\n it.return?.();\n}\n\n// ES2024 Iterator helpers are available in Node 22+ and part of ES2024.\n// https://github.com/tc39/proposal-iterator-helpers\n\ntype IteratorWithHelpers<T> = Iterator<T> & {\n map<U>(f: (t: T, index: number) => U): IteratorWithHelpers<U>;\n filter(p: (t: T, index: number) => boolean): IteratorWithHelpers<T>;\n some(p: (t: T, index: number) => boolean): boolean;\n [Symbol.iterator](): IteratorWithHelpers<T>;\n};\n\ntype IteratorConstructor = {\n from<T>(this: void, iter: Iterable<T>): IteratorWithHelpers<T>;\n};\n\n// Check if native Iterator.from is available and bind it once at startup\n// We use globalThis to access the runtime value safely\nconst iteratorCtor = (globalThis as {Iterator?: IteratorConstructor}).Iterator;\nconst nativeIteratorFrom = iteratorCtor?.from as\n | (<T>(iter: Iterable<T>) => IteratorWithHelpers<T>)\n | undefined;\n\nconst iteratorFrom: <T>(e: Iterable<T>) => IteratorWithHelpers<T> =\n nativeIteratorFrom ?? (e => new IterWrapper(e));\n\n// Fallback implementation for environments without ES2024 Iterator helpers\nclass IterWrapper<T> implements IteratorWithHelpers<T>, IterableIterator<T> {\n readonly #iterator: Iterator<T>;\n\n constructor(iterable: Iterable<T>) {\n this.#iterator = iterable[Symbol.iterator]();\n }\n\n next(): IteratorResult<T> {\n return this.#iterator.next();\n }\n\n [Symbol.iterator](): IteratorWithHelpers<T> {\n return this;\n }\n\n map<U>(f: (t: T, index: number) => U): IterWrapper<U> {\n return new IterWrapper(mapIter(this, f));\n }\n\n filter(p: (t: T, index: number) => boolean): IterWrapper<T> {\n return new IterWrapper(filterIter(this, p));\n }\n\n some(p: (t: T, index: number) => boolean): boolean {\n return some(this, p);\n }\n}\n\nexport function wrapIterable<T>(iter: Iterable<T>): IteratorWithHelpers<T> {\n return iteratorFrom(iter);\n}\n\n/**\n * This will make a new array where the elements are the same as the iterable\n * but sorted according to the compare function. If the compare function is not\n * provided, it will sort the elements in JS standard way which is string\n * compare.\n */\nexport function toSorted<T>(\n iter: Iterable<T>,\n compare?: (a: T, b: T) => number,\n): T[] {\n // oxlint-disable-next-line e18e/prefer-array-to-sorted\n return [...iter].sort(compare);\n}\n\nexport function some<T>(\n iterable: Iterable<T>,\n predicate: (item: T, index: number) => boolean,\n): boolean {\n let index = 0;\n for (const item of iterable) {\n if (predicate(item, index++)) {\n return true;\n }\n }\n return false;\n}\n"],"mappings":";AAAA,UAAiB,cAAiB,GAAG,OAAsB;CACzD,KAAK,MAAM,QAAQ,OACjB,OAAO;AAEX;AAEA,UAAU,WACR,MACA,GACa;CACb,IAAI,QAAQ;CACZ,KAAK,MAAM,KAAK,MACd,IAAI,EAAE,GAAG,OAAO,GACd,MAAM;AAGZ;AAEA,UAAU,QACR,MACA,GACa;CACb,IAAI,QAAQ;CACZ,KAAK,MAAM,KAAK,MACd,MAAM,EAAE,GAAG,OAAO;AAEtB;AASA,UAAiB,KAAQ,QAAkC;CACzD,MAAM,KAAK,OAAO,OAAO,UAAU;CACnC,MAAM,EAAC,UAAS,GAAG,KAAK;CACxB,IAAI,UAAU,KAAA,GACZ,MAAM;CAER,GAAG,SAAS;AACd;AAuBA,IAAM,eALgB,WAAgD,UAC7B,UAKhB,MAAK,IAAI,YAAY,CAAC;AAG/C,IAAM,cAAN,MAAM,YAAsE;CAC1E;CAEA,YAAY,UAAuB;EACjC,KAAKA,YAAY,SAAS,OAAO,UAAU;CAC7C;CAEA,OAA0B;EACxB,OAAO,KAAKA,UAAU,KAAK;CAC7B;CAEA,CAAC,OAAO,YAAoC;EAC1C,OAAO;CACT;CAEA,IAAO,GAA+C;EACpD,OAAO,IAAI,YAAY,QAAQ,MAAM,CAAC,CAAC;CACzC;CAEA,OAAO,GAAqD;EAC1D,OAAO,IAAI,YAAY,WAAW,MAAM,CAAC,CAAC;CAC5C;CAEA,KAAK,GAA8C;EACjD,OAAO,KAAK,MAAM,CAAC;CACrB;AACF;AAEA,SAAgB,aAAgB,MAA2C;CACzE,OAAO,aAAa,IAAI;AAC1B;;;;;;;AAQA,SAAgB,SACd,MACA,SACK;CAEL,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,OAAO;AAC/B;AAEA,SAAgB,KACd,UACA,WACS;CACT,IAAI,QAAQ;CACZ,KAAK,MAAM,QAAQ,UACjB,IAAI,UAAU,MAAM,OAAO,GACzB,OAAO;CAGX,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"iterables.js","names":["#iterator"],"sources":["../../../../shared/src/iterables.ts"],"sourcesContent":["export function* joinIterables<T>(...iters: Iterable<T>[]) {\n for (const iter of iters) {\n yield* iter;\n }\n}\n\nfunction* filterIter<T>(\n iter: Iterable<T>,\n p: (t: T, index: number) => boolean,\n): Iterable<T> {\n let index = 0;\n for (const t of iter) {\n if (p(t, index++)) {\n yield t;\n }\n }\n}\n\nfunction* mapIter<T, U>(\n iter: Iterable<T>,\n f: (t: T, index: number) => U,\n): Iterable<U> {\n let index = 0;\n for (const t of iter) {\n yield f(t, index++);\n }\n}\n\nexport function first<T>(stream: Iterable<T>): T | undefined {\n const it = stream[Symbol.iterator]();\n const {value} = it.next();\n it.return?.();\n return value;\n}\n\nexport function* once<T>(stream: Iterable<T>): Iterable<T> {\n const it = stream[Symbol.iterator]();\n const {value} = it.next();\n if (value !== undefined) {\n yield value;\n }\n it.return?.();\n}\n\n// ES2024 Iterator helpers are available in Node 22+ and part of ES2024.\n// https://github.com/tc39/proposal-iterator-helpers\n\ntype IteratorWithHelpers<T> = Iterator<T> & {\n map<U>(f: (t: T, index: number) => U): IteratorWithHelpers<U>;\n filter(p: (t: T, index: number) => boolean): IteratorWithHelpers<T>;\n some(p: (t: T, index: number) => boolean): boolean;\n [Symbol.iterator](): IteratorWithHelpers<T>;\n};\n\ntype IteratorConstructor = {\n from<T>(this: void, iter: Iterable<T>): IteratorWithHelpers<T>;\n};\n\n// Check if native Iterator.from is available and bind it once at startup\n// We use globalThis to access the runtime value safely\nconst iteratorCtor = (globalThis as {Iterator?: IteratorConstructor}).Iterator;\nconst nativeIteratorFrom = iteratorCtor?.from as\n | (<T>(iter: Iterable<T>) => IteratorWithHelpers<T>)\n | undefined;\n\nconst iteratorFrom: <T>(e: Iterable<T>) => IteratorWithHelpers<T> =\n nativeIteratorFrom ?? (e => new IterWrapper(e));\n\n// Fallback implementation for environments without ES2024 Iterator helpers\nclass IterWrapper<T> implements IteratorWithHelpers<T>, IterableIterator<T> {\n readonly #iterator: Iterator<T>;\n\n constructor(iterable: Iterable<T>) {\n this.#iterator = iterable[Symbol.iterator]();\n }\n\n next(): IteratorResult<T> {\n return this.#iterator.next();\n }\n\n [Symbol.iterator](): IteratorWithHelpers<T> {\n return this;\n }\n\n map<U>(f: (t: T, index: number) => U): IterWrapper<U> {\n return new IterWrapper(mapIter(this, f));\n }\n\n filter(p: (t: T, index: number) => boolean): IterWrapper<T> {\n return new IterWrapper(filterIter(this, p));\n }\n\n some(p: (t: T, index: number) => boolean): boolean {\n return some(this, p);\n }\n}\n\nexport function wrapIterable<T>(iter: Iterable<T>): IteratorWithHelpers<T> {\n return iteratorFrom(iter);\n}\n\n/**\n * This will make a new array where the elements are the same as the iterable\n * but sorted according to the compare function. If the compare function is not\n * provided, it will sort the elements in JS standard way which is string\n * compare.\n */\nexport function toSorted<T>(\n iter: Iterable<T>,\n compare?: (a: T, b: T) => number,\n): T[] {\n // oxlint-disable-next-line e18e/prefer-array-to-sorted\n return [...iter].sort(compare);\n}\n\nexport function some<T>(\n iterable: Iterable<T>,\n predicate: (item: T, index: number) => boolean,\n): boolean {\n let index = 0;\n for (const item of iterable) {\n if (predicate(item, index++)) {\n return true;\n }\n }\n return false;\n}\n\nclass EmptyIteratorWithReturn<T>\n // oxlint-disable-next-line typescript/no-explicit-any\n implements IterableIterator<any, T, any>, IteratorReturnResult<T>\n{\n readonly value: T;\n readonly done = true;\n\n constructor(value: T) {\n this.value = value;\n }\n\n [Symbol.iterator]() {\n return this;\n }\n\n next() {\n return this;\n }\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const emptyIterator: IterableIterator<any, undefined, any> =\n new EmptyIteratorWithReturn(undefined);\n\nexport function makeEmptyIteratorWithReturn<T>(\n value: T,\n // oxlint-disable-next-line typescript/no-explicit-any\n): IterableIterator<any, T, any> {\n return new EmptyIteratorWithReturn(value);\n}\n"],"mappings":";AAAA,UAAiB,cAAiB,GAAG,OAAsB;CACzD,KAAK,MAAM,QAAQ,OACjB,OAAO;AAEX;AAEA,UAAU,WACR,MACA,GACa;CACb,IAAI,QAAQ;CACZ,KAAK,MAAM,KAAK,MACd,IAAI,EAAE,GAAG,OAAO,GACd,MAAM;AAGZ;AAEA,UAAU,QACR,MACA,GACa;CACb,IAAI,QAAQ;CACZ,KAAK,MAAM,KAAK,MACd,MAAM,EAAE,GAAG,OAAO;AAEtB;AASA,UAAiB,KAAQ,QAAkC;CACzD,MAAM,KAAK,OAAO,OAAO,UAAU;CACnC,MAAM,EAAC,UAAS,GAAG,KAAK;CACxB,IAAI,UAAU,KAAA,GACZ,MAAM;CAER,GAAG,SAAS;AACd;AAuBA,IAAM,eALgB,WAAgD,UAC7B,UAKhB,MAAK,IAAI,YAAY,CAAC;AAG/C,IAAM,cAAN,MAAM,YAAsE;CAC1E;CAEA,YAAY,UAAuB;EACjC,KAAKA,YAAY,SAAS,OAAO,UAAU;CAC7C;CAEA,OAA0B;EACxB,OAAO,KAAKA,UAAU,KAAK;CAC7B;CAEA,CAAC,OAAO,YAAoC;EAC1C,OAAO;CACT;CAEA,IAAO,GAA+C;EACpD,OAAO,IAAI,YAAY,QAAQ,MAAM,CAAC,CAAC;CACzC;CAEA,OAAO,GAAqD;EAC1D,OAAO,IAAI,YAAY,WAAW,MAAM,CAAC,CAAC;CAC5C;CAEA,KAAK,GAA8C;EACjD,OAAO,KAAK,MAAM,CAAC;CACrB;AACF;AAEA,SAAgB,aAAgB,MAA2C;CACzE,OAAO,aAAa,IAAI;AAC1B;;;;;;;AAQA,SAAgB,SACd,MACA,SACK;CAEL,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,OAAO;AAC/B;AAEA,SAAgB,KACd,UACA,WACS;CACT,IAAI,QAAQ;CACZ,KAAK,MAAM,QAAQ,UACjB,IAAI,UAAU,MAAM,OAAO,GACzB,OAAO;CAGX,OAAO;AACT;AAEA,IAAM,0BAAN,MAGA;CACE;CACA,OAAgB;CAEhB,YAAY,OAAU;EACpB,KAAK,QAAQ;CACf;CAEA,CAAC,OAAO,YAAY;EAClB,OAAO;CACT;CAEA,OAAO;EACL,OAAO;CACT;AACF;AAGA,IAAa,gBACX,IAAI,wBAAwB,KAAA,CAAS;AAEvC,SAAgB,4BACd,OAE+B;CAC/B,OAAO,IAAI,wBAAwB,KAAK;AAC1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../../shared/src/json.ts"],"names":[],"mappings":"AAIA,iDAAiD;AACjD,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,CAAC,SAAS,CAAC,GAChB,UAAU,CAAC;AAEf;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,UAAU,GAAG;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;CAAC,CAAC;AAEhE,iDAAiD;AACjD,MAAM,MAAM,iBAAiB,GACzB,IAAI,GACJ,MAAM,GACN,OAAO,GACP,MAAM,GACN,aAAa,CAAC,iBAAiB,CAAC,GAChC,kBAAkB,CAAC;AAEvB,kDAAkD;AAClD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAAC;CACvD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE,iBAAiB,GAAG,SAAS,EAChC,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAC/B,OAAO,
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../../shared/src/json.ts"],"names":[],"mappings":"AAIA,iDAAiD;AACjD,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,CAAC,SAAS,CAAC,GAChB,UAAU,CAAC;AAEf;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,UAAU,GAAG;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;CAAC,CAAC;AAEhE,iDAAiD;AACjD,MAAM,MAAM,iBAAiB,GACzB,IAAI,GACJ,MAAM,GACN,OAAO,GACP,MAAM,GACN,aAAa,CAAC,iBAAiB,CAAC,GAChC,kBAAkB,CAAC;AAEvB,kDAAkD;AAClD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAAC;CACvD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE,iBAAiB,GAAG,SAAS,EAChC,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAC/B,OAAO,CA6ET;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,IAAI,SAAS,CAmBlE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,IAAI,UAAU,CAGpE;AAqBD,UAAU,IAAI;IACZ,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,GAAG,IAAI,IAAI,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,SAAS,CAgBlE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,UAAU,CAKpE;AA8BD,sEAAsE;AACtE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAC3B,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,GACT,CAAC,GACD;IAAC,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAC,CAAC"}
|
package/out/shared/src/json.js
CHANGED
|
@@ -33,12 +33,12 @@ function deepEqual(a, b) {
|
|
|
33
33
|
a = a;
|
|
34
34
|
b = b;
|
|
35
35
|
let aSize = 0;
|
|
36
|
-
for (const key in a) if (hasOwn(a, key)) {
|
|
36
|
+
for (const key in a) if (hasOwn(a, key) && a[key] !== void 0) {
|
|
37
37
|
if (!deepEqual(a[key], b[key])) return false;
|
|
38
38
|
aSize++;
|
|
39
39
|
}
|
|
40
40
|
let bSize = 0;
|
|
41
|
-
for (const key in b) if (hasOwn(b, key)) bSize++;
|
|
41
|
+
for (const key in b) if (hasOwn(b, key) && b[key] !== void 0) bSize++;
|
|
42
42
|
return aSize === bSize;
|
|
43
43
|
}
|
|
44
44
|
function assertJSONValue(v) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","names":[],"sources":["../../../../shared/src/json.ts"],"sourcesContent":["import {assertObject, throwInvalidType} from './asserts.ts';\nimport {skipAssertJSONValue} from './config.ts';\nimport {hasOwn} from './has-own.ts';\n\n/** The values that can be represented in JSON */\nexport type JSONValue =\n | null\n | string\n | boolean\n | number\n | Array<JSONValue>\n | JSONObject;\n\n/**\n * A JSON object. This is a map from strings to JSON values or `undefined`. We\n * allow `undefined` values as a convenience... but beware that the `undefined`\n * values do not round trip to the server. For example:\n *\n * ```\n * // Time t1\n * await tx.set('a', {a: undefined});\n *\n * // time passes, in a new transaction\n * const v = await tx.get('a');\n * console.log(v); // either {a: undefined} or {}\n * ```\n */\nexport type JSONObject = {[key: string]: JSONValue | undefined};\n\n/** Like {@link JSONValue} but deeply readonly */\nexport type ReadonlyJSONValue =\n | null\n | string\n | boolean\n | number\n | ReadonlyArray<ReadonlyJSONValue>\n | ReadonlyJSONObject;\n\n/** Like {@link JSONObject} but deeply readonly */\nexport type ReadonlyJSONObject = {\n readonly [key: string]: ReadonlyJSONValue | undefined;\n};\n\n/**\n * Checks deep equality of two JSON value with (almost) same semantics as\n * `JSON.stringify`. The only difference is that with `JSON.stringify` the\n * ordering of the properties in an object/map/dictionary matters. In\n * {@link deepEqual} the following two values are consider equal, even though the\n * strings JSON.stringify would produce is different:\n *\n * ```js\n * assert(deepEqual(t({a: 1, b: 2}, {b: 2, a: 1}))\n * ```\n */\nexport function deepEqual(\n a: ReadonlyJSONValue | undefined,\n b: ReadonlyJSONValue | undefined,\n): boolean {\n if (a === b) {\n return true;\n }\n\n if (typeof a !== typeof b) {\n return false;\n }\n\n switch (typeof a) {\n case 'boolean':\n case 'number':\n case 'string':\n return false;\n }\n\n // a cannot be undefined here because either a and b are undefined or their\n // types are different.\n // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion\n a = a!;\n\n // 'object'\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n\n if (a === null || b === null) {\n return false;\n }\n\n if (Array.isArray(b)) {\n return false;\n }\n\n // We know a and b are objects here but type inference is not smart enough.\n a = a as ReadonlyJSONObject;\n b = b as ReadonlyJSONObject;\n\n // We use for-in loops instead of for of Object.keys() to make sure deepEquals\n // does not allocate any objects.\n\n let aSize = 0;\n for (const key in a) {\n if (hasOwn(a, key)) {\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n aSize++;\n }\n }\n\n let bSize = 0;\n for (const key in b) {\n if (hasOwn(b, key)) {\n bSize++;\n }\n }\n\n return aSize === bSize;\n}\n\nexport function assertJSONValue(v: unknown): asserts v is JSONValue {\n if (skipAssertJSONValue) {\n return;\n }\n switch (typeof v) {\n case 'boolean':\n case 'number':\n case 'string':\n return;\n case 'object':\n if (v === null) {\n return;\n }\n if (Array.isArray(v)) {\n return assertJSONArray(v);\n }\n return assertObjectIsJSONObject(v as Record<string, unknown>);\n }\n throwInvalidType(v, 'JSON value');\n}\n\nexport function assertJSONObject(v: unknown): asserts v is JSONObject {\n assertObject(v);\n assertObjectIsJSONObject(v);\n}\n\nfunction assertObjectIsJSONObject(\n v: Record<string, unknown>,\n): asserts v is JSONObject {\n for (const k in v) {\n if (hasOwn(v, k)) {\n const value = v[k];\n if (value !== undefined) {\n assertJSONValue(value);\n }\n }\n }\n}\n\nfunction assertJSONArray(v: unknown[]): asserts v is JSONValue[] {\n for (const item of v) {\n assertJSONValue(item);\n }\n}\n\ninterface Path {\n push(key: string | number): void;\n pop(): void;\n}\n\n/**\n * Checks if a value is a JSON value. If there is a value that is not a JSON\n * value, the path parameter is updated to the path of the invalid value.\n */\nexport function isJSONValue(v: unknown, path: Path): v is JSONValue {\n switch (typeof v) {\n case 'boolean':\n case 'number':\n case 'string':\n return true;\n case 'object':\n if (v === null) {\n return true;\n }\n if (Array.isArray(v)) {\n return isJSONArray(v, path);\n }\n return objectIsJSONObject(v as Record<string, unknown>, path);\n }\n return false;\n}\n\nexport function isJSONObject(v: unknown, path: Path): v is JSONObject {\n if (typeof v !== 'object' || v === null) {\n return false;\n }\n return objectIsJSONObject(v as Record<string, unknown>, path);\n}\n\nfunction objectIsJSONObject(\n v: Record<string, unknown>,\n path: Path,\n): v is JSONObject {\n for (const k in v) {\n if (hasOwn(v, k)) {\n path.push(k);\n const value = v[k];\n if (value !== undefined && !isJSONValue(value, path)) {\n return false;\n }\n path.pop();\n }\n }\n return true;\n}\n\nfunction isJSONArray(v: unknown[], path: Path): v is JSONValue[] {\n for (let i = 0; i < v.length; i++) {\n path.push(i);\n if (!isJSONValue(v[i], path)) {\n return false;\n }\n path.pop();\n }\n return true;\n}\n\n/** Basic deep readonly type. It works for {@link JSONValue} types. */\nexport type DeepReadonly<T> = T extends\n | null\n | boolean\n | string\n | number\n | undefined\n ? T\n : {readonly [K in keyof T]: DeepReadonly<T[K]>};\n"],"mappings":";;;;;;;;;;;;;;;AAsDA,SAAgB,UACd,GACA,GACS;CACT,IAAI,MAAM,GACR,OAAO;CAGT,IAAI,OAAO,MAAM,OAAO,GACtB,OAAO;CAGT,QAAQ,OAAO,GAAf;EACE,KAAK;EACL,KAAK;EACL,KAAK,UACH,OAAO;CACX;CAKA,IAAI;CAGJ,IAAI,MAAM,QAAQ,CAAC,GAAG;EACpB,IAAI,CAAC,MAAM,QAAQ,CAAC,GAClB,OAAO;EAET,IAAI,EAAE,WAAW,EAAE,QACjB,OAAO;EAET,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,GACvB,OAAO;EAGX,OAAO;CACT;CAEA,IAAI,MAAM,QAAQ,MAAM,MACtB,OAAO;CAGT,IAAI,MAAM,QAAQ,CAAC,GACjB,OAAO;CAIT,IAAI;CACJ,IAAI;
|
|
1
|
+
{"version":3,"file":"json.js","names":[],"sources":["../../../../shared/src/json.ts"],"sourcesContent":["import {assertObject, throwInvalidType} from './asserts.ts';\nimport {skipAssertJSONValue} from './config.ts';\nimport {hasOwn} from './has-own.ts';\n\n/** The values that can be represented in JSON */\nexport type JSONValue =\n | null\n | string\n | boolean\n | number\n | Array<JSONValue>\n | JSONObject;\n\n/**\n * A JSON object. This is a map from strings to JSON values or `undefined`. We\n * allow `undefined` values as a convenience... but beware that the `undefined`\n * values do not round trip to the server. For example:\n *\n * ```\n * // Time t1\n * await tx.set('a', {a: undefined});\n *\n * // time passes, in a new transaction\n * const v = await tx.get('a');\n * console.log(v); // either {a: undefined} or {}\n * ```\n */\nexport type JSONObject = {[key: string]: JSONValue | undefined};\n\n/** Like {@link JSONValue} but deeply readonly */\nexport type ReadonlyJSONValue =\n | null\n | string\n | boolean\n | number\n | ReadonlyArray<ReadonlyJSONValue>\n | ReadonlyJSONObject;\n\n/** Like {@link JSONObject} but deeply readonly */\nexport type ReadonlyJSONObject = {\n readonly [key: string]: ReadonlyJSONValue | undefined;\n};\n\n/**\n * Checks deep equality of two JSON value with (almost) same semantics as\n * `JSON.stringify`. The only difference is that with `JSON.stringify` the\n * ordering of the properties in an object/map/dictionary matters. In\n * {@link deepEqual} the following two values are consider equal, even though the\n * strings JSON.stringify would produce is different:\n *\n * ```js\n * assert(deepEqual(t({a: 1, b: 2}, {b: 2, a: 1}))\n * ```\n */\nexport function deepEqual(\n a: ReadonlyJSONValue | undefined,\n b: ReadonlyJSONValue | undefined,\n): boolean {\n if (a === b) {\n return true;\n }\n\n if (typeof a !== typeof b) {\n return false;\n }\n\n switch (typeof a) {\n case 'boolean':\n case 'number':\n case 'string':\n return false;\n }\n\n // a cannot be undefined here because either a and b are undefined or their\n // types are different.\n // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion\n a = a!;\n\n // 'object'\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n\n if (a === null || b === null) {\n return false;\n }\n\n if (Array.isArray(b)) {\n return false;\n }\n\n // We know a and b are objects here but type inference is not smart enough.\n a = a as ReadonlyJSONObject;\n b = b as ReadonlyJSONObject;\n\n // We use for-in loops instead of for of Object.keys() to make sure deepEquals\n // does not allocate any objects.\n\n // The behavior we want is that property values that are undefined are treated\n // as if they do not exist. For example, the following two values are\n // considered equal:\n // ```\n // deepEqual({a: undefined}, {})\n // ```\n\n let aSize = 0;\n for (const key in a) {\n if (hasOwn(a, key) && a[key] !== undefined) {\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n aSize++;\n }\n }\n\n let bSize = 0;\n for (const key in b) {\n if (hasOwn(b, key) && b[key] !== undefined) {\n bSize++;\n }\n }\n\n return aSize === bSize;\n}\n\nexport function assertJSONValue(v: unknown): asserts v is JSONValue {\n if (skipAssertJSONValue) {\n return;\n }\n switch (typeof v) {\n case 'boolean':\n case 'number':\n case 'string':\n return;\n case 'object':\n if (v === null) {\n return;\n }\n if (Array.isArray(v)) {\n return assertJSONArray(v);\n }\n return assertObjectIsJSONObject(v as Record<string, unknown>);\n }\n throwInvalidType(v, 'JSON value');\n}\n\nexport function assertJSONObject(v: unknown): asserts v is JSONObject {\n assertObject(v);\n assertObjectIsJSONObject(v);\n}\n\nfunction assertObjectIsJSONObject(\n v: Record<string, unknown>,\n): asserts v is JSONObject {\n for (const k in v) {\n if (hasOwn(v, k)) {\n const value = v[k];\n if (value !== undefined) {\n assertJSONValue(value);\n }\n }\n }\n}\n\nfunction assertJSONArray(v: unknown[]): asserts v is JSONValue[] {\n for (const item of v) {\n assertJSONValue(item);\n }\n}\n\ninterface Path {\n push(key: string | number): void;\n pop(): void;\n}\n\n/**\n * Checks if a value is a JSON value. If there is a value that is not a JSON\n * value, the path parameter is updated to the path of the invalid value.\n */\nexport function isJSONValue(v: unknown, path: Path): v is JSONValue {\n switch (typeof v) {\n case 'boolean':\n case 'number':\n case 'string':\n return true;\n case 'object':\n if (v === null) {\n return true;\n }\n if (Array.isArray(v)) {\n return isJSONArray(v, path);\n }\n return objectIsJSONObject(v as Record<string, unknown>, path);\n }\n return false;\n}\n\nexport function isJSONObject(v: unknown, path: Path): v is JSONObject {\n if (typeof v !== 'object' || v === null) {\n return false;\n }\n return objectIsJSONObject(v as Record<string, unknown>, path);\n}\n\nfunction objectIsJSONObject(\n v: Record<string, unknown>,\n path: Path,\n): v is JSONObject {\n for (const k in v) {\n if (hasOwn(v, k)) {\n path.push(k);\n const value = v[k];\n if (value !== undefined && !isJSONValue(value, path)) {\n return false;\n }\n path.pop();\n }\n }\n return true;\n}\n\nfunction isJSONArray(v: unknown[], path: Path): v is JSONValue[] {\n for (let i = 0; i < v.length; i++) {\n path.push(i);\n if (!isJSONValue(v[i], path)) {\n return false;\n }\n path.pop();\n }\n return true;\n}\n\n/** Basic deep readonly type. It works for {@link JSONValue} types. */\nexport type DeepReadonly<T> = T extends\n | null\n | boolean\n | string\n | number\n | undefined\n ? T\n : {readonly [K in keyof T]: DeepReadonly<T[K]>};\n"],"mappings":";;;;;;;;;;;;;;;AAsDA,SAAgB,UACd,GACA,GACS;CACT,IAAI,MAAM,GACR,OAAO;CAGT,IAAI,OAAO,MAAM,OAAO,GACtB,OAAO;CAGT,QAAQ,OAAO,GAAf;EACE,KAAK;EACL,KAAK;EACL,KAAK,UACH,OAAO;CACX;CAKA,IAAI;CAGJ,IAAI,MAAM,QAAQ,CAAC,GAAG;EACpB,IAAI,CAAC,MAAM,QAAQ,CAAC,GAClB,OAAO;EAET,IAAI,EAAE,WAAW,EAAE,QACjB,OAAO;EAET,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,GACvB,OAAO;EAGX,OAAO;CACT;CAEA,IAAI,MAAM,QAAQ,MAAM,MACtB,OAAO;CAGT,IAAI,MAAM,QAAQ,CAAC,GACjB,OAAO;CAIT,IAAI;CACJ,IAAI;CAYJ,IAAI,QAAQ;CACZ,KAAK,MAAM,OAAO,GAChB,IAAI,OAAO,GAAG,GAAG,KAAK,EAAE,SAAS,KAAA,GAAW;EAC1C,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAC3B,OAAO;EAET;CACF;CAGF,IAAI,QAAQ;CACZ,KAAK,MAAM,OAAO,GAChB,IAAI,OAAO,GAAG,GAAG,KAAK,EAAE,SAAS,KAAA,GAC/B;CAIJ,OAAO,UAAU;AACnB;AAEA,SAAgB,gBAAgB,GAAoC;CAClE,IAAI,QACF;CAEF,QAAQ,OAAO,GAAf;EACE,KAAK;EACL,KAAK;EACL,KAAK,UACH;EACF,KAAK;GACH,IAAI,MAAM,MACR;GAEF,IAAI,MAAM,QAAQ,CAAC,GACjB,OAAO,gBAAgB,CAAC;GAE1B,OAAO,yBAAyB,CAA4B;CAChE;CACA,iBAAiB,GAAG,YAAY;AAClC;AAEA,SAAgB,iBAAiB,GAAqC;CACpE,aAAa,CAAC;CACd,yBAAyB,CAAC;AAC5B;AAEA,SAAS,yBACP,GACyB;CACzB,KAAK,MAAM,KAAK,GACd,IAAI,OAAO,GAAG,CAAC,GAAG;EAChB,MAAM,QAAQ,EAAE;EAChB,IAAI,UAAU,KAAA,GACZ,gBAAgB,KAAK;CAEzB;AAEJ;AAEA,SAAS,gBAAgB,GAAwC;CAC/D,KAAK,MAAM,QAAQ,GACjB,gBAAgB,IAAI;AAExB;;;;;AAWA,SAAgB,YAAY,GAAY,MAA4B;CAClE,QAAQ,OAAO,GAAf;EACE,KAAK;EACL,KAAK;EACL,KAAK,UACH,OAAO;EACT,KAAK;GACH,IAAI,MAAM,MACR,OAAO;GAET,IAAI,MAAM,QAAQ,CAAC,GACjB,OAAO,YAAY,GAAG,IAAI;GAE5B,OAAO,mBAAmB,GAA8B,IAAI;CAChE;CACA,OAAO;AACT;AAEA,SAAgB,aAAa,GAAY,MAA6B;CACpE,IAAI,OAAO,MAAM,YAAY,MAAM,MACjC,OAAO;CAET,OAAO,mBAAmB,GAA8B,IAAI;AAC9D;AAEA,SAAS,mBACP,GACA,MACiB;CACjB,KAAK,MAAM,KAAK,GACd,IAAI,OAAO,GAAG,CAAC,GAAG;EAChB,KAAK,KAAK,CAAC;EACX,MAAM,QAAQ,EAAE;EAChB,IAAI,UAAU,KAAA,KAAa,CAAC,YAAY,OAAO,IAAI,GACjD,OAAO;EAET,KAAK,IAAI;CACX;CAEF,OAAO;AACT;AAEA,SAAS,YAAY,GAAc,MAA8B;CAC/D,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;EACjC,KAAK,KAAK,CAAC;EACX,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,GACzB,OAAO;EAET,KAAK,IAAI;CACX;CACA,OAAO;AACT"}
|
|
@@ -14,6 +14,10 @@ export declare class RingBuffer<T> {
|
|
|
14
14
|
constructor(initialCapacity?: number);
|
|
15
15
|
get size(): number;
|
|
16
16
|
push(value: T): void;
|
|
17
|
+
/** Returns the last element, or `undefined` if empty. */
|
|
18
|
+
last(): T | undefined;
|
|
19
|
+
/** Replaces the last element, or appends it if empty. */
|
|
20
|
+
replaceLast(value: T): void;
|
|
17
21
|
/** Removes and returns the front element, or `undefined` if empty. */
|
|
18
22
|
shift(): T | undefined;
|
|
19
23
|
/**
|
|
@@ -28,5 +32,9 @@ export declare class RingBuffer<T> {
|
|
|
28
32
|
* Removes and returns all elements in FIFO order, resetting the buffer.
|
|
29
33
|
*/
|
|
30
34
|
drain(): T[];
|
|
35
|
+
/** Copies all elements in FIFO order without removing them. */
|
|
36
|
+
toArray(): T[];
|
|
37
|
+
/** Removes all elements and releases extra capacity. */
|
|
38
|
+
clear(): void;
|
|
31
39
|
}
|
|
32
40
|
//# sourceMappingURL=ring-buffer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../../../shared/src/ring-buffer.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,qBAAa,UAAU,CAAC,CAAC;;gBAMX,eAAe,SAA2B;IAKtD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAQpB,sEAAsE;IACtE,KAAK,IAAI,CAAC,GAAG,SAAS;IAqBtB;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAsBxB;;OAEG;IACH,KAAK,IAAI,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../../../shared/src/ring-buffer.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,qBAAa,UAAU,CAAC,CAAC;;gBAMX,eAAe,SAA2B;IAKtD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAQpB,yDAAyD;IACzD,IAAI,IAAI,CAAC,GAAG,SAAS;IAMrB,yDAAyD;IACzD,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAQ3B,sEAAsE;IACtE,KAAK,IAAI,CAAC,GAAG,SAAS;IAqBtB;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAsBxB;;OAEG;IACH,KAAK,IAAI,CAAC,EAAE;IAQZ,+DAA+D;IAC/D,OAAO,IAAI,CAAC,EAAE;IAQd,wDAAwD;IACxD,KAAK,IAAI,IAAI;CA+Cd"}
|
|
@@ -29,6 +29,15 @@ var RingBuffer = class {
|
|
|
29
29
|
this.#buffer[(this.#head + this.#size) % this.#capacity] = value;
|
|
30
30
|
this.#size++;
|
|
31
31
|
}
|
|
32
|
+
/** Returns the last element, or `undefined` if empty. */
|
|
33
|
+
last() {
|
|
34
|
+
return this.#size === 0 ? void 0 : this.#buffer[(this.#head + this.#size - 1) % this.#capacity];
|
|
35
|
+
}
|
|
36
|
+
/** Replaces the last element, or appends it if empty. */
|
|
37
|
+
replaceLast(value) {
|
|
38
|
+
if (this.#size === 0) this.push(value);
|
|
39
|
+
else this.#buffer[(this.#head + this.#size - 1) % this.#capacity] = value;
|
|
40
|
+
}
|
|
32
41
|
/** Removes and returns the front element, or `undefined` if empty. */
|
|
33
42
|
shift() {
|
|
34
43
|
if (this.#size === 0) return;
|
|
@@ -65,12 +74,24 @@ var RingBuffer = class {
|
|
|
65
74
|
* Removes and returns all elements in FIFO order, resetting the buffer.
|
|
66
75
|
*/
|
|
67
76
|
drain() {
|
|
77
|
+
const result = this.toArray();
|
|
78
|
+
this.#head = 0;
|
|
79
|
+
this.#size = 0;
|
|
80
|
+
this.#buffer = Array.from({ length: this.#capacity });
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
/** Copies all elements in FIFO order without removing them. */
|
|
84
|
+
toArray() {
|
|
68
85
|
const result = Array.from({ length: this.#size });
|
|
69
86
|
for (let i = 0; i < this.#size; i++) result[i] = this.#buffer[(this.#head + i) % this.#capacity];
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/** Removes all elements and releases extra capacity. */
|
|
90
|
+
clear() {
|
|
70
91
|
this.#head = 0;
|
|
71
92
|
this.#size = 0;
|
|
93
|
+
this.#capacity = MIN_CAPACITY;
|
|
72
94
|
this.#buffer = Array.from({ length: this.#capacity });
|
|
73
|
-
return result;
|
|
74
95
|
}
|
|
75
96
|
/**
|
|
76
97
|
* Grows the buffer in place by doubling its length and relocating
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ring-buffer.js","names":["#capacity","#buffer","#size","#grow","#head","#shrink"],"sources":["../../../../shared/src/ring-buffer.ts"],"sourcesContent":["const DEFAULT_INITIAL_CAPACITY = 16;\nconst MIN_CAPACITY = 16;\n\n/**\n * A FIFO ring buffer backed by a circular array. Provides:\n *\n * - `push()` — O(1) amortized (O(n) on resize)\n * - `shift()` — O(1)\n * - `size` — O(1)\n * - `drain()` — O(n)\n *\n * The buffer grows (doubles) when full and shrinks (halves) when\n * utilization drops below 25%, bounded by {@link MIN_CAPACITY}.\n */\nexport class RingBuffer<T> {\n #buffer: (T | undefined)[];\n #head = 0;\n #size = 0;\n #capacity: number;\n\n constructor(initialCapacity = DEFAULT_INITIAL_CAPACITY) {\n this.#capacity = Math.max(MIN_CAPACITY, initialCapacity);\n this.#buffer = Array.from({length: initialCapacity});\n }\n\n get size(): number {\n return this.#size;\n }\n\n push(value: T): void {\n if (this.#size === this.#capacity) {\n this.#grow();\n }\n this.#buffer[(this.#head + this.#size) % this.#capacity] = value;\n this.#size++;\n }\n\n /** Removes and returns the front element, or `undefined` if empty. */\n shift(): T | undefined {\n if (this.#size === 0) {\n return undefined;\n }\n const value = this.#buffer[this.#head];\n this.#buffer[this.#head] = undefined; // allow GC of removed element\n this.#head = (this.#head + 1) % this.#capacity;\n this.#size--;\n\n // Shrink when utilization drops below 25%, keeping a minimum capacity.\n if (\n this.#size > 0 &&\n this.#size < this.#capacity >> 2 &&\n this.#capacity > MIN_CAPACITY\n ) {\n this.#shrink();\n }\n\n return value;\n }\n\n /**\n * Removes all elements matching `value` (by identity `===`).\n *\n * This is O(n) — suitable for rare operations like cancellation.\n *\n * @returns The number of elements removed.\n */\n delete(value: T): number {\n if (this.#size === 0) {\n return 0;\n }\n // Rebuild the buffer without matching elements.\n const newBuffer: (T | undefined)[] = Array.from({length: this.#capacity});\n let newSize = 0;\n let count = 0;\n for (let i = 0; i < this.#size; i++) {\n const item = this.#buffer[(this.#head + i) % this.#capacity];\n if (item === value) {\n count++;\n } else {\n newBuffer[newSize++] = item;\n }\n }\n this.#buffer = newBuffer;\n this.#head = 0;\n this.#size = newSize;\n return count;\n }\n\n /**\n * Removes and returns all elements in FIFO order, resetting the buffer.\n */\n drain(): T[] {\n const result = Array.from<T>({length: this.#size});\n for (let i = 0; i < this.#size; i++) {\n result[i] = this.#buffer[(this.#head + i) % this.#capacity] as T;\n }\n this.#head = 0;\n this.#size = 0;\n this.#buffer = Array.from({length: this.#capacity});\n
|
|
1
|
+
{"version":3,"file":"ring-buffer.js","names":["#capacity","#buffer","#size","#grow","#head","#shrink"],"sources":["../../../../shared/src/ring-buffer.ts"],"sourcesContent":["const DEFAULT_INITIAL_CAPACITY = 16;\nconst MIN_CAPACITY = 16;\n\n/**\n * A FIFO ring buffer backed by a circular array. Provides:\n *\n * - `push()` — O(1) amortized (O(n) on resize)\n * - `shift()` — O(1)\n * - `size` — O(1)\n * - `drain()` — O(n)\n *\n * The buffer grows (doubles) when full and shrinks (halves) when\n * utilization drops below 25%, bounded by {@link MIN_CAPACITY}.\n */\nexport class RingBuffer<T> {\n #buffer: (T | undefined)[];\n #head = 0;\n #size = 0;\n #capacity: number;\n\n constructor(initialCapacity = DEFAULT_INITIAL_CAPACITY) {\n this.#capacity = Math.max(MIN_CAPACITY, initialCapacity);\n this.#buffer = Array.from({length: initialCapacity});\n }\n\n get size(): number {\n return this.#size;\n }\n\n push(value: T): void {\n if (this.#size === this.#capacity) {\n this.#grow();\n }\n this.#buffer[(this.#head + this.#size) % this.#capacity] = value;\n this.#size++;\n }\n\n /** Returns the last element, or `undefined` if empty. */\n last(): T | undefined {\n return this.#size === 0\n ? undefined\n : this.#buffer[(this.#head + this.#size - 1) % this.#capacity];\n }\n\n /** Replaces the last element, or appends it if empty. */\n replaceLast(value: T): void {\n if (this.#size === 0) {\n this.push(value);\n } else {\n this.#buffer[(this.#head + this.#size - 1) % this.#capacity] = value;\n }\n }\n\n /** Removes and returns the front element, or `undefined` if empty. */\n shift(): T | undefined {\n if (this.#size === 0) {\n return undefined;\n }\n const value = this.#buffer[this.#head];\n this.#buffer[this.#head] = undefined; // allow GC of removed element\n this.#head = (this.#head + 1) % this.#capacity;\n this.#size--;\n\n // Shrink when utilization drops below 25%, keeping a minimum capacity.\n if (\n this.#size > 0 &&\n this.#size < this.#capacity >> 2 &&\n this.#capacity > MIN_CAPACITY\n ) {\n this.#shrink();\n }\n\n return value;\n }\n\n /**\n * Removes all elements matching `value` (by identity `===`).\n *\n * This is O(n) — suitable for rare operations like cancellation.\n *\n * @returns The number of elements removed.\n */\n delete(value: T): number {\n if (this.#size === 0) {\n return 0;\n }\n // Rebuild the buffer without matching elements.\n const newBuffer: (T | undefined)[] = Array.from({length: this.#capacity});\n let newSize = 0;\n let count = 0;\n for (let i = 0; i < this.#size; i++) {\n const item = this.#buffer[(this.#head + i) % this.#capacity];\n if (item === value) {\n count++;\n } else {\n newBuffer[newSize++] = item;\n }\n }\n this.#buffer = newBuffer;\n this.#head = 0;\n this.#size = newSize;\n return count;\n }\n\n /**\n * Removes and returns all elements in FIFO order, resetting the buffer.\n */\n drain(): T[] {\n const result = this.toArray();\n this.#head = 0;\n this.#size = 0;\n this.#buffer = Array.from({length: this.#capacity});\n return result;\n }\n\n /** Copies all elements in FIFO order without removing them. */\n toArray(): T[] {\n const result = Array.from<T>({length: this.#size});\n for (let i = 0; i < this.#size; i++) {\n result[i] = this.#buffer[(this.#head + i) % this.#capacity] as T;\n }\n return result;\n }\n\n /** Removes all elements and releases extra capacity. */\n clear(): void {\n this.#head = 0;\n this.#size = 0;\n this.#capacity = MIN_CAPACITY;\n this.#buffer = Array.from({length: this.#capacity});\n }\n\n /**\n * Grows the buffer in place by doubling its length and relocating\n * only the wrapped-around elements (those before #head) into the\n * newly available space. No new array is allocated.\n */\n #grow(): void {\n const oldLen = this.#buffer.length;\n const newLen = oldLen * 2;\n this.#buffer.length = newLen;\n this.#capacity = newLen;\n\n // Copy wrapped-around elements (indices 0..head-1) into the new space.\n for (let i = 0; i < this.#head; i++) {\n this.#buffer[oldLen + i] = this.#buffer[i];\n this.#buffer[i] = undefined; // ensure gc when the element is removed\n }\n }\n\n /**\n * Shrinks the buffer in place by halving its length. Elements whose\n * indices fall in the removed half are relocated into the lower half,\n * then the array is truncated.\n */\n #shrink(): void {\n const oldLen = this.#buffer.length;\n const newLen = Math.max(MIN_CAPACITY, oldLen >> 1);\n\n // Move elements that sit in the upper half down by newLen.\n const left = Math.max(newLen, this.#head);\n const right = Math.min(this.#head + this.#size, oldLen);\n for (let i = left; i < right; i++) {\n this.#buffer[i - newLen] = this.#buffer[i];\n }\n\n if (this.#head >= newLen) {\n this.#head -= newLen;\n }\n this.#buffer.length = newLen;\n this.#capacity = newLen;\n }\n}\n"],"mappings":";AAAA,IAAM,2BAA2B;AACjC,IAAM,eAAe;;;;;;;;;;;;AAarB,IAAa,aAAb,MAA2B;CACzB;CACA,QAAQ;CACR,QAAQ;CACR;CAEA,YAAY,kBAAkB,0BAA0B;EACtD,KAAKA,YAAY,KAAK,IAAI,cAAc,eAAe;EACvD,KAAKC,UAAU,MAAM,KAAK,EAAC,QAAQ,gBAAe,CAAC;CACrD;CAEA,IAAI,OAAe;EACjB,OAAO,KAAKC;CACd;CAEA,KAAK,OAAgB;EACnB,IAAI,KAAKA,UAAU,KAAKF,WACtB,KAAKG,MAAM;EAEb,KAAKF,SAAS,KAAKG,QAAQ,KAAKF,SAAS,KAAKF,aAAa;EAC3D,KAAKE;CACP;;CAGA,OAAsB;EACpB,OAAO,KAAKA,UAAU,IAClB,KAAA,IACA,KAAKD,SAAS,KAAKG,QAAQ,KAAKF,QAAQ,KAAK,KAAKF;CACxD;;CAGA,YAAY,OAAgB;EAC1B,IAAI,KAAKE,UAAU,GACjB,KAAK,KAAK,KAAK;OAEf,KAAKD,SAAS,KAAKG,QAAQ,KAAKF,QAAQ,KAAK,KAAKF,aAAa;CAEnE;;CAGA,QAAuB;EACrB,IAAI,KAAKE,UAAU,GACjB;EAEF,MAAM,QAAQ,KAAKD,QAAQ,KAAKG;EAChC,KAAKH,QAAQ,KAAKG,SAAS,KAAA;EAC3B,KAAKA,SAAS,KAAKA,QAAQ,KAAK,KAAKJ;EACrC,KAAKE;EAGL,IACE,KAAKA,QAAQ,KACb,KAAKA,QAAQ,KAAKF,aAAa,KAC/B,KAAKA,YAAY,cAEjB,KAAKK,QAAQ;EAGf,OAAO;CACT;;;;;;;;CASA,OAAO,OAAkB;EACvB,IAAI,KAAKH,UAAU,GACjB,OAAO;EAGT,MAAM,YAA+B,MAAM,KAAK,EAAC,QAAQ,KAAKF,UAAS,CAAC;EACxE,IAAI,UAAU;EACd,IAAI,QAAQ;EACZ,KAAK,IAAI,IAAI,GAAG,IAAI,KAAKE,OAAO,KAAK;GACnC,MAAM,OAAO,KAAKD,SAAS,KAAKG,QAAQ,KAAK,KAAKJ;GAClD,IAAI,SAAS,OACX;QAEA,UAAU,aAAa;EAE3B;EACA,KAAKC,UAAU;EACf,KAAKG,QAAQ;EACb,KAAKF,QAAQ;EACb,OAAO;CACT;;;;CAKA,QAAa;EACX,MAAM,SAAS,KAAK,QAAQ;EAC5B,KAAKE,QAAQ;EACb,KAAKF,QAAQ;EACb,KAAKD,UAAU,MAAM,KAAK,EAAC,QAAQ,KAAKD,UAAS,CAAC;EAClD,OAAO;CACT;;CAGA,UAAe;EACb,MAAM,SAAS,MAAM,KAAQ,EAAC,QAAQ,KAAKE,MAAK,CAAC;EACjD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAKA,OAAO,KAC9B,OAAO,KAAK,KAAKD,SAAS,KAAKG,QAAQ,KAAK,KAAKJ;EAEnD,OAAO;CACT;;CAGA,QAAc;EACZ,KAAKI,QAAQ;EACb,KAAKF,QAAQ;EACb,KAAKF,YAAY;EACjB,KAAKC,UAAU,MAAM,KAAK,EAAC,QAAQ,KAAKD,UAAS,CAAC;CACpD;;;;;;CAOA,QAAc;EACZ,MAAM,SAAS,KAAKC,QAAQ;EAC5B,MAAM,SAAS,SAAS;EACxB,KAAKA,QAAQ,SAAS;EACtB,KAAKD,YAAY;EAGjB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAKI,OAAO,KAAK;GACnC,KAAKH,QAAQ,SAAS,KAAK,KAAKA,QAAQ;GACxC,KAAKA,QAAQ,KAAK,KAAA;EACpB;CACF;;;;;;CAOA,UAAgB;EACd,MAAM,SAAS,KAAKA,QAAQ;EAC5B,MAAM,SAAS,KAAK,IAAI,cAAc,UAAU,CAAC;EAGjD,MAAM,OAAO,KAAK,IAAI,QAAQ,KAAKG,KAAK;EACxC,MAAM,QAAQ,KAAK,IAAI,KAAKA,QAAQ,KAAKF,OAAO,MAAM;EACtD,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO,KAC5B,KAAKD,QAAQ,IAAI,UAAU,KAAKA,QAAQ;EAG1C,IAAI,KAAKG,SAAS,QAChB,KAAKA,SAAS;EAEhB,KAAKH,QAAQ,SAAS;EACtB,KAAKD,YAAY;CACnB;AACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two arithmetic steps at the core of xxHash32, shared by everything here
|
|
3
|
+
* that builds a hash out of it.
|
|
4
|
+
*
|
|
5
|
+
* xxHash32 is defined over a byte stream, but its round and avalanche steps
|
|
6
|
+
* are just 32-bit word arithmetic and are reusable on their own. `hash.ts`
|
|
7
|
+
* feeds them UTF-8 bytes to produce digests bit-compatible with the reference
|
|
8
|
+
* implementation; `zero-protocol`'s AST hash feeds them words taken straight
|
|
9
|
+
* from a structure, never materializing bytes at all. Same mixing, different
|
|
10
|
+
* ingestion.
|
|
11
|
+
*
|
|
12
|
+
* These constants and steps are frozen: both callers' digests are persisted or
|
|
13
|
+
* compared against stored values, so changing anything here silently changes
|
|
14
|
+
* hashes across the system. `hash.test.ts` pins the byte-oriented side against
|
|
15
|
+
* the js-xxhash reference; `query-hash-visitor.test.ts` pins the word-oriented
|
|
16
|
+
* side against a corpus.
|
|
17
|
+
*/
|
|
18
|
+
export declare const PRIME32_1 = 2654435761;
|
|
19
|
+
export declare const PRIME32_2 = 2246822519;
|
|
20
|
+
export declare const PRIME32_3 = 3266489917;
|
|
21
|
+
export declare const PRIME32_4 = 668265263;
|
|
22
|
+
export declare const PRIME32_5 = 374761393;
|
|
23
|
+
/**
|
|
24
|
+
* One xxHash32 round: fold a 32-bit word into an accumulator.
|
|
25
|
+
*
|
|
26
|
+
* `Math.imul` is the whole multiply. Reference JS ports write it as two 16-bit
|
|
27
|
+
* half-multiplies recombined; that computes the same low 32 bits by a longer
|
|
28
|
+
* route, which is why moving to `Math.imul` left every digest unchanged.
|
|
29
|
+
*/
|
|
30
|
+
export declare function round32(acc: number, word: number): number;
|
|
31
|
+
/**
|
|
32
|
+
* xxHash32's final mix, spreading every input bit across the whole word.
|
|
33
|
+
* Returns an unsigned 32-bit number.
|
|
34
|
+
*/
|
|
35
|
+
export declare function avalanche32(acc: number): number;
|
|
36
|
+
//# sourceMappingURL=xxhash32.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xxhash32.d.ts","sourceRoot":"","sources":["../../../../shared/src/xxhash32.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,SAAS,YAAY,CAAC;AACnC,eAAO,MAAM,SAAS,YAAY,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region ../shared/src/xxhash32.ts
|
|
2
|
+
/**
|
|
3
|
+
* The two arithmetic steps at the core of xxHash32, shared by everything here
|
|
4
|
+
* that builds a hash out of it.
|
|
5
|
+
*
|
|
6
|
+
* xxHash32 is defined over a byte stream, but its round and avalanche steps
|
|
7
|
+
* are just 32-bit word arithmetic and are reusable on their own. `hash.ts`
|
|
8
|
+
* feeds them UTF-8 bytes to produce digests bit-compatible with the reference
|
|
9
|
+
* implementation; `zero-protocol`'s AST hash feeds them words taken straight
|
|
10
|
+
* from a structure, never materializing bytes at all. Same mixing, different
|
|
11
|
+
* ingestion.
|
|
12
|
+
*
|
|
13
|
+
* These constants and steps are frozen: both callers' digests are persisted or
|
|
14
|
+
* compared against stored values, so changing anything here silently changes
|
|
15
|
+
* hashes across the system. `hash.test.ts` pins the byte-oriented side against
|
|
16
|
+
* the js-xxhash reference; `query-hash-visitor.test.ts` pins the word-oriented
|
|
17
|
+
* side against a corpus.
|
|
18
|
+
*/
|
|
19
|
+
var PRIME32_1 = 2654435761;
|
|
20
|
+
var PRIME32_2 = 2246822519;
|
|
21
|
+
var PRIME32_3 = 3266489917;
|
|
22
|
+
var PRIME32_4 = 668265263;
|
|
23
|
+
var PRIME32_5 = 374761393;
|
|
24
|
+
/**
|
|
25
|
+
* One xxHash32 round: fold a 32-bit word into an accumulator.
|
|
26
|
+
*
|
|
27
|
+
* `Math.imul` is the whole multiply. Reference JS ports write it as two 16-bit
|
|
28
|
+
* half-multiplies recombined; that computes the same low 32 bits by a longer
|
|
29
|
+
* route, which is why moving to `Math.imul` left every digest unchanged.
|
|
30
|
+
*/
|
|
31
|
+
function round32(acc, word) {
|
|
32
|
+
acc = acc + Math.imul(word, PRIME32_2) | 0;
|
|
33
|
+
acc = acc << 13 | acc >>> 19;
|
|
34
|
+
return Math.imul(acc, PRIME32_1);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* xxHash32's final mix, spreading every input bit across the whole word.
|
|
38
|
+
* Returns an unsigned 32-bit number.
|
|
39
|
+
*/
|
|
40
|
+
function avalanche32(acc) {
|
|
41
|
+
acc ^= acc >>> 15;
|
|
42
|
+
acc = Math.imul(acc, PRIME32_2);
|
|
43
|
+
acc ^= acc >>> 13;
|
|
44
|
+
acc = Math.imul(acc, PRIME32_3);
|
|
45
|
+
acc ^= acc >>> 16;
|
|
46
|
+
return acc >>> 0;
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { PRIME32_1, PRIME32_2, PRIME32_3, PRIME32_4, PRIME32_5, avalanche32, round32 };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=xxhash32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xxhash32.js","names":[],"sources":["../../../../shared/src/xxhash32.ts"],"sourcesContent":["/**\n * The two arithmetic steps at the core of xxHash32, shared by everything here\n * that builds a hash out of it.\n *\n * xxHash32 is defined over a byte stream, but its round and avalanche steps\n * are just 32-bit word arithmetic and are reusable on their own. `hash.ts`\n * feeds them UTF-8 bytes to produce digests bit-compatible with the reference\n * implementation; `zero-protocol`'s AST hash feeds them words taken straight\n * from a structure, never materializing bytes at all. Same mixing, different\n * ingestion.\n *\n * These constants and steps are frozen: both callers' digests are persisted or\n * compared against stored values, so changing anything here silently changes\n * hashes across the system. `hash.test.ts` pins the byte-oriented side against\n * the js-xxhash reference; `query-hash-visitor.test.ts` pins the word-oriented\n * side against a corpus.\n */\n\nexport const PRIME32_1 = 2654435761;\nexport const PRIME32_2 = 2246822519;\nexport const PRIME32_3 = 3266489917;\nexport const PRIME32_4 = 668265263;\nexport const PRIME32_5 = 374761393;\n\n/**\n * One xxHash32 round: fold a 32-bit word into an accumulator.\n *\n * `Math.imul` is the whole multiply. Reference JS ports write it as two 16-bit\n * half-multiplies recombined; that computes the same low 32 bits by a longer\n * route, which is why moving to `Math.imul` left every digest unchanged.\n */\nexport function round32(acc: number, word: number): number {\n acc = (acc + Math.imul(word, PRIME32_2)) | 0;\n acc = (acc << 13) | (acc >>> 19);\n return Math.imul(acc, PRIME32_1);\n}\n\n/**\n * xxHash32's final mix, spreading every input bit across the whole word.\n * Returns an unsigned 32-bit number.\n */\nexport function avalanche32(acc: number): number {\n acc ^= acc >>> 15;\n acc = Math.imul(acc, PRIME32_2);\n acc ^= acc >>> 13;\n acc = Math.imul(acc, PRIME32_3);\n acc ^= acc >>> 16;\n return acc >>> 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,IAAa,YAAY;AACzB,IAAa,YAAY;AACzB,IAAa,YAAY;AACzB,IAAa,YAAY;AACzB,IAAa,YAAY;;;;;;;;AASzB,SAAgB,QAAQ,KAAa,MAAsB;CACzD,MAAO,MAAM,KAAK,KAAK,MAAM,SAAS,IAAK;CAC3C,MAAO,OAAO,KAAO,QAAQ;CAC7B,OAAO,KAAK,KAAK,KAAK,SAAS;AACjC;;;;;AAMA,SAAgB,YAAY,KAAqB;CAC/C,OAAO,QAAQ;CACf,MAAM,KAAK,KAAK,KAAK,SAAS;CAC9B,OAAO,QAAQ;CACf,MAAM,KAAK,KAAK,KAAK,SAAS;CAC9B,OAAO,QAAQ;CACf,OAAO,QAAQ;AACjB"}
|
package/out/z2s/src/compiler.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { assert, unreachable } from "../../shared/src/asserts.js";
|
|
2
2
|
import { hasOwn } from "../../shared/src/has-own.js";
|
|
3
3
|
import "../../shared/src/json.js";
|
|
4
|
-
import { last, zip } from "../../shared/src/arrays.js";
|
|
5
4
|
import { must } from "../../shared/src/must.js";
|
|
6
5
|
import { clientToServer } from "../../zero-schema/src/name-mapper.js";
|
|
7
6
|
import { completeOrdering } from "../../zql/src/query/complete-ordering.js";
|
|
7
|
+
import { last, zip } from "../../shared/src/arrays.js";
|
|
8
8
|
import { parse } from "../../shared/src/bigint-json.js";
|
|
9
9
|
import { sql, sqlConvertColumnArg, sqlConvertPluralLiteralArg, sqlConvertSingularLiteralArg } from "./sql.js";
|
|
10
10
|
//#region ../z2s/src/compiler.ts
|
package/out/zero/package.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var package_default = {
|
|
2
2
|
name: "@rocicorp/zero",
|
|
3
|
-
version: "1.10.0-canary.
|
|
3
|
+
version: "1.10.0-canary.22",
|
|
4
4
|
description: "Zero is a web framework for serverless web development.",
|
|
5
5
|
homepage: "https://zero.rocicorp.dev",
|
|
6
6
|
bugs: { "url": "https://bugs.rocicorp.dev" },
|
package/out/zero/package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","names":[],"sources":["../../package.json"],"sourcesContent":["{\n \"name\": \"@rocicorp/zero\",\n \"version\": \"1.10.0-canary.
|
|
1
|
+
{"version":3,"file":"package.js","names":[],"sources":["../../package.json"],"sourcesContent":["{\n \"name\": \"@rocicorp/zero\",\n \"version\": \"1.10.0-canary.22\",\n \"description\": \"Zero is a web framework for serverless web development.\",\n \"homepage\": \"https://zero.rocicorp.dev\",\n \"bugs\": {\n \"url\": \"https://bugs.rocicorp.dev\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"Rocicorp, Inc.\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/rocicorp/mono.git\",\n \"directory\": \"packages/zero\"\n },\n \"bin\": {\n \"analyze-query\": \"./out/zero/src/analyze-query.js\",\n \"ast-to-zql\": \"./out/zero/src/ast-to-zql.js\",\n \"transform-query\": \"./out/zero/src/transform-query.js\",\n \"zero-build-schema\": \"./out/zero/src/build-schema.js\",\n \"zero-cache\": \"./out/zero/src/cli.js\",\n \"zero-cache-dev\": \"./out/zero/src/zero-cache-dev.js\",\n \"zero-deploy-permissions\": \"./out/zero/src/deploy-permissions.js\",\n \"zero-out\": \"./out/zero/src/zero-out.js\"\n },\n \"files\": [\n \"out\",\n \"!*.tsbuildinfo\"\n ],\n \"type\": \"module\",\n \"main\": \"out/zero/src/zero.js\",\n \"module\": \"out/zero/src/zero.js\",\n \"types\": \"out/zero/src/zero.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./out/zero/src/zero.d.ts\",\n \"default\": \"./out/zero/src/zero.js\"\n },\n \"./analyze\": {\n \"types\": \"./out/zero/src/analyze.d.ts\",\n \"default\": \"./out/zero/src/analyze.js\"\n },\n \"./bindings\": {\n \"types\": \"./out/zero/src/bindings.d.ts\",\n \"default\": \"./out/zero/src/bindings.js\"\n },\n \"./change-protocol/v0\": {\n \"types\": \"./out/zero/src/change-protocol/v0.d.ts\",\n \"default\": \"./out/zero/src/change-protocol/v0.js\"\n },\n \"./expo-sqlite\": {\n \"types\": \"./out/zero/src/expo-sqlite.d.ts\",\n \"default\": \"./out/zero/src/expo-sqlite.js\"\n },\n \"./op-sqlite\": {\n \"types\": \"./out/zero/src/op-sqlite.d.ts\",\n \"default\": \"./out/zero/src/op-sqlite.js\"\n },\n \"./pg\": {\n \"types\": \"./out/zero/src/pg.d.ts\",\n \"default\": \"./out/zero/src/pg.js\"\n },\n \"./react\": {\n \"types\": \"./out/zero/src/react.d.ts\",\n \"default\": \"./out/zero/src/react.js\"\n },\n \"./react-native\": {\n \"types\": \"./out/zero/src/react-native.d.ts\",\n \"default\": \"./out/zero/src/react-native.js\"\n },\n \"./server\": {\n \"types\": \"./out/zero/src/server.d.ts\",\n \"default\": \"./out/zero/src/server.js\"\n },\n \"./server/adapters/drizzle\": {\n \"types\": \"./out/zero/src/adapters/drizzle.d.ts\",\n \"default\": \"./out/zero/src/adapters/drizzle.js\"\n },\n \"./server/adapters/kysely\": {\n \"types\": \"./out/zero/src/adapters/kysely.d.ts\",\n \"default\": \"./out/zero/src/adapters/kysely.js\"\n },\n \"./server/adapters/prisma\": {\n \"types\": \"./out/zero/src/adapters/prisma.d.ts\",\n \"default\": \"./out/zero/src/adapters/prisma.js\"\n },\n \"./server/adapters/pg\": {\n \"types\": \"./out/zero/src/adapters/pg.d.ts\",\n \"default\": \"./out/zero/src/adapters/pg.js\"\n },\n \"./server/adapters/postgresjs\": {\n \"types\": \"./out/zero/src/adapters/postgresjs.d.ts\",\n \"default\": \"./out/zero/src/adapters/postgresjs.js\"\n },\n \"./solid\": {\n \"types\": \"./out/zero/src/solid.d.ts\",\n \"default\": \"./out/zero/src/solid.js\"\n },\n \"./sqlite\": {\n \"types\": \"./out/zero/src/sqlite.d.ts\",\n \"default\": \"./out/zero/src/sqlite.js\"\n },\n \"./zqlite\": {\n \"types\": \"./out/zero/src/zqlite.d.ts\",\n \"default\": \"./out/zero/src/zqlite.js\"\n }\n },\n \"scripts\": {\n \"build\": \"node --experimental-strip-types --no-warnings tool/build.ts\",\n \"build:watch\": \"node --experimental-strip-types --no-warnings tool/build.ts --watch\",\n \"check-types\": \"tsc -p tsconfig.client.json && tsc -p tsconfig.server.json\",\n \"check-types:client:watch\": \"tsc -p tsconfig.client.json --watch\",\n \"check-types:server:watch\": \"tsc -p tsconfig.server.json --watch\",\n \"format\": \"oxfmt .\",\n \"check-format\": \"oxfmt --check .\",\n \"lint\": \"oxlint --quiet --config ../../oxlint.config.ts src/\",\n \"docs\": \"node --experimental-strip-types --no-warnings tool/generate-docs.ts\",\n \"docs:server\": \"node --watch --experimental-strip-types --no-warnings tool/generate-docs.ts --server\",\n \"fmt\": \"oxfmt .\",\n \"check-fmt\": \"oxfmt --check .\"\n },\n \"dependencies\": {\n \"@badrap/valita\": \"0.3.11\",\n \"@databases/escape-identifier\": \"^1.0.3\",\n \"@databases/sql\": \"^3.3.0\",\n \"@dotenvx/dotenvx\": \"^1.39.0\",\n \"@drdgvhbh/postgres-error-codes\": \"^0.0.6\",\n \"@fastify/cors\": \"^10.0.0\",\n \"@fastify/websocket\": \"^11.0.0\",\n \"@google-cloud/precise-date\": \"^4.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.218.0\",\n \"@opentelemetry/auto-instrumentations-node\": \"^0.76.0\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.218.0\",\n \"@opentelemetry/resources\": \"^2.7.1\",\n \"@opentelemetry/sdk-metrics\": \"^2.7.1\",\n \"@opentelemetry/sdk-node\": \"^0.218.0\",\n \"@opentelemetry/sdk-trace-node\": \"^2.7.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.41.1\",\n \"@postgresql-typed/oids\": \"^0.2.0\",\n \"@rocicorp/lock\": \"^1.0.4\",\n \"@rocicorp/logger\": \"^6.1.0\",\n \"@rocicorp/resolver\": \"^1.0.2\",\n \"@rocicorp/zero-sqlite3\": \"^1.1.4\",\n \"@standard-schema/spec\": \"^1.0.0\",\n \"@types/basic-auth\": \"^1.1.8\",\n \"@types/ws\": \"^8.5.12\",\n \"basic-auth\": \"^2.0.1\",\n \"chalk-template\": \"^1.1.0\",\n \"chokidar\": \"^4.0.1\",\n \"cloudevents\": \"^10.0.0\",\n \"command-line-args\": \"^6.0.1\",\n \"command-line-usage\": \"^7.0.3\",\n \"compare-utf8\": \"^0.2.3\",\n \"defu\": \"^6.1.4\",\n \"eventemitter3\": \"^5.0.1\",\n \"fastify\": \"^5.0.0\",\n \"is-in-subnet\": \"^4.0.1\",\n \"jose\": \"^5.9.3\",\n \"json-custom-numbers\": \"^3.1.1\",\n \"kasi\": \"^1.1.0\",\n \"nanoid\": \"^5.1.2\",\n \"oxfmt\": \"^0.45.0\",\n \"parse-prometheus-text-format\": \"^1.1.1\",\n \"pg-format\": \"npm:pg-format-fix@^1.0.5\",\n \"postgres\": \"3.4.7\",\n \"semver\": \"^7.5.4\",\n \"url-pattern\": \"^1.0.3\",\n \"urlpattern-polyfill\": \"^10.1.0\",\n \"ws\": \"^8.18.1\"\n },\n \"devDependencies\": {\n \"@op-engineering/op-sqlite\": \">=15\",\n \"@vitest/runner\": \"^4.1.6\",\n \"analyze-query\": \"workspace:*\",\n \"ast-to-zql\": \"workspace:*\",\n \"expo-sqlite\": \">=15\",\n \"oxc-parser\": \"^0.129.0\",\n \"replicache\": \"workspace:*\",\n \"shared\": \"workspace:*\",\n \"syncpack\": \"^14.3.0\",\n \"typedoc\": \"^0.28.17\",\n \"typedoc-plugin-markdown\": \"^4.10.0\",\n \"typescript\": \"~6.0.2\",\n \"vite\": \"^8.0.13\",\n \"vitest\": \"^4.1.6\",\n \"zero-cache\": \"workspace:*\",\n \"zero-client\": \"workspace:*\",\n \"zero-pg\": \"workspace:*\",\n \"zero-react\": \"workspace:*\",\n \"zero-server\": \"workspace:*\",\n \"zero-solid\": \"workspace:*\",\n \"zqlite\": \"workspace:*\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"pnpm@11.11.0\"\n}\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { hashOfAST } from "../../../zero-protocol/src/query-hash.js";
|
|
2
1
|
import { simplifyCondition } from "../../../zql/src/query/expression.js";
|
|
2
|
+
import { hashOfAST } from "../../../zero-protocol/src/query-hash.js";
|
|
3
3
|
import { bindStaticParameters } from "../../../zql/src/builder/builder.js";
|
|
4
4
|
//#region ../zero-cache/src/auth/read-authorizer.ts
|
|
5
5
|
/**
|