lib0 1.0.0-rc.2 → 1.0.0-rc.21

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 (141) hide show
  1. package/README.md +0 -1315
  2. package/{types → dist}/buffer.d.ts +2 -10
  3. package/{types → dist}/delta/delta.d.ts +582 -144
  4. package/dist/delta/position.d.ts +65 -0
  5. package/dist/delta/rdt/delta.d.ts +57 -0
  6. package/dist/delta/rdt/dom.d.ts +102 -0
  7. package/dist/delta/rdt.d.ts +180 -0
  8. package/dist/delta/transformer/attr.d.ts +64 -0
  9. package/dist/delta/transformer/attribution-to-format.d.ts +52 -0
  10. package/dist/delta/transformer/children.d.ts +69 -0
  11. package/dist/delta/transformer/conform.d.ts +83 -0
  12. package/dist/delta/transformer/core.d.ts +189 -0
  13. package/dist/delta/transformer/full-attributions.d.ts +37 -0
  14. package/dist/delta/transformer/id.d.ts +2 -0
  15. package/dist/delta/transformer/inline.d.ts +89 -0
  16. package/dist/delta/transformer/pipe.d.ts +182 -0
  17. package/dist/delta/transformer/project.d.ts +223 -0
  18. package/dist/delta/transformer/rename-attrs.d.ts +75 -0
  19. package/dist/delta/transformer/rename.d.ts +41 -0
  20. package/dist/delta/transformer/value.d.ts +92 -0
  21. package/dist/delta/transformer.d.ts +14 -0
  22. package/dist/diff/patience.d.ts +25 -0
  23. package/{types → dist}/environment.d.ts +10 -0
  24. package/dist/hash/fnv1a.d.ts +11 -0
  25. package/{types → dist}/schema.d.ts +49 -38
  26. package/{types → dist}/ts.d.ts +4 -0
  27. package/dist/webcrypto.d.ts +3 -0
  28. package/package.json +148 -82
  29. package/src/bin/0serve.js +11 -3
  30. package/src/broadcastchannel.js +6 -1
  31. package/src/buffer.js +35 -25
  32. package/src/decoding.js +1 -1
  33. package/src/delta/delta.js +2531 -564
  34. package/src/delta/position.js +165 -0
  35. package/src/delta/rdt/delta.js +105 -0
  36. package/src/delta/rdt/dom.js +307 -0
  37. package/src/delta/rdt.js +255 -0
  38. package/src/delta/transformer/attr.js +126 -0
  39. package/src/delta/transformer/attribution-to-format.js +335 -0
  40. package/src/delta/transformer/children.js +219 -0
  41. package/src/delta/transformer/conform.js +401 -0
  42. package/src/delta/transformer/core.js +323 -0
  43. package/src/delta/transformer/full-attributions.js +282 -0
  44. package/src/delta/transformer/id.js +13 -0
  45. package/src/delta/transformer/inline.js +818 -0
  46. package/src/delta/transformer/pipe.js +272 -0
  47. package/src/delta/transformer/project.js +526 -0
  48. package/src/delta/transformer/rename-attrs.js +152 -0
  49. package/src/delta/transformer/rename.js +84 -0
  50. package/src/delta/transformer/value.js +214 -0
  51. package/src/delta/transformer.js +38 -0
  52. package/src/diff/patience.js +22 -11
  53. package/src/dom.js +2 -2
  54. package/src/encoding.js +1 -1
  55. package/src/environment.js +15 -0
  56. package/src/hash/fnv1a.js +82 -0
  57. package/src/number.js +1 -3
  58. package/src/performance.node.js +3 -3
  59. package/src/schema.js +231 -177
  60. package/src/string.js +3 -5
  61. package/src/testing.js +1 -1
  62. package/src/trait/equality.js +1 -1
  63. package/src/trait/fingerprint.js +1 -1
  64. package/src/ts.js +11 -0
  65. package/src/bin/gendocs.js +0 -117
  66. package/src/component.js +0 -414
  67. package/src/delta/binding.js +0 -372
  68. package/src/tree.js +0 -546
  69. package/types/bin/gendocs.d.ts +0 -3
  70. package/types/component.d.ts +0 -86
  71. package/types/delta/binding.d.ts +0 -106
  72. package/types/diff/patience.d.ts +0 -16
  73. package/types/tree.d.ts +0 -96
  74. package/types/webcrypto.d.ts +0 -3
  75. /package/{types → dist}/array.d.ts +0 -0
  76. /package/{types → dist}/bin/0ecdsa-generate-keypair.d.ts +0 -0
  77. /package/{types → dist}/bin/0serve.d.ts +0 -0
  78. /package/{types → dist}/bin/gentesthtml.d.ts +0 -0
  79. /package/{types → dist}/binary.d.ts +0 -0
  80. /package/{types → dist}/broadcastchannel.d.ts +0 -0
  81. /package/{types → dist}/cache.d.ts +0 -0
  82. /package/{types → dist}/conditions.d.ts +0 -0
  83. /package/{types → dist}/crypto/aes-gcm.d.ts +0 -0
  84. /package/{types → dist}/crypto/common.d.ts +0 -0
  85. /package/{types → dist}/crypto/ecdsa.d.ts +0 -0
  86. /package/{types → dist}/crypto/jwt.d.ts +0 -0
  87. /package/{types → dist}/crypto/rsa-oaep.d.ts +0 -0
  88. /package/{types → dist}/decoding.d.ts +0 -0
  89. /package/{types → dist}/diff.d.ts +0 -0
  90. /package/{types → dist}/dom.d.ts +0 -0
  91. /package/{types → dist}/encoding.d.ts +0 -0
  92. /package/{types → dist}/error.d.ts +0 -0
  93. /package/{types → dist}/eventloop.d.ts +0 -0
  94. /package/{types → dist}/function.d.ts +0 -0
  95. /package/{types → dist}/hash/rabin-gf2-polynomial.d.ts +0 -0
  96. /package/{types → dist}/hash/rabin-uncached.d.ts +0 -0
  97. /package/{types → dist}/hash/rabin.d.ts +0 -0
  98. /package/{types → dist}/hash/sha256.d.ts +0 -0
  99. /package/{types → dist}/hash/sha256.node.d.ts +0 -0
  100. /package/{types → dist}/indexeddb.d.ts +0 -0
  101. /package/{types → dist}/indexeddbV2.d.ts +0 -0
  102. /package/{types → dist}/iterator.d.ts +0 -0
  103. /package/{types → dist}/json.d.ts +0 -0
  104. /package/{types → dist}/list.d.ts +0 -0
  105. /package/{types → dist}/logging.common.d.ts +0 -0
  106. /package/{types → dist}/logging.d.ts +0 -0
  107. /package/{types → dist}/logging.node.d.ts +0 -0
  108. /package/{types → dist}/map.d.ts +0 -0
  109. /package/{types → dist}/math.d.ts +0 -0
  110. /package/{types → dist}/metric.d.ts +0 -0
  111. /package/{types → dist}/mutex.d.ts +0 -0
  112. /package/{types → dist}/number.d.ts +0 -0
  113. /package/{types → dist}/object.d.ts +0 -0
  114. /package/{types → dist}/observable.d.ts +0 -0
  115. /package/{types → dist}/pair.d.ts +0 -0
  116. /package/{types → dist}/performance.d.ts +0 -0
  117. /package/{types → dist}/performance.node.d.ts +0 -0
  118. /package/{types → dist}/pledge.d.ts +0 -0
  119. /package/{types → dist}/prng/Mt19937.d.ts +0 -0
  120. /package/{types → dist}/prng/Xoroshiro128plus.d.ts +0 -0
  121. /package/{types → dist}/prng/Xorshift32.d.ts +0 -0
  122. /package/{types → dist}/prng.d.ts +0 -0
  123. /package/{types → dist}/promise.d.ts +0 -0
  124. /package/{types → dist}/queue.d.ts +0 -0
  125. /package/{types → dist}/random.d.ts +0 -0
  126. /package/{types → dist}/set.d.ts +0 -0
  127. /package/{types → dist}/sort.d.ts +0 -0
  128. /package/{types → dist}/statistics.d.ts +0 -0
  129. /package/{types → dist}/storage.d.ts +0 -0
  130. /package/{types → dist}/string.d.ts +0 -0
  131. /package/{types → dist}/symbol.d.ts +0 -0
  132. /package/{types → dist}/testing.d.ts +0 -0
  133. /package/{types → dist}/time.d.ts +0 -0
  134. /package/{types → dist}/trait/equality.d.ts +0 -0
  135. /package/{types → dist}/trait/fingerprint.d.ts +0 -0
  136. /package/{types → dist}/trait/traits.d.ts +0 -0
  137. /package/{types → dist}/url.d.ts +0 -0
  138. /package/{types → dist}/webcrypto.deno.d.ts +0 -0
  139. /package/{types → dist}/webcrypto.node.d.ts +0 -0
  140. /package/{types → dist}/webcrypto.react-native.d.ts +0 -0
  141. /package/{types → dist}/websocket.d.ts +0 -0
