@earendil-works/chord 1.0.4 → 1.2.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.
Files changed (186) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +77 -194
  3. package/dist/cell.d.ts +101 -0
  4. package/dist/cell.d.ts.map +1 -0
  5. package/dist/cell.js +316 -0
  6. package/dist/cell.js.map +1 -0
  7. package/dist/cluster.d.ts +26 -0
  8. package/dist/cluster.d.ts.map +1 -0
  9. package/dist/cluster.js +214 -0
  10. package/dist/cluster.js.map +1 -0
  11. package/dist/connection.d.ts +157 -0
  12. package/dist/connection.d.ts.map +1 -0
  13. package/dist/connection.js +757 -0
  14. package/dist/connection.js.map +1 -0
  15. package/dist/context/index.d.ts +12 -1
  16. package/dist/context/index.d.ts.map +1 -1
  17. package/dist/context/index.js.map +1 -1
  18. package/dist/contract.d.ts +133 -0
  19. package/dist/contract.d.ts.map +1 -0
  20. package/dist/contract.js +157 -0
  21. package/dist/contract.js.map +1 -0
  22. package/dist/declare.d.ts +70 -0
  23. package/dist/declare.d.ts.map +1 -0
  24. package/dist/declare.js +22 -0
  25. package/dist/declare.js.map +1 -0
  26. package/dist/delta/apply-immutable-trusted.js.map +1 -1
  27. package/dist/delta/diff.d.ts +1 -1
  28. package/dist/delta/diff.d.ts.map +1 -1
  29. package/dist/delta/diff.js.map +1 -1
  30. package/dist/delta/index.d.ts +2 -2
  31. package/dist/delta/index.d.ts.map +1 -1
  32. package/dist/delta/index.js +41 -0
  33. package/dist/delta/index.js.map +1 -1
  34. package/dist/delta/revision-validator.d.ts +1 -1
  35. package/dist/delta/revision-validator.d.ts.map +1 -1
  36. package/dist/delta/revision-validator.js.map +1 -1
  37. package/dist/delta/tracker.d.ts +1 -1
  38. package/dist/delta/tracker.d.ts.map +1 -1
  39. package/dist/delta/tracker.js +40 -4
  40. package/dist/delta/tracker.js.map +1 -1
  41. package/dist/errors.d.ts +27 -0
  42. package/dist/errors.d.ts.map +1 -0
  43. package/dist/errors.js +44 -0
  44. package/dist/errors.js.map +1 -0
  45. package/dist/host.d.ts +254 -0
  46. package/dist/host.d.ts.map +1 -0
  47. package/dist/host.js +795 -0
  48. package/dist/host.js.map +1 -0
  49. package/dist/index.d.ts +17 -10
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +8 -8
  52. package/dist/index.js.map +1 -1
  53. package/dist/json.d.ts +9 -1
  54. package/dist/json.d.ts.map +1 -1
  55. package/dist/json.js.map +1 -1
  56. package/dist/link.d.ts +72 -0
  57. package/dist/link.d.ts.map +1 -0
  58. package/dist/link.js +169 -0
  59. package/dist/link.js.map +1 -0
  60. package/dist/loader.d.ts +4 -0
  61. package/dist/loader.d.ts.map +1 -0
  62. package/dist/loader.js +68 -0
  63. package/dist/loader.js.map +1 -0
  64. package/dist/manager.d.ts +115 -0
  65. package/dist/manager.d.ts.map +1 -0
  66. package/dist/manager.js +319 -0
  67. package/dist/manager.js.map +1 -0
  68. package/dist/node.d.ts +3 -4
  69. package/dist/node.d.ts.map +1 -1
  70. package/dist/node.js +3 -2
  71. package/dist/node.js.map +1 -1
  72. package/dist/publish.d.ts +5 -0
  73. package/dist/publish.d.ts.map +1 -0
  74. package/dist/publish.js +40 -0
  75. package/dist/publish.js.map +1 -0
  76. package/dist/record.d.ts +320 -0
  77. package/dist/record.d.ts.map +1 -0
  78. package/dist/record.js +1292 -0
  79. package/dist/record.js.map +1 -0
  80. package/dist/registry.d.ts +25 -0
  81. package/dist/registry.d.ts.map +1 -0
  82. package/dist/registry.js +6 -0
  83. package/dist/registry.js.map +1 -0
  84. package/dist/reload.d.ts +118 -0
  85. package/dist/reload.d.ts.map +1 -0
  86. package/dist/reload.js +589 -0
  87. package/dist/reload.js.map +1 -0
  88. package/dist/remote.d.ts +70 -0
  89. package/dist/remote.d.ts.map +1 -0
  90. package/dist/remote.js +308 -0
  91. package/dist/remote.js.map +1 -0
  92. package/dist/schema.d.ts +21 -0
  93. package/dist/schema.d.ts.map +1 -0
  94. package/dist/schema.js +228 -0
  95. package/dist/schema.js.map +1 -0
  96. package/dist/state.d.ts +92 -0
  97. package/dist/state.d.ts.map +1 -0
  98. package/dist/{services/state.js → state.js} +28 -138
  99. package/dist/state.js.map +1 -0
  100. package/dist/types.d.ts +62 -262
  101. package/dist/types.d.ts.map +1 -1
  102. package/dist/types.js.map +1 -1
  103. package/dist/websocket.d.ts +16 -0
  104. package/dist/websocket.d.ts.map +1 -0
  105. package/dist/websocket.js +15 -0
  106. package/dist/websocket.js.map +1 -0
  107. package/dist/wire.d.ts +135 -0
  108. package/dist/wire.d.ts.map +1 -0
  109. package/dist/wire.js +112 -0
  110. package/dist/wire.js.map +1 -0
  111. package/docs/guide.md +750 -0
  112. package/docs/spec.md +261 -0
  113. package/docs/tutorial.md +909 -0
  114. package/package.json +10 -11
  115. package/src/delta/README.md +5 -3
  116. package/dist/api.d.ts +0 -20
  117. package/dist/api.d.ts.map +0 -1
  118. package/dist/api.js +0 -77
  119. package/dist/api.js.map +0 -1
  120. package/dist/bundler.d.ts +0 -6
  121. package/dist/bundler.d.ts.map +0 -1
  122. package/dist/bundler.js +0 -3
  123. package/dist/bundler.js.map +0 -1
  124. package/dist/facets/host.d.ts +0 -12
  125. package/dist/facets/host.d.ts.map +0 -1
  126. package/dist/facets/host.js +0 -763
  127. package/dist/facets/host.js.map +0 -1
  128. package/dist/facets/loader.d.ts +0 -3
  129. package/dist/facets/loader.d.ts.map +0 -1
  130. package/dist/facets/loader.js +0 -5
  131. package/dist/facets/loader.js.map +0 -1
  132. package/dist/node/bundle-loader.d.ts +0 -30
  133. package/dist/node/bundle-loader.d.ts.map +0 -1
  134. package/dist/node/bundle-loader.js +0 -377
  135. package/dist/node/bundle-loader.js.map +0 -1
  136. package/dist/node/bundle.d.ts +0 -26
  137. package/dist/node/bundle.d.ts.map +0 -1
  138. package/dist/node/bundle.js +0 -183
  139. package/dist/node/bundle.js.map +0 -1
  140. package/dist/node/manifest.d.ts +0 -36
  141. package/dist/node/manifest.d.ts.map +0 -1
  142. package/dist/node/manifest.js +0 -6
  143. package/dist/node/manifest.js.map +0 -1
  144. package/dist/node/package.d.ts +0 -15
  145. package/dist/node/package.d.ts.map +0 -1
  146. package/dist/node/package.js +0 -199
  147. package/dist/node/package.js.map +0 -1
  148. package/dist/services/consumer.d.ts +0 -11
  149. package/dist/services/consumer.d.ts.map +0 -1
  150. package/dist/services/consumer.js +0 -585
  151. package/dist/services/consumer.js.map +0 -1
  152. package/dist/services/errors.d.ts +0 -8
  153. package/dist/services/errors.d.ts.map +0 -1
  154. package/dist/services/errors.js +0 -22
  155. package/dist/services/errors.js.map +0 -1
  156. package/dist/services/handle.d.ts +0 -15
  157. package/dist/services/handle.d.ts.map +0 -1
  158. package/dist/services/handle.js +0 -101
  159. package/dist/services/handle.js.map +0 -1
  160. package/dist/services/instances.d.ts +0 -26
  161. package/dist/services/instances.d.ts.map +0 -1
  162. package/dist/services/instances.js +0 -140
  163. package/dist/services/instances.js.map +0 -1
  164. package/dist/services/loopback.d.ts +0 -5
  165. package/dist/services/loopback.d.ts.map +0 -1
  166. package/dist/services/loopback.js +0 -15
  167. package/dist/services/loopback.js.map +0 -1
  168. package/dist/services/provider.d.ts +0 -37
  169. package/dist/services/provider.d.ts.map +0 -1
  170. package/dist/services/provider.js +0 -521
  171. package/dist/services/provider.js.map +0 -1
  172. package/dist/services/state-codec.d.ts +0 -15
  173. package/dist/services/state-codec.d.ts.map +0 -1
  174. package/dist/services/state-codec.js +0 -133
  175. package/dist/services/state-codec.js.map +0 -1
  176. package/dist/services/state-internals.d.ts +0 -13
  177. package/dist/services/state-internals.d.ts.map +0 -1
  178. package/dist/services/state-internals.js +0 -10
  179. package/dist/services/state-internals.js.map +0 -1
  180. package/dist/services/state.d.ts +0 -28
  181. package/dist/services/state.d.ts.map +0 -1
  182. package/dist/services/state.js.map +0 -1
  183. package/dist/services/wire.d.ts +0 -63
  184. package/dist/services/wire.d.ts.map +0 -1
  185. package/dist/services/wire.js +0 -186
  186. package/dist/services/wire.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ import type { Static, TSchema } from "typebox";
