This commit is contained in:
Kevin Jahns 2020-01-22 16:42:16 +01:00
parent ac8dab1e88
commit 6cd9e2be32
32 changed files with 910 additions and 574 deletions

1235
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -56,7 +56,7 @@
}, },
"homepage": "https://yjs.dev", "homepage": "https://yjs.dev",
"dependencies": { "dependencies": {
"lib0": "^0.2.2" "lib0": "^0.2.7"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-commonjs": "^11.0.1", "@rollup/plugin-commonjs": "^11.0.1",
@ -65,11 +65,11 @@
"http-server": "^0.12.1", "http-server": "^0.12.1",
"jsdoc": "^3.6.3", "jsdoc": "^3.6.3",
"markdownlint-cli": "^0.19.0", "markdownlint-cli": "^0.19.0",
"rollup": "^1.29.0", "rollup": "^1.29.1",
"rollup-cli": "^1.0.9", "rollup-cli": "^1.0.9",
"standard": "^11.0.1", "standard": "^14.0.0",
"tui-jsdoc-template": "^1.2.2", "tui-jsdoc-template": "^1.2.2",
"typescript": "^3.6.2", "typescript": "^3.7.5",
"y-protocols": "^0.2.0" "y-protocols": "^0.2.0"
} }
} }

View File

