2018-09-03 02:47:52 +03:00
|
|
|
/**********************************************************************
|
|
|
|
|
*
|
|
|
|
|
* This module describes the diff format and provides basic verification.
|
|
|
|
|
*
|
|
|
|
|
* XXX EXPERIMENTAL...
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
**********************************************************************/
|
|
|
|
|
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
|
|
|
|
|
(function(require){ var module={} // make module AMD/node compatible...
|
|
|
|
|
/*********************************************************************/
|
|
|
|
|
|
|
|
|
|
var diff = require('./diff')
|
|
|
|
|
var {
|
|
|
|
|
ANY,
|
2018-09-05 02:58:15 +03:00
|
|
|
NULL, BOOL, NUMBER, STRING, ARRAY, FUNCTION,
|
2018-09-03 02:47:52 +03:00
|
|
|
OR, AND, NOT,
|
|
|
|
|
AT, OF, IN,
|
2018-09-05 00:09:45 +03:00
|
|
|
VAR, LIKE, TEST,
|
2018-09-03 02:47:52 +03:00
|
|
|
|
|
|
|
|
EMPTY, NONE,
|
|
|
|
|
} = diff
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
|
//
|
|
|
|
|
// XXX need better mismatch checking -- ideally stating the exact spot
|
|
|
|
|
// where we did not match and the path of fails it created...
|
2018-09-05 04:39:42 +03:00
|
|
|
//
|
2018-09-03 02:47:52 +03:00
|
|
|
//
|
|
|
|
|
//---------------------------------------------------------------------
|
|
|
|
|
// Flat diff...
|
|
|
|
|
|
|
|
|
|
var VALUE =
|
|
|
|
|
module.VALUE = OR(
|
|
|
|
|
// XXX use these taken from .placeholders...
|
2018-09-04 22:07:03 +03:00
|
|
|
OR(EMPTY, LIKE('EMPTY')),
|
|
|
|
|
OR(NONE, LIKE('NONE')),
|
2018-09-03 02:47:52 +03:00
|
|
|
ANY)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var SIDE_VALUES =
|
|
|
|
|
module.SIDE_VALUES = OR(
|
|
|
|
|
// A and B...
|
|
|
|
|
AND(
|
|
|
|
|
AT('A', VALUE),
|
|
|
|
|
AT('B', VALUE)),
|
|
|
|
|
// only A...
|
|
|
|
|
AT('A', VALUE),
|
|
|
|
|
// only B...
|
|
|
|
|
AT('B', VALUE))
|
|
|
|
|
|
|
|
|
|
var CHANGE =
|
|
|
|
|
module.CHANGE = AND(
|
|
|
|
|
AT('path', ARRAY),
|
|
|
|
|
// XXX optional...
|
|
|
|
|
// ...see DIFF_OBJECT's options for description...
|
|
|
|
|
AT('type', OR(STRING, undefined)),
|
|
|
|
|
SIDE_VALUES)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var DIFF_FLAT =
|
|
|
|
|
module.DIFF_FLAT = OR(
|
|
|
|
|
ARRAY(CHANGE),
|
|
|
|
|
null)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------
|
|
|
|
|
// Tree diff...
|
|
|
|
|
|
|
|
|
|
var BASIC_CHANGE =
|
|
|
|
|
module.BASIC_CHANGE = AND(
|
|
|
|
|
AT('type', 'Basic'),
|
|
|
|
|
SIDE_VALUES)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
var OBJECT_ITEM =
|
|
|
|
|
module.OBJECT_ITEM = OR(
|
|
|
|
|
[STRING, DIFF_TREE],
|
|
|
|
|
[STRING, STRING, DIFF_TREE])
|
|
|
|
|
|
|
|
|
|
var OBJECT_CHANGE =
|
|
|
|
|
module.OBJECT_CHANGE = AND(
|
|
|
|
|
AT('type', 'Object'),
|
|
|
|
|
AT('items', ARRAY(OBJECT_ITEM)),
|
|
|
|
|
// XXX
|
|
|
|
|
AT('item_order', undefined))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
var ARRAY_ITEM =
|
|
|
|
|
module.ARRAY_ITEM = OR(
|
|
|
|
|
[ANY, ANY, DIFF_TREE],
|
|
|
|
|
[[ANY, NUMBER], [ANY, NUMBER], DIFF_TREE])
|
|
|
|
|
|
|
|
|
|
var ARRAY_ITEMS =
|
|
|
|
|
module.ARRAY_ITEMS = AND(
|
|
|
|
|
AT('length', OR(
|
|
|
|
|
[NUMBER, NUMBER],
|
|
|
|
|
undefined)),
|
|
|
|
|
AT('items', ARRAY(
|
|
|
|
|
OR(
|
|
|
|
|
ARRAY_ITEM,
|
|
|
|
|
OBJECT_ITEM))),
|
|
|
|
|
// XXX
|
|
|
|
|
AT('item_order', undefined))
|
|
|
|
|
|
|
|
|
|
var ARRAY_CHANGE =
|
|
|
|
|
module.ARRAY_CHANGE = AND(
|
|
|
|
|
AT('type', 'Array'),
|
|
|
|
|
ARRAY_ITEMS)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
var TEXT_CHANGE =
|
|
|
|
|
module.TEXT_CHANGE = AND(
|
|
|
|
|
AT('type', 'Text'),
|
|
|
|
|
ARRAY_ITEMS)
|
|
|
|
|
|
|
|
|
|
// XXX it makes sense to make this a recursive pattern...
|
|
|
|
|
// ...need to check if we stop on a recursive pattern...
|
|
|
|
|
// XXX TEST!!!
|
|
|
|
|
var DIFF_TREE =
|
|
|
|
|
module.DIFF_TREE = OR(
|
|
|
|
|
BASIC_CHANGE,
|
|
|
|
|
OBJECT_CHANGE,
|
|
|
|
|
ARRAY_CHANGE,
|
|
|
|
|
TEXT_CHANGE,
|
|
|
|
|
null)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------
|
|
|
|
|
// Diff...
|
|
|
|
|
|
|
|
|
|
var DIFF_OBJECT =
|
|
|
|
|
module.DIFF_OBJECT = AND(
|
|
|
|
|
// format metadata...
|
|
|
|
|
AT('format', diff.FORMAT_NAME),
|
|
|
|
|
//AT('version', STRING(/\d+\.\d+\.\d+/)),
|
|
|
|
|
AT('version', diff.FORMAT_VERSION),
|
|
|
|
|
|
|
|
|
|
// instance metadata...
|
|
|
|
|
AT('options', AND(
|
2018-09-05 02:58:15 +03:00
|
|
|
AT('tree_diff', OR(BOOL, NULL)),
|
|
|
|
|
AT('keep_none', OR(BOOL, NULL)),
|
|
|
|
|
AT('min_text_length', OR(NUMBER, NULL)),
|
|
|
|
|
AT('no_attributes', OR(BOOL, NULL)),
|
|
|
|
|
AT('NONE', OR(ANY, NULL)),
|
|
|
|
|
AT('EMPTY', OR(ANY, NULL)),
|
|
|
|
|
AT('no_length', OR(BOOL, NULL)),
|
|
|
|
|
AT('cmp', OR(FUNCTION, NULL)) )),
|
2018-09-03 02:47:52 +03:00
|
|
|
AT('placeholders', AND(
|
2018-09-04 22:07:03 +03:00
|
|
|
AT('NONE',
|
|
|
|
|
VAR('NONE', ANY)),
|
|
|
|
|
AT('EMPTY',
|
|
|
|
|
VAR('EMPTY', ANY)))),
|
2018-09-03 02:47:52 +03:00
|
|
|
AT('timestamp', NUMBER),
|
|
|
|
|
|
|
|
|
|
// diff...
|
|
|
|
|
OR(
|
|
|
|
|
AND(
|
|
|
|
|
AT('structure', 'flat'),
|
|
|
|
|
AT('diff', DIFF_FLAT)),
|
|
|
|
|
AND(
|
|
|
|
|
AT('structure', 'tree'),
|
|
|
|
|
AT('diff', DIFF_TREE))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
|
* vim:set ts=4 sw=4 : */ return module })
|