2
+ import type { Cell, Sources, SourceValues } from "./cell.ts";
3
+ import type { Ctx, Readable } from "./types.ts";
4
+ declare const DECL: unique symbol;
5
+ export interface Subscribable<E> {
6
+ subscribe(listener: (event: E) => void): () => void;
7
+ }
8
+ export interface CellDecl<T> {
9
+ readonly [DECL]: "cell";
10
+ readonly schema: TSchema;
11
+ readonly initial: T;
12
+ }
13
+ export interface ResourceSpec<T> {
14
+ /** Bump to replace the resource at the next reload. */
15
+ readonly rev: number;
16
+ /** Holds or resources that must be live/open first. A change replaces the resource. */
17
+ readonly deps?: readonly unknown[];
18
+ /** Exclusive resources are replaced at the gate: old closed before new opened. */
19
+ readonly exclusive?: boolean;
20
+ open(options: {
21
+ readonly signal: AbortSignal;
22
+ }): T | Promise<T>;
23
+ close?(value: T): void | Promise<void>;
24
+ }
25
+ export interface ResourceDecl<T> {
26
+ readonly [DECL]: "resource";
27
+ readonly spec: ResourceSpec<T>;
28
+ }
29
+ export interface Resource<T> {
30
+ readonly key: string;
31
+ /** Throws not_ready until opened. */
32
+ readonly value: T;
33
+ }
34
+ export interface ListenerDecl {
35
+ readonly [DECL]: "listener";
36
+ readonly source: unknown;
37
+ readonly select: ((value: never) => Subscribable<unknown>) | undefined;
38
+ readonly fn: (event: unknown, ctx: Ctx) => void | Promise<void>;
39
+ }
40
+ export interface DerivationDecl<T> {
41
+ readonly [DECL]: "derivation";
42
+ readonly sources: Sources;
43
+ readonly fn: (...values: never[]) => T;
44
+ }
45
+ /** A state cell: schema (required; there is no TypeScript at runtime) and initial value (validated). */
46
+ export declare const cell: <S extends TSchema>(schema: S, initial: Static<S>) => CellDecl<Static<S>>;
47
+ export declare const resource: <T>(spec: ResourceSpec<T>) => ResourceDecl<T>;
48
+ type ValueOf<S> = S extends Resource<infer T> ? T : S;
49
+ type EventOf<S> = S extends Resource<infer T> ? EventOf<T> : S extends Subscribable<infer E> ? E : never;
50
+ /**
51
+ * Reacts to a source once the record is live. `listener(source, fn)` subscribes to the source itself: a readable
52
+ * (cell, derivation, handle state member: called with each value, starting with the current one), an event source,
53
+ * or a resource whose value is one. `listener(source, select, fn)` subscribes to `select(value)`, where value is the
54
+ * opened resource for a resource source. Each event runs `fn` in a fresh root.
55
+ */
56
+ export declare function listener<S>(source: S, fn: (event: EventOf<S>, ctx: Ctx) => void | Promise<void>): ListenerDecl;
57
+ export declare function listener<S, E>(source: S, select: (value: ValueOf<S>) => Subscribable<E>, fn: (event: E, ctx: Ctx) => void | Promise<void>): ListenerDecl;
58
+ export declare const derivation: <const S extends Sources, T>(sources: S, fn: (...values: SourceValues<S>) => T) => DerivationDecl<T>;
59
+ export declare const declKind: (value: unknown) => string | undefined;
60
+ export type Cells<D> = {
61
+ readonly [K in keyof D]: D[K] extends CellDecl<infer T> ? Cell<T> : never;
62
+ };
63
+ export type Resources<D> = {
64
+ readonly [K in keyof D]: D[K] extends ResourceDecl<infer T> ? Resource<T> : never;
65
+ };
66
+ export type Derivations<D> = {
67
+ readonly [K in keyof D]: D[K] extends DerivationDecl<infer T> ? Readable<T> : never;
68
+ };
69
+ export {};
70
+ //# sourceMappingURL=declare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declare.d.ts","sourceRoot":"","sources":["../src/declare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ // Declaration descriptors. A factory passes them in object literals; the property name identifies the declaration
2
+ // across factory reruns (reload), independent of call order.
3
+ const DECL = Symbol("chord.decl");
4
+ /** A state cell: schema (required; there is no TypeScript at runtime) and initial value (validated). */
5
+ export const cell = (schema, initial) => ({
6
+ [DECL]: "cell",
7
+ schema,
8
+ initial,
9
+ });
10
+ export const resource = (spec) => ({ [DECL]: "resource", spec });
11
+ export function listener(source, ...rest) {
12
+ const [select, fn] = rest.length === 1 ? [undefined, rest[0]] : [rest[0], rest[1]];
13
+ return {
14
+ [DECL]: "listener",
15
+ source,
16
+ select: select,
17
+ fn: fn,
18
+ };
19
+ }
20
+ export const derivation = (sources, fn) => ({ [DECL]: "derivation", sources, fn: fn });
21
+ export const declKind = (value) => value !== null && typeof value === "object" ? value[DECL] : undefined;
22
+ //# sourceMappingURL=declare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declare.js","sourceRoot":"","sources":["../src/declare.ts"],"names":[],"mappings":"AAIA,kHAAkH;AAClH,6DAA6D;AAE7D,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AA+ClC,wGAAwG;AACxG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAoB,MAAS,EAAE,OAAkB,EAAuB,EAAE,CAAC,CAAC;IAC/F,CAAC,IAAI,CAAC,EAAE,MAAM;IACd,MAAM;IACN,OAAO;CACP,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,IAAqB,EAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AAiBtG,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,GAAG,IAAwB;IACpE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,OAAO;QACN,CAAC,IAAI,CAAC,EAAE,UAAU;QAClB,MAAM;QACN,MAAM,EAAE,MAAgC;QACxC,EAAE,EAAE,EAAwB;KAC5B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CACzB,OAAU,EACV,EAAqC,EACjB,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,EAA0C,EAAE,CAAC,CAAC;AAE5G,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAsB,EAAE,CAC9D,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,KAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["import type { Static, TSchema } from \"typebox\";\nimport type { Cell, Sources, SourceValues } from \"./cell.ts\";\nimport type { Ctx, Readable } from \"./types.ts\";\n\n// Declaration descriptors. A factory passes them in object literals; the property name identifies the declaration\n// across factory reruns (reload), independent of call order.\n\nconst DECL = Symbol(\"chord.decl\");\n\nexport interface Subscribable<E> {\n\tsubscribe(listener: (event: E) => void): () => void;\n}\n\nexport interface CellDecl<T> {\n\treadonly [DECL]: \"cell\";\n\treadonly schema: TSchema;\n\treadonly initial: T;\n}\n\nexport interface ResourceSpec<T> {\n\t/** Bump to replace the resource at the next reload. */\n\treadonly rev: number;\n\t/** Holds or resources that must be live/open first. A change replaces the resource. */\n\treadonly deps?: readonly unknown[];\n\t/** Exclusive resources are replaced at the gate: old closed before new opened. */\n\treadonly exclusive?: boolean;\n\topen(options: { readonly signal: AbortSignal }): T | Promise<T>;\n\tclose?(value: T): void | Promise<void>;\n}\n\nexport interface ResourceDecl<T> {\n\treadonly [DECL]: \"resource\";\n\treadonly spec: ResourceSpec<T>;\n}\n\nexport interface Resource<T> {\n\treadonly key: string;\n\t/** Throws not_ready until opened. */\n\treadonly value: T;\n}\n\nexport interface ListenerDecl {\n\treadonly [DECL]: \"listener\";\n\treadonly source: unknown;\n\treadonly select: ((value: never) => Subscribable<unknown>) | undefined;\n\treadonly fn: (event: unknown, ctx: Ctx) => void | Promise<void>;\n}\n\nexport interface DerivationDecl<T> {\n\treadonly [DECL]: \"derivation\";\n\treadonly sources: Sources;\n\treadonly fn: (...values: never[]) => T;\n}\n\n/** A state cell: schema (required; there is no TypeScript at runtime) and initial value (validated). */\nexport const cell = <S extends TSchema>(schema: S, initial: Static<S>): CellDecl<Static<S>> => ({\n\t[DECL]: \"cell\",\n\tschema,\n\tinitial,\n});\n\nexport const resource = <T>(spec: ResourceSpec<T>): ResourceDecl<T> => ({ [DECL]: \"resource\", spec });\n\ntype ValueOf<S> = S extends Resource<infer T> ? T : S;\ntype EventOf<S> = S extends Resource<infer T> ? EventOf<T> : S extends Subscribable<infer E> ? E : never;\n\n/**\n * Reacts to a source once the record is live. `listener(source, fn)` subscribes to the source itself: a readable\n * (cell, derivation, handle state member: called with each value, starting with the current one), an event source,\n * or a resource whose value is one. `listener(source, select, fn)` subscribes to `select(value)`, where value is the\n * opened resource for a resource source. Each event runs `fn` in a fresh root.\n */\nexport function listener<S>(source: S, fn: (event: EventOf<S>, ctx: Ctx) => void | Promise<void>): ListenerDecl;\nexport function listener<S, E>(\n\tsource: S,\n\tselect: (value: ValueOf<S>) => Subscribable<E>,\n\tfn: (event: E, ctx: Ctx) => void | Promise<void>,\n): ListenerDecl;\nexport function listener(source: unknown, ...rest: readonly unknown[]): ListenerDecl {\n\tconst [select, fn] = rest.length === 1 ? [undefined, rest[0]] : [rest[0], rest[1]];\n\treturn {\n\t\t[DECL]: \"listener\",\n\t\tsource,\n\t\tselect: select as ListenerDecl[\"select\"],\n\t\tfn: fn as ListenerDecl[\"fn\"],\n\t};\n}\n\nexport const derivation = <const S extends Sources, T>(\n\tsources: S,\n\tfn: (...values: SourceValues<S>) => T,\n): DerivationDecl<T> => ({ [DECL]: \"derivation\", sources, fn: fn as unknown as (...values: never[]) => T });\n\nexport const declKind = (value: unknown): string | undefined =>\n\tvalue !== null && typeof value === \"object\" ? (value as { [DECL]?: string })[DECL] : undefined;\n\nexport type Cells<D> = { readonly [K in keyof D]: D[K] extends CellDecl<infer T> ? Cell<T> : never };\nexport type Resources<D> = { readonly [K in keyof D]: D[K] extends ResourceDecl<infer T> ? Resource<T> : never };\nexport type Derivations<D> = { readonly [K in keyof D]: D[K] extends DerivationDecl<infer T> ? Readable<T> : never };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"apply-immutable-trusted.js","sourceRoot":"","sources":["../../src/delta/apply-immutable-trusted.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../types.ts\";\nimport type { Op, Path, Seg } from \"./index.ts\";\n\ntype JsonContainer = JsonValue[] | Record<string, JsonValue>;\ntype CopiedPath = { root: JsonValue; target: JsonContainer };\n\nconst DATA_DESCRIPTOR: PropertyDescriptor = {\n\tvalue: undefined,\n\twritable: true,\n\tenumerable: true,\n\tconfigurable: true,\n};\n\n/** Apply self-produced trusted operations while copying each touched container once. */\nexport function applyImmutableTrusted<T>(target: T, operations: readonly Op[]): T {\n\tlet root = target as unknown as JsonValue;\n\tconst owned = new WeakSet<object>();\n\tfor (const operation of operations) {\n\t\tif (operation[0] === \"r\") {\n\t\t\troot = operation[1];\n\t\t\tcontinue;\n\t\t}\n\t\tif (operation[0] === \"p\" || operation[0] === \"m\") {\n\t\t\tconst copied = copyPath(root, operation[1], operation[1].length, owned);\n\t\t\troot = copied.root;\n\t\t\tif (!Array.isArray(copied.target)) throw new TypeError(\"Trusted array operation target is not an array\");\n\t\t\tif (operation[0] === \"p\") spliceTrusted(copied.target, operation[2], operation[3], operation[4]);\n\t\t\telse permuteTrusted(copied.target, operation[2]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst path = operation[1];\n\t\tconst copied = copyPath(root, path, path.length - 1, owned);\n\t\troot = copied.root;\n\t\tconst key = path[path.length - 1]!;\n\t\tswitch (operation[0]) {\n\t\t\tcase \"s\":\n\t\t\t\tdefineData(copied.target, key, operation[2]);\n\t\t\t\tbreak;\n\t\t\tcase \"d\":\n\t\t\t\tif (Array.isArray(copied.target)) {\n\t\t\t\t\tif (typeof key !== \"number\") throw new TypeError(\"Trusted array deletion key is not numeric\");\n\t\t\t\t\tspliceTrusted(copied.target, key, 1, []);\n\t\t\t\t} else Reflect.deleteProperty(copied.target, key);\n\t\t\t\tbreak;\n\t\t\tcase \"a\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted append target is not a string\");\n\t\t\t\tdefineData(copied.target, key, `${current}${operation[2]}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"t\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted truncate target is not a string\");\n\t\t\t\tdefineData(copied.target, key, current.slice(operation[2]));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn root as unknown as T;\n}\n\nfunction copyPath(root: JsonValue, path: Path, length: number, owned: WeakSet<object>): CopiedPath {\n\tif (!isContainer(root)) throw new TypeError(\"Trusted operation root is not a container\");\n\tlet copiedRoot = root;\n\tif (!owned.has(root)) {\n\t\tcopiedRoot = shallowCopy(root);\n\t\towned.add(copiedRoot);\n\t}\n\tlet destination = copiedRoot as JsonContainer;\n\tfor (let index = 0; index < length; index++) {\n\t\tconst segment = path[index]!;\n\t\tconst child = read(destination, segment);\n\t\tif (!isContainer(child)) throw new TypeError(\"Trusted operation path is not a container\");\n\t\tif (owned.has(child)) {\n\t\t\tdestination = child;\n\t\t\tcontinue;\n\t\t}\n\t\tconst copy = shallowCopy(child);\n\t\tdefineData(destination, segment, copy);\n\t\towned.add(copy);\n\t\tdestination = copy;\n\t}\n\treturn { root: copiedRoot, target: destination };\n}\n\nfunction shallowCopy(value: JsonContainer): JsonContainer {\n\tif (Array.isArray(value)) return Array.from(value);\n\tconst result = Object.create(Object.getPrototypeOf(value) === null ? null : Object.prototype) as Record<\n\t\tstring,\n\t\tJsonValue\n\t>;\n\tfor (const key of Object.keys(value)) defineData(result, key, value[key]!);\n\treturn result;\n}\n\nfunction read(target: JsonContainer, key: Seg): JsonValue {\n\treturn (target as Record<Seg, JsonValue>)[key]!;\n}\n\nfunction defineData(target: JsonContainer, key: Seg, value: JsonValue): void {\n\tDATA_DESCRIPTOR.value = value;\n\tObject.defineProperty(target, key, DATA_DESCRIPTOR);\n\tDATA_DESCRIPTOR.value = undefined;\n}\n\nfunction spliceTrusted(target: JsonValue[], start: number, remove: number, items: readonly JsonValue[]): void {\n\tconst oldLength = target.length;\n\tconst delta = items.length - remove;\n\tif (delta > 0) {\n\t\ttarget.length = oldLength + delta;\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t} else if (delta < 0) {\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t\ttarget.length = oldLength + delta;\n\t}\n\tfor (let index = 0; index < items.length; index++) defineData(target, start + index, items[index]!);\n}\n\nfunction permuteTrusted(target: JsonValue[], permutation: readonly number[]): void {\n\tif (target.length !== permutation.length) throw new TypeError(\"Trusted permutation length mismatch\");\n\tconst previous = target.slice();\n\tfor (let index = 0; index < permutation.length; index++) target[index] = previous[permutation[index]!]!;\n}\n\nfunction isContainer(value: unknown): value is JsonContainer {\n\treturn value !== null && typeof value === \"object\";\n}\n"]}
1
+ {"version":3,"file":"apply-immutable-trusted.js","sourceRoot":"","sources":["../../src/delta/apply-immutable-trusted.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../json.ts\";\nimport type { Op, Path, Seg } from \"./index.ts\";\n\ntype JsonContainer = JsonValue[] | Record<string, JsonValue>;\ntype CopiedPath = { root: JsonValue; target: JsonContainer };\n\nconst DATA_DESCRIPTOR: PropertyDescriptor = {\n\tvalue: undefined,\n\twritable: true,\n\tenumerable: true,\n\tconfigurable: true,\n};\n\n/** Apply self-produced trusted operations while copying each touched container once. */\nexport function applyImmutableTrusted<T>(target: T, operations: readonly Op[]): T {\n\tlet root = target as unknown as JsonValue;\n\tconst owned = new WeakSet<object>();\n\tfor (const operation of operations) {\n\t\tif (operation[0] === \"r\") {\n\t\t\troot = operation[1];\n\t\t\tcontinue;\n\t\t}\n\t\tif (operation[0] === \"p\" || operation[0] === \"m\") {\n\t\t\tconst copied = copyPath(root, operation[1], operation[1].length, owned);\n\t\t\troot = copied.root;\n\t\t\tif (!Array.isArray(copied.target)) throw new TypeError(\"Trusted array operation target is not an array\");\n\t\t\tif (operation[0] === \"p\") spliceTrusted(copied.target, operation[2], operation[3], operation[4]);\n\t\t\telse permuteTrusted(copied.target, operation[2]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst path = operation[1];\n\t\tconst copied = copyPath(root, path, path.length - 1, owned);\n\t\troot = copied.root;\n\t\tconst key = path[path.length - 1]!;\n\t\tswitch (operation[0]) {\n\t\t\tcase \"s\":\n\t\t\t\tdefineData(copied.target, key, operation[2]);\n\t\t\t\tbreak;\n\t\t\tcase \"d\":\n\t\t\t\tif (Array.isArray(copied.target)) {\n\t\t\t\t\tif (typeof key !== \"number\") throw new TypeError(\"Trusted array deletion key is not numeric\");\n\t\t\t\t\tspliceTrusted(copied.target, key, 1, []);\n\t\t\t\t} else Reflect.deleteProperty(copied.target, key);\n\t\t\t\tbreak;\n\t\t\tcase \"a\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted append target is not a string\");\n\t\t\t\tdefineData(copied.target, key, `${current}${operation[2]}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"t\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted truncate target is not a string\");\n\t\t\t\tdefineData(copied.target, key, current.slice(operation[2]));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn root as unknown as T;\n}\n\nfunction copyPath(root: JsonValue, path: Path, length: number, owned: WeakSet<object>): CopiedPath {\n\tif (!isContainer(root)) throw new TypeError(\"Trusted operation root is not a container\");\n\tlet copiedRoot = root;\n\tif (!owned.has(root)) {\n\t\tcopiedRoot = shallowCopy(root);\n\t\towned.add(copiedRoot);\n\t}\n\tlet destination = copiedRoot as JsonContainer;\n\tfor (let index = 0; index < length; index++) {\n\t\tconst segment = path[index]!;\n\t\tconst child = read(destination, segment);\n\t\tif (!isContainer(child)) throw new TypeError(\"Trusted operation path is not a container\");\n\t\tif (owned.has(child)) {\n\t\t\tdestination = child;\n\t\t\tcontinue;\n\t\t}\n\t\tconst copy = shallowCopy(child);\n\t\tdefineData(destination, segment, copy);\n\t\towned.add(copy);\n\t\tdestination = copy;\n\t}\n\treturn { root: copiedRoot, target: destination };\n}\n\nfunction shallowCopy(value: JsonContainer): JsonContainer {\n\tif (Array.isArray(value)) return Array.from(value);\n\tconst result = Object.create(Object.getPrototypeOf(value) === null ? null : Object.prototype) as Record<\n\t\tstring,\n\t\tJsonValue\n\t>;\n\tfor (const key of Object.keys(value)) defineData(result, key, value[key]!);\n\treturn result;\n}\n\nfunction read(target: JsonContainer, key: Seg): JsonValue {\n\treturn (target as Record<Seg, JsonValue>)[key]!;\n}\n\nfunction defineData(target: JsonContainer, key: Seg, value: JsonValue): void {\n\tDATA_DESCRIPTOR.value = value;\n\tObject.defineProperty(target, key, DATA_DESCRIPTOR);\n\tDATA_DESCRIPTOR.value = undefined;\n}\n\nfunction spliceTrusted(target: JsonValue[], start: number, remove: number, items: readonly JsonValue[]): void {\n\tconst oldLength = target.length;\n\tconst delta = items.length - remove;\n\tif (delta > 0) {\n\t\ttarget.length = oldLength + delta;\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t} else if (delta < 0) {\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t\ttarget.length = oldLength + delta;\n\t}\n\tfor (let index = 0; index < items.length; index++) defineData(target, start + index, items[index]!);\n}\n\nfunction permuteTrusted(target: JsonValue[], permutation: readonly number[]): void {\n\tif (target.length !== permutation.length) throw new TypeError(\"Trusted permutation length mismatch\");\n\tconst previous = target.slice();\n\tfor (let index = 0; index < permutation.length; index++) target[index] = previous[permutation[index]!]!;\n}\n\nfunction isContainer(value: unknown): value is JsonContainer {\n\treturn value !== null && typeof value === \"object\";\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { JsonValue } from "../types.ts";
1
+ import type { JsonValue } from "../json.ts";
2
2
  import { type Op } from "./index.ts";
3
3
  /** Compute a compact operation batch from two immutable JSON revisions. */
4
4
  export declare function diffRevisions(before: JsonValue, after: JsonValue): Op[];
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAqB,KAAK,EAAE,EAAmD,MAAM,YAAY,CAAC;AA8fzG,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,CAUvE"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAqB,KAAK,EAAE,EAAmD,MAAM,YAAY,CAAC;AA8fzG,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,CAUvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../types.ts\";\nimport { type NonEmptyPath, type Op, overlap, type Path, RESERVED_SEGMENTS, type Seg } from \"./index.ts\";\n\nconst DEFAULT_OVERLAP_SCAN = 65_536;\nconst MAX_DELTA_OPERATIONS = 4_096;\nconst overflowedBatches = new WeakSet<Op[]>();\n\nconst emitOperation = (operations: Op[], operation: Op): void => {\n\tif (overflowedBatches.has(operations)) return;\n\tif (operations.length >= MAX_DELTA_OPERATIONS) {\n\t\toverflowedBatches.add(operations);\n\t\treturn;\n\t}\n\toperations.push(operation);\n};\n\nconst isContainer = (value: JsonValue): value is JsonValue[] | Record<string, JsonValue> =>\n\tvalue !== null && typeof value === \"object\";\n\nconst emitSet = (path: Path, value: JsonValue, operations: Op[]): void => {\n\tif (path.length === 0) emitOperation(operations, [\"r\", value]);\n\telse emitOperation(operations, [\"s\", path as NonEmptyPath, value]);\n};\n\nconst equalJson = (left: JsonValue, right: JsonValue): boolean => {\n\tif (left === right) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left)) {\n\t\tconst other = right as JsonValue[];\n\t\tif (left.length !== other.length) return false;\n\t\tfor (let index = 0; index < left.length; index++) {\n\t\t\tif (!equalJson(left[index]!, other[index]!)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\tconst other = right as Record<string, JsonValue>;\n\tconst keys = Object.keys(left);\n\tif (keys.length !== Object.keys(other).length) return false;\n\tfor (const key of keys) {\n\t\tif (!Object.hasOwn(other, key) || !equalJson(left[key]!, other[key]!)) return false;\n\t}\n\treturn true;\n};\n\nconst permutation = (before: readonly JsonValue[], after: readonly JsonValue[]): number[] | undefined => {\n\tif (before.length !== after.length) return undefined;\n\tconst positions = new Map<JsonValue, { indices: number[]; used: number }>();\n\tfor (let index = 0; index < before.length; index++) {\n\t\tconst value = before[index]!;\n\t\tconst entry = positions.get(value);\n\t\tif (entry === undefined) positions.set(value, { indices: [index], used: 0 });\n\t\telse entry.indices.push(index);\n\t}\n\tconst result = new Array<number>(after.length);\n\tfor (let index = 0; index < after.length; index++) {\n\t\tconst entry = positions.get(after[index]!);\n\t\tif (entry === undefined || entry.used === entry.indices.length) return undefined;\n\t\tresult[index] = entry.indices[entry.used++]!;\n\t}\n\treturn result;\n};\n\nconst emitString = (before: string, after: string, path: NonEmptyPath, operations: Op[]): void => {\n\tif (before === after) return;\n\tif (after.length > before.length && after.slice(0, before.length) === before) {\n\t\temitOperation(operations, [\"a\", path, after.slice(before.length)]);\n\t\treturn;\n\t}\n\tconst shared = overlap(before, after, DEFAULT_OVERLAP_SCAN);\n\tif (shared === 0) {\n\t\temitOperation(operations, [\"s\", path, after]);\n\t\treturn;\n\t}\n\temitOperation(operations, [\"t\", path, before.length - shared]);\n\tif (after.length > shared) emitOperation(operations, [\"a\", path, after.slice(shared)]);\n};\n\ntype ArrayMatch = readonly [before: number, after: number];\n\ntype MatchCandidate = {\n\tbefore: number;\n\tafter: number;\n\tprevious: number;\n};\n\nconst MAX_IDENTITY_CANDIDATES = 200_000;\nconst MAX_SEMANTIC_CELLS = 65_536;\n\nconst sameValue = (left: JsonValue, right: JsonValue): boolean => left === right || equalJson(left, right);\n\nconst lcsMatches = (\n\tbefore: readonly JsonValue[],\n\tafter: readonly JsonValue[],\n\tequal: (left: JsonValue, right: JsonValue) => boolean,\n\tmaxCells: number,\n): ArrayMatch[] | undefined => {\n\tif (before.length === 0 || after.length === 0) return [];\n\tif (before.length * after.length > maxCells) return undefined;\n\tconst width = after.length + 1;\n\tconst lengths = new Uint32Array((before.length + 1) * width);\n\tfor (let left = before.length - 1; left >= 0; left--) {\n\t\tfor (let right = after.length - 1; right >= 0; right--) {\n\t\t\tconst at = left * width + right;\n\t\t\tlengths[at] = equal(before[left]!, after[right]!)\n\t\t\t\t? lengths[(left + 1) * width + right + 1]! + 1\n\t\t\t\t: Math.max(lengths[(left + 1) * width + right]!, lengths[left * width + right + 1]!);\n\t\t}\n\t}\n\tconst matches: ArrayMatch[] = [];\n\tlet left = 0;\n\tlet right = 0;\n\twhile (left < before.length && right < after.length) {\n\t\tif (\n\t\t\tequal(before[left]!, after[right]!) &&\n\t\t\tlengths[left * width + right] === lengths[(left + 1) * width + right + 1]! + 1\n\t\t) {\n\t\t\tmatches.push([left++, right++]);\n\t\t} else if (lengths[(left + 1) * width + right]! >= lengths[left * width + right + 1]!) left += 1;\n\t\telse right += 1;\n\t}\n\treturn matches;\n};\n\nconst semanticallyAligned = (left: JsonValue, right: JsonValue): boolean => {\n\tif (sameValue(left, right)) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left) && Array.isArray(right)) {\n\t\tif (left.length !== right.length) return false;\n\t\treturn left.some((value, index) => isContainer(value) && value === right[index]);\n\t}\n\tconst leftObject = left as Record<string, JsonValue>;\n\tconst rightObject = right as Record<string, JsonValue>;\n\tfor (const key of Object.keys(leftObject)) {\n\t\tconst value = leftObject[key];\n\t\tif (isContainer(value) && Object.hasOwn(rightObject, key) && value === rightObject[key]) return true;\n\t}\n\treturn false;\n};\n\nconst lowerBound = (values: readonly number[], value: number): number => {\n\tlet low = 0;\n\tlet high = values.length;\n\twhile (low < high) {\n\t\tconst middle = (low + high) >>> 1;\n\t\tif (values[middle]! < value) low = middle + 1;\n\t\telse high = middle;\n\t}\n\treturn low;\n};\n\nconst identitySubsequence = (\n\tbefore: readonly JsonValue[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] | undefined => {\n\tconst beforeCount = beforeEnd - beforeStart;\n\tconst afterCount = afterEnd - afterStart;\n\tconst matches: ArrayMatch[] = [];\n\tif (afterCount < beforeCount) {\n\t\tlet beforeIndex = beforeStart;\n\t\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\t\twhile (beforeIndex < beforeEnd && before[beforeIndex] !== after[afterIndex]) beforeIndex += 1;\n\t\t\tif (beforeIndex === beforeEnd) return undefined;\n\t\t\tmatches.push([beforeIndex++, afterIndex]);\n\t\t}\n\t\treturn matches;\n\t}\n\tif (beforeCount < afterCount) {\n\t\tlet afterIndex = afterStart;\n\t\tfor (let beforeIndex = beforeStart; beforeIndex < beforeEnd; beforeIndex++) {\n\t\t\twhile (afterIndex < afterEnd && before[beforeIndex] !== after[afterIndex]) afterIndex += 1;\n\t\t\tif (afterIndex === afterEnd) return undefined;\n\t\t\tmatches.push([beforeIndex, afterIndex++]);\n\t\t}\n\t\treturn matches;\n\t}\n\treturn undefined;\n};\n\nconst greedyIdentityAnchors = (\n\tpositions: ReadonlyMap<JsonValue, readonly number[]>,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] => {\n\tconst matches: ArrayMatch[] = [];\n\tlet previous = -1;\n\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\tconst candidates = positions.get(after[afterIndex]!);\n\t\tif (candidates === undefined) continue;\n\t\tconst at = lowerBound(candidates, previous + 1);\n\t\tconst beforeIndex = candidates[at];\n\t\tif (beforeIndex === undefined) continue;\n\t\tmatches.push([beforeIndex, afterIndex]);\n\t\tprevious = beforeIndex;\n\t}\n\treturn matches;\n};\n\nconst identityAnchors = (\n\tbefore: readonly JsonValue[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] => {\n\tconst positions = new Map<JsonValue, number[]>();\n\tfor (let index = beforeStart; index < beforeEnd; index++) {\n\t\tconst value = before[index]!;\n\t\tconst existing = positions.get(value);\n\t\tif (existing === undefined) positions.set(value, [index]);\n\t\telse existing.push(index);\n\t}\n\tlet candidateCount = 0;\n\tfor (let index = afterStart; index < afterEnd; index++) {\n\t\tcandidateCount += positions.get(after[index]!)?.length ?? 0;\n\t\tif (candidateCount > MAX_IDENTITY_CANDIDATES) {\n\t\t\treturn greedyIdentityAnchors(positions, after, afterStart, afterEnd);\n\t\t}\n\t}\n\tif (candidateCount === 0) return [];\n\n\tconst candidates: MatchCandidate[] = [];\n\tconst tails: number[] = [];\n\tconst tailValues: number[] = [];\n\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\tconst beforePositions = positions.get(after[afterIndex]!);\n\t\tif (beforePositions === undefined) continue;\n\t\tfor (let index = beforePositions.length - 1; index >= 0; index--) {\n\t\t\tconst beforeIndex = beforePositions[index]!;\n\t\t\tconst at = lowerBound(tailValues, beforeIndex);\n\t\t\tconst candidateIndex = candidates.length;\n\t\t\tcandidates.push({ before: beforeIndex, after: afterIndex, previous: at === 0 ? -1 : tails[at - 1]! });\n\t\t\ttails[at] = candidateIndex;\n\t\t\ttailValues[at] = beforeIndex;\n\t\t}\n\t}\n\tconst matches: ArrayMatch[] = [];\n\tlet candidateIndex = tails[tails.length - 1] ?? -1;\n\twhile (candidateIndex >= 0) {\n\t\tconst candidate = candidates[candidateIndex]!;\n\t\tmatches.push([candidate.before, candidate.after]);\n\t\tcandidateIndex = candidate.previous;\n\t}\n\tmatches.reverse();\n\treturn matches;\n};\n\nconst processArrayMatches = (\n\tbefore: JsonValue[],\n\tafter: JsonValue[],\n\tpath: Path,\n\toperations: Op[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterEnd: number,\n\toutputStart: number,\n\tmatches: readonly ArrayMatch[],\n): void => {\n\tlet beforeAt = beforeStart;\n\tlet afterAt = afterStart;\n\tlet outputAt = outputStart;\n\tfor (const [beforeMatch, afterMatch] of matches) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tdiffArrayRegion(before, after, path, operations, beforeAt, beforeMatch, afterAt, afterMatch, outputAt);\n\t\toutputAt += afterMatch - afterAt;\n\t\tif (!sameValue(before[beforeMatch]!, after[afterMatch]!)) {\n\t\t\tdiffValue(before[beforeMatch]!, after[afterMatch]!, [...path, outputAt], operations);\n\t\t}\n\t\toutputAt += 1;\n\t\tbeforeAt = beforeMatch + 1;\n\t\tafterAt = afterMatch + 1;\n\t}\n\tif (!overflowedBatches.has(operations)) {\n\t\tdiffArrayRegion(before, after, path, operations, beforeAt, beforeEnd, afterAt, afterEnd, outputAt);\n\t}\n};\n\nfunction diffArrayRegion(\n\tbefore: JsonValue[],\n\tafter: JsonValue[],\n\tpath: Path,\n\toperations: Op[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterEnd: number,\n\toutputStart: number,\n): void {\n\tif (overflowedBatches.has(operations)) return;\n\twhile (beforeStart < beforeEnd && afterStart < afterEnd && sameValue(before[beforeStart]!, after[afterStart]!)) {\n\t\tbeforeStart += 1;\n\t\tafterStart += 1;\n\t\toutputStart += 1;\n\t}\n\twhile (beforeStart < beforeEnd && afterStart < afterEnd && sameValue(before[beforeEnd - 1]!, after[afterEnd - 1]!)) {\n\t\tbeforeEnd -= 1;\n\t\tafterEnd -= 1;\n\t}\n\tconst beforeCount = beforeEnd - beforeStart;\n\tconst afterCount = afterEnd - afterStart;\n\tif (beforeCount === 0 && afterCount === 0) return;\n\tif (beforeCount === 0 || afterCount === 0) {\n\t\temitOperation(operations, [\"p\", path, outputStart, beforeCount, after.slice(afterStart, afterEnd)]);\n\t\treturn;\n\t}\n\n\tif (beforeCount === afterCount) {\n\t\tconst positional: ArrayMatch[] = [];\n\t\tfor (let offset = 0; offset < beforeCount; offset++) {\n\t\t\tif (sameValue(before[beforeStart + offset]!, after[afterStart + offset]!)) {\n\t\t\t\tpositional.push([beforeStart + offset, afterStart + offset]);\n\t\t\t}\n\t\t}\n\t\tif (positional.length > 0) {\n\t\t\tprocessArrayMatches(\n\t\t\t\tbefore,\n\t\t\t\tafter,\n\t\t\t\tpath,\n\t\t\t\toperations,\n\t\t\t\tbeforeStart,\n\t\t\t\tbeforeEnd,\n\t\t\t\tafterStart,\n\t\t\t\tafterEnd,\n\t\t\t\toutputStart,\n\t\t\t\tpositional,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst subsequence = identitySubsequence(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n\tif (subsequence !== undefined && subsequence.length > 0) {\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tsubsequence,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst identity = identityAnchors(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n\tif (identity.length > 0) {\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tidentity,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst semantic = lcsMatches(\n\t\tbefore.slice(beforeStart, beforeEnd),\n\t\tafter.slice(afterStart, afterEnd),\n\t\tsemanticallyAligned,\n\t\tMAX_SEMANTIC_CELLS,\n\t);\n\tif (semantic !== undefined && semantic.length > 0) {\n\t\tconst absolute = semantic.map(\n\t\t\t([beforeIndex, afterIndex]) => [beforeStart + beforeIndex, afterStart + afterIndex] as const,\n\t\t);\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tabsolute,\n\t\t);\n\t\treturn;\n\t}\n\n\tif (beforeCount === 1 && afterCount === 1) {\n\t\tdiffValue(before[beforeStart]!, after[afterStart]!, [...path, outputStart], operations);\n\t\treturn;\n\t}\n\temitOperation(operations, [\"p\", path, outputStart, beforeCount, after.slice(afterStart, afterEnd)]);\n}\n\nconst diffArray = (before: JsonValue[], after: JsonValue[], path: Path, operations: Op[]): void => {\n\tif (before === after || equalJson(before, after)) return;\n\tif (\n\t\tbefore.length === after.length &&\n\t\tbefore.length > 1 &&\n\t\t!sameValue(before[0]!, after[0]!) &&\n\t\t!sameValue(before[before.length - 1]!, after[after.length - 1]!)\n\t) {\n\t\tconst order = permutation(before, after);\n\t\tif (order !== undefined) {\n\t\t\temitOperation(operations, [\"m\", path, order]);\n\t\t\treturn;\n\t\t}\n\t}\n\tdiffArrayRegion(before, after, path, operations, 0, before.length, 0, after.length, 0);\n};\n\nconst diffObject = (\n\tbefore: Record<string, JsonValue>,\n\tafter: Record<string, JsonValue>,\n\tpath: Path,\n\toperations: Op[],\n): void => {\n\tconst beforeKeys = Object.keys(before);\n\tconst afterKeys = Object.keys(after);\n\tif ([...beforeKeys, ...afterKeys].some((key) => RESERVED_SEGMENTS.has(key))) {\n\t\tif (!equalJson(before, after)) emitSet(path, after, operations);\n\t\treturn;\n\t}\n\tfor (const key of afterKeys) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tif (Object.hasOwn(before, key)) diffValue(before[key]!, after[key]!, [...path, key], operations);\n\t\telse emitSet([...path, key], after[key]!, operations);\n\t}\n\tfor (const key of beforeKeys) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tif (!Object.hasOwn(after, key)) emitOperation(operations, [\"d\", [...path, key] as unknown as NonEmptyPath]);\n\t}\n};\n\nconst diffValue = (before: JsonValue, after: JsonValue, path: Path, operations: Op[]): void => {\n\tif (before === after || overflowedBatches.has(operations)) return;\n\tif (typeof before === \"string\" && typeof after === \"string\" && path.length > 0) {\n\t\temitString(before, after, path as NonEmptyPath, operations);\n\t\treturn;\n\t}\n\tif (Array.isArray(before) && Array.isArray(after)) {\n\t\tdiffArray(before, after, path, operations);\n\t\treturn;\n\t}\n\tif (isContainer(before) && isContainer(after) && !Array.isArray(before) && !Array.isArray(after)) {\n\t\tdiffObject(before, after, path, operations);\n\t\treturn;\n\t}\n\temitSet(path, after, operations);\n};\n\nconst jsonCost = (value: JsonValue): number => {\n\tif (value === null) return 4;\n\tif (typeof value === \"string\") return value.length + 2;\n\tif (typeof value === \"number\") return String(value).length;\n\tif (typeof value === \"boolean\") return value ? 4 : 5;\n\tif (Array.isArray(value)) {\n\t\tlet cost = 2;\n\t\tfor (let index = 0; index < value.length; index++) cost += jsonCost(value[index]!) + (index === 0 ? 0 : 1);\n\t\treturn cost;\n\t}\n\tlet cost = 2;\n\tlet index = 0;\n\tfor (const key of Object.keys(value)) {\n\t\tcost += key.length + 3 + jsonCost(value[key]!) + (index++ === 0 ? 0 : 1);\n\t}\n\treturn cost;\n};\n\nconst pathCost = (path: Path): number => {\n\tlet cost = 2;\n\tfor (let index = 0; index < path.length; index++) {\n\t\tconst segment: Seg = path[index]!;\n\t\tcost += (typeof segment === \"string\" ? segment.length + 2 : String(segment).length) + (index === 0 ? 0 : 1);\n\t}\n\treturn cost;\n};\n\nconst operationCost = (operation: Op): number => {\n\tswitch (operation[0]) {\n\t\tcase \"r\":\n\t\t\treturn 6 + jsonCost(operation[1]);\n\t\tcase \"s\":\n\t\t\treturn 7 + pathCost(operation[1]) + jsonCost(operation[2]);\n\t\tcase \"d\":\n\t\t\treturn 6 + pathCost(operation[1]);\n\t\tcase \"a\":\n\t\t\treturn 7 + pathCost(operation[1]) + operation[2].length + 2;\n\t\tcase \"t\":\n\t\t\treturn 7 + pathCost(operation[1]) + String(operation[2]).length;\n\t\tcase \"p\":\n\t\t\treturn (\n\t\t\t\t10 +\n\t\t\t\tpathCost(operation[1]) +\n\t\t\t\tString(operation[2]).length +\n\t\t\t\tString(operation[3]).length +\n\t\t\t\tjsonCost(operation[4])\n\t\t\t);\n\t\tcase \"m\":\n\t\t\treturn 7 + pathCost(operation[1]) + jsonCost(operation[2]);\n\t}\n};\n\n/** Compute a compact operation batch from two immutable JSON revisions. */\nexport function diffRevisions(before: JsonValue, after: JsonValue): Op[] {\n\tconst operations: Op[] = [];\n\tdiffValue(before, after, [], operations);\n\tif (overflowedBatches.has(operations)) return [[\"r\", after]];\n\tif (operations.length === 0 || operations[0]?.[0] === \"r\") return operations;\n\tlet deltaCost = 2;\n\tfor (const operation of operations) deltaCost += operationCost(operation) + 1;\n\tif (deltaCost < 65_536) return operations;\n\tconst snapshotCost = jsonCost(after) + 6;\n\treturn deltaCost >= snapshotCost ? [[\"r\", after]] : operations;\n}\n"]}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../json.ts\";\nimport { type NonEmptyPath, type Op, overlap, type Path, RESERVED_SEGMENTS, type Seg } from \"./index.ts\";\n\nconst DEFAULT_OVERLAP_SCAN = 65_536;\nconst MAX_DELTA_OPERATIONS = 4_096;\nconst overflowedBatches = new WeakSet<Op[]>();\n\nconst emitOperation = (operations: Op[], operation: Op): void => {\n\tif (overflowedBatches.has(operations)) return;\n\tif (operations.length >= MAX_DELTA_OPERATIONS) {\n\t\toverflowedBatches.add(operations);\n\t\treturn;\n\t}\n\toperations.push(operation);\n};\n\nconst isContainer = (value: JsonValue): value is JsonValue[] | Record<string, JsonValue> =>\n\tvalue !== null && typeof value === \"object\";\n\nconst emitSet = (path: Path, value: JsonValue, operations: Op[]): void => {\n\tif (path.length === 0) emitOperation(operations, [\"r\", value]);\n\telse emitOperation(operations, [\"s\", path as NonEmptyPath, value]);\n};\n\nconst equalJson = (left: JsonValue, right: JsonValue): boolean => {\n\tif (left === right) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left)) {\n\t\tconst other = right as JsonValue[];\n\t\tif (left.length !== other.length) return false;\n\t\tfor (let index = 0; index < left.length; index++) {\n\t\t\tif (!equalJson(left[index]!, other[index]!)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\tconst other = right as Record<string, JsonValue>;\n\tconst keys = Object.keys(left);\n\tif (keys.length !== Object.keys(other).length) return false;\n\tfor (const key of keys) {\n\t\tif (!Object.hasOwn(other, key) || !equalJson(left[key]!, other[key]!)) return false;\n\t}\n\treturn true;\n};\n\nconst permutation = (before: readonly JsonValue[], after: readonly JsonValue[]): number[] | undefined => {\n\tif (before.length !== after.length) return undefined;\n\tconst positions = new Map<JsonValue, { indices: number[]; used: number }>();\n\tfor (let index = 0; index < before.length; index++) {\n\t\tconst value = before[index]!;\n\t\tconst entry = positions.get(value);\n\t\tif (entry === undefined) positions.set(value, { indices: [index], used: 0 });\n\t\telse entry.indices.push(index);\n\t}\n\tconst result = new Array<number>(after.length);\n\tfor (let index = 0; index < after.length; index++) {\n\t\tconst entry = positions.get(after[index]!);\n\t\tif (entry === undefined || entry.used === entry.indices.length) return undefined;\n\t\tresult[index] = entry.indices[entry.used++]!;\n\t}\n\treturn result;\n};\n\nconst emitString = (before: string, after: string, path: NonEmptyPath, operations: Op[]): void => {\n\tif (before === after) return;\n\tif (after.length > before.length && after.slice(0, before.length) === before) {\n\t\temitOperation(operations, [\"a\", path, after.slice(before.length)]);\n\t\treturn;\n\t}\n\tconst shared = overlap(before, after, DEFAULT_OVERLAP_SCAN);\n\tif (shared === 0) {\n\t\temitOperation(operations, [\"s\", path, after]);\n\t\treturn;\n\t}\n\temitOperation(operations, [\"t\", path, before.length - shared]);\n\tif (after.length > shared) emitOperation(operations, [\"a\", path, after.slice(shared)]);\n};\n\ntype ArrayMatch = readonly [before: number, after: number];\n\ntype MatchCandidate = {\n\tbefore: number;\n\tafter: number;\n\tprevious: number;\n};\n\nconst MAX_IDENTITY_CANDIDATES = 200_000;\nconst MAX_SEMANTIC_CELLS = 65_536;\n\nconst sameValue = (left: JsonValue, right: JsonValue): boolean => left === right || equalJson(left, right);\n\nconst lcsMatches = (\n\tbefore: readonly JsonValue[],\n\tafter: readonly JsonValue[],\n\tequal: (left: JsonValue, right: JsonValue) => boolean,\n\tmaxCells: number,\n): ArrayMatch[] | undefined => {\n\tif (before.length === 0 || after.length === 0) return [];\n\tif (before.length * after.length > maxCells) return undefined;\n\tconst width = after.length + 1;\n\tconst lengths = new Uint32Array((before.length + 1) * width);\n\tfor (let left = before.length - 1; left >= 0; left--) {\n\t\tfor (let right = after.length - 1; right >= 0; right--) {\n\t\t\tconst at = left * width + right;\n\t\t\tlengths[at] = equal(before[left]!, after[right]!)\n\t\t\t\t? lengths[(left + 1) * width + right + 1]! + 1\n\t\t\t\t: Math.max(lengths[(left + 1) * width + right]!, lengths[left * width + right + 1]!);\n\t\t}\n\t}\n\tconst matches: ArrayMatch[] = [];\n\tlet left = 0;\n\tlet right = 0;\n\twhile (left < before.length && right < after.length) {\n\t\tif (\n\t\t\tequal(before[left]!, after[right]!) &&\n\t\t\tlengths[left * width + right] === lengths[(left + 1) * width + right + 1]! + 1\n\t\t) {\n\t\t\tmatches.push([left++, right++]);\n\t\t} else if (lengths[(left + 1) * width + right]! >= lengths[left * width + right + 1]!) left += 1;\n\t\telse right += 1;\n\t}\n\treturn matches;\n};\n\nconst semanticallyAligned = (left: JsonValue, right: JsonValue): boolean => {\n\tif (sameValue(left, right)) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left) && Array.isArray(right)) {\n\t\tif (left.length !== right.length) return false;\n\t\treturn left.some((value, index) => isContainer(value) && value === right[index]);\n\t}\n\tconst leftObject = left as Record<string, JsonValue>;\n\tconst rightObject = right as Record<string, JsonValue>;\n\tfor (const key of Object.keys(leftObject)) {\n\t\tconst value = leftObject[key];\n\t\tif (isContainer(value) && Object.hasOwn(rightObject, key) && value === rightObject[key]) return true;\n\t}\n\treturn false;\n};\n\nconst lowerBound = (values: readonly number[], value: number): number => {\n\tlet low = 0;\n\tlet high = values.length;\n\twhile (low < high) {\n\t\tconst middle = (low + high) >>> 1;\n\t\tif (values[middle]! < value) low = middle + 1;\n\t\telse high = middle;\n\t}\n\treturn low;\n};\n\nconst identitySubsequence = (\n\tbefore: readonly JsonValue[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] | undefined => {\n\tconst beforeCount = beforeEnd - beforeStart;\n\tconst afterCount = afterEnd - afterStart;\n\tconst matches: ArrayMatch[] = [];\n\tif (afterCount < beforeCount) {\n\t\tlet beforeIndex = beforeStart;\n\t\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\t\twhile (beforeIndex < beforeEnd && before[beforeIndex] !== after[afterIndex]) beforeIndex += 1;\n\t\t\tif (beforeIndex === beforeEnd) return undefined;\n\t\t\tmatches.push([beforeIndex++, afterIndex]);\n\t\t}\n\t\treturn matches;\n\t}\n\tif (beforeCount < afterCount) {\n\t\tlet afterIndex = afterStart;\n\t\tfor (let beforeIndex = beforeStart; beforeIndex < beforeEnd; beforeIndex++) {\n\t\t\twhile (afterIndex < afterEnd && before[beforeIndex] !== after[afterIndex]) afterIndex += 1;\n\t\t\tif (afterIndex === afterEnd) return undefined;\n\t\t\tmatches.push([beforeIndex, afterIndex++]);\n\t\t}\n\t\treturn matches;\n\t}\n\treturn undefined;\n};\n\nconst greedyIdentityAnchors = (\n\tpositions: ReadonlyMap<JsonValue, readonly number[]>,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] => {\n\tconst matches: ArrayMatch[] = [];\n\tlet previous = -1;\n\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\tconst candidates = positions.get(after[afterIndex]!);\n\t\tif (candidates === undefined) continue;\n\t\tconst at = lowerBound(candidates, previous + 1);\n\t\tconst beforeIndex = candidates[at];\n\t\tif (beforeIndex === undefined) continue;\n\t\tmatches.push([beforeIndex, afterIndex]);\n\t\tprevious = beforeIndex;\n\t}\n\treturn matches;\n};\n\nconst identityAnchors = (\n\tbefore: readonly JsonValue[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] => {\n\tconst positions = new Map<JsonValue, number[]>();\n\tfor (let index = beforeStart; index < beforeEnd; index++) {\n\t\tconst value = before[index]!;\n\t\tconst existing = positions.get(value);\n\t\tif (existing === undefined) positions.set(value, [index]);\n\t\telse existing.push(index);\n\t}\n\tlet candidateCount = 0;\n\tfor (let index = afterStart; index < afterEnd; index++) {\n\t\tcandidateCount += positions.get(after[index]!)?.length ?? 0;\n\t\tif (candidateCount > MAX_IDENTITY_CANDIDATES) {\n\t\t\treturn greedyIdentityAnchors(positions, after, afterStart, afterEnd);\n\t\t}\n\t}\n\tif (candidateCount === 0) return [];\n\n\tconst candidates: MatchCandidate[] = [];\n\tconst tails: number[] = [];\n\tconst tailValues: number[] = [];\n\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\tconst beforePositions = positions.get(after[afterIndex]!);\n\t\tif (beforePositions === undefined) continue;\n\t\tfor (let index = beforePositions.length - 1; index >= 0; index--) {\n\t\t\tconst beforeIndex = beforePositions[index]!;\n\t\t\tconst at = lowerBound(tailValues, beforeIndex);\n\t\t\tconst candidateIndex = candidates.length;\n\t\t\tcandidates.push({ before: beforeIndex, after: afterIndex, previous: at === 0 ? -1 : tails[at - 1]! });\n\t\t\ttails[at] = candidateIndex;\n\t\t\ttailValues[at] = beforeIndex;\n\t\t}\n\t}\n\tconst matches: ArrayMatch[] = [];\n\tlet candidateIndex = tails[tails.length - 1] ?? -1;\n\twhile (candidateIndex >= 0) {\n\t\tconst candidate = candidates[candidateIndex]!;\n\t\tmatches.push([candidate.before, candidate.after]);\n\t\tcandidateIndex = candidate.previous;\n\t}\n\tmatches.reverse();\n\treturn matches;\n};\n\nconst processArrayMatches = (\n\tbefore: JsonValue[],\n\tafter: JsonValue[],\n\tpath: Path,\n\toperations: Op[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterEnd: number,\n\toutputStart: number,\n\tmatches: readonly ArrayMatch[],\n): void => {\n\tlet beforeAt = beforeStart;\n\tlet afterAt = afterStart;\n\tlet outputAt = outputStart;\n\tfor (const [beforeMatch, afterMatch] of matches) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tdiffArrayRegion(before, after, path, operations, beforeAt, beforeMatch, afterAt, afterMatch, outputAt);\n\t\toutputAt += afterMatch - afterAt;\n\t\tif (!sameValue(before[beforeMatch]!, after[afterMatch]!)) {\n\t\t\tdiffValue(before[beforeMatch]!, after[afterMatch]!, [...path, outputAt], operations);\n\t\t}\n\t\toutputAt += 1;\n\t\tbeforeAt = beforeMatch + 1;\n\t\tafterAt = afterMatch + 1;\n\t}\n\tif (!overflowedBatches.has(operations)) {\n\t\tdiffArrayRegion(before, after, path, operations, beforeAt, beforeEnd, afterAt, afterEnd, outputAt);\n\t}\n};\n\nfunction diffArrayRegion(\n\tbefore: JsonValue[],\n\tafter: JsonValue[],\n\tpath: Path,\n\toperations: Op[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterEnd: number,\n\toutputStart: number,\n): void {\n\tif (overflowedBatches.has(operations)) return;\n\twhile (beforeStart < beforeEnd && afterStart < afterEnd && sameValue(before[beforeStart]!, after[afterStart]!)) {\n\t\tbeforeStart += 1;\n\t\tafterStart += 1;\n\t\toutputStart += 1;\n\t}\n\twhile (beforeStart < beforeEnd && afterStart < afterEnd && sameValue(before[beforeEnd - 1]!, after[afterEnd - 1]!)) {\n\t\tbeforeEnd -= 1;\n\t\tafterEnd -= 1;\n\t}\n\tconst beforeCount = beforeEnd - beforeStart;\n\tconst afterCount = afterEnd - afterStart;\n\tif (beforeCount === 0 && afterCount === 0) return;\n\tif (beforeCount === 0 || afterCount === 0) {\n\t\temitOperation(operations, [\"p\", path, outputStart, beforeCount, after.slice(afterStart, afterEnd)]);\n\t\treturn;\n\t}\n\n\tif (beforeCount === afterCount) {\n\t\tconst positional: ArrayMatch[] = [];\n\t\tfor (let offset = 0; offset < beforeCount; offset++) {\n\t\t\tif (sameValue(before[beforeStart + offset]!, after[afterStart + offset]!)) {\n\t\t\t\tpositional.push([beforeStart + offset, afterStart + offset]);\n\t\t\t}\n\t\t}\n\t\tif (positional.length > 0) {\n\t\t\tprocessArrayMatches(\n\t\t\t\tbefore,\n\t\t\t\tafter,\n\t\t\t\tpath,\n\t\t\t\toperations,\n\t\t\t\tbeforeStart,\n\t\t\t\tbeforeEnd,\n\t\t\t\tafterStart,\n\t\t\t\tafterEnd,\n\t\t\t\toutputStart,\n\t\t\t\tpositional,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst subsequence = identitySubsequence(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n\tif (subsequence !== undefined && subsequence.length > 0) {\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tsubsequence,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst identity = identityAnchors(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n\tif (identity.length > 0) {\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tidentity,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst semantic = lcsMatches(\n\t\tbefore.slice(beforeStart, beforeEnd),\n\t\tafter.slice(afterStart, afterEnd),\n\t\tsemanticallyAligned,\n\t\tMAX_SEMANTIC_CELLS,\n\t);\n\tif (semantic !== undefined && semantic.length > 0) {\n\t\tconst absolute = semantic.map(\n\t\t\t([beforeIndex, afterIndex]) => [beforeStart + beforeIndex, afterStart + afterIndex] as const,\n\t\t);\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tabsolute,\n\t\t);\n\t\treturn;\n\t}\n\n\tif (beforeCount === 1 && afterCount === 1) {\n\t\tdiffValue(before[beforeStart]!, after[afterStart]!, [...path, outputStart], operations);\n\t\treturn;\n\t}\n\temitOperation(operations, [\"p\", path, outputStart, beforeCount, after.slice(afterStart, afterEnd)]);\n}\n\nconst diffArray = (before: JsonValue[], after: JsonValue[], path: Path, operations: Op[]): void => {\n\tif (before === after || equalJson(before, after)) return;\n\tif (\n\t\tbefore.length === after.length &&\n\t\tbefore.length > 1 &&\n\t\t!sameValue(before[0]!, after[0]!) &&\n\t\t!sameValue(before[before.length - 1]!, after[after.length - 1]!)\n\t) {\n\t\tconst order = permutation(before, after);\n\t\tif (order !== undefined) {\n\t\t\temitOperation(operations, [\"m\", path, order]);\n\t\t\treturn;\n\t\t}\n\t}\n\tdiffArrayRegion(before, after, path, operations, 0, before.length, 0, after.length, 0);\n};\n\nconst diffObject = (\n\tbefore: Record<string, JsonValue>,\n\tafter: Record<string, JsonValue>,\n\tpath: Path,\n\toperations: Op[],\n): void => {\n\tconst beforeKeys = Object.keys(before);\n\tconst afterKeys = Object.keys(after);\n\tif ([...beforeKeys, ...afterKeys].some((key) => RESERVED_SEGMENTS.has(key))) {\n\t\tif (!equalJson(before, after)) emitSet(path, after, operations);\n\t\treturn;\n\t}\n\tfor (const key of afterKeys) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tif (Object.hasOwn(before, key)) diffValue(before[key]!, after[key]!, [...path, key], operations);\n\t\telse emitSet([...path, key], after[key]!, operations);\n\t}\n\tfor (const key of beforeKeys) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tif (!Object.hasOwn(after, key)) emitOperation(operations, [\"d\", [...path, key] as unknown as NonEmptyPath]);\n\t}\n};\n\nconst diffValue = (before: JsonValue, after: JsonValue, path: Path, operations: Op[]): void => {\n\tif (before === after || overflowedBatches.has(operations)) return;\n\tif (typeof before === \"string\" && typeof after === \"string\" && path.length > 0) {\n\t\temitString(before, after, path as NonEmptyPath, operations);\n\t\treturn;\n\t}\n\tif (Array.isArray(before) && Array.isArray(after)) {\n\t\tdiffArray(before, after, path, operations);\n\t\treturn;\n\t}\n\tif (isContainer(before) && isContainer(after) && !Array.isArray(before) && !Array.isArray(after)) {\n\t\tdiffObject(before, after, path, operations);\n\t\treturn;\n\t}\n\temitSet(path, after, operations);\n};\n\nconst jsonCost = (value: JsonValue): number => {\n\tif (value === null) return 4;\n\tif (typeof value === \"string\") return value.length + 2;\n\tif (typeof value === \"number\") return String(value).length;\n\tif (typeof value === \"boolean\") return value ? 4 : 5;\n\tif (Array.isArray(value)) {\n\t\tlet cost = 2;\n\t\tfor (let index = 0; index < value.length; index++) cost += jsonCost(value[index]!) + (index === 0 ? 0 : 1);\n\t\treturn cost;\n\t}\n\tlet cost = 2;\n\tlet index = 0;\n\tfor (const key of Object.keys(value)) {\n\t\tcost += key.length + 3 + jsonCost(value[key]!) + (index++ === 0 ? 0 : 1);\n\t}\n\treturn cost;\n};\n\nconst pathCost = (path: Path): number => {\n\tlet cost = 2;\n\tfor (let index = 0; index < path.length; index++) {\n\t\tconst segment: Seg = path[index]!;\n\t\tcost += (typeof segment === \"string\" ? segment.length + 2 : String(segment).length) + (index === 0 ? 0 : 1);\n\t}\n\treturn cost;\n};\n\nconst operationCost = (operation: Op): number => {\n\tswitch (operation[0]) {\n\t\tcase \"r\":\n\t\t\treturn 6 + jsonCost(operation[1]);\n\t\tcase \"s\":\n\t\t\treturn 7 + pathCost(operation[1]) + jsonCost(operation[2]);\n\t\tcase \"d\":\n\t\t\treturn 6 + pathCost(operation[1]);\n\t\tcase \"a\":\n\t\t\treturn 7 + pathCost(operation[1]) + operation[2].length + 2;\n\t\tcase \"t\":\n\t\t\treturn 7 + pathCost(operation[1]) + String(operation[2]).length;\n\t\tcase \"p\":\n\t\t\treturn (\n\t\t\t\t10 +\n\t\t\t\tpathCost(operation[1]) +\n\t\t\t\tString(operation[2]).length +\n\t\t\t\tString(operation[3]).length +\n\t\t\t\tjsonCost(operation[4])\n\t\t\t);\n\t\tcase \"m\":\n\t\t\treturn 7 + pathCost(operation[1]) + jsonCost(operation[2]);\n\t}\n};\n\n/** Compute a compact operation batch from two immutable JSON revisions. */\nexport function diffRevisions(before: JsonValue, after: JsonValue): Op[] {\n\tconst operations: Op[] = [];\n\tdiffValue(before, after, [], operations);\n\tif (overflowedBatches.has(operations)) return [[\"r\", after]];\n\tif (operations.length === 0 || operations[0]?.[0] === \"r\") return operations;\n\tlet deltaCost = 2;\n\tfor (const operation of operations) deltaCost += operationCost(operation) + 1;\n\tif (deltaCost < 65_536) return operations;\n\tconst snapshotCost = jsonCost(after) + 6;\n\treturn deltaCost >= snapshotCost ? [[\"r\", after]] : operations;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { JsonValue } from "../types.ts";
2
- export type { JsonValue } from "../types.ts";
1
+ import type { JsonValue } from "../json.ts";
2
+ export type { JsonValue } from "../json.ts";
3
3
  export type Seg = string | number;