@@ -1,372 +0,0 @@
1
- /* eslint-disable */
2
- // @ts-nocheck
3
- // @todo remove all @ts-nocheck and eslint-disable
4
- /* global MutationObserver */
5
- import { ObservableV2 } from '../observable.js'
6
- import * as delta from './delta.js'
7
- import * as dt from './t3.test.js' // eslint-disable-line
8
- import * as dom from '../dom.js'
9
- import * as set from '../set.js'
10
- import * as map from '../map.js'
11
- import * as error from '../error.js'
12
- import * as math from '../math.js'
13
- import * as mux from '../mutex.js'
14
- import * as s from '../schema.js'
15
-
16
- /**
17
- * @template T
18
- * @typedef {import('../schema.js').Schema<T>} Schema
19
- */
20
-
21
- /**
22
- * @template {delta.AbstractDelta} DeltaA
23
- * @template {delta.AbstractDelta} DeltaB
24
- */
25
- export class Binding {
26
- /**
27
- * @param {RDT<DeltaA>} a
28
- * @param {RDT<DeltaB>} b
29
- * @param {dt.Template<any,DeltaA,DeltaB>} template
30
- */
31
- constructor (a, b, template) {
32
- /**
33
- * @type {dt.Transformer<any,DeltaA,DeltaB>}
34
- */
35
- this.t = template.init()
36
- this.a = a
37
- this.b = b
38
- this._mux = mux.createMutex()
39
- this._achanged = this.a.on('change', d => this._mux(() => {
40
- const tres = this.t.applyA(d)
41
- if (tres.a) {
42
- a.update(tres.a)
43
- }
44
- if (tres.b) {
45
- b.update(tres.b)
46
- }
47
- }))
48
- this._bchanged = this.b.on('change', d => this._mux(() => {
49
- const tres = this.t.applyB(d)
50
- if (tres.b) {
51
- this.b.update(tres.b)
52
- }
53
- if (tres.a) {
54
- a.update(tres.a)
55
- }
56
- }))
57
- }
58
-
59
- destroy = () => {
60
- this.a.off('destroy', this.destroy)
61
- this.b.off('destroy', this.destroy)
62
- this.a.off('change', this._achanged)
63
- this.b.off('change', this._bchanged)
64
- }
65
- }
66
-
67
- /**
68
- * Abstract Interface for a delta-based Replicated Data Type.
69
- *
70
- * @template {delta.AbstractDelta} Delta
71
- * @typedef {ObservableV2<{ 'change': (delta: Delta) => void, 'destroy': (rdt:RDT<Delta>)=>void }> & { update: (delta: Delta) => any, destroy: () => void }} RDT
72
- */
73
-
74
- /**
75
- * @template {delta.AbstractDelta} DeltaA
76
- * @template {dt.Template<any,DeltaA,any>} Transformer
77
- * @param {RDT<DeltaA>} a
78
- * @param {RDT<Transformer extends dt.Template<any,DeltaA,infer DeltaB> ? DeltaB : never>} b
79
- * @param {dt.Template<any,DeltaA,any>} template
80
- */
81
- export const bind = (a, b, template) => new Binding(a, b, template)
82
-
83
- /**
84
- * @template {delta.AbstractDelta} Delta
85
- * @implements RDT<Delta>
86
- * @extends {ObservableV2<{ change: (delta: Delta) => void, 'destroy': (rdt:DeltaRDT<Delta>)=>void }>}
87
- */
88
- class DeltaRDT extends ObservableV2 {
89
- /**
90
- * @param {Schema<Delta>} $delta
91
- */
92
- constructor ($delta) {
93
- super()
94
- this.$delta = $delta
95
- /**
96
- * @type {Delta?}
97
- */
98
- this.state = null
99
- this._mux = mux.createMutex()
100
- }
101
-
102
- /**
103
- * @param {Delta} delta
104
- */
105
- update = delta => delta.isEmpty() || this._mux(() => {
106
- if (this.state != null) {
107
- this.state.apply(delta)
108
- } else {
109
- this.state = delta
110
- }
111
- this.emit('change', [delta])
112
- })
113
-
114
- destroy () {
115
- this.emit('destroy', [this])
116
- super.destroy()
117
- }
118
- }
119
-
120
- /**
121
- * @template {delta.AbstractDelta} Delta
122
- * @param {Schema<Delta>} $delta
123
- */
124
- export const deltaRDT = $delta => new DeltaRDT($delta)
125
-
126
- /**
127
- * @param {Node} domNode
128
- */
129
- const domToDelta = domNode => {
130
- if (dom.$element.check(domNode)) {
131
- const d = delta.node(domNode.nodeName.toLowerCase())
132
- for (let i = 0; i < domNode.attributes.length; i++) {
133
- const attr = /** @type {Attr} */ (domNode.attributes.item(i))
134
- d.attributes.set(attr.nodeName, attr.value)
135
- }
136
- domNode.childNodes.forEach(child => {
137
- d.children.insert(dom.$text.check(child) ? child.textContent : [domToDelta(child)])
138
- })
139
- return d
140
- }
141
- error.unexpectedCase()
142
- }
143
-
144
- /**
145
- * @param {DomDelta} d
146
- */
147
- const deltaToDom = d => {
148
- if (delta.$nodeAny.check(d)) {
149
- const n = dom.element(d.name)
150
- d.attributes.forEach(change => {
151
- if (delta.$insertOp.check(change)) {
152
- n.setAttribute(change.key, change.value)
153
- }
154
- })
155
- d.children.forEach(child => {
156
- if (delta.$insertOp.check(child)) {
157
- n.append(...child.insert.map(deltaToDom))
158
- } else if (delta.$textOp.check(child)) {
159
- n.append(dom.text(child.insert))
160
- }
161
- })
162
- return n
163
- }
164
- error.unexpectedCase()
165
- }
166
-
167
- /**
168
- * @param {Element} el
169
- * @param {delta.Node<string,any,any,any>} d
170
- */
171
- const applyDeltaToDom = (el, d) => {
172
- d.attributes.forEach(change => {
173
- if (delta.$deleteOp.check(change)) {
174
- el.removeAttribute(change.key)
175
- } else {
176
- el.setAttribute(change.key, change.value)
177
- }
178
- })
179
- let childIndex = 0
180
- let childOffset = 0
181
- d.children.forEach(change => {
182
- let child = el.childNodes[childIndex] || null
183
- if (delta.$deleteOp.check(change)) {
184
- let len = change.length
185
- while (len > 0) {
186
- if (dom.$element.check(child)) {
187
- child.remove()
188
- len--
189
- } else if (dom.$text.check(child)) {
190
- const childLen = child.length
191
- if (childOffset === 0 && childLen <= len) {
192
- child.remove()
193
- len -= childLen
194
- } else {
195
- const spliceLen = math.min(len, childLen - childOffset)
196
- child.deleteData(childOffset, spliceLen)
197
- if (child.length <= childOffset) {
198
- childOffset = 0
199
- childIndex++
200
- }
201
- }
202
- }
203
- }
204
- } else if (delta.$insertOp.check(change)) {
205
- if (childOffset > 0) {
206
- const tchild = dom.$text.cast(child)
207
- child = tchild.splitText(childOffset)
208
- childIndex++
209
- childOffset = 0
210
- }
211
- el.insertBefore(dom.fragment(change.insert.map(deltaToDom)), child)
212
- } else if (delta.$modifyOp.check(change)) {
213
- applyDeltaToDom(dom.$element.cast(child), change.modify)
214
- } else if (delta.$textOp.check(change)) {
215
- el.insertBefore(dom.text(change.insert), child)
216
- } else {
217
- error.unexpectedCase()
218
- }
219
- })
220
- }
221
-
222
- export const $domDelta = delta.$node(s.$string, s.$record(s.$string, s.$string), s.$never, { recursive: true, withText: true })
223
-
224
- /**
225
- * @param {Element} observedNode
226
- * @param {MutationRecord[]} mutations
227
- * @param {any} origin assign this origin to the generated delta
228
- */
229
- const _mutationsToDelta = (observedNode, mutations, origin) => {
230
- /**
231
- * @typedef {{ removedBefore: Map<Node?,number>, added: Set<Node>, modified: number, d: delta.Node }} ChangedNodeInfo
232
- */
233
- /**
234
- * Compute all deltas without recursion.
235
- *
236
- * 1. mark all changed parents in parentsChanged
237
- * 2. fill out necessary information for each changed parent ()
238
- */
239
- //
240
- /**
241
- * @type {Map<Node,ChangedNodeInfo>}
242
- */
243
- const changedNodes = map.create()
244
- /**
245
- * @param {Node} node
246
- * @return {ChangedNodeInfo}
247
- */
248
- const getChangedNodeInfo = node => map.setIfUndefined(changedNodes, node, () => ({ removedBefore: map.create(), added: set.create(), modified: 0, d: delta.node(node.nodeName.toLowerCase()) }))
249
- const observedNodeInfo = getChangedNodeInfo(observedNode)
250
- mutations.forEach(mutation => {
251
- const target = /** @type {HTMLElement} */ (mutation.target)
252
- const parent = target.parentNode
253
- const attrName = /** @type {string} */ (mutation.attributeName)
254
- const newVal = target.getAttribute(attrName)
255
- const info = getChangedNodeInfo(target)
256
- const d = info.d
257
- // go up the tree and mark that a child has been modified
258
- for (let changedParent = parent; changedParent != null && getChangedNodeInfo(changedParent).modified++ > 1 && changedParent !== observedNode; changedParent = changedParent.parentNode) {
259
- // nop
260
- }
261
- switch (mutation.type) {
262
- case 'attributes': {
263
- const attrs = /** @type {delta.Node<any,any,any>} */ (d).attributes
264
- if (newVal == null) {
265
- attrs.delete(attrName)
266
- } else {
267
- attrs.set(/** @type {string} */ (attrName), newVal)
268
- }
269
- break
270
- }
271
- case 'characterData': {
272
- error.methodUnimplemented()
273
- break
274
- }
275
- case 'childList': {
276
- const targetInfo = getChangedNodeInfo(target)
277
- mutation.addedNodes.forEach(node => {
278
- targetInfo.added.add(node)
279
- })
280
- const removed = mutation.removedNodes.length
281
- if (removed > 0) {
282
- // @todo this can't work because next can be null
283
- targetInfo.removedBefore.set(mutation.nextSibling, removed)
284
- }
285
- break
286
- }
287
- }
288
- })
289
- changedNodes.forEach((info, node) => {
290
- const numOfChildChanges = info.modified + info.removedBefore.size + info.added.size
291
- const d = /** @type {delta.Node<any,any,any>} */ (info.d)
292
- if (numOfChildChanges > 0) {
293
- node.childNodes.forEach(nchild => {
294
- if (info.removedBefore.has(nchild)) { // can happen separately
295
- d.children.delete(/** @type {number} */ (info.removedBefore.get(nchild)))
296
- }
297
- if (info.added.has(nchild)) {
298
- d.children.insert(dom.$text.check(nchild) ? nchild.textContent : [domToDelta(nchild)])
299
- } else if (changedNodes.has(nchild)) {
300
- d.children.modify(getChangedNodeInfo(nchild).d)
301
- }
302
- })
303
- // remove items to the end, if necessary
304
- d.children.delete(info.removedBefore.get(null) ?? 0)
305
- }
306
- d.done()
307
- })
308
- observedNodeInfo.d.origin = origin
309
- return observedNodeInfo.d
310
- }
311
-
312
- /**
313
- * @typedef {delta.RecursiveNode<string, { [key:string]: string }, never, true>} DomDelta
314
- */
315
-
316
- /**
317
- * @template {DomDelta} [D=DomDelta]
318
- * @implements RDT<D>
319
- * @extends {ObservableV2<{ change: (delta: D)=>void, destroy: (rdt:DomRDT<D>)=>void }>}>}
320
- */
321
- class DomRDT extends ObservableV2 {
322
- /**
323
- * @param {Element} observedNode
324
- */
325
- constructor (observedNode) {
326
- super()
327
- this.observedNode = observedNode
328
- this._mux = mux.createMutex()
329
- this.observer = new MutationObserver(this._mutationHandler)
330
- this.observer.observe(observedNode, {
331
- subtree: true,
332
- childList: true,
333
- attributes: true,
334
- characterDataOldValue: true
335
- })
336
- }
337
-
338
- /**
339
- * @param {MutationRecord[]} mutations
340
- */
341
- _mutationHandler = mutations =>
342
- mutations.length > 0 && this._mux(() => {
343
- this.emit('change', [/** @type {D} */(_mutationsToDelta(this.observedNode, mutations, this))])
344
- })
345
-
346
- /**
347
- * @param {D} delta
348
- */
349
- update = delta => {
350
- if (delta.origin !== this) {
351
- // @todo the retrieved changes must be transformed agains the updated changes. need a proper
352
- // transaction system
353
- this._mutationHandler(this.observer.takeRecords())
354
- this._mux(() => {
355
- applyDeltaToDom(this.observedNode, delta)
356
- const mutations = this.observer.takeRecords()
357
- this.emit('change', [/** @type {D} */(_mutationsToDelta(this.observedNode, mutations, delta.origin))])
358
- })
359
- }
360
- }
361
-
362
- destroy () {
363
- this.emit('destroy', [this])
364
- super.destroy()
365
- this.observer.disconnect()
366
- }
367
- }
368
-
369
- /**
370
- * @param {Element} dom
371
- */
372
- export const domRDT = dom => new DomRDT(dom)