diff --git a/src/structs/AbstractItem.js b/src/structs/AbstractItem.js index 9b8be18a..7b0ad76a 100644 --- a/src/structs/AbstractItem.js +++ b/src/structs/AbstractItem.js @@ -64,7 +64,7 @@ export class AbstractItem extends AbstractStruct { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType | null} parent + * @param {AbstractType | null} parent * @param {string | null} parentSub */ constructor (id, left, right, parent, parentSub) { @@ -102,7 +102,7 @@ export class AbstractItem extends AbstractStruct { this.rightOrigin = right /** * The parent type. - * @type {AbstractType} + * @type {AbstractType} * @readonly */ this.parent = parent @@ -266,7 +266,7 @@ export class AbstractItem extends AbstractStruct { * @param {ID} id * @param {AbstractItem|null} left * @param {AbstractItem|null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string|null} parentSub * @return {AbstractItem} */ diff --git a/src/structs/ItemBinary.js b/src/structs/ItemBinary.js index 908cd300..b08c55b7 100644 --- a/src/structs/ItemBinary.js +++ b/src/structs/ItemBinary.js @@ -20,7 +20,7 @@ export class ItemBinary extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub * @param {ArrayBuffer} content */ @@ -35,7 +35,7 @@ export class ItemBinary extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub */ copy (id, left, right, parent, parentSub) { diff --git a/src/structs/ItemDeleted.js b/src/structs/ItemDeleted.js index e1e42751..0211aecb 100644 --- a/src/structs/ItemDeleted.js +++ b/src/structs/ItemDeleted.js @@ -19,7 +19,7 @@ export class ItemDeleted extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub * @param {number} length */ @@ -31,7 +31,7 @@ export class ItemDeleted extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub */ copy (id, left, right, parent, parentSub) { diff --git a/src/structs/ItemEmbed.js b/src/structs/ItemEmbed.js index 390453a2..559abee0 100644 --- a/src/structs/ItemEmbed.js +++ b/src/structs/ItemEmbed.js @@ -19,7 +19,7 @@ export class ItemEmbed extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub * @param {Object} embed */ @@ -31,7 +31,7 @@ export class ItemEmbed extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub */ copy (id, left, right, parent, parentSub) { diff --git a/src/structs/ItemFormat.js b/src/structs/ItemFormat.js index c47a5b45..0eea68dc 100644 --- a/src/structs/ItemFormat.js +++ b/src/structs/ItemFormat.js @@ -19,7 +19,7 @@ export class ItemFormat extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub * @param {string} key * @param {any} value @@ -33,7 +33,7 @@ export class ItemFormat extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType parent * @param {string | null} parentSub */ copy (id, left, right, parent, parentSub) { diff --git a/src/structs/ItemJSON.js b/src/structs/ItemJSON.js index 8f5f59ba..3de53299 100644 --- a/src/structs/ItemJSON.js +++ b/src/structs/ItemJSON.js @@ -19,7 +19,7 @@ export class ItemJSON extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub * @param {Array} content */ @@ -34,7 +34,7 @@ export class ItemJSON extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType parent * @param {string | null} parentSub */ copy (id, left, right, parent, parentSub) { diff --git a/src/structs/ItemString.js b/src/structs/ItemString.js index 4f3d81a6..b443f440 100644 --- a/src/structs/ItemString.js +++ b/src/structs/ItemString.js @@ -18,7 +18,7 @@ export class ItemString extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub * @param {string} string */ @@ -33,7 +33,7 @@ export class ItemString extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType parent * @param {string | null} parentSub */ copy (id, left, right, parent, parentSub) { diff --git a/src/structs/ItemType.js b/src/structs/ItemType.js index f63fb58e..32e75155 100644 --- a/src/structs/ItemType.js +++ b/src/structs/ItemType.js @@ -35,7 +35,7 @@ const gcChildren = (y, item) => { export const structTypeRefNumber = 7 /** - * @type {Array} + * @type {Array>} */ export const typeRefs = [ readYArray, @@ -52,9 +52,9 @@ export class ItemType extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string | null} parentSub - * @param {AbstractType} type + * @param {AbstractType} type */ constructor (id, left, right, parent, parentSub, type) { super(id, left, right, parent, parentSub) @@ -67,7 +67,7 @@ export class ItemType extends AbstractItem { * @param {ID} id * @param {AbstractItem | null} left * @param {AbstractItem | null} right - * @param {AbstractType} parent + * @param {AbstractType parent * @param {string | null} parentSub * @return {AbstractItem} TODO, returns itemtype */ @@ -150,7 +150,7 @@ export class ItemTypeRef extends AbstractItemRef { super(decoder, id, info) const typeRef = decoding.readVarUint(decoder) /** - * @type {AbstractType} + * @type {AbstractType */ this.type = typeRefs[typeRef](decoder) } diff --git a/src/types/AbstractType.js b/src/types/AbstractType.js index a7fb65a1..fd75f153 100644 --- a/src/types/AbstractType.js +++ b/src/types/AbstractType.js @@ -18,6 +18,7 @@ import { getItemCleanStart, getItemCleanEnd } from '../utils/StructStore.js' import * as iterator from 'lib0/iterator.js' /** + * @template EventType * Abstract Yjs Type class */ export class AbstractType { @@ -63,7 +64,7 @@ export class AbstractType { } /** - * @return {AbstractType} + * @return {AbstractType} */ _copy () { throw new Error('unimplemented') @@ -110,10 +111,11 @@ export class AbstractType { const changedParentTypes = transaction.changedParentTypes this._eventHandler.callEventListeners(transaction, event) /** - * @type {AbstractType} + * @type {AbstractType} */ let type = this while (true) { + // @ts-ignore map.setIfUndefined(changedParentTypes, type, () => []).push(event) if (type._item === null) { break @@ -125,7 +127,7 @@ export class AbstractType { /** * Observe all events that are created on this type. * - * @param {function(YEvent):void} f Observer function + * @param {function(EventType):void} f Observer function */ observe (f) { this._eventHandler.addEventListener(f) @@ -134,7 +136,7 @@ export class AbstractType { /** * Observe all events that are created by this type and its children. * - * @param {Function} f Observer function + * @param {function(Array):void} f Observer function */ observeDeep (f) { this._deepEventHandler.addEventListener(f) @@ -166,7 +168,7 @@ export class AbstractType { } /** - * @param {AbstractType} type + * @param {AbstractType} type * @return {Array} */ export const typeArrayToArray = type => { @@ -187,8 +189,8 @@ export const typeArrayToArray = type => { /** * Executes a provided function on once on overy element of this YArray. * - * @param {AbstractType} type - * @param {function(any,number,AbstractType):void} f A function to execute on every element of this YArray. + * @param {AbstractType} type + * @param {function(any,number,AbstractType):void} f A function to execute on every element of this YArray. */ export const typeArrayForEach = (type, f) => { let index = 0 @@ -206,8 +208,8 @@ export const typeArrayForEach = (type, f) => { /** * @template C,R - * @param {AbstractType} type - * @param {function(C,number,AbstractType):R} f + * @param {AbstractType} type + * @param {function(C,number,AbstractType):R} f * @return {Array} */ export const typeArrayMap = (type, f) => { @@ -222,7 +224,7 @@ export const typeArrayMap = (type, f) => { } /** - * @param {AbstractType} type + * @param {AbstractType} type * @return {{next:function():{done:boolean,value:any|undefined}}} */ export const typeArrayCreateIterator = type => { @@ -270,8 +272,8 @@ export const typeArrayCreateIterator = type => { * Executes a provided function on once on overy element of this YArray. * Operates on a snapshotted state of the document. * - * @param {AbstractType} type - * @param {function(any,number,AbstractType):void} f A function to execute on every element of this YArray. + * @param {AbstractType} type + * @param {function(any,number,AbstractType):void} f A function to execute on every element of this YArray. * @param {Snapshot} snapshot */ export const typeArrayForEachSnapshot = (type, f, snapshot) => { @@ -289,7 +291,7 @@ export const typeArrayForEachSnapshot = (type, f, snapshot) => { } /** - * @param {AbstractType} type + * @param {AbstractType} type * @param {number} index * @return {any} */ @@ -306,7 +308,7 @@ export const typeArrayGet = (type, index) => { /** * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {AbstractItem?} referenceItem * @param {Array|Array|number|string|ArrayBuffer>} content */ @@ -349,7 +351,7 @@ export const typeArrayInsertGenericsAfter = (transaction, parent, referenceItem, /** * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {number} index * @param {Array|Array|number|string|ArrayBuffer>} content */ @@ -373,7 +375,7 @@ export const typeArrayInsertGenerics = (transaction, parent, index, content) => /** * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {number} index * @param {number} length */ @@ -404,7 +406,7 @@ export const typeArrayDelete = (transaction, parent, index, length) => { /** * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string} key */ export const typeMapDelete = (transaction, parent, key) => { @@ -416,9 +418,9 @@ export const typeMapDelete = (transaction, parent, key) => { /** * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string} key - * @param {Object|number|Array|string|ArrayBuffer|AbstractType} value + * @param {Object|number|Array|string|ArrayBuffer|AbstractType} value */ export const typeMapSet = (transaction, parent, key, value) => { const right = parent._map.get(key) || null @@ -442,9 +444,9 @@ export const typeMapSet = (transaction, parent, key, value) => { } /** - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string} key - * @return {Object|number|Array|string|ArrayBuffer|AbstractType|undefined} + * @return {Object|number|Array|string|ArrayBuffer|AbstractType|undefined} */ export const typeMapGet = (parent, key) => { const val = parent._map.get(key) @@ -452,8 +454,8 @@ export const typeMapGet = (parent, key) => { } /** - * @param {AbstractType} parent - * @return {Object|number|Array|string|ArrayBuffer|AbstractType|undefined>} + * @param {AbstractType} parent + * @return {Object|number|Array|string|ArrayBuffer|AbstractType|undefined>} */ export const typeMapGetAll = (parent) => { /** @@ -469,7 +471,7 @@ export const typeMapGetAll = (parent) => { } /** - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string} key * @return {boolean} */ @@ -479,10 +481,10 @@ export const typeMapHas = (parent, key) => { } /** - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {string} key * @param {Snapshot} snapshot - * @return {Object|number|Array|string|ArrayBuffer|AbstractType|undefined} + * @return {Object|number|Array|string|ArrayBuffer|AbstractType|undefined} */ export const typeMapGetSnapshot = (parent, key, snapshot) => { let v = parent._map.get(key) || null diff --git a/src/types/YArray.js b/src/types/YArray.js index 752c0736..8b9ff161 100644 --- a/src/types/YArray.js +++ b/src/types/YArray.js @@ -11,10 +11,11 @@ import * as decoding from 'lib0/decoding.js' // eslint-disable-line /** * Event that describes the changes on a YArray + * @template T */ export class YArrayEvent extends YEvent { /** - * @param {AbstractType} yarray The changed type + * @param {YArray} yarray The changed type * @param {Transaction} transaction The transaction object */ constructor (yarray, transaction) { @@ -26,6 +27,7 @@ export class YArrayEvent extends YEvent { /** * A shared Array implementation. * @template T + * @extends AbstractType> */ export class YArray extends AbstractType { constructor () { @@ -149,10 +151,10 @@ export class YArray extends AbstractType { * // Insert character 'a' at position 0 * yarray.insert(0, ['a']) * // Insert numbers 1, 2 at position 1 - * yarray.insert(2, [1, 2]) + * yarray.insert(1, [1, 2]) * * @param {number} index The index to insert content at. - * @param {Array} content The array of content + * @param {Array} content The array of content */ insert (index, content) { if (this._y !== null) { @@ -168,7 +170,7 @@ export class YArray extends AbstractType { /** * Appends content to this YArray. * - * @param {Array} content Array of content to append. + * @param {Array} content Array of content to append. */ push (content) { this.insert(this.length, content) diff --git a/src/types/YMap.js b/src/types/YMap.js index 8dedd044..290db548 100644 --- a/src/types/YMap.js +++ b/src/types/YMap.js @@ -28,6 +28,8 @@ export class YMapEvent extends YEvent { /** * @template T number|string|Object|Array|ArrayBuffer * A shared Map implementation. + * + * @extends AbstractType> */ export class YMap extends AbstractType { constructor () { diff --git a/src/types/YText.js b/src/types/YText.js index 830fa106..a6057906 100644 --- a/src/types/YText.js +++ b/src/types/YText.js @@ -5,7 +5,7 @@ import { ItemEmbed } from '../structs/ItemEmbed.js' import { ItemString } from '../structs/ItemString.js' import { ItemFormat } from '../structs/ItemFormat.js' -import { YArrayEvent } from './YArray.js' +import { YEvent } from '../utils/YEvent.js' import { ItemType } from '../structs/ItemType.js' // eslint-disable-line import { AbstractType } from './AbstractType.js' import { AbstractItem } from '../structs/AbstractItem.js' // eslint-disable-line @@ -57,7 +57,7 @@ const findNextPosition = (transaction, store, currentAttributes, left, right, co * @private * @param {Transaction} transaction * @param {StructStore} store - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {number} index * @return {{left:AbstractItem|null,right:AbstractItem|null,currentAttributes:Map}} */ @@ -73,7 +73,7 @@ const findPosition = (transaction, store, parent, index) => { * * @private * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {AbstractItem|null} left * @param {AbstractItem|null} right * @param {Map} negatedAttributes @@ -151,7 +151,7 @@ const minimizeAttributeChanges = (left, right, currentAttributes, attributes) => /** * @private * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {AbstractItem|null} left * @param {AbstractItem|null} right * @param {Map} currentAttributes @@ -177,7 +177,7 @@ const insertAttributes = (transaction, parent, left, right, currentAttributes, a /** * @private * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {AbstractItem|null} left * @param {AbstractItem|null} right * @param {Map} currentAttributes @@ -206,7 +206,7 @@ const insertText = (transaction, parent, left, right, currentAttributes, text, a /** * @private * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {AbstractItem|null} left * @param {AbstractItem|null} right * @param {Map} currentAttributes @@ -260,7 +260,7 @@ const formatText = (transaction, parent, left, right, currentAttributes, length, /** * @private * @param {Transaction} transaction - * @param {AbstractType} parent + * @param {AbstractType} parent * @param {AbstractItem|null} left * @param {AbstractItem|null} right * @param {Map} currentAttributes @@ -324,9 +324,9 @@ const deleteText = (transaction, parent, left, right, currentAttributes, length) * * @private */ -class YTextEvent extends YArrayEvent { +class YTextEvent extends YEvent { /** - * @param {AbstractType} ytext + * @param {YText} ytext * @param {Transaction} transaction */ constructor (ytext, transaction) { @@ -544,6 +544,8 @@ class YTextEvent extends YArrayEvent { * This type replaces y-richtext as this implementation is able to handle * block formats (format information on a paragraph), embeds (complex elements * like pictures and videos), and text formats (**bold**, *italic*). + * + * @extends AbstractType */ export class YText extends AbstractType { /** diff --git a/src/types/YXmlElement.js b/src/types/YXmlElement.js index d98c3f4f..a349c9ee 100644 --- a/src/types/YXmlElement.js +++ b/src/types/YXmlElement.js @@ -11,7 +11,7 @@ import { YXmlEvent } from './YXmlEvent.js' import { ItemType } from '../structs/ItemType.js' // eslint-disable-line import { YXmlText } from './YXmlText.js' // eslint-disable-line import { YXmlHook } from './YXmlHook.js' // eslint-disable-line -import { AbstractType, typeArrayMap, typeArrayForEach, typeMapGet, typeMapGetAll } from './AbstractType.js' +import { AbstractType, typeArrayMap, typeArrayForEach, typeMapGet, typeMapGetAll, typeArrayInsertGenerics } from './AbstractType.js' import { Snapshot } from '../utils/Snapshot.js' // eslint-disable-line /** @@ -46,7 +46,7 @@ import { Snapshot } from '../utils/Snapshot.js' // eslint-disable-line export class YXmlTreeWalker { /** * @param {YXmlFragment | YXmlElement} root - * @param {function(AbstractType):boolean} f + * @param {function(AbstractType):boolean} f */ constructor (root, f) { this._filter = f || (() => true) @@ -107,6 +107,7 @@ export class YXmlTreeWalker { * element - in this case the attributes and the nodeName are not shared. * * @public + * @extends AbstractType */ export class YXmlFragment extends AbstractType { /** @@ -119,7 +120,7 @@ export class YXmlFragment extends AbstractType { * nop(node) * } * - * @param {function(AbstractType):boolean} filter Function that is called on each child element and + * @param {function(AbstractType):boolean} filter Function that is called on each child element and * returns a Boolean indicating whether the child * is to be included in the subtree. * @return {YXmlTreeWalker} A subtree and a position within it. @@ -340,6 +341,28 @@ export class YXmlElement extends YXmlFragment { getAttributes (snapshot) { return typeMapGetAll(this) } + + /** + * Inserts new content at an index. + * + * @example + * // Insert character 'a' at position 0 + * xml.insert(0, [new Y.XmlText('text')]) + * + * @param {number} index The index to insert content at + * @param {Array} content The array of content + */ + insert (index, content) { + if (this._y !== null) { + this._y.transact(transaction => { + typeArrayInsertGenerics(transaction, this, index, content) + }) + } else { + // @ts-ignore _prelimContent is defined because this is not yet integrated + this._prelimContent.splice(index, 0, ...content) + } + } + // TODO: outsource the binding property. /** * Creates a Dom Element that mirrors this YXmlElement. diff --git a/src/types/YXmlEvent.js b/src/types/YXmlEvent.js index c5ffed98..19c8aa10 100644 --- a/src/types/YXmlEvent.js +++ b/src/types/YXmlEvent.js @@ -6,6 +6,7 @@ import { YEvent } from '../utils/YEvent.js' import { AbstractType } from './AbstractType.js' // eslint-disable-line import { Transaction } from '../utils/Transaction.js' // eslint-disable-line +import { YXmlElement, YXmlFragment } from './YXmlElement.js' // eslint-disable-line /** * An Event that describes changes on a YXml Element or Yxml Fragment @@ -14,14 +15,14 @@ import { Transaction } from '../utils/Transaction.js' // eslint-disable-line */ export class YXmlEvent extends YEvent { /** - * @param {AbstractType} target The target on which the event is created. + * @param {YXmlElement|YXmlFragment} target The target on which the event is created. * @param {Set} subs The set of changed attributes. `null` is included if the * child list changed. * @param {Transaction} transaction The transaction instance with wich the * change was created. */ constructor (target, subs, transaction) { - super(target) + super(target, transaction) /** * The transaction instance for the computed change. * @type {Transaction} diff --git a/src/utils/ID.js b/src/utils/ID.js index 6c1ba33e..802e1bfc 100644 --- a/src/utils/ID.js +++ b/src/utils/ID.js @@ -86,7 +86,7 @@ export const readID = decoder => * `type` does not store any information about the `keyname`. * This function finds the correct `keyname` for `type` and throws otherwise. * - * @param {AbstractType} type + * @param {AbstractType} type * @return {string} */ export const findRootTypeKey = type => { diff --git a/src/utils/Transaction.js b/src/utils/Transaction.js index aba2c4e4..4119df95 100644 --- a/src/utils/Transaction.js +++ b/src/utils/Transaction.js @@ -61,13 +61,13 @@ export class Transaction { * All types that were directly modified (property added or child * inserted/deleted). New types are not included in this Set. * Maps from type to parentSubs (`item._parentSub = null` for YArray) - * @type {Map>} + * @type {Map,Set>} */ this.changed = new Map() /** * Stores the events for the types that observe also child elements. * It is mainly used by `observeDeep`. - * @type {Map>} + * @type {Map,Array>} */ this.changedParentTypes = new Map() /** diff --git a/src/utils/Y.js b/src/utils/Y.js index ce9aac04..aaefd955 100644 --- a/src/utils/Y.js +++ b/src/utils/Y.js @@ -14,6 +14,7 @@ import { YArray } from '../types/YArray.js' import { YText } from '../types/YText.js' import { YMap } from '../types/YMap.js' import { YXmlFragment } from '../types/YXmlElement.js' +import { YEvent } from './YEvent.js' // eslint-disable-line /** * A Yjs instance handles the state of shared data. @@ -28,7 +29,7 @@ export class Y extends Observable { this.gcEnabled = conf.gc || false this.clientID = random.uint32() /** - * @type {Map} + * @type {Map>} */ this.share = new Map() this.store = new StructStore() @@ -203,7 +204,7 @@ export class Y extends Observable { * * @param {string} name * @param {Function} TypeConstructor The constructor of the type definition - * @return {AbstractType} The created type. Constructed with TypeConstructor + * @return {AbstractType} The created type. Constructed with TypeConstructor */ get (name, TypeConstructor = AbstractType) { // @ts-ignore @@ -242,7 +243,7 @@ export class Y extends Observable { } /** * @param {string} name - * @return {YMap} + * @return {YMap} */ getMap (name) { // @ts-ignore diff --git a/src/utils/YEvent.js b/src/utils/YEvent.js index 47bf89f9..d0da6e09 100644 --- a/src/utils/YEvent.js +++ b/src/utils/YEvent.js @@ -13,18 +13,18 @@ import { isDeleted } from './DeleteSet.js' */ export class YEvent { /** - * @param {AbstractType} target The changed type. + * @param {AbstractType target The changed type. * @param {Transaction} transaction */ constructor (target, transaction) { /** * The type on which this event was created on. - * @type {AbstractType} + * @type {AbstractType */ this.target = target /** * The current target on which the observe callback is called. - * @type {AbstractType} + * @type {AbstractType */ this.currentTarget = target /** @@ -81,7 +81,7 @@ export class YEvent { * console.log(path) // might look like => [2, 'key1'] * child === type.get(path[0]).get(path[1]) * - * @param {AbstractType} parent + * @param {AbstractType parent * @param {AbstractItem} child target * @return {Array} Path to the target */ diff --git a/src/utils/isParentOf.js b/src/utils/isParentOf.js index d965b259..638bcc06 100644 --- a/src/utils/isParentOf.js +++ b/src/utils/isParentOf.js @@ -8,8 +8,8 @@ import { AbstractType } from '../types/AbstractType.js' // eslint-disable-line /** * Check if `parent` is a parent of `child`. * - * @param {AbstractType} parent - * @param {AbstractType} child + * @param {AbstractType} parent + * @param {AbstractType} child * @return {Boolean} Whether `parent` is a parent of `child`. * * @public diff --git a/src/utils/relativePosition.js b/src/utils/relativePosition.js index a8c7b2ba..cc094bbb 100644 --- a/src/utils/relativePosition.js +++ b/src/utils/relativePosition.js @@ -60,12 +60,12 @@ export class RelativePosition { export class AbsolutePosition { /** - * @param {AbstractType} type + * @param {AbstractType} type * @param {number} offset */ constructor (type, offset) { /** - * @type {AbstractType} + * @type {AbstractType} */ this.type = type /** @@ -76,13 +76,13 @@ export class AbsolutePosition { } /** - * @param {AbstractType} type + * @param {AbstractType type * @param {number} offset */ export const createAbsolutePosition = (type, offset) => new AbsolutePosition(type, offset) /** - * @param {AbstractType} type + * @param {AbstractType type * @param {ID.ID|null} item */ export const createRelativePosition = (type, item) => { @@ -99,7 +99,7 @@ export const createRelativePosition = (type, item) => { /** * Create a relativePosition based on a absolute position. * - * @param {AbstractType} type The base type (e.g. YText or YArray). + * @param {AbstractType type The base type (e.g. YText or YArray). * @param {number} offset The absolute position. * @return {RelativePosition} */ diff --git a/tests/testHelper.js b/tests/testHelper.js index 8b4e0898..47d024a2 100644 --- a/tests/testHelper.js +++ b/tests/testHelper.js @@ -224,7 +224,7 @@ export class TestConnector { /** * @param {t.TestCase} tc * @param {{users?:number}} conf - * @return {{testConnector:TestConnector,users:Array,array0:Y.Array,array1:Y.Array,array2:Y.Array,map0:Y.Map,map1:Y.Map,map2:Y.Map,text0:Y.Text,text1:Y.Text,text2:Y.Text,xml0:Y.XmlFragment,xml1:Y.XmlFragment,xml2:Y.XmlFragment}} + * @return {{testConnector:TestConnector,users:Array,array0:Y.Array,array1:Y.Array,array2:Y.Array,map0:Y.Map,map1:Y.Map,map2:Y.Map,map3:Y.Map,text0:Y.Text,text1:Y.Text,text2:Y.Text,xml0:Y.XmlElement,xml1:Y.XmlElement,xml2:Y.XmlElement}} */ export const init = (tc, { users = 5 } = {}) => { /** diff --git a/tests/y-map.tests.js b/tests/y-map.tests.js index db6211e6..eae65910 100644 --- a/tests/y-map.tests.js +++ b/tests/y-map.tests.js @@ -1,4 +1,4 @@ -import { init, compare, applyRandomTests } from './testHelper.js' +import { init, compare, applyRandomTests, TestYInstance } from './testHelper.js' // eslint-disable-line import * as Y from '../src/index.js' import * as t from 'lib0/testing.js' import * as prng from 'lib0/prng.js' @@ -54,7 +54,7 @@ export const testGetAndSetOfMapProperty = tc => { testConnector.flushAllMessages() for (let user of users) { - const u = user.define('map', Y.Map) + const u = user.getMap('map') t.compare(u.get('stuff'), 'stuffy') t.assert(u.get('undefined') === undefined, 'undefined') t.compare(u.get('null'), null, 'null') @@ -82,6 +82,7 @@ export const testYmapSetsYarray = tc => { const array = map0.set('Array', new Y.Array()) t.assert(array === map0.get('Array')) array.insert(0, [1, 2, 3]) + // @ts-ignore t.compare(map0.toJSON(), { Array: [1, 2, 3] }) compare(users) } @@ -95,7 +96,7 @@ export const testGetAndSetOfMapPropertySyncs = tc => { t.compare(map0.get('stuff'), 'stuffy') testConnector.flushAllMessages() for (let user of users) { - var u = user.define('map', Y.Map) + var u = user.getMap('map') t.compare(u.get('stuff'), 'stuffy') } compare(users) @@ -110,7 +111,7 @@ export const testGetAndSetOfMapPropertyWithConflict = tc => { map1.set('stuff', 'c1') testConnector.flushAllMessages() for (let user of users) { - var u = user.define('map', Y.Map) + var u = user.getMap('map') t.compare(u.get('stuff'), 'c0') } compare(users) @@ -126,7 +127,7 @@ export const testGetAndSetAndDeleteOfMapProperty = tc => { map1.set('stuff', 'c1') testConnector.flushAllMessages() for (let user of users) { - var u = user.define('map', Y.Map) + var u = user.getMap('map') t.assert(u.get('stuff') === undefined) } compare(users) @@ -143,7 +144,7 @@ export const testGetAndSetOfMapPropertyWithThreeConflicts = tc => { map2.set('stuff', 'c3') testConnector.flushAllMessages() for (let user of users) { - var u = user.define('map', Y.Map) + var u = user.getMap('map') t.compare(u.get('stuff'), 'c0') } compare(users) @@ -166,7 +167,7 @@ export const testGetAndSetAndDeleteOfMapPropertyWithThreeConflicts = tc => { map3.set('stuff', 'c3') testConnector.flushAllMessages() for (let user of users) { - var u = user.define('map', Y.Map) + var u = user.getMap('map') t.assert(u.get('stuff') === undefined) } compare(users) @@ -183,9 +184,11 @@ export const testObserveDeepProperties = tc => { map1.observeDeep(events => { events.forEach(event => { calls++ + // @ts-ignore t.assert(event.keysChanged.has('deepmap')) t.assert(event.path.length === 1) t.assert(event.path[0] === 'map') + // @ts-ignore dmapid = event.target.get('deepmap')._id }) }) @@ -211,6 +214,9 @@ export const testObserveDeepProperties = tc => { */ export const testObserversUsingObservedeep = tc => { const { users, map0 } = init(tc, { users: 2 }) + /** + * @type {Array>} + */ const pathes = [] let calls = 0 map0.observeDeep(events => { @@ -228,7 +234,11 @@ export const testObserversUsingObservedeep = tc => { } // TODO: Test events in Y.Map -const compareEvent = (t, is, should) => { +/** + * @param {Object} is + * @param {Object} should + */ +const compareEvent = (is, should) => { for (var key in should) { t.compare(should[key], is[key]) } @@ -239,18 +249,21 @@ const compareEvent = (t, is, should) => { */ export const testThrowsAddAndUpdateAndDeleteEvents = tc => { const { users, map0 } = init(tc, { users: 2 }) - let event + /** + * @type {Object} + */ + let event = {} map0.observe(e => { event = e // just put it on event, should be thrown synchronously anyway }) map0.set('stuff', 4) - compareEvent(t, event, { + compareEvent(event, { target: map0, keysChanged: new Set(['stuff']) }) // update, oldValue is in contents map0.set('stuff', new Y.Array()) - compareEvent(t, event, { + compareEvent(event, { target: map0, keysChanged: new Set(['stuff']) }) @@ -258,7 +271,7 @@ export const testThrowsAddAndUpdateAndDeleteEvents = tc => { map0.set('stuff', 5) // delete map0.delete('stuff') - compareEvent(t, event, { + compareEvent(event, { keysChanged: new Set(['stuff']), target: map0 }) @@ -270,7 +283,10 @@ export const testThrowsAddAndUpdateAndDeleteEvents = tc => { */ export const testYmapEventHasCorrectValueWhenSettingAPrimitive = tc => { const { users, map0 } = init(tc, { users: 3 }) - let event + /** + * @type {Object} + */ + let event = {} map0.observe(e => { event = e }) @@ -284,7 +300,10 @@ export const testYmapEventHasCorrectValueWhenSettingAPrimitive = tc => { */ export const testYmapEventHasCorrectValueWhenSettingAPrimitiveFromOtherUser = tc => { const { users, map0, map1, testConnector } = init(tc, { users: 3 }) - let event + /** + * @type {Object} + */ + let event = {} map0.observe(e => { event = e }) @@ -294,25 +313,28 @@ export const testYmapEventHasCorrectValueWhenSettingAPrimitiveFromOtherUser = tc compare(users) } +/** + * @type {Array} + */ const mapTransactions = [ - function set (tc, user, gen) { + function set (user, gen) { let key = prng.oneOf(gen, ['one', 'two']) var value = prng.utf16String(gen) - user.define('map', Y.Map).set(key, value) + user.getMap('map').set(key, value) }, - function setType (tc, user, gen) { + function setType (user, gen) { let key = prng.oneOf(gen, ['one', 'two']) var type = prng.oneOf(gen, [new Y.Array(), new Y.Map()]) - user.define('map', Y.Map).set(key, type) + user.getMap('map').set(key, type) if (type instanceof Y.Array) { type.insert(0, [1, 2, 3, 4]) } else { type.set('deepkey', 'deepvalue') } }, - function _delete (tc, user, gen) { + function _delete (user, gen) { let key = prng.oneOf(gen, ['one', 'two']) - user.define('map', Y.Map).delete(key) + user.getMap('map').delete(key) } ] diff --git a/tests/y-text.tests.js b/tests/y-text.tests.js index aebd6e56..1ef294d5 100644 --- a/tests/y-text.tests.js +++ b/tests/y-text.tests.js @@ -54,7 +54,8 @@ export const testBasicFormat = tc => { t.assert(text0.toString() === 'zb') t.compare(text0.toDelta(), [{ insert: 'zb', attributes: { bold: true } }]) t.compare(delta, [{ insert: 'z', attributes: { bold: true } }]) - t.assert(text0._start._right._right._right._content === 'b', 'Does not insert duplicate attribute marker') + // @ts-ignore + t.assert(text0._start.right.right.right.string === 'b', 'Does not insert duplicate attribute marker') text0.insert(0, 'y') t.assert(text0.toString() === 'yzb') t.compare(text0.toDelta(), [{ insert: 'y' }, { insert: 'zb', attributes: { bold: true } }])