4
4
  export type Path = readonly Seg[];
5
5
  export type NonEmptyPath = readonly [Seg, ...Seg[]];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delta/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delta/index.ts"],"names":[],"mappings":"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"}
@@ -388,12 +388,53 @@ export function applyImmutableBatches(target, batches) {
388
388
  root = op[1];
389
389
  continue;
390
390
  }
391
+ if (op[0] === "p") {
392
+ const appended = appendCopy(root, op, owned);
393
+ if (appended !== undefined) {
394
+ root = appended;
395
+ continue;
396
+ }
397
+ }
391
398
  root = copyContainers(root, op[0] === "p" || op[0] === "m" ? op[1] : op[1].slice(0, -1), owned);
392
399
  root = applyOps(root, [op]);
393
400
  }
394
401
  }
395
402
  return root;
396
403
  }
404
+ /**
405
+ * An append to an array not yet copied in this replay, built as one copy with the items (`concat`) instead of a copy that
406
+ * the insert then grows, which copies it again. `undefined` for any other splice and for any path that is not a plain
407
+ * walk over own properties, which takes the general path and so fails with its errors.
408
+ */
409
+ function appendCopy(root, op, owned) {
410
+ const [, path, index, deleteCount, items] = op;
411
+ if (deleteCount !== 0)
412
+ return undefined;
413
+ let target = root;
414
+ for (const segment of path) {
415
+ const valid = typeof segment === "string"
416
+ ? !RESERVED_SEGMENTS.has(segment) && isObj(target) && !Array.isArray(target)
417
+ : Number.isInteger(segment) && segment >= 0 && Array.isArray(target);
418
+ if (!valid || !Object.hasOwn(target, segment))
419
+ return undefined;
420
+ target = target[segment];
421
+ }
422
+ if (!Array.isArray(target) || owned.has(target) || index !== target.length)
423
+ return undefined;
424
+ const appended = target.concat(items);
425
+ owned.add(appended);
426
+ if (path.length === 0)
427
+ return appended;
428
+ const parentPath = path.slice(0, -1);
429
+ const copiedRoot = copyContainers(root, parentPath, owned);
430
+ Object.defineProperty(resolve(copiedRoot, parentPath), path[path.length - 1], {
431
+ value: appended,
432
+ writable: true,
433
+ enumerable: true,
434
+ configurable: true,
435
+ });
436
+ return copiedRoot;
437
+ }
397
438
  function copyContainers(root, path, owned) {
398
439
  const copy = (value) => {
399
440
  if (Array.isArray(value))