@ -24,6 +24,7 @@ export class AbstractStruct {
this.length = length this.length = length
this.deleted = false this.deleted = false
} }
/** /**
* Merge this struct with the item to the right. * Merge this struct with the item to the right.
* This method is already assuming that `this.id.clock + this.length === this.id.clock`. * This method is already assuming that `this.id.clock + this.length === this.id.clock`.
@ -34,6 +35,7 @@ export class AbstractStruct {
mergeWith (right) { mergeWith (right) {
return false return false
} }
/** /**
* @param {encoding.Encoder} encoder The encoder to write data to. * @param {encoding.Encoder} encoder The encoder to write data to.
* @param {number} offset * @param {number} offset
@ -43,6 +45,7 @@ export class AbstractStruct {
write (encoder, offset, encodingRef) { write (encoder, offset, encodingRef) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
*/ */
@ -69,6 +72,7 @@ export class AbstractStructRef {
*/ */
this.id = id this.id = id
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @return {Array<ID|null>} * @return {Array<ID|null>}
@ -76,6 +80,7 @@ export class AbstractStructRef {
getMissing (transaction) { getMissing (transaction) {
return this._missing return this._missing
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {StructStore} store * @param {StructStore} store

View File

@ -18,30 +18,35 @@ export class ContentAny {
*/ */
this.arr = arr this.arr = arr
} }
/** /**
* @return {number} * @return {number}
*/ */
getLength () { getLength () {
return this.arr.length return this.arr.length
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
return this.arr return this.arr
} }
/** /**
* @return {boolean} * @return {boolean}
*/ */
isCountable () { isCountable () {
return true return true
} }
/** /**
* @return {ContentAny} * @return {ContentAny}
*/ */
copy () { copy () {
return new ContentAny(this.arr) return new ContentAny(this.arr)
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {ContentAny} * @return {ContentAny}
@ -51,6 +56,7 @@ export class ContentAny {
this.arr = this.arr.slice(0, offset) this.arr = this.arr.slice(0, offset)
return right return right
} }
/** /**
* @param {ContentAny} right * @param {ContentAny} right
* @return {boolean} * @return {boolean}
@ -59,6 +65,7 @@ export class ContentAny {
this.arr = this.arr.concat(right.arr) this.arr = this.arr.concat(right.arr)
return true return true
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -84,6 +91,7 @@ export class ContentAny {
encoding.writeAny(encoder, c) encoding.writeAny(encoder, c)
} }
} }
/** /**
* @return {number} * @return {number}
*/ */

View File

@ -17,30 +17,35 @@ export class ContentBinary {
constructor (content) { constructor (content) {
this.content = content this.content = content
} }
/** /**
* @return {number} * @return {number}
*/ */
getLength () { getLength () {
return 1 return 1
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
return [this.content] return [this.content]
} }
/** /**
* @return {boolean} * @return {boolean}
*/ */
isCountable () { isCountable () {
return true return true
} }
/** /**
* @return {ContentBinary} * @return {ContentBinary}
*/ */
copy () { copy () {
return new ContentBinary(this.content) return new ContentBinary(this.content)
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {ContentBinary} * @return {ContentBinary}
@ -48,6 +53,7 @@ export class ContentBinary {
splice (offset) { splice (offset) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {ContentBinary} right * @param {ContentBinary} right
* @return {boolean} * @return {boolean}
@ -55,6 +61,7 @@ export class ContentBinary {
mergeWith (right) { mergeWith (right) {
return false return false
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -75,6 +82,7 @@ export class ContentBinary {
write (encoder, offset) { write (encoder, offset) {
encoding.writeVarUint8Array(encoder, this.content) encoding.writeVarUint8Array(encoder, this.content)
} }
/** /**
* @return {number} * @return {number}
*/ */

View File

@ -17,30 +17,35 @@ export class ContentDeleted {
constructor (len) { constructor (len) {
this.len = len this.len = len
} }
/** /**
* @return {number} * @return {number}
*/ */
getLength () { getLength () {
return this.len return this.len
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
return [] return []
} }
/** /**
* @return {boolean} * @return {boolean}
*/ */
isCountable () { isCountable () {
return false return false
} }
/** /**
* @return {ContentDeleted} * @return {ContentDeleted}
*/ */
copy () { copy () {
return new ContentDeleted(this.len) return new ContentDeleted(this.len)
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {ContentDeleted} * @return {ContentDeleted}
@ -50,6 +55,7 @@ export class ContentDeleted {
this.len = offset this.len = offset
return right return right
} }
/** /**
* @param {ContentDeleted} right * @param {ContentDeleted} right
* @return {boolean} * @return {boolean}
@ -58,6 +64,7 @@ export class ContentDeleted {
this.len += right.len this.len += right.len
return true return true
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -66,6 +73,7 @@ export class ContentDeleted {
addToDeleteSet(transaction.deleteSet, item.id, this.len) addToDeleteSet(transaction.deleteSet, item.id, this.len)
item.deleted = true item.deleted = true
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
*/ */
@ -81,6 +89,7 @@ export class ContentDeleted {
write (encoder, offset) { write (encoder, offset) {
encoding.writeVarUint(encoder, this.len - offset) encoding.writeVarUint(encoder, this.len - offset)
} }
/** /**
* @return {number} * @return {number}
*/ */

View File

@ -17,30 +17,35 @@ export class ContentEmbed {
constructor (embed) { constructor (embed) {
this.embed = embed this.embed = embed
} }
/** /**
* @return {number} * @return {number}
*/ */
getLength () { getLength () {
return 1 return 1
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
return [this.embed] return [this.embed]
} }
/** /**
* @return {boolean} * @return {boolean}
*/ */
isCountable () { isCountable () {
return true return true
} }
/** /**
* @return {ContentEmbed} * @return {ContentEmbed}
*/ */
copy () { copy () {
return new ContentEmbed(this.embed) return new ContentEmbed(this.embed)
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {ContentEmbed} * @return {ContentEmbed}
@ -48,6 +53,7 @@ export class ContentEmbed {
splice (offset) { splice (offset) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {ContentEmbed} right * @param {ContentEmbed} right
* @return {boolean} * @return {boolean}
@ -55,6 +61,7 @@ export class ContentEmbed {
mergeWith (right) { mergeWith (right) {
return false return false
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -75,6 +82,7 @@ export class ContentEmbed {
write (encoder, offset) { write (encoder, offset) {
encoding.writeVarString(encoder, JSON.stringify(this.embed)) encoding.writeVarString(encoder, JSON.stringify(this.embed))
} }
/** /**
* @return {number} * @return {number}
*/ */

View File

@ -19,30 +19,35 @@ export class ContentFormat {
this.key = key this.key = key
this.value = value this.value = value
} }
/** /**
* @return {number} * @return {number}
*/ */
getLength () { getLength () {
return 1 return 1
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
return [] return []
} }
/** /**
* @return {boolean} * @return {boolean}
*/ */
isCountable () { isCountable () {
return false return false
} }
/** /**
* @return {ContentFormat} * @return {ContentFormat}
*/ */
copy () { copy () {
return new ContentFormat(this.key, this.value) return new ContentFormat(this.key, this.value)
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {ContentFormat} * @return {ContentFormat}
@ -50,6 +55,7 @@ export class ContentFormat {
splice (offset) { splice (offset) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {ContentFormat} right * @param {ContentFormat} right
* @return {boolean} * @return {boolean}
@ -57,6 +63,7 @@ export class ContentFormat {
mergeWith (right) { mergeWith (right) {
return false return false
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -78,6 +85,7 @@ export class ContentFormat {
encoding.writeVarString(encoder, this.key) encoding.writeVarString(encoder, this.key)
encoding.writeVarString(encoder, JSON.stringify(this.value)) encoding.writeVarString(encoder, JSON.stringify(this.value))
} }
/** /**
* @return {number} * @return {number}
*/ */

View File

@ -18,30 +18,35 @@ export class ContentJSON {
*/ */
this.arr = arr this.arr = arr
} }
/** /**
* @return {number} * @return {number}
*/ */
getLength () { getLength () {
return this.arr.length return this.arr.length
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
return this.arr return this.arr
} }
/** /**
* @return {boolean} * @return {boolean}
*/ */
isCountable () { isCountable () {
return true return true
} }
/** /**
* @return {ContentJSON} * @return {ContentJSON}
*/ */
copy () { copy () {
return new ContentJSON(this.arr) return new ContentJSON(this.arr)
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {ContentJSON} * @return {ContentJSON}
@ -51,6 +56,7 @@ export class ContentJSON {
this.arr = this.arr.slice(0, offset) this.arr = this.arr.slice(0, offset)
return right return right
} }
/** /**
* @param {ContentJSON} right * @param {ContentJSON} right
* @return {boolean} * @return {boolean}
@ -59,6 +65,7 @@ export class ContentJSON {
this.arr = this.arr.concat(right.arr) this.arr = this.arr.concat(right.arr)
return true return true
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -84,6 +91,7 @@ export class ContentJSON {
encoding.writeVarString(encoder, c === undefined ? 'undefined' : JSON.stringify(c)) encoding.writeVarString(encoder, c === undefined ? 'undefined' : JSON.stringify(c))
} }
} }
/** /**
* @return {number} * @return {number}
*/ */

View File

@ -18,30 +18,35 @@ export class ContentString {
*/ */
this.str = str this.str = str
} }
/** /**
* @return {number} * @return {number}
*/ */
getLength () { getLength () {
return this.str.length return this.str.length
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
return this.str.split('') return this.str.split('')
} }
/** /**
* @return {boolean} * @return {boolean}
*/ */
isCountable () { isCountable () {
return true return true
} }
/** /**
* @return {ContentString} * @return {ContentString}
*/ */
copy () { copy () {
return new ContentString(this.str) return new ContentString(this.str)
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {ContentString} * @return {ContentString}
@ -51,6 +56,7 @@ export class ContentString {
this.str = this.str.slice(0, offset) this.str = this.str.slice(0, offset)
return right return right
} }
/** /**
* @param {ContentString} right * @param {ContentString} right
* @return {boolean} * @return {boolean}
@ -59,6 +65,7 @@ export class ContentString {
this.str += right.str this.str += right.str
return true return true
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -79,6 +86,7 @@ export class ContentString {
write (encoder, offset) { write (encoder, offset) {
encoding.writeVarString(encoder, offset === 0 ? this.str : this.str.slice(offset)) encoding.writeVarString(encoder, offset === 0 ? this.str : this.str.slice(offset))
} }
/** /**
* @return {number} * @return {number}
*/ */

View File

@ -49,30 +49,35 @@ export class ContentType {
*/ */
this.type = type this.type = type
} }
/** /**
* @return {number} * @return {number}
*/ */
getLength () { getLength () {
return 1 return 1
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
return [this.type] return [this.type]
} }
/** /**
* @return {boolean} * @return {boolean}
*/ */
isCountable () { isCountable () {
return true return true
} }
/** /**
* @return {ContentType} * @return {ContentType}
*/ */
copy () { copy () {
return new ContentType(this.type._copy()) return new ContentType(this.type._copy())
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {ContentType} * @return {ContentType}
@ -80,6 +85,7 @@ export class ContentType {
splice (offset) { splice (offset) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {ContentType} right * @param {ContentType} right
* @return {boolean} * @return {boolean}
@ -87,6 +93,7 @@ export class ContentType {
mergeWith (right) { mergeWith (right) {
return false return false
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -94,6 +101,7 @@ export class ContentType {
integrate (transaction, item) { integrate (transaction, item) {
this.type._integrate(transaction.doc, item) this.type._integrate(transaction.doc, item)
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
*/ */
@ -121,6 +129,7 @@ export class ContentType {
}) })
transaction.changed.delete(this.type) transaction.changed.delete(this.type)
} }
/** /**
* @param {StructStore} store * @param {StructStore} store
*/ */
@ -139,6 +148,7 @@ export class ContentType {
}) })
this.type._map = new Map() this.type._map = new Map()
} }
/** /**
* @param {encoding.Encoder} encoder * @param {encoding.Encoder} encoder
* @param {number} offset * @param {number} offset
@ -146,6 +156,7 @@ export class ContentType {
write (encoder, offset) { write (encoder, offset) {
this.type._write(encoder) this.type._write(encoder)
} }
/** /**
* @return {number} * @return {number}
*/ */

View File

@ -69,6 +69,7 @@ export class GCRef extends AbstractStructRef {
*/ */
this.length = decoding.readVarUint(decoder) this.length = decoding.readVarUint(decoder)
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {StructStore} store * @param {StructStore} store

View File

@ -430,6 +430,7 @@ export class Item extends AbstractStruct {
get lastId () { get lastId () {
return createID(this.id.client, this.id.clock + this.length - 1) return createID(this.id.client, this.id.clock + this.length - 1)
} }
/** /**
* Try to merge two items * Try to merge two items
* *
@ -578,12 +579,14 @@ export class AbstractContent {
getLength () { getLength () {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @return {Array<any>} * @return {Array<any>}
*/ */
getContent () { getContent () {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* Should return false if this Item is some kind of meta information * Should return false if this Item is some kind of meta information
* (e.g. format information). * (e.g. format information).
@ -596,12 +599,14 @@ export class AbstractContent {
isCountable () { isCountable () {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @return {AbstractContent} * @return {AbstractContent}
*/ */
copy () { copy () {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {number} offset * @param {number} offset
* @return {AbstractContent} * @return {AbstractContent}
@ -609,6 +614,7 @@ export class AbstractContent {
splice (offset) { splice (offset) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {AbstractContent} right * @param {AbstractContent} right
* @return {boolean} * @return {boolean}
@ -616,6 +622,7 @@ export class AbstractContent {
mergeWith (right) { mergeWith (right) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {Item} item * @param {Item} item
@ -623,18 +630,21 @@ export class AbstractContent {
integrate (transaction, item) { integrate (transaction, item) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
*/ */
delete (transaction) { delete (transaction) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {StructStore} store * @param {StructStore} store
*/ */
gc (store) { gc (store) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @param {encoding.Encoder} encoder * @param {encoding.Encoder} encoder
* @param {number} offset * @param {number} offset
@ -642,6 +652,7 @@ export class AbstractContent {
write (encoder, offset) { write (encoder, offset) {
throw error.methodUnimplemented() throw error.methodUnimplemented()
} }
/** /**
* @return {number} * @return {number}
*/ */
@ -709,6 +720,7 @@ export class ItemRef extends AbstractStructRef {
this.content = readItemContent(decoder, info) this.content = readItemContent(decoder, info)
this.length = this.content.getLength() this.length = this.content.getLength()
} }
/** /**
* @param {Transaction} transaction * @param {Transaction} transaction
* @param {StructStore} store * @param {StructStore} store

View File

@ -171,7 +171,7 @@ export class AbstractType {
/** /**
* @abstract * @abstract
* @return {Object | Array | number | string} * @return {any}
*/ */
toJSON () {} toJSON () {}
} }
@ -370,7 +370,7 @@ export const typeListInsertGenericsAfter = (transaction, parent, referenceItem,
let left = referenceItem let left = referenceItem
const right = referenceItem === null ? parent._start : referenceItem.right const right = referenceItem === null ? parent._start : referenceItem.right
/** /**
* @type {Array<Object|Array|number>} * @type {Array<Object|Array<any>|number>}
*/ */
let jsonContent = [] let jsonContent = []
const packJsonContent = () => { const packJsonContent = () => {
@ -515,7 +515,7 @@ export const typeMapSet = (transaction, parent, key, value) => {
content = new ContentAny([value]) content = new ContentAny([value])
break break
case Uint8Array: case Uint8Array:
content = new ContentBinary(value) content = new ContentBinary(/** @type {Uint8Array} */ (value))
break break
default: default:
if (value instanceof AbstractType) { if (value instanceof AbstractType) {
@ -552,7 +552,7 @@ export const typeMapGetAll = (parent) => {
/** /**
* @type {Object<string,any>} * @type {Object<string,any>}
*/ */
let res = {} const res = {}
for (const [key, value] of parent._map) { for (const [key, value] of parent._map) {
if (!value.deleted) { if (!value.deleted) {
res[key] = value.content.getContent()[value.length - 1] res[key] = value.content.getContent()[value.length - 1]

View File

@ -51,6 +51,7 @@ export class YArray extends AbstractType {
*/ */
this._prelimContent = [] this._prelimContent = []
} }
/** /**
* Integrate this type into the Yjs instance. * Integrate this type into the Yjs instance.
* *
@ -65,7 +66,7 @@ export class YArray extends AbstractType {
*/ */
_integrate (y, item) { _integrate (y, item) {
super._integrate(y, item) super._integrate(y, item)
this.insert(0, /** @type {Array} */ (this._prelimContent)) this.insert(0, /** @type {Array<any>} */ (this._prelimContent))
this._prelimContent = null this._prelimContent = null
} }
@ -76,6 +77,7 @@ export class YArray extends AbstractType {
get length () { get length () {
return this._prelimContent === null ? this._length : this._prelimContent.length return this._prelimContent === null ? this._length : this._prelimContent.length
} }
/** /**
* Creates YArrayEvent and calls observers. * Creates YArrayEvent and calls observers.
* *
@ -110,7 +112,7 @@ export class YArray extends AbstractType {
typeListInsertGenerics(transaction, this, index, content) typeListInsertGenerics(transaction, this, index, content)
}) })
} else { } else {
/** @type {Array} */ (this._prelimContent).splice(index, 0, ...content) /** @type {Array<any>} */ (this._prelimContent).splice(index, 0, ...content)
} }
} }
@ -135,7 +137,7 @@ export class YArray extends AbstractType {
typeListDelete(transaction, this, index, length) typeListDelete(transaction, this, index, length)
}) })
} else { } else {
/** @type {Array} */ (this._prelimContent).splice(index, length) /** @type {Array<any>} */ (this._prelimContent).splice(index, length)
} }
} }

View File

@ -53,6 +53,7 @@ export class YMap extends AbstractType {
*/ */
this._prelimContent = new Map() this._prelimContent = new Map()
} }
/** /**
* Integrate this type into the Yjs instance. * Integrate this type into the Yjs instance.
* *
@ -67,7 +68,7 @@ export class YMap extends AbstractType {
*/ */
_integrate (y, item) { _integrate (y, item) {
super._integrate(y, item) super._integrate(y, item)
for (let [key, value] of /** @type {Map<string, any>} */ (this._prelimContent)) { for (const [key, value] of /** @type {Map<string, any>} */ (this._prelimContent)) {
this.set(key, value) this.set(key, value)
} }
this._prelimContent = null this._prelimContent = null
@ -99,7 +100,7 @@ export class YMap extends AbstractType {
* @type {Object<string,T>} * @type {Object<string,T>}
*/ */
const map = {} const map = {}
for (let [key, item] of this._map) { for (const [key, item] of this._map) {
if (!item.deleted) { if (!item.deleted) {
const v = item.content.getContent()[item.length - 1] const v = item.content.getContent()[item.length - 1]
map[key] = v instanceof AbstractType ? v.toJSON() : v map[key] = v instanceof AbstractType ? v.toJSON() : v
@ -145,7 +146,7 @@ export class YMap extends AbstractType {
* @type {Object<string,T>} * @type {Object<string,T>}
*/ */
const map = {} const map = {}
for (let [key, item] of this._map) { for (const [key, item] of this._map) {
if (!item.deleted) { if (!item.deleted) {
f(item.content.getContent()[item.length - 1], key, this) f(item.content.getContent()[item.length - 1], key, this)
} }

View File

@ -112,10 +112,9 @@ const findNextPosition = (transaction, currentAttributes, left, right, count) =>
* @function * @function
*/ */
const findPosition = (transaction, parent, index) => { const findPosition = (transaction, parent, index) => {
let currentAttributes = new Map() const currentAttributes = new Map()
let left = null const right = parent._start
let right = parent._start return findNextPosition(transaction, currentAttributes, null, right, index)
return findNextPosition(transaction, currentAttributes, left, right, index)
} }
/** /**
@ -147,7 +146,7 @@ const insertNegatedAttributes = (transaction, parent, left, right, negatedAttrib
left = right left = right
right = right.right right = right.right
} }
for (let [key, val] of negatedAttributes) { for (const [key, val] of negatedAttributes) {
left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new ContentFormat(key, val)) left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new ContentFormat(key, val))
left.integrate(transaction) left.integrate(transaction)
} }
@ -214,7 +213,7 @@ const minimizeAttributeChanges = (left, right, currentAttributes, attributes) =>
const insertAttributes = (transaction, parent, left, right, currentAttributes, attributes) => { const insertAttributes = (transaction, parent, left, right, currentAttributes, attributes) => {
const negatedAttributes = new Map() const negatedAttributes = new Map()
// insert format-start items // insert format-start items
for (let key in attributes) { for (const key in attributes) {
const val = attributes[key] const val = attributes[key]
const currentVal = currentAttributes.get(key) || null const currentVal = currentAttributes.get(key) || null
if (!equalAttrs(currentVal, val)) { if (!equalAttrs(currentVal, val)) {
@ -241,7 +240,7 @@ const insertAttributes = (transaction, parent, left, right, currentAttributes, a
* @function * @function
**/ **/
const insertText = (transaction, parent, left, right, currentAttributes, text, attributes) => { const insertText = (transaction, parent, left, right, currentAttributes, text, attributes) => {
for (let [key] of currentAttributes) { for (const [key] of currentAttributes) {
if (attributes[key] === undefined) { if (attributes[key] === undefined) {
attributes[key] = null attributes[key] = null
} }
@ -281,7 +280,7 @@ const formatText = (transaction, parent, left, right, currentAttributes, length,
while (length > 0 && right !== null) { while (length > 0 && right !== null) {
if (!right.deleted) { if (!right.deleted) {
switch (right.content.constructor) { switch (right.content.constructor) {
case ContentFormat: case ContentFormat: {
const { key, value } = /** @type {ContentFormat} */ (right.content) const { key, value } = /** @type {ContentFormat} */ (right.content)
const attr = attributes[key] const attr = attributes[key]
if (attr !== undefined) { if (attr !== undefined) {
@ -294,6 +293,7 @@ const formatText = (transaction, parent, left, right, currentAttributes, length,
} }
updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (right.content)) updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (right.content))
break break
}
case ContentEmbed: case ContentEmbed:
case ContentString: case ContentString:
if (length < right.length) { if (length < right.length) {
@ -405,6 +405,7 @@ export class YTextEvent extends YEvent {
*/ */
this._delta = null this._delta = null
} }
/** /**
* Compute the changes in the delta format. * Compute the changes in the delta format.
* A {@link https://quilljs.com/docs/delta/|Quill Delta}) that represents the changes on the document. * A {@link https://quilljs.com/docs/delta/|Quill Delta}) that represents the changes on the document.
@ -429,7 +430,10 @@ export class YTextEvent extends YEvent {
/** /**
* @type {Object<string,any>} * @type {Object<string,any>}
*/ */
let attributes = {} // counts added or removed new attributes for retain const attributes = {} // counts added or removed new attributes for retain
/**
* @type {string|object}
*/
let insert = '' let insert = ''
let retain = 0 let retain = 0
let deleteLen = 0 let deleteLen = 0
@ -448,7 +452,7 @@ export class YTextEvent extends YEvent {
op = { insert } op = { insert }
if (currentAttributes.size > 0) { if (currentAttributes.size > 0) {
op.attributes = {} op.attributes = {}
for (let [key, value] of currentAttributes) { for (const [key, value] of currentAttributes) {
if (value !== null) { if (value !== null) {
op.attributes[key] = value op.attributes[key] = value
} }
@ -460,7 +464,7 @@ export class YTextEvent extends YEvent {
op = { retain } op = { retain }
if (Object.keys(attributes).length > 0) { if (Object.keys(attributes).length > 0) {
op.attributes = {} op.attributes = {}
for (let key in attributes) { for (const key in attributes) {
op.attributes[key] = attributes[key] op.attributes[key] = attributes[key]
} }
} }
@ -518,7 +522,7 @@ export class YTextEvent extends YEvent {
retain += item.length retain += item.length
} }
break break
case ContentFormat: case ContentFormat: {
const { key, value } = /** @type {ContentFormat} */ (item.content) const { key, value } = /** @type {ContentFormat} */ (item.content)
if (this.adds(item)) { if (this.adds(item)) {
if (!this.deletes(item)) { if (!this.deletes(item)) {
@ -570,12 +574,13 @@ export class YTextEvent extends YEvent {
updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (item.content)) updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (item.content))
} }
break break
}
} }
item = item.right item = item.right
} }
addOp() addOp()
while (delta.length > 0) { while (delta.length > 0) {
let lastOp = delta[delta.length - 1] const lastOp = delta[delta.length - 1]
if (lastOp.retain !== undefined && lastOp.attributes === undefined) { if (lastOp.retain !== undefined && lastOp.attributes === undefined) {
// retain delta's if they don't assign attributes // retain delta's if they don't assign attributes
delta.pop() delta.pop()
@ -745,7 +750,7 @@ export class YText extends AbstractType {
*/ */
const attributes = {} const attributes = {}
let addAttributes = false let addAttributes = false
for (let [key, value] of currentAttributes) { for (const [key, value] of currentAttributes) {
addAttributes = true addAttributes = true
attributes[key] = value attributes[key] = value
} }
@ -772,7 +777,7 @@ export class YText extends AbstractType {
while (n !== null) { while (n !== null) {
if (isVisible(n, snapshot) || (prevSnapshot !== undefined && isVisible(n, prevSnapshot))) { if (isVisible(n, snapshot) || (prevSnapshot !== undefined && isVisible(n, prevSnapshot))) {
switch (n.content.constructor) { switch (n.content.constructor) {
case ContentString: case ContentString: {
const cur = currentAttributes.get('ychange') const cur = currentAttributes.get('ychange')
if (snapshot !== undefined && !isVisible(n, snapshot)) { if (snapshot !== undefined && !isVisible(n, snapshot)) {
if (cur === undefined || cur.user !== n.id.client || cur.state !== 'removed') { if (cur === undefined || cur.user !== n.id.client || cur.state !== 'removed') {
@ -790,6 +795,7 @@ export class YText extends AbstractType {
} }
str += /** @type {ContentString} */ (n.content).str str += /** @type {ContentString} */ (n.content).str
break break
}
case ContentEmbed: case ContentEmbed:
packStr() packStr()
ops.push({ ops.push({
@ -831,6 +837,7 @@ export class YText extends AbstractType {
const { left, right, currentAttributes } = findPosition(transaction, this, index) const { left, right, currentAttributes } = findPosition(transaction, this, index)
if (!attributes) { if (!attributes) {
attributes = {} attributes = {}
// @ts-ignore
currentAttributes.forEach((v, k) => { attributes[k] = v }) currentAttributes.forEach((v, k) => { attributes[k] = v })
} }
insertText(transaction, this, left, right, currentAttributes, text, attributes) insertText(transaction, this, left, right, currentAttributes, text, attributes)
@ -902,7 +909,7 @@ export class YText extends AbstractType {
const y = this.doc const y = this.doc
if (y !== null) { if (y !== null) {
transact(y, transaction => { transact(y, transaction => {
let { left, right, currentAttributes } = findPosition(transaction, this, index) const { left, right, currentAttributes } = findPosition(transaction, this, index)
if (right === null) { if (right === null) {
return return
} }

View File

@ -74,7 +74,7 @@ export class YXmlElement extends YXmlFragment {
const attrs = this.getAttributes() const attrs = this.getAttributes()
const stringBuilder = [] const stringBuilder = []
const keys = [] const keys = []
for (let key in attrs) { for (const key in attrs) {
keys.push(key) keys.push(key)
} }
keys.sort() keys.sort()
@ -140,7 +140,7 @@ export class YXmlElement extends YXmlFragment {
* Returns all attribute name/value pairs in a JSON Object. * Returns all attribute name/value pairs in a JSON Object.
* *
* @param {Snapshot} [snapshot] * @param {Snapshot} [snapshot]
* @return {Object} A JSON Object that describes the attributes. * @return {Object<string, any>} A JSON Object that describes the attributes.
* *
* @public * @public
*/ */
@ -165,8 +165,8 @@ export class YXmlElement extends YXmlFragment {
*/ */
toDOM (_document = document, hooks = {}, binding) { toDOM (_document = document, hooks = {}, binding) {
const dom = _document.createElement(this.nodeName) const dom = _document.createElement(this.nodeName)
let attrs = this.getAttributes() const attrs = this.getAttributes()
for (let key in attrs) { for (const key in attrs) {
dom.setAttribute(key, attrs[key]) dom.setAttribute(key, attrs[key])
} }
typeListForEach(this, yxml => { typeListForEach(this, yxml => {

View File

@ -68,6 +68,7 @@ export class YXmlTreeWalker {
[Symbol.iterator] () { [Symbol.iterator] () {
return this return this
} }
/** /**
* Get the next node. * Get the next node.
* *
@ -130,6 +131,7 @@ export class YXmlFragment extends AbstractType {
*/ */
this._prelimContent = [] this._prelimContent = []
} }
/** /**
* Integrate this type into the Yjs instance. * Integrate this type into the Yjs instance.
* *
@ -143,7 +145,7 @@ export class YXmlFragment extends AbstractType {
*/ */
_integrate (y, item) { _integrate (y, item) {
super._integrate(y, item) super._integrate(y, item)
this.insert(0, /** @type {Array} */ (this._prelimContent)) this.insert(0, /** @type {Array<any>} */ (this._prelimContent))
this._prelimContent = null this._prelimContent = null
} }
@ -307,6 +309,7 @@ export class YXmlFragment extends AbstractType {
this._prelimContent.splice(index, length) this._prelimContent.splice(index, length)
} }
} }
/** /**
* Transforms this YArray to a JavaScript Array. * Transforms this YArray to a JavaScript Array.
* *
@ -315,6 +318,7 @@ export class YXmlFragment extends AbstractType {
toArray () { toArray () {
return typeListToArray(this) return typeListToArray(this)
} }
/** /**
* Transform the properties of this type to binary and write it to an * Transform the properties of this type to binary and write it to an
* BinaryEncoder. * BinaryEncoder.

View File

@ -12,6 +12,7 @@ export class YXmlText extends YText {
_copy () { _copy () {
return new YXmlText() return new YXmlText()
} }
/** /**
* Creates a Dom Element that mirrors this YXmlText. * Creates a Dom Element that mirrors this YXmlText.
* *
@ -39,9 +40,9 @@ export class YXmlText extends YText {
// @ts-ignore // @ts-ignore
return this.toDelta().map(delta => { return this.toDelta().map(delta => {
const nestedNodes = [] const nestedNodes = []
for (let nodeName in delta.attributes) { for (const nodeName in delta.attributes) {
const attrs = [] const attrs = []
for (let key in delta.attributes[nodeName]) { for (const key in delta.attributes[nodeName]) {
attrs.push({ key, value: delta.attributes[nodeName][key] }) attrs.push({ key, value: delta.attributes[nodeName][key] })
} }
// sort attributes to get a unique order // sort attributes to get a unique order

View File

@ -46,6 +46,7 @@ export class Doc extends Observable {
*/ */
this._transactionCleanups = [] this._transactionCleanups = []
} }
/** /**
* Changes that happen inside of a transaction are bundled. This means that * Changes that happen inside of a transaction are bundled. This means that
* the observer fires _after_ the transaction is finished and that all changes * the observer fires _after_ the transaction is finished and that all changes
@ -60,6 +61,7 @@ export class Doc extends Observable {
transact (f, origin = null) { transact (f, origin = null) {
transact(this, f, origin) transact(this, f, origin)
} }
/** /**
* Define a shared data type. * Define a shared data type.
* *
@ -118,6 +120,7 @@ export class Doc extends Observable {
} }
return type return type
} }
/** /**
* @template T * @template T
* @param {string} name * @param {string} name
@ -129,6 +132,7 @@ export class Doc extends Observable {
// @ts-ignore // @ts-ignore
return this.get(name, YArray) return this.get(name, YArray)
} }
/** /**
* @param {string} name * @param {string} name
* @return {YText} * @return {YText}
@ -139,6 +143,7 @@ export class Doc extends Observable {
// @ts-ignore // @ts-ignore
return this.get(name, YText) return this.get(name, YText)
} }
/** /**
* @param {string} name * @param {string} name
* @return {YMap<any>} * @return {YMap<any>}
@ -149,6 +154,7 @@ export class Doc extends Observable {
// @ts-ignore // @ts-ignore
return this.get(name, YMap) return this.get(name, YMap)
} }
/** /**
* @param {string} name * @param {string} name
* @return {YXmlFragment} * @return {YXmlFragment}
@ -159,6 +165,7 @@ export class Doc extends Observable {
// @ts-ignore // @ts-ignore
return this.get(name, YXmlFragment) return this.get(name, YXmlFragment)
} }
/** /**
* Emit `destroy` event and unregister all event handlers. * Emit `destroy` event and unregister all event handlers.
* *
@ -168,6 +175,7 @@ export class Doc extends Observable {
this.emit('destroyed', [true]) this.emit('destroyed', [true])
super.destroy() super.destroy()
} }
/** /**
* @param {string} eventName * @param {string} eventName
* @param {function} f * @param {function} f
@ -175,6 +183,7 @@ export class Doc extends Observable {
on (eventName, f) { on (eventName, f) {
super.on(eventName, f) super.on(eventName, f)
} }
/** /**
* @param {string} eventName * @param {string} eventName
* @param {function} f * @param {function} f

View File

@ -81,7 +81,7 @@ export const readID = decoder =>
*/ */
export const findRootTypeKey = type => { export const findRootTypeKey = type => {
// @ts-ignore _y must be defined, otherwise unexpected case // @ts-ignore _y must be defined, otherwise unexpected case
for (let [key, value] of type.doc.share) { for (const [key, value] of type.doc.share) {
if (value === type) { if (value === type) {
return key return key
} }

View File

@ -67,6 +67,7 @@ export class PermanentUserData {
// add intial data // add intial data
users.forEach(initUser) users.forEach(initUser)
} }
/** /**
* @param {Doc} doc * @param {Doc} doc
* @param {number} clientid * @param {number} clientid
@ -116,6 +117,7 @@ export class PermanentUserData {
}) })
}) })
} }
/** /**
* @param {number} clientid * @param {number} clientid
* @return {any} * @return {any}
@ -123,6 +125,7 @@ export class PermanentUserData {
getUserByClientId (clientid) { getUserByClientId (clientid) {
return this.clients.get(clientid) || null return this.clients.get(clientid) || null
} }
/** /**
* @param {ID} id * @param {ID} id
* @return {string | null} * @return {string | null}

View File

@ -63,7 +63,7 @@ export class RelativePosition {
} }
/** /**
* @param {Object} json * @param {any} json
* @return {RelativePosition} * @return {RelativePosition}
* *
* @function * @function

View File

@ -185,7 +185,7 @@ export const getItem = (store, id) => find(store, id)
*/ */
export const findIndexCleanStart = (transaction, structs, clock) => { export const findIndexCleanStart = (transaction, structs, clock) => {
const index = findIndexSS(structs, clock) const index = findIndexSS(structs, clock)
let struct = structs[index] const struct = structs[index]
if (struct.id.clock < clock && struct instanceof Item) { if (struct.id.clock < clock && struct instanceof Item) {
structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock)) structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock))
return index + 1 return index + 1

View File

@ -181,7 +181,7 @@ export class YEvent {
}) })
this._changes = changes this._changes = changes
} }
return changes return /** @type {any} */ (changes)
} }
} }

View File

@ -12,6 +12,7 @@ import * as prng from 'lib0/prng.js'
import * as encoding from 'lib0/encoding.js' import * as encoding from 'lib0/encoding.js'
import * as decoding from 'lib0/decoding.js' import * as decoding from 'lib0/decoding.js'
import * as syncProtocol from 'y-protocols/sync.js' import * as syncProtocol from 'y-protocols/sync.js'
import * as object from 'lib0/object.js'
export * from '../src/internals.js' export * from '../src/internals.js'
/** /**
@ -55,6 +56,7 @@ export class TestYInstance extends Doc {
}) })
this.connect() this.connect()
} }
/** /**
* Disconnect from TestConnector. * Disconnect from TestConnector.
*/ */
@ -62,6 +64,7 @@ export class TestYInstance extends Doc {
this.receiving = new Map() this.receiving = new Map()
this.tc.onlineConns.delete(this) this.tc.onlineConns.delete(this)
} }
/** /**
* Append yourself to the list of known Y instances in testconnector. * Append yourself to the list of known Y instances in testconnector.
* Also initiate sync with all clients. * Also initiate sync with all clients.
@ -83,6 +86,7 @@ export class TestYInstance extends Doc {
}) })
} }
} }
/** /**
* Receive a message from another client. This message is only appended to the list of receiving messages. * Receive a message from another client. This message is only appended to the list of receiving messages.
* TestConnector decides when this client actually reads this message. * TestConnector decides when this client actually reads this message.
@ -124,6 +128,7 @@ export class TestConnector {
*/ */
this.prng = gen this.prng = gen
} }
/** /**
* Create a new Y instance and add it to the list of connections * Create a new Y instance and add it to the list of connections
* @param {number} clientID * @param {number} clientID
@ -131,6 +136,7 @@ export class TestConnector {
createY (clientID) { createY (clientID) {
return new TestYInstance(this, clientID) return new TestYInstance(this, clientID)
} }
/** /**
* Choose random connection and flush a random message from a random sender. * Choose random connection and flush a random message from a random sender.
* *
@ -162,6 +168,7 @@ export class TestConnector {
} }
return false return false
} }
/** /**
* @return {boolean} True iff this function actually flushed something * @return {boolean} True iff this function actually flushed something
*/ */
@ -172,16 +179,20 @@ export class TestConnector {
} }
return didSomething return didSomething
} }
reconnectAll () { reconnectAll () {
this.allConns.forEach(conn => conn.connect()) this.allConns.forEach(conn => conn.connect())
} }
disconnectAll () { disconnectAll () {
this.allConns.forEach(conn => conn.disconnect()) this.allConns.forEach(conn => conn.disconnect())
} }
syncAll () { syncAll () {
this.reconnectAll() this.reconnectAll()
this.flushAllMessages() this.flushAllMessages()
} }
/** /**
* @return {boolean} Whether it was possible to disconnect a randon connection. * @return {boolean} Whether it was possible to disconnect a randon connection.
*/ */
@ -192,6 +203,7 @@ export class TestConnector {
prng.oneOf(this.prng, Array.from(this.onlineConns)).disconnect() prng.oneOf(this.prng, Array.from(this.onlineConns)).disconnect()
return true return true
} }
/** /**
* @return {boolean} Whether it was possible to reconnect a random connection. * @return {boolean} Whether it was possible to reconnect a random connection.
*/ */
@ -270,12 +282,12 @@ export const compare = users => {
// Test Map iterator // Test Map iterator
const ymapkeys = Array.from(users[0].getMap('map').keys()) const ymapkeys = Array.from(users[0].getMap('map').keys())
t.assert(ymapkeys.length === Object.keys(userMapValues[0]).length) t.assert(ymapkeys.length === Object.keys(userMapValues[0]).length)
ymapkeys.forEach(key => t.assert(userMapValues[0].hasOwnProperty(key))) ymapkeys.forEach(key => t.assert(object.hasProperty(userMapValues[0], key)))
/** /**
* @type {Object<string,any>} * @type {Object<string,any>}
*/ */
const mapRes = {} const mapRes = {}
for (let [k, v] of users[0].getMap('map')) { for (const [k, v] of users[0].getMap('map')) {
mapRes[k] = v instanceof Y.AbstractType ? v.toJSON() : v mapRes[k] = v instanceof Y.AbstractType ? v.toJSON() : v
} }
t.compare(userMapValues[0], mapRes) t.compare(userMapValues[0], mapRes)

View File

@ -69,11 +69,11 @@ export const testUndoMap = tc => {
const subType = new Y.Map() const subType = new Y.Map()
map0.set('a', subType) map0.set('a', subType)
subType.set('x', 42) subType.set('x', 42)
t.compare(map0.toJSON(), /** @type {any} */ ({ 'a': { x: 42 } })) t.compare(map0.toJSON(), /** @type {any} */ ({ a: { x: 42 } }))
undoManager.undo() undoManager.undo()
t.assert(map0.get('a') === 1) t.assert(map0.get('a') === 1)
undoManager.redo() undoManager.redo()
t.compare(map0.toJSON(), /** @type {any} */ ({ 'a': { x: 42 } })) t.compare(map0.toJSON(), /** @type {any} */ ({ a: { x: 42 } }))
testConnector.syncAll() testConnector.syncAll()
// if content is overwritten by another user, undo operations should be skipped // if content is overwritten by another user, undo operations should be skipped
map1.set('a', 44) map1.set('a', 44)

View File

@ -227,7 +227,7 @@ export const testInsertAndDeleteEventsForTypes2 = tc => {
/** /**
* @type {Array<Object<string,any>>} * @type {Array<Object<string,any>>}
*/ */
let events = [] const events = []
array0.observe(e => { array0.observe(e => {
events.push(e) events.push(e)
}) })
@ -318,7 +318,7 @@ export const testIteratingArrayContainingTypes = tc => {
arr.push([map]) arr.push([map])
} }
let cnt = 0 let cnt = 0
for (let item of arr) { for (const item of arr) {
t.assert(item.get('value') === cnt++, 'value is correct') t.assert(item.get('value') === cnt++, 'value is correct')
} }
y.destroy() y.destroy()

View File

@ -66,7 +66,7 @@ export const testGetAndSetOfMapProperty = tc => {
testConnector.flushAllMessages() testConnector.flushAllMessages()
for (let user of users) { for (const user of users) {
const u = user.getMap('map') const u = user.getMap('map')
t.compare(u.get('stuff'), 'stuffy') t.compare(u.get('stuff'), 'stuffy')
t.assert(u.get('undefined') === undefined, 'undefined') t.assert(u.get('undefined') === undefined, 'undefined')
@ -108,7 +108,7 @@ export const testGetAndSetOfMapPropertySyncs = tc => {
map0.set('stuff', 'stuffy') map0.set('stuff', 'stuffy')
t.compare(map0.get('stuff'), 'stuffy') t.compare(map0.get('stuff'), 'stuffy')
testConnector.flushAllMessages() testConnector.flushAllMessages()
for (let user of users) { for (const user of users) {
var u = user.getMap('map') var u = user.getMap('map')
t.compare(u.get('stuff'), 'stuffy') t.compare(u.get('stuff'), 'stuffy')
} }
@ -123,7 +123,7 @@ export const testGetAndSetOfMapPropertyWithConflict = tc => {
map0.set('stuff', 'c0') map0.set('stuff', 'c0')
map1.set('stuff', 'c1') map1.set('stuff', 'c1')
testConnector.flushAllMessages() testConnector.flushAllMessages()
for (let user of users) { for (const user of users) {
var u = user.getMap('map') var u = user.getMap('map')
t.compare(u.get('stuff'), 'c1') t.compare(u.get('stuff'), 'c1')
} }
@ -139,7 +139,7 @@ export const testGetAndSetAndDeleteOfMapProperty = tc => {
map1.set('stuff', 'c1') map1.set('stuff', 'c1')
map1.delete('stuff') map1.delete('stuff')
testConnector.flushAllMessages() testConnector.flushAllMessages()
for (let user of users) { for (const user of users) {
var u = user.getMap('map') var u = user.getMap('map')
t.assert(u.get('stuff') === undefined) t.assert(u.get('stuff') === undefined)
} }
@ -156,7 +156,7 @@ export const testGetAndSetOfMapPropertyWithThreeConflicts = tc => {
map1.set('stuff', 'c2') map1.set('stuff', 'c2')
map2.set('stuff', 'c3') map2.set('stuff', 'c3')
testConnector.flushAllMessages() testConnector.flushAllMessages()
for (let user of users) { for (const user of users) {
var u = user.getMap('map') var u = user.getMap('map')
t.compare(u.get('stuff'), 'c3') t.compare(u.get('stuff'), 'c3')
} }
@ -179,7 +179,7 @@ export const testGetAndSetAndDeleteOfMapPropertyWithThreeConflicts = tc => {
map3.set('stuff', 'c3') map3.set('stuff', 'c3')
map3.delete('stuff') map3.delete('stuff')
testConnector.flushAllMessages() testConnector.flushAllMessages()
for (let user of users) { for (const user of users) {
var u = user.getMap('map') var u = user.getMap('map')
t.assert(u.get('stuff') === undefined) t.assert(u.get('stuff') === undefined)
} }
@ -430,12 +430,12 @@ export const testYmapEventHasCorrectValueWhenSettingAPrimitiveFromOtherUser = tc
*/ */
const mapTransactions = [ const mapTransactions = [
function set (user, gen) { function set (user, gen) {
let key = prng.oneOf(gen, ['one', 'two']) const key = prng.oneOf(gen, ['one', 'two'])
var value = prng.utf16String(gen) var value = prng.utf16String(gen)
user.getMap('map').set(key, value) user.getMap('map').set(key, value)
}, },
function setType (user, gen) { function setType (user, gen) {
let key = prng.oneOf(gen, ['one', 'two']) const key = prng.oneOf(gen, ['one', 'two'])
var type = prng.oneOf(gen, [new Y.Array(), new Y.Map()]) var type = prng.oneOf(gen, [new Y.Array(), new Y.Map()])
user.getMap('map').set(key, type) user.getMap('map').set(key, type)
if (type instanceof Y.Array) { if (type instanceof Y.Array) {
@ -445,7 +445,7 @@ const mapTransactions = [
} }
}, },
function _delete (user, gen) { function _delete (user, gen) {
let key = prng.oneOf(gen, ['one', 'two']) const key = prng.oneOf(gen, ['one', 'two'])
user.getMap('map').delete(key) user.getMap('map').delete(key)
} }
] ]

View File

@ -154,7 +154,7 @@ export const testSnapshotDeleteAfter = tc => {
* @param {t.TestCase} tc * @param {t.TestCase} tc
*/ */
export const testToJson = tc => { export const testToJson = tc => {
const {text0 } = init(tc, { users: 1 }) const { text0 } = init(tc, { users: 1 })
text0.insert(0, 'abc', { bold: true }) text0.insert(0, 'abc', { bold: true })
t.assert(text0.toJSON() === 'abc', 'toJSON returns the unformatted text') t.assert(text0.toJSON() === 'abc', 'toJSON returns the unformatted text')
} }

View File

@ -60,13 +60,13 @@ export const testEvents = tc => {
*/ */
export const testTreewalker = tc => { export const testTreewalker = tc => {
const { users, xml0 } = init(tc, { users: 3 }) const { users, xml0 } = init(tc, { users: 3 })
let paragraph1 = new Y.XmlElement('p') const paragraph1 = new Y.XmlElement('p')
let paragraph2 = new Y.XmlElement('p') const paragraph2 = new Y.XmlElement('p')
let text1 = new Y.XmlText('init') const text1 = new Y.XmlText('init')
let text2 = new Y.XmlText('text') const text2 = new Y.XmlText('text')
paragraph1.insert(0, [text1, text2]) paragraph1.insert(0, [text1, text2])
xml0.insert(0, [paragraph1, paragraph2, new Y.XmlElement('img')]) xml0.insert(0, [paragraph1, paragraph2, new Y.XmlElement('img')])
let allParagraphs = xml0.querySelectorAll('p') const allParagraphs = xml0.querySelectorAll('p')
t.assert(allParagraphs.length === 2, 'found exactly two paragraphs') t.assert(allParagraphs.length === 2, 'found exactly two paragraphs')
t.assert(allParagraphs[0] === paragraph1, 'querySelectorAll found paragraph1') t.assert(allParagraphs[0] === paragraph1, 'querySelectorAll found paragraph1')
t.assert(allParagraphs[1] === paragraph2, 'querySelectorAll found paragraph2') t.assert(allParagraphs[1] === paragraph2, 'querySelectorAll found paragraph2')