Compare commits

..

1 Commits

Author SHA1 Message Date
Kevin Jahns
cbe2abafbb v13.0.0-27 -- distribution files 2017-11-10 12:55:13 -08:00
23 changed files with 475 additions and 760 deletions

View File

@@ -1,15 +1,4 @@
/* global Y, HTMLElement, customElements */
class MagicTable extends HTMLElement {
constructor () {
super()
var shadow = this.attachShadow({mode: 'open'})
setTimeout(() => {
shadow.append(this.childNodes[0])
}, 1000)
}
}
customElements.define('magic-table', MagicTable)
/* global Y */
// initialize a shared object. This function call returns a promise!
let y = new Y({
@@ -28,14 +17,17 @@ window.onload = function () {
window.yXmlType.bindToDom(document.body)
}
window.undoManager = new Y.utils.UndoManager(window.yXmlType, {
captureTimeout: 500
captureTimeout: 0
})
document.onkeydown = function interceptUndoRedo (e) {
if (e.keyCode === 90 && e.metaKey) {
console.log('uidtaren')
if (!e.shiftKey) {
console.info('Undo!')
window.undoManager.undo()
} else {
console.info('Redo!')
window.undoManager.redo()
}
e.preventDefault()

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "yjs",
"version": "13.0.0-30",
"version": "13.0.0-27",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -1,6 +1,6 @@
{
"name": "yjs",
"version": "13.0.0-30",
"version": "13.0.0-27",
"description": "A framework for real-time p2p shared editing on any data",
"main": "./y.node.js",
"browser": "./y.js",

View File

@@ -5,13 +5,9 @@ import commonjs from 'rollup-plugin-commonjs'
var pkg = require('./package.json')
export default {
input: 'src/Y.js',
name: 'Y',
sourcemap: true,
output: {
file: 'y.js',
format: 'umd'
},
entry: 'src/Y.js',
moduleName: 'Y',
format: 'umd',
plugins: [
nodeResolve({
main: true,
@@ -36,6 +32,8 @@ export default {
}
})
],
dest: 'y.js',
sourceMap: true,
banner: `
/**
* ${pkg.name} - ${pkg.description}

View File

@@ -3,13 +3,9 @@ import commonjs from 'rollup-plugin-commonjs'
var pkg = require('./package.json')
export default {
input: 'src/y-dist.cjs.js',
nameame: 'Y',
sourcemap: true,
output: {
file: 'y.node.js',
format: 'cjs'
},
entry: 'src/y-dist.cjs.js',
moduleName: 'Y',
format: 'cjs',
plugins: [
nodeResolve({
main: true,
@@ -18,6 +14,8 @@ export default {
}),
commonjs()
],
dest: 'y.node.js',
sourceMap: true,
banner: `
/**
* ${pkg.name} - ${pkg.description}

View File

@@ -3,13 +3,9 @@ import commonjs from 'rollup-plugin-commonjs'
import multiEntry from 'rollup-plugin-multi-entry'
export default {
input: 'test/y-xml.tests.js',
name: 'y-tests',
sourcemap: true,
output: {
file: 'y.test.js',
format: 'umd'
},
entry: 'test/y-map.tests.js',
moduleName: 'y-tests',
format: 'umd',
plugins: [
nodeResolve({
main: true,
@@ -18,5 +14,7 @@ export default {
}),
commonjs(),
multiEntry()
]
],
dest: 'y.test.js',
sourceMap: true
}

View File

@@ -20,13 +20,7 @@ export default class ItemJSON extends Item {
this._content = new Array(len)
for (let i = 0; i < len; i++) {
const ctnt = decoder.readVarString()
let parsed
if (ctnt === 'undefined') {
parsed = undefined
} else {
parsed = JSON.parse(ctnt)
}
this._content[i] = parsed
this._content[i] = JSON.parse(ctnt)
}
return missing
}
@@ -35,14 +29,7 @@ export default class ItemJSON extends Item {
let len = this._content.length
encoder.writeVarUint(len)
for (let i = 0; i < len; i++) {
let encoded
let content = this._content[i]
if (content === undefined) {
encoded = 'undefined'
} else {
encoded = JSON.stringify(content)
}
encoder.writeVarString(encoded)
encoder.writeVarString(JSON.stringify(this._content[i]))
}
}
_logString () {

View File

@@ -65,9 +65,9 @@ export default class Type extends Item {
}
return path
}
_callEventHandler (transaction, event) {
const changedParentTypes = transaction.changedParentTypes
this._eventHandler.callEventListeners(transaction, event)
_callEventHandler (event) {
const changedParentTypes = this._y._transaction.changedParentTypes
this._eventHandler.callEventListeners(event)
let type = this
while (type !== this._y) {
let events = changedParentTypes.get(type)

View File

@@ -12,8 +12,8 @@ class YArrayEvent extends YEvent {
}
export default class YArray extends Type {
_callObserver (transaction, parentSubs, remote) {
this._callEventHandler(transaction, new YArrayEvent(this, remote))
_callObserver (parentSubs, remote) {
this._callEventHandler(new YArrayEvent(this, remote))
}
get (pos) {
let n = this._start

View File

@@ -13,8 +13,8 @@ class YMapEvent extends YEvent {
}
export default class YMap extends Type {
_callObserver (transaction, parentSubs, remote) {
this._callEventHandler(transaction, new YMapEvent(this, parentSubs, remote))
_callObserver (parentSubs, remote) {
this._callEventHandler(new YMapEvent(this, parentSubs, remote))
}
toJSON () {
const map = {}

View File

@@ -142,8 +142,8 @@ export default class YXmlFragment extends YArray {
xml.setDomFilter(f)
})
}
_callObserver (transaction, parentSubs, remote) {
this._callEventHandler(transaction, new YXmlEvent(this, parentSubs, remote))
_callObserver (parentSubs, remote) {
this._callEventHandler(new YXmlEvent(this, parentSubs, remote))
}
toString () {
return this.map(xml => xml.toString()).join('')

View File

@@ -7,7 +7,7 @@ let relativeSelection = null
export let beforeTransactionSelectionFixer
if (typeof getSelection !== 'undefined') {
beforeTransactionSelectionFixer = function _beforeTransactionSelectionFixer (y, transaction, remote) {
beforeTransactionSelectionFixer = function _beforeTransactionSelectionFixer (y, remote) {
if (!remote) {
return
}
@@ -30,7 +30,7 @@ if (typeof getSelection !== 'undefined') {
beforeTransactionSelectionFixer = function _fakeBeforeTransactionSelectionFixer () {}
}
export function afterTransactionSelectionFixer (y, transaction, remote) {
export function afterTransactionSelectionFixer (y, remote) {
if (relativeSelection === null || !remote) {
return
}

View File

@@ -136,32 +136,6 @@ export function applyChangesFromDom (dom) {
}
export function reflectChangesOnDom (events) {
// Make sure that no filtered attributes are applied to the structure
// if they were, delete them
/*
events.forEach(event => {
const target = event.target
if (event.attributesChanged === undefined) {
// event.target is Y.XmlText
return
}
const keys = this._domFilter(target.nodeName, Array.from(event.attributesChanged))
if (keys === null) {
target._delete()
} else {
const removeKeys = new Set() // is a copy of event.attributesChanged
event.attributesChanged.forEach(key => { removeKeys.add(key) })
keys.forEach(key => {
// remove all accepted keys from removeKeys
removeKeys.delete(key)
})
// remove the filtered attribute
removeKeys.forEach(key => {
target.removeAttribute(key)
})
}
})
*/
this._mutualExclude(() => {
events.forEach(event => {
const yxml = event.target

View File

@@ -17,7 +17,7 @@ export default class EventHandler {
removeAllEventListeners () {
this.eventListeners = []
}
callEventListeners (transaction, event) {
callEventListeners (event) {
for (var i = 0; i < this.eventListeners.length; i++) {
try {
const f = this.eventListeners[i]

View File

@@ -1,16 +1,16 @@
import ID from './ID.js'
class ReverseOperation {
constructor (y, transaction) {
constructor (y) {
this.created = new Date()
const beforeState = transaction.beforeState
const beforeState = y._transaction.beforeState
this.toState = new ID(y.userID, y.ss.getState(y.userID) - 1)
if (beforeState.has(y.userID)) {
this.fromState = new ID(y.userID, beforeState.get(y.userID))
} else {
this.fromState = this.toState
}
this.deletedStructs = transaction.deletedStructs
this.deletedStructs = y._transaction.deletedStructs
}
}
@@ -70,9 +70,9 @@ export default class UndoManager {
this._redoing = false
const y = scope._y
this.y = y
y.on('afterTransaction', (y, transaction, remote) => {
if (!remote && transaction.changedParentTypes.has(scope)) {
let reverseOperation = new ReverseOperation(y, transaction)
y.on('afterTransaction', (y, remote) => {
if (!remote && y._transaction.changedParentTypes.has(scope)) {
let reverseOperation = new ReverseOperation(y)
if (!this._undoing) {
let lastUndoOp = this._undoBuffer.length > 0 ? this._undoBuffer[this._undoBuffer.length - 1] : null
if (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) {

View File

@@ -15,7 +15,6 @@ import YMap from './Type/YMap.js'
import YText from './Type/YText.js'
import { YXmlFragment, YXmlElement, YXmlText } from './Type/y-xml/y-xml.js'
import BinaryDecoder from './Binary/Decoder.js'
import { getRelativePosition, fromRelativePosition } from './Util/relativePosition.js'
import debug from 'debug'
import Transaction from './Transaction.js'
@@ -45,8 +44,8 @@ export default class Y extends NamedEventHandler {
transact (f, remote = false) {
let initialCall = this._transaction === null
if (initialCall) {
this.emit('beforeTransaction', this, remote)
this._transaction = new Transaction(this)
this.emit('beforeTransaction', this, this._transaction, remote)
}
try {
f(this)
@@ -54,15 +53,13 @@ export default class Y extends NamedEventHandler {
console.error(e)
}
if (initialCall) {
const transaction = this._transaction
this._transaction = null
// emit change events on changed types
transaction.changedTypes.forEach(function (subs, type) {
this._transaction.changedTypes.forEach(function (subs, type) {
if (!type._deleted) {
type._callObserver(transaction, subs, remote)
type._callObserver(subs, remote)
}
})
transaction.changedParentTypes.forEach(function (events, type) {
this._transaction.changedParentTypes.forEach(function (events, type) {
if (!type._deleted) {
events = events
.filter(event =>
@@ -74,11 +71,12 @@ export default class Y extends NamedEventHandler {
})
// we don't have to check for events.length
// because there is no way events is empty..
type._deepEventHandler.callEventListeners(transaction, events)
type._deepEventHandler.callEventListeners(events)
}
})
// when all changes & events are processed, emit afterTransaction event
this.emit('afterTransaction', this, transaction, remote)
this.emit('afterTransaction', this, remote)
this._transaction = null
}
}
// fake _start for root properties (y.set('name', type))
@@ -170,9 +168,7 @@ Y.XmlText = YXmlText
Y.utils = {
BinaryDecoder,
UndoManager,
getRelativePosition,
fromRelativePosition
UndoManager
}
Y.debug = debug

View File

@@ -41,8 +41,6 @@ test('basic map tests', async function map0 (t) {
test('Basic get&set of Map property (converge via sync)', async function map1 (t) {
let { users, map0 } = await initArrays(t, { users: 2 })
map0.set('stuff', 'stuffy')
map0.set('undefined', undefined)
map0.set('null', null)
t.compare(map0.get('stuff'), 'stuffy')
await flushAll(t, users)
@@ -50,8 +48,6 @@ test('Basic get&set of Map property (converge via sync)', async function map1 (t
for (let user of users) {
var u = user.get('map', Y.Map)
t.compare(u.get('stuff'), 'stuffy')
t.assert(u.get('undefined') === undefined, 'undefined')
t.compare(u.get('null'), null, 'null')
}
await compareUsers(t, users)
})

8
y.js

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

100
y.node.js
View File

@@ -1,7 +1,7 @@
/**
* yjs - A framework for real-time p2p shared editing on any data
* @version v13.0.0-30
* @version v13.0.0-27
* @license MIT
*/
@@ -1899,7 +1899,7 @@ class EventHandler {
removeAllEventListeners () {
this.eventListeners = [];
}
callEventListeners (transaction, event) {
callEventListeners (event) {
for (var i = 0; i < this.eventListeners.length; i++) {
try {
const f = this.eventListeners[i];
@@ -1966,9 +1966,9 @@ class Type extends Item {
}
return path
}
_callEventHandler (transaction, event) {
const changedParentTypes = transaction.changedParentTypes;
this._eventHandler.callEventListeners(transaction, event);
_callEventHandler (event) {
const changedParentTypes = this._y._transaction.changedParentTypes;
this._eventHandler.callEventListeners(event);
let type = this;
while (type !== this._y) {
let events = changedParentTypes.get(type);
@@ -2091,13 +2091,7 @@ class ItemJSON extends Item {
this._content = new Array(len);
for (let i = 0; i < len; i++) {
const ctnt = decoder.readVarString();
let parsed;
if (ctnt === 'undefined') {
parsed = undefined;
} else {
parsed = JSON.parse(ctnt);
}
this._content[i] = parsed;
this._content[i] = JSON.parse(ctnt);
}
return missing
}
@@ -2106,14 +2100,7 @@ class ItemJSON extends Item {
let len = this._content.length;
encoder.writeVarUint(len);
for (let i = 0; i < len; i++) {
let encoded;
let content = this._content[i];
if (content === undefined) {
encoded = 'undefined';
} else {
encoded = JSON.stringify(content);
}
encoder.writeVarString(encoded);
encoder.writeVarString(JSON.stringify(this._content[i]));
}
}
_logString () {
@@ -2211,8 +2198,8 @@ class YArrayEvent extends YEvent {
}
class YArray extends Type {
_callObserver (transaction, parentSubs, remote) {
this._callEventHandler(transaction, new YArrayEvent(this, remote));
_callObserver (parentSubs, remote) {
this._callEventHandler(new YArrayEvent(this, remote));
}
get (pos) {
let n = this._start;
@@ -2429,8 +2416,8 @@ class YMapEvent extends YEvent {
}
class YMap extends Type {
_callObserver (transaction, parentSubs, remote) {
this._callEventHandler(transaction, new YMapEvent(this, parentSubs, remote));
_callObserver (parentSubs, remote) {
this._callEventHandler(new YMapEvent(this, parentSubs, remote));
}
toJSON () {
const map = {};
@@ -2777,32 +2764,6 @@ function applyChangesFromDom (dom) {
}
function reflectChangesOnDom (events) {
// Make sure that no filtered attributes are applied to the structure
// if they were, delete them
/*
events.forEach(event => {
const target = event.target
if (event.attributesChanged === undefined) {
// event.target is Y.XmlText
return
}
const keys = this._domFilter(target.nodeName, Array.from(event.attributesChanged))
if (keys === null) {
target._delete()
} else {
const removeKeys = new Set() // is a copy of event.attributesChanged
event.attributesChanged.forEach(key => { removeKeys.add(key) })
keys.forEach(key => {
// remove all accepted keys from removeKeys
removeKeys.delete(key)
})
// remove the filtered attribute
removeKeys.forEach(key => {
target.removeAttribute(key)
})
}
})
*/
this._mutualExclude(() => {
events.forEach(event => {
const yxml = event.target;
@@ -2956,7 +2917,7 @@ let relativeSelection = null;
let beforeTransactionSelectionFixer;
if (typeof getSelection !== 'undefined') {
beforeTransactionSelectionFixer = function _beforeTransactionSelectionFixer (y, transaction, remote) {
beforeTransactionSelectionFixer = function _beforeTransactionSelectionFixer (y, remote) {
if (!remote) {
return
}
@@ -2979,7 +2940,7 @@ if (typeof getSelection !== 'undefined') {
beforeTransactionSelectionFixer = function _fakeBeforeTransactionSelectionFixer () {};
}
function afterTransactionSelectionFixer (y, transaction, remote) {
function afterTransactionSelectionFixer (y, remote) {
if (relativeSelection === null || !remote) {
return
}
@@ -3911,8 +3872,8 @@ class YXmlFragment extends YArray {
xml.setDomFilter(f);
});
}
_callObserver (transaction, parentSubs, remote) {
this._callEventHandler(transaction, new YXmlEvent(this, parentSubs, remote));
_callObserver (parentSubs, remote) {
this._callEventHandler(new YXmlEvent(this, parentSubs, remote));
}
toString () {
return this.map(xml => xml.toString()).join('')
@@ -4409,16 +4370,16 @@ class NamedEventHandler {
}
class ReverseOperation {
constructor (y, transaction) {
constructor (y) {
this.created = new Date();
const beforeState = transaction.beforeState;
const beforeState = y._transaction.beforeState;
this.toState = new ID(y.userID, y.ss.getState(y.userID) - 1);
if (beforeState.has(y.userID)) {
this.fromState = new ID(y.userID, beforeState.get(y.userID));
} else {
this.fromState = this.toState;
}
this.deletedStructs = transaction.deletedStructs;
this.deletedStructs = y._transaction.deletedStructs;
}
}
@@ -4478,9 +4439,9 @@ class UndoManager {
this._redoing = false;
const y = scope._y;
this.y = y;
y.on('afterTransaction', (y, transaction, remote) => {
if (!remote && transaction.changedParentTypes.has(scope)) {
let reverseOperation = new ReverseOperation(y, transaction);
y.on('afterTransaction', (y, remote) => {
if (!remote && y._transaction.changedParentTypes.has(scope)) {
let reverseOperation = new ReverseOperation(y);
if (!this._undoing) {
let lastUndoOp = this._undoBuffer.length > 0 ? this._undoBuffer[this._undoBuffer.length - 1] : null;
if (lastUndoOp !== null && reverseOperation.created - lastUndoOp.created <= options.captureTimeout) {
@@ -5436,8 +5397,8 @@ class Y$1 extends NamedEventHandler {
transact (f, remote = false) {
let initialCall = this._transaction === null;
if (initialCall) {
this.emit('beforeTransaction', this, remote);
this._transaction = new Transaction(this);
this.emit('beforeTransaction', this, this._transaction, remote);
}
try {
f(this);
@@ -5445,15 +5406,13 @@ class Y$1 extends NamedEventHandler {
console.error(e);
}
if (initialCall) {
const transaction = this._transaction;
this._transaction = null;
// emit change events on changed types
transaction.changedTypes.forEach(function (subs, type) {
this._transaction.changedTypes.forEach(function (subs, type) {
if (!type._deleted) {
type._callObserver(transaction, subs, remote);
type._callObserver(subs, remote);
}
});
transaction.changedParentTypes.forEach(function (events, type) {
this._transaction.changedParentTypes.forEach(function (events, type) {
if (!type._deleted) {
events = events
.filter(event =>
@@ -5465,11 +5424,12 @@ class Y$1 extends NamedEventHandler {
});
// we don't have to check for events.length
// because there is no way events is empty..
type._deepEventHandler.callEventListeners(transaction, events);
type._deepEventHandler.callEventListeners(events);
}
});
// when all changes & events are processed, emit afterTransaction event
this.emit('afterTransaction', this, transaction, remote);
this.emit('afterTransaction', this, remote);
this._transaction = null;
}
}
// fake _start for root properties (y.set('name', type))
@@ -5561,9 +5521,7 @@ Y$1.XmlText = YXmlText;
Y$1.utils = {
BinaryDecoder,
UndoManager,
getRelativePosition,
fromRelativePosition
UndoManager
};
Y$1.debug = browser;

File diff suppressed because one or more lines are too long

958
y.test.js

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long