lint
This commit is contained in:
		
							parent
							
								
									ac8dab1e88
								
							
						
					
					
						commit
						6cd9e2be32
					
				
							
								
								
									
										1233
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1233
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -56,7 +56,7 @@
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://yjs.dev",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "lib0": "^0.2.2"
 | 
			
		||||
    "lib0": "^0.2.7"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@rollup/plugin-commonjs": "^11.0.1",
 | 
			
		||||
@ -65,11 +65,11 @@
 | 
			
		||||
    "http-server": "^0.12.1",
 | 
			
		||||
    "jsdoc": "^3.6.3",
 | 
			
		||||
    "markdownlint-cli": "^0.19.0",
 | 
			
		||||
    "rollup": "^1.29.0",
 | 
			
		||||
    "rollup": "^1.29.1",
 | 
			
		||||
    "rollup-cli": "^1.0.9",
 | 
			
		||||
    "standard": "^11.0.1",
 | 
			
		||||
    "standard": "^14.0.0",
 | 
			
		||||
    "tui-jsdoc-template": "^1.2.2",
 | 
			
		||||
    "typescript": "^3.6.2",
 | 
			
		||||
    "typescript": "^3.7.5",
 | 
			
		||||
    "y-protocols": "^0.2.0"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ export class AbstractStruct {
 | 
			
		||||
    this.length = length
 | 
			
		||||
    this.deleted = false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Merge this struct with the item to the right.
 | 
			
		||||
   * This method is already assuming that `this.id.clock + this.length === this.id.clock`.
 | 
			
		||||
@ -34,6 +35,7 @@ export class AbstractStruct {
 | 
			
		||||
  mergeWith (right) {
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {encoding.Encoder} encoder The encoder to write data to.
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
@ -43,6 +45,7 @@ export class AbstractStruct {
 | 
			
		||||
  write (encoder, offset, encodingRef) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   */
 | 
			
		||||
@ -69,6 +72,7 @@ export class AbstractStructRef {
 | 
			
		||||
     */
 | 
			
		||||
    this.id = id
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @return {Array<ID|null>}
 | 
			
		||||
@ -76,6 +80,7 @@ export class AbstractStructRef {
 | 
			
		||||
  getMissing (transaction) {
 | 
			
		||||
    return this._missing
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {StructStore} store
 | 
			
		||||
 | 
			
		||||
@ -18,30 +18,35 @@ export class ContentAny {
 | 
			
		||||
     */
 | 
			
		||||
    this.arr = arr
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  getLength () {
 | 
			
		||||
    return this.arr.length
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    return this.arr
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
   */
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {ContentAny}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    return new ContentAny(this.arr)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {ContentAny}
 | 
			
		||||
@ -51,6 +56,7 @@ export class ContentAny {
 | 
			
		||||
    this.arr = this.arr.slice(0, offset)
 | 
			
		||||
    return right
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ContentAny} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -59,6 +65,7 @@ export class ContentAny {
 | 
			
		||||
    this.arr = this.arr.concat(right.arr)
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -84,6 +91,7 @@ export class ContentAny {
 | 
			
		||||
      encoding.writeAny(encoder, c)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -17,30 +17,35 @@ export class ContentBinary {
 | 
			
		||||
  constructor (content) {
 | 
			
		||||
    this.content = content
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  getLength () {
 | 
			
		||||
    return 1
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    return [this.content]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
   */
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {ContentBinary}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    return new ContentBinary(this.content)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {ContentBinary}
 | 
			
		||||
@ -48,6 +53,7 @@ export class ContentBinary {
 | 
			
		||||
  splice (offset) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ContentBinary} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -55,6 +61,7 @@ export class ContentBinary {
 | 
			
		||||
  mergeWith (right) {
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -75,6 +82,7 @@ export class ContentBinary {
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
    encoding.writeVarUint8Array(encoder, this.content)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -17,30 +17,35 @@ export class ContentDeleted {
 | 
			
		||||
  constructor (len) {
 | 
			
		||||
    this.len = len
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  getLength () {
 | 
			
		||||
    return this.len
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    return []
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
   */
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {ContentDeleted}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    return new ContentDeleted(this.len)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {ContentDeleted}
 | 
			
		||||
@ -50,6 +55,7 @@ export class ContentDeleted {
 | 
			
		||||
    this.len = offset
 | 
			
		||||
    return right
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ContentDeleted} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -58,6 +64,7 @@ export class ContentDeleted {
 | 
			
		||||
    this.len += right.len
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -66,6 +73,7 @@ export class ContentDeleted {
 | 
			
		||||
    addToDeleteSet(transaction.deleteSet, item.id, this.len)
 | 
			
		||||
    item.deleted = true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   */
 | 
			
		||||
@ -81,6 +89,7 @@ export class ContentDeleted {
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
    encoding.writeVarUint(encoder, this.len - offset)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -17,30 +17,35 @@ export class ContentEmbed {
 | 
			
		||||
  constructor (embed) {
 | 
			
		||||
    this.embed = embed
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  getLength () {
 | 
			
		||||
    return 1
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    return [this.embed]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
   */
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {ContentEmbed}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    return new ContentEmbed(this.embed)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {ContentEmbed}
 | 
			
		||||
@ -48,6 +53,7 @@ export class ContentEmbed {
 | 
			
		||||
  splice (offset) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ContentEmbed} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -55,6 +61,7 @@ export class ContentEmbed {
 | 
			
		||||
  mergeWith (right) {
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -75,6 +82,7 @@ export class ContentEmbed {
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
    encoding.writeVarString(encoder, JSON.stringify(this.embed))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -19,30 +19,35 @@ export class ContentFormat {
 | 
			
		||||
    this.key = key
 | 
			
		||||
    this.value = value
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  getLength () {
 | 
			
		||||
    return 1
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    return []
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
   */
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {ContentFormat}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    return new ContentFormat(this.key, this.value)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {ContentFormat}
 | 
			
		||||
@ -50,6 +55,7 @@ export class ContentFormat {
 | 
			
		||||
  splice (offset) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ContentFormat} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -57,6 +63,7 @@ export class ContentFormat {
 | 
			
		||||
  mergeWith (right) {
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -78,6 +85,7 @@ export class ContentFormat {
 | 
			
		||||
    encoding.writeVarString(encoder, this.key)
 | 
			
		||||
    encoding.writeVarString(encoder, JSON.stringify(this.value))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -18,30 +18,35 @@ export class ContentJSON {
 | 
			
		||||
     */
 | 
			
		||||
    this.arr = arr
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  getLength () {
 | 
			
		||||
    return this.arr.length
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    return this.arr
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
   */
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {ContentJSON}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    return new ContentJSON(this.arr)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {ContentJSON}
 | 
			
		||||
@ -51,6 +56,7 @@ export class ContentJSON {
 | 
			
		||||
    this.arr = this.arr.slice(0, offset)
 | 
			
		||||
    return right
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ContentJSON} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -59,6 +65,7 @@ export class ContentJSON {
 | 
			
		||||
    this.arr = this.arr.concat(right.arr)
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -84,6 +91,7 @@ export class ContentJSON {
 | 
			
		||||
      encoding.writeVarString(encoder, c === undefined ? 'undefined' : JSON.stringify(c))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -18,30 +18,35 @@ export class ContentString {
 | 
			
		||||
     */
 | 
			
		||||
    this.str = str
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  getLength () {
 | 
			
		||||
    return this.str.length
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    return this.str.split('')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
   */
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {ContentString}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    return new ContentString(this.str)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {ContentString}
 | 
			
		||||
@ -51,6 +56,7 @@ export class ContentString {
 | 
			
		||||
    this.str = this.str.slice(0, offset)
 | 
			
		||||
    return right
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ContentString} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -59,6 +65,7 @@ export class ContentString {
 | 
			
		||||
    this.str += right.str
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -79,6 +86,7 @@ export class ContentString {
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
    encoding.writeVarString(encoder, offset === 0 ? this.str : this.str.slice(offset))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -49,30 +49,35 @@ export class ContentType {
 | 
			
		||||
     */
 | 
			
		||||
    this.type = type
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
  getLength () {
 | 
			
		||||
    return 1
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    return [this.type]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
   */
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {ContentType}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    return new ContentType(this.type._copy())
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {ContentType}
 | 
			
		||||
@ -80,6 +85,7 @@ export class ContentType {
 | 
			
		||||
  splice (offset) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ContentType} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -87,6 +93,7 @@ export class ContentType {
 | 
			
		||||
  mergeWith (right) {
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -94,6 +101,7 @@ export class ContentType {
 | 
			
		||||
  integrate (transaction, item) {
 | 
			
		||||
    this.type._integrate(transaction.doc, item)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   */
 | 
			
		||||
@ -121,6 +129,7 @@ export class ContentType {
 | 
			
		||||
    })
 | 
			
		||||
    transaction.changed.delete(this.type)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {StructStore} store
 | 
			
		||||
   */
 | 
			
		||||
@ -139,6 +148,7 @@ export class ContentType {
 | 
			
		||||
    })
 | 
			
		||||
    this.type._map = new Map()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {encoding.Encoder} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
@ -146,6 +156,7 @@ export class ContentType {
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
    this.type._write(encoder)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -69,6 +69,7 @@ export class GCRef extends AbstractStructRef {
 | 
			
		||||
     */
 | 
			
		||||
    this.length = decoding.readVarUint(decoder)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {StructStore} store
 | 
			
		||||
 | 
			
		||||
@ -430,6 +430,7 @@ export class Item extends AbstractStruct {
 | 
			
		||||
  get lastId () {
 | 
			
		||||
    return createID(this.id.client, this.id.clock + this.length - 1)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Try to merge two items
 | 
			
		||||
   *
 | 
			
		||||
@ -578,12 +579,14 @@ export class AbstractContent {
 | 
			
		||||
  getLength () {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {Array<any>}
 | 
			
		||||
   */
 | 
			
		||||
  getContent () {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Should return false if this Item is some kind of meta information
 | 
			
		||||
   * (e.g. format information).
 | 
			
		||||
@ -596,12 +599,14 @@ export class AbstractContent {
 | 
			
		||||
  isCountable () {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {AbstractContent}
 | 
			
		||||
   */
 | 
			
		||||
  copy () {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
   * @return {AbstractContent}
 | 
			
		||||
@ -609,6 +614,7 @@ export class AbstractContent {
 | 
			
		||||
  splice (offset) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {AbstractContent} right
 | 
			
		||||
   * @return {boolean}
 | 
			
		||||
@ -616,6 +622,7 @@ export class AbstractContent {
 | 
			
		||||
  mergeWith (right) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {Item} item
 | 
			
		||||
@ -623,18 +630,21 @@ export class AbstractContent {
 | 
			
		||||
  integrate (transaction, item) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   */
 | 
			
		||||
  delete (transaction) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {StructStore} store
 | 
			
		||||
   */
 | 
			
		||||
  gc (store) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {encoding.Encoder} encoder
 | 
			
		||||
   * @param {number} offset
 | 
			
		||||
@ -642,6 +652,7 @@ export class AbstractContent {
 | 
			
		||||
  write (encoder, offset) {
 | 
			
		||||
    throw error.methodUnimplemented()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {number}
 | 
			
		||||
   */
 | 
			
		||||
@ -709,6 +720,7 @@ export class ItemRef extends AbstractStructRef {
 | 
			
		||||
    this.content = readItemContent(decoder, info)
 | 
			
		||||
    this.length = this.content.getLength()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Transaction} transaction
 | 
			
		||||
   * @param {StructStore} store
 | 
			
		||||
 | 
			
		||||
@ -171,7 +171,7 @@ export class AbstractType {
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @abstract
 | 
			
		||||
   * @return {Object | Array | number | string}
 | 
			
		||||
   * @return {any}
 | 
			
		||||
   */
 | 
			
		||||
  toJSON () {}
 | 
			
		||||
}
 | 
			
		||||
@ -370,7 +370,7 @@ export const typeListInsertGenericsAfter = (transaction, parent, referenceItem,
 | 
			
		||||
  let left = referenceItem
 | 
			
		||||
  const right = referenceItem === null ? parent._start : referenceItem.right
 | 
			
		||||
  /**
 | 
			
		||||
   * @type {Array<Object|Array|number>}
 | 
			
		||||
   * @type {Array<Object|Array<any>|number>}
 | 
			
		||||
   */
 | 
			
		||||
  let jsonContent = []
 | 
			
		||||
  const packJsonContent = () => {
 | 
			
		||||
@ -515,7 +515,7 @@ export const typeMapSet = (transaction, parent, key, value) => {
 | 
			
		||||
        content = new ContentAny([value])
 | 
			
		||||
        break
 | 
			
		||||
      case Uint8Array:
 | 
			
		||||
        content = new ContentBinary(value)
 | 
			
		||||
        content = new ContentBinary(/** @type {Uint8Array} */ (value))
 | 
			
		||||
        break
 | 
			
		||||
      default:
 | 
			
		||||
        if (value instanceof AbstractType) {
 | 
			
		||||
@ -552,7 +552,7 @@ export const typeMapGetAll = (parent) => {
 | 
			
		||||
  /**
 | 
			
		||||
   * @type {Object<string,any>}
 | 
			
		||||
   */
 | 
			
		||||
  let res = {}
 | 
			
		||||
  const res = {}
 | 
			
		||||
  for (const [key, value] of parent._map) {
 | 
			
		||||
    if (!value.deleted) {
 | 
			
		||||
      res[key] = value.content.getContent()[value.length - 1]
 | 
			
		||||
 | 
			
		||||
@ -51,6 +51,7 @@ export class YArray extends AbstractType {
 | 
			
		||||
     */
 | 
			
		||||
    this._prelimContent = []
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Integrate this type into the Yjs instance.
 | 
			
		||||
   *
 | 
			
		||||
@ -65,7 +66,7 @@ export class YArray extends AbstractType {
 | 
			
		||||
   */
 | 
			
		||||
  _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
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -76,6 +77,7 @@ export class YArray extends AbstractType {
 | 
			
		||||
  get length () {
 | 
			
		||||
    return this._prelimContent === null ? this._length : this._prelimContent.length
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Creates YArrayEvent and calls observers.
 | 
			
		||||
   *
 | 
			
		||||
@ -110,7 +112,7 @@ export class YArray extends AbstractType {
 | 
			
		||||
        typeListInsertGenerics(transaction, this, index, content)
 | 
			
		||||
      })
 | 
			
		||||
    } 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)
 | 
			
		||||
      })
 | 
			
		||||
    } else {
 | 
			
		||||
      /** @type {Array} */ (this._prelimContent).splice(index, length)
 | 
			
		||||
      /** @type {Array<any>} */ (this._prelimContent).splice(index, length)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -53,6 +53,7 @@ export class YMap extends AbstractType {
 | 
			
		||||
     */
 | 
			
		||||
    this._prelimContent = new Map()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Integrate this type into the Yjs instance.
 | 
			
		||||
   *
 | 
			
		||||
@ -67,7 +68,7 @@ export class YMap extends AbstractType {
 | 
			
		||||
   */
 | 
			
		||||
  _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._prelimContent = null
 | 
			
		||||
@ -99,7 +100,7 @@ export class YMap extends AbstractType {
 | 
			
		||||
     * @type {Object<string,T>}
 | 
			
		||||
     */
 | 
			
		||||
    const map = {}
 | 
			
		||||
    for (let [key, item] of this._map) {
 | 
			
		||||
    for (const [key, item] of this._map) {
 | 
			
		||||
      if (!item.deleted) {
 | 
			
		||||
        const v = item.content.getContent()[item.length - 1]
 | 
			
		||||
        map[key] = v instanceof AbstractType ? v.toJSON() : v
 | 
			
		||||
@ -145,7 +146,7 @@ export class YMap extends AbstractType {
 | 
			
		||||
     * @type {Object<string,T>}
 | 
			
		||||
     */
 | 
			
		||||
    const map = {}
 | 
			
		||||
    for (let [key, item] of this._map) {
 | 
			
		||||
    for (const [key, item] of this._map) {
 | 
			
		||||
      if (!item.deleted) {
 | 
			
		||||
        f(item.content.getContent()[item.length - 1], key, this)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -112,10 +112,9 @@ const findNextPosition = (transaction, currentAttributes, left, right, count) =>
 | 
			
		||||
 * @function
 | 
			
		||||
 */
 | 
			
		||||
const findPosition = (transaction, parent, index) => {
 | 
			
		||||
  let currentAttributes = new Map()
 | 
			
		||||
  let left = null
 | 
			
		||||
  let right = parent._start
 | 
			
		||||
  return findNextPosition(transaction, currentAttributes, left, right, index)
 | 
			
		||||
  const currentAttributes = new Map()
 | 
			
		||||
  const right = parent._start
 | 
			
		||||
  return findNextPosition(transaction, currentAttributes, null, right, index)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -147,7 +146,7 @@ const insertNegatedAttributes = (transaction, parent, left, right, negatedAttrib
 | 
			
		||||
    left = 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.integrate(transaction)
 | 
			
		||||
  }
 | 
			
		||||
@ -214,7 +213,7 @@ const minimizeAttributeChanges = (left, right, currentAttributes, attributes) =>
 | 
			
		||||
const insertAttributes = (transaction, parent, left, right, currentAttributes, attributes) => {
 | 
			
		||||
  const negatedAttributes = new Map()
 | 
			
		||||
  // insert format-start items
 | 
			
		||||
  for (let key in attributes) {
 | 
			
		||||
  for (const key in attributes) {
 | 
			
		||||
    const val = attributes[key]
 | 
			
		||||
    const currentVal = currentAttributes.get(key) || null
 | 
			
		||||
    if (!equalAttrs(currentVal, val)) {
 | 
			
		||||
@ -241,7 +240,7 @@ const insertAttributes = (transaction, parent, left, right, currentAttributes, a
 | 
			
		||||
 * @function
 | 
			
		||||
 **/
 | 
			
		||||
const insertText = (transaction, parent, left, right, currentAttributes, text, attributes) => {
 | 
			
		||||
  for (let [key] of currentAttributes) {
 | 
			
		||||
  for (const [key] of currentAttributes) {
 | 
			
		||||
    if (attributes[key] === undefined) {
 | 
			
		||||
      attributes[key] = null
 | 
			
		||||
    }
 | 
			
		||||
@ -281,7 +280,7 @@ const formatText = (transaction, parent, left, right, currentAttributes, length,
 | 
			
		||||
  while (length > 0 && right !== null) {
 | 
			
		||||
    if (!right.deleted) {
 | 
			
		||||
      switch (right.content.constructor) {
 | 
			
		||||
        case ContentFormat:
 | 
			
		||||
        case ContentFormat: {
 | 
			
		||||
          const { key, value } = /** @type {ContentFormat} */ (right.content)
 | 
			
		||||
          const attr = attributes[key]
 | 
			
		||||
          if (attr !== undefined) {
 | 
			
		||||
@ -294,6 +293,7 @@ const formatText = (transaction, parent, left, right, currentAttributes, length,
 | 
			
		||||
          }
 | 
			
		||||
          updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (right.content))
 | 
			
		||||
          break
 | 
			
		||||
        }
 | 
			
		||||
        case ContentEmbed:
 | 
			
		||||
        case ContentString:
 | 
			
		||||
          if (length < right.length) {
 | 
			
		||||
@ -405,6 +405,7 @@ export class YTextEvent extends YEvent {
 | 
			
		||||
     */
 | 
			
		||||
    this._delta = null
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Compute the changes in the delta format.
 | 
			
		||||
   * 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>}
 | 
			
		||||
         */
 | 
			
		||||
        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 retain = 0
 | 
			
		||||
        let deleteLen = 0
 | 
			
		||||
@ -448,7 +452,7 @@ export class YTextEvent extends YEvent {
 | 
			
		||||
                op = { insert }
 | 
			
		||||
                if (currentAttributes.size > 0) {
 | 
			
		||||
                  op.attributes = {}
 | 
			
		||||
                  for (let [key, value] of currentAttributes) {
 | 
			
		||||
                  for (const [key, value] of currentAttributes) {
 | 
			
		||||
                    if (value !== null) {
 | 
			
		||||
                      op.attributes[key] = value
 | 
			
		||||
                    }
 | 
			
		||||
@ -460,7 +464,7 @@ export class YTextEvent extends YEvent {
 | 
			
		||||
                op = { retain }
 | 
			
		||||
                if (Object.keys(attributes).length > 0) {
 | 
			
		||||
                  op.attributes = {}
 | 
			
		||||
                  for (let key in attributes) {
 | 
			
		||||
                  for (const key in attributes) {
 | 
			
		||||
                    op.attributes[key] = attributes[key]
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
@ -518,7 +522,7 @@ export class YTextEvent extends YEvent {
 | 
			
		||||
                retain += item.length
 | 
			
		||||
              }
 | 
			
		||||
              break
 | 
			
		||||
            case ContentFormat:
 | 
			
		||||
            case ContentFormat: {
 | 
			
		||||
              const { key, value } = /** @type {ContentFormat} */ (item.content)
 | 
			
		||||
              if (this.adds(item)) {
 | 
			
		||||
                if (!this.deletes(item)) {
 | 
			
		||||
@ -571,11 +575,12 @@ export class YTextEvent extends YEvent {
 | 
			
		||||
              }
 | 
			
		||||
              break
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          item = item.right
 | 
			
		||||
        }
 | 
			
		||||
        addOp()
 | 
			
		||||
        while (delta.length > 0) {
 | 
			
		||||
          let lastOp = delta[delta.length - 1]
 | 
			
		||||
          const lastOp = delta[delta.length - 1]
 | 
			
		||||
          if (lastOp.retain !== undefined && lastOp.attributes === undefined) {
 | 
			
		||||
            // retain delta's if they don't assign attributes
 | 
			
		||||
            delta.pop()
 | 
			
		||||
@ -745,7 +750,7 @@ export class YText extends AbstractType {
 | 
			
		||||
         */
 | 
			
		||||
        const attributes = {}
 | 
			
		||||
        let addAttributes = false
 | 
			
		||||
        for (let [key, value] of currentAttributes) {
 | 
			
		||||
        for (const [key, value] of currentAttributes) {
 | 
			
		||||
          addAttributes = true
 | 
			
		||||
          attributes[key] = value
 | 
			
		||||
        }
 | 
			
		||||
@ -772,7 +777,7 @@ export class YText extends AbstractType {
 | 
			
		||||
      while (n !== null) {
 | 
			
		||||
        if (isVisible(n, snapshot) || (prevSnapshot !== undefined && isVisible(n, prevSnapshot))) {
 | 
			
		||||
          switch (n.content.constructor) {
 | 
			
		||||
            case ContentString:
 | 
			
		||||
            case ContentString: {
 | 
			
		||||
              const cur = currentAttributes.get('ychange')
 | 
			
		||||
              if (snapshot !== undefined && !isVisible(n, snapshot)) {
 | 
			
		||||
                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
 | 
			
		||||
              break
 | 
			
		||||
            }
 | 
			
		||||
            case ContentEmbed:
 | 
			
		||||
              packStr()
 | 
			
		||||
              ops.push({
 | 
			
		||||
@ -831,6 +837,7 @@ export class YText extends AbstractType {
 | 
			
		||||
        const { left, right, currentAttributes } = findPosition(transaction, this, index)
 | 
			
		||||
        if (!attributes) {
 | 
			
		||||
          attributes = {}
 | 
			
		||||
          // @ts-ignore
 | 
			
		||||
          currentAttributes.forEach((v, k) => { attributes[k] = v })
 | 
			
		||||
        }
 | 
			
		||||
        insertText(transaction, this, left, right, currentAttributes, text, attributes)
 | 
			
		||||
@ -902,7 +909,7 @@ export class YText extends AbstractType {
 | 
			
		||||
    const y = this.doc
 | 
			
		||||
    if (y !== null) {
 | 
			
		||||
      transact(y, transaction => {
 | 
			
		||||
        let { left, right, currentAttributes } = findPosition(transaction, this, index)
 | 
			
		||||
        const { left, right, currentAttributes } = findPosition(transaction, this, index)
 | 
			
		||||
        if (right === null) {
 | 
			
		||||
          return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -74,7 +74,7 @@ export class YXmlElement extends YXmlFragment {
 | 
			
		||||
    const attrs = this.getAttributes()
 | 
			
		||||
    const stringBuilder = []
 | 
			
		||||
    const keys = []
 | 
			
		||||
    for (let key in attrs) {
 | 
			
		||||
    for (const key in attrs) {
 | 
			
		||||
      keys.push(key)
 | 
			
		||||
    }
 | 
			
		||||
    keys.sort()
 | 
			
		||||
@ -140,7 +140,7 @@ export class YXmlElement extends YXmlFragment {
 | 
			
		||||
   * Returns all attribute name/value pairs in a JSON Object.
 | 
			
		||||
   *
 | 
			
		||||
   * @param {Snapshot} [snapshot]
 | 
			
		||||
   * @return {Object} A JSON Object that describes the attributes.
 | 
			
		||||
   * @return {Object<string, any>} A JSON Object that describes the attributes.
 | 
			
		||||
   *
 | 
			
		||||
   * @public
 | 
			
		||||
   */
 | 
			
		||||
@ -165,8 +165,8 @@ export class YXmlElement extends YXmlFragment {
 | 
			
		||||
   */
 | 
			
		||||
  toDOM (_document = document, hooks = {}, binding) {
 | 
			
		||||
    const dom = _document.createElement(this.nodeName)
 | 
			
		||||
    let attrs = this.getAttributes()
 | 
			
		||||
    for (let key in attrs) {
 | 
			
		||||
    const attrs = this.getAttributes()
 | 
			
		||||
    for (const key in attrs) {
 | 
			
		||||
      dom.setAttribute(key, attrs[key])
 | 
			
		||||
    }
 | 
			
		||||
    typeListForEach(this, yxml => {
 | 
			
		||||
 | 
			
		||||
@ -68,6 +68,7 @@ export class YXmlTreeWalker {
 | 
			
		||||
  [Symbol.iterator] () {
 | 
			
		||||
    return this
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Get the next node.
 | 
			
		||||
   *
 | 
			
		||||
@ -130,6 +131,7 @@ export class YXmlFragment extends AbstractType {
 | 
			
		||||
     */
 | 
			
		||||
    this._prelimContent = []
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Integrate this type into the Yjs instance.
 | 
			
		||||
   *
 | 
			
		||||
@ -143,7 +145,7 @@ export class YXmlFragment extends AbstractType {
 | 
			
		||||
   */
 | 
			
		||||
  _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
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -307,6 +309,7 @@ export class YXmlFragment extends AbstractType {
 | 
			
		||||
      this._prelimContent.splice(index, length)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Transforms this YArray to a JavaScript Array.
 | 
			
		||||
   *
 | 
			
		||||
@ -315,6 +318,7 @@ export class YXmlFragment extends AbstractType {
 | 
			
		||||
  toArray () {
 | 
			
		||||
    return typeListToArray(this)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Transform the properties of this type to binary and write it to an
 | 
			
		||||
   * BinaryEncoder.
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@ export class YXmlText extends YText {
 | 
			
		||||
  _copy () {
 | 
			
		||||
    return new YXmlText()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Creates a Dom Element that mirrors this YXmlText.
 | 
			
		||||
   *
 | 
			
		||||
@ -39,9 +40,9 @@ export class YXmlText extends YText {
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    return this.toDelta().map(delta => {
 | 
			
		||||
      const nestedNodes = []
 | 
			
		||||
      for (let nodeName in delta.attributes) {
 | 
			
		||||
      for (const nodeName in delta.attributes) {
 | 
			
		||||
        const attrs = []
 | 
			
		||||
        for (let key in delta.attributes[nodeName]) {
 | 
			
		||||
        for (const key in delta.attributes[nodeName]) {
 | 
			
		||||
          attrs.push({ key, value: delta.attributes[nodeName][key] })
 | 
			
		||||
        }
 | 
			
		||||
        // sort attributes to get a unique order
 | 
			
		||||
 | 
			
		||||
@ -46,6 +46,7 @@ export class Doc extends Observable {
 | 
			
		||||
     */
 | 
			
		||||
    this._transactionCleanups = []
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Changes that happen inside of a transaction are bundled. This means that
 | 
			
		||||
   * 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(this, f, origin)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Define a shared data type.
 | 
			
		||||
   *
 | 
			
		||||
@ -118,6 +120,7 @@ export class Doc extends Observable {
 | 
			
		||||
    }
 | 
			
		||||
    return type
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @template T
 | 
			
		||||
   * @param {string} name
 | 
			
		||||
@ -129,6 +132,7 @@ export class Doc extends Observable {
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    return this.get(name, YArray)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {string} name
 | 
			
		||||
   * @return {YText}
 | 
			
		||||
@ -139,6 +143,7 @@ export class Doc extends Observable {
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    return this.get(name, YText)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {string} name
 | 
			
		||||
   * @return {YMap<any>}
 | 
			
		||||
@ -149,6 +154,7 @@ export class Doc extends Observable {
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    return this.get(name, YMap)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {string} name
 | 
			
		||||
   * @return {YXmlFragment}
 | 
			
		||||
@ -159,6 +165,7 @@ export class Doc extends Observable {
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    return this.get(name, YXmlFragment)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Emit `destroy` event and unregister all event handlers.
 | 
			
		||||
   *
 | 
			
		||||
@ -168,6 +175,7 @@ export class Doc extends Observable {
 | 
			
		||||
    this.emit('destroyed', [true])
 | 
			
		||||
    super.destroy()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {string} eventName
 | 
			
		||||
   * @param {function} f
 | 
			
		||||
@ -175,6 +183,7 @@ export class Doc extends Observable {
 | 
			
		||||
  on (eventName, f) {
 | 
			
		||||
    super.on(eventName, f)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {string} eventName
 | 
			
		||||
   * @param {function} f
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ export const readID = decoder =>
 | 
			
		||||
 */
 | 
			
		||||
export const findRootTypeKey = type => {
 | 
			
		||||
  // @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) {
 | 
			
		||||
      return key
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -67,6 +67,7 @@ export class PermanentUserData {
 | 
			
		||||
    // add intial data
 | 
			
		||||
    users.forEach(initUser)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {Doc} doc
 | 
			
		||||
   * @param {number} clientid
 | 
			
		||||
@ -116,6 +117,7 @@ export class PermanentUserData {
 | 
			
		||||
      })
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} clientid
 | 
			
		||||
   * @return {any}
 | 
			
		||||
@ -123,6 +125,7 @@ export class PermanentUserData {
 | 
			
		||||
  getUserByClientId (clientid) {
 | 
			
		||||
    return this.clients.get(clientid) || null
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {ID} id
 | 
			
		||||
   * @return {string | null}
 | 
			
		||||
 | 
			
		||||
@ -63,7 +63,7 @@ export class RelativePosition {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {Object} json
 | 
			
		||||
 * @param {any} json
 | 
			
		||||
 * @return {RelativePosition}
 | 
			
		||||
 *
 | 
			
		||||
 * @function
 | 
			
		||||
 | 
			
		||||
@ -185,7 +185,7 @@ export const getItem = (store, id) => find(store, id)
 | 
			
		||||
 */
 | 
			
		||||
export const findIndexCleanStart = (transaction, structs, clock) => {
 | 
			
		||||
  const index = findIndexSS(structs, clock)
 | 
			
		||||
  let struct = structs[index]
 | 
			
		||||
  const struct = structs[index]
 | 
			
		||||
  if (struct.id.clock < clock && struct instanceof Item) {
 | 
			
		||||
    structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock))
 | 
			
		||||
    return index + 1
 | 
			
		||||
 | 
			
		||||
@ -181,7 +181,7 @@ export class YEvent {
 | 
			
		||||
      })
 | 
			
		||||
      this._changes = changes
 | 
			
		||||
    }
 | 
			
		||||
    return changes
 | 
			
		||||
    return /** @type {any} */ (changes)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@ import * as prng from 'lib0/prng.js'
 | 
			
		||||
import * as encoding from 'lib0/encoding.js'
 | 
			
		||||
import * as decoding from 'lib0/decoding.js'
 | 
			
		||||
import * as syncProtocol from 'y-protocols/sync.js'
 | 
			
		||||
import * as object from 'lib0/object.js'
 | 
			
		||||
export * from '../src/internals.js'
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -55,6 +56,7 @@ export class TestYInstance extends Doc {
 | 
			
		||||
    })
 | 
			
		||||
    this.connect()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Disconnect from TestConnector.
 | 
			
		||||
   */
 | 
			
		||||
@ -62,6 +64,7 @@ export class TestYInstance extends Doc {
 | 
			
		||||
    this.receiving = new Map()
 | 
			
		||||
    this.tc.onlineConns.delete(this)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Append yourself to the list of known Y instances in testconnector.
 | 
			
		||||
   * 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.
 | 
			
		||||
   * TestConnector decides when this client actually reads this message.
 | 
			
		||||
@ -124,6 +128,7 @@ export class TestConnector {
 | 
			
		||||
     */
 | 
			
		||||
    this.prng = gen
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Create a new Y instance and add it to the list of connections
 | 
			
		||||
   * @param {number} clientID
 | 
			
		||||
@ -131,6 +136,7 @@ export class TestConnector {
 | 
			
		||||
  createY (clientID) {
 | 
			
		||||
    return new TestYInstance(this, clientID)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Choose random connection and flush a random message from a random sender.
 | 
			
		||||
   *
 | 
			
		||||
@ -162,6 +168,7 @@ export class TestConnector {
 | 
			
		||||
    }
 | 
			
		||||
    return false
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean} True iff this function actually flushed something
 | 
			
		||||
   */
 | 
			
		||||
@ -172,16 +179,20 @@ export class TestConnector {
 | 
			
		||||
    }
 | 
			
		||||
    return didSomething
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  reconnectAll () {
 | 
			
		||||
    this.allConns.forEach(conn => conn.connect())
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  disconnectAll () {
 | 
			
		||||
    this.allConns.forEach(conn => conn.disconnect())
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  syncAll () {
 | 
			
		||||
    this.reconnectAll()
 | 
			
		||||
    this.flushAllMessages()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @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()
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @return {boolean} Whether it was possible to reconnect a random connection.
 | 
			
		||||
   */
 | 
			
		||||
@ -270,12 +282,12 @@ export const compare = users => {
 | 
			
		||||
  // Test Map iterator
 | 
			
		||||
  const ymapkeys = Array.from(users[0].getMap('map').keys())
 | 
			
		||||
  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>}
 | 
			
		||||
   */
 | 
			
		||||
  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
 | 
			
		||||
  }
 | 
			
		||||
  t.compare(userMapValues[0], mapRes)
 | 
			
		||||
 | 
			
		||||
@ -69,11 +69,11 @@ export const testUndoMap = tc => {
 | 
			
		||||
  const subType = new Y.Map()
 | 
			
		||||
  map0.set('a', subType)
 | 
			
		||||
  subType.set('x', 42)
 | 
			
		||||
  t.compare(map0.toJSON(), /** @type {any} */ ({ 'a': { x: 42 } }))
 | 
			
		||||
  t.compare(map0.toJSON(), /** @type {any} */ ({ a: { x: 42 } }))
 | 
			
		||||
  undoManager.undo()
 | 
			
		||||
  t.assert(map0.get('a') === 1)
 | 
			
		||||
  undoManager.redo()
 | 
			
		||||
  t.compare(map0.toJSON(), /** @type {any} */ ({ 'a': { x: 42 } }))
 | 
			
		||||
  t.compare(map0.toJSON(), /** @type {any} */ ({ a: { x: 42 } }))
 | 
			
		||||
  testConnector.syncAll()
 | 
			
		||||
  // if content is overwritten by another user, undo operations should be skipped
 | 
			
		||||
  map1.set('a', 44)
 | 
			
		||||
 | 
			
		||||
@ -227,7 +227,7 @@ export const testInsertAndDeleteEventsForTypes2 = tc => {
 | 
			
		||||
  /**
 | 
			
		||||
   * @type {Array<Object<string,any>>}
 | 
			
		||||
   */
 | 
			
		||||
  let events = []
 | 
			
		||||
  const events = []
 | 
			
		||||
  array0.observe(e => {
 | 
			
		||||
    events.push(e)
 | 
			
		||||
  })
 | 
			
		||||
@ -318,7 +318,7 @@ export const testIteratingArrayContainingTypes = tc => {
 | 
			
		||||
    arr.push([map])
 | 
			
		||||
  }
 | 
			
		||||
  let cnt = 0
 | 
			
		||||
  for (let item of arr) {
 | 
			
		||||
  for (const item of arr) {
 | 
			
		||||
    t.assert(item.get('value') === cnt++, 'value is correct')
 | 
			
		||||
  }
 | 
			
		||||
  y.destroy()
 | 
			
		||||
 | 
			
		||||
@ -66,7 +66,7 @@ export const testGetAndSetOfMapProperty = tc => {
 | 
			
		||||
 | 
			
		||||
  testConnector.flushAllMessages()
 | 
			
		||||
 | 
			
		||||
  for (let user of users) {
 | 
			
		||||
  for (const user of users) {
 | 
			
		||||
    const u = user.getMap('map')
 | 
			
		||||
    t.compare(u.get('stuff'), 'stuffy')
 | 
			
		||||
    t.assert(u.get('undefined') === undefined, 'undefined')
 | 
			
		||||
@ -108,7 +108,7 @@ export const testGetAndSetOfMapPropertySyncs = tc => {
 | 
			
		||||
  map0.set('stuff', 'stuffy')
 | 
			
		||||
  t.compare(map0.get('stuff'), 'stuffy')
 | 
			
		||||
  testConnector.flushAllMessages()
 | 
			
		||||
  for (let user of users) {
 | 
			
		||||
  for (const user of users) {
 | 
			
		||||
    var u = user.getMap('map')
 | 
			
		||||
    t.compare(u.get('stuff'), 'stuffy')
 | 
			
		||||
  }
 | 
			
		||||
@ -123,7 +123,7 @@ export const testGetAndSetOfMapPropertyWithConflict = tc => {
 | 
			
		||||
  map0.set('stuff', 'c0')
 | 
			
		||||
  map1.set('stuff', 'c1')
 | 
			
		||||
  testConnector.flushAllMessages()
 | 
			
		||||
  for (let user of users) {
 | 
			
		||||
  for (const user of users) {
 | 
			
		||||
    var u = user.getMap('map')
 | 
			
		||||
    t.compare(u.get('stuff'), 'c1')
 | 
			
		||||
  }
 | 
			
		||||
@ -139,7 +139,7 @@ export const testGetAndSetAndDeleteOfMapProperty = tc => {
 | 
			
		||||
  map1.set('stuff', 'c1')
 | 
			
		||||
  map1.delete('stuff')
 | 
			
		||||
  testConnector.flushAllMessages()
 | 
			
		||||
  for (let user of users) {
 | 
			
		||||
  for (const user of users) {
 | 
			
		||||
    var u = user.getMap('map')
 | 
			
		||||
    t.assert(u.get('stuff') === undefined)
 | 
			
		||||
  }
 | 
			
		||||
@ -156,7 +156,7 @@ export const testGetAndSetOfMapPropertyWithThreeConflicts = tc => {
 | 
			
		||||
  map1.set('stuff', 'c2')
 | 
			
		||||
  map2.set('stuff', 'c3')
 | 
			
		||||
  testConnector.flushAllMessages()
 | 
			
		||||
  for (let user of users) {
 | 
			
		||||
  for (const user of users) {
 | 
			
		||||
    var u = user.getMap('map')
 | 
			
		||||
    t.compare(u.get('stuff'), 'c3')
 | 
			
		||||
  }
 | 
			
		||||
@ -179,7 +179,7 @@ export const testGetAndSetAndDeleteOfMapPropertyWithThreeConflicts = tc => {
 | 
			
		||||
  map3.set('stuff', 'c3')
 | 
			
		||||
  map3.delete('stuff')
 | 
			
		||||
  testConnector.flushAllMessages()
 | 
			
		||||
  for (let user of users) {
 | 
			
		||||
  for (const user of users) {
 | 
			
		||||
    var u = user.getMap('map')
 | 
			
		||||
    t.assert(u.get('stuff') === undefined)
 | 
			
		||||
  }
 | 
			
		||||
@ -430,12 +430,12 @@ export const testYmapEventHasCorrectValueWhenSettingAPrimitiveFromOtherUser = tc
 | 
			
		||||
 */
 | 
			
		||||
const mapTransactions = [
 | 
			
		||||
  function set (user, gen) {
 | 
			
		||||
    let key = prng.oneOf(gen, ['one', 'two'])
 | 
			
		||||
    const key = prng.oneOf(gen, ['one', 'two'])
 | 
			
		||||
    var value = prng.utf16String(gen)
 | 
			
		||||
    user.getMap('map').set(key, value)
 | 
			
		||||
  },
 | 
			
		||||
  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()])
 | 
			
		||||
    user.getMap('map').set(key, type)
 | 
			
		||||
    if (type instanceof Y.Array) {
 | 
			
		||||
@ -445,7 +445,7 @@ const mapTransactions = [
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  function _delete (user, gen) {
 | 
			
		||||
    let key = prng.oneOf(gen, ['one', 'two'])
 | 
			
		||||
    const key = prng.oneOf(gen, ['one', 'two'])
 | 
			
		||||
    user.getMap('map').delete(key)
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
@ -60,13 +60,13 @@ export const testEvents = tc => {
 | 
			
		||||
 */
 | 
			
		||||
export const testTreewalker = tc => {
 | 
			
		||||
  const { users, xml0 } = init(tc, { users: 3 })
 | 
			
		||||
  let paragraph1 = new Y.XmlElement('p')
 | 
			
		||||
  let paragraph2 = new Y.XmlElement('p')
 | 
			
		||||
  let text1 = new Y.XmlText('init')
 | 
			
		||||
  let text2 = new Y.XmlText('text')
 | 
			
		||||
  const paragraph1 = new Y.XmlElement('p')
 | 
			
		||||
  const paragraph2 = new Y.XmlElement('p')
 | 
			
		||||
  const text1 = new Y.XmlText('init')
 | 
			
		||||
  const text2 = new Y.XmlText('text')
 | 
			
		||||
  paragraph1.insert(0, [text1, text2])
 | 
			
		||||
  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[0] === paragraph1, 'querySelectorAll found paragraph1')
 | 
			
		||||
  t.assert(allParagraphs[1] === paragraph2, 'querySelectorAll found paragraph2')
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user