mirror of
https://github.com/flynx/diff.js.git
synced 2025-10-28 18:40:09 +00:00
187 lines
4.1 KiB
JavaScript
187 lines
4.1 KiB
JavaScript
/**********************************************************************
|
|
*
|
|
* 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,
|
|
NULL, BOOL, B, NUMBER, N, STRING, S, ARRAY, L, FUNCTION, F,
|
|
OR, AND, NOT,
|
|
AT, OF, IN,
|
|
VAR, LIKE, TEST,
|
|
|
|
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...
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------
|
|
// Flat diff...
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Basic value...
|
|
var VALUE =
|
|
module.VALUE = OR(
|
|
OR(LIKE('EMPTY'), EMPTY),
|
|
OR(LIKE('NONE'), NONE),
|
|
ANY)
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Change A/B side values...
|
|
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))
|
|
|
|
// Basic change...
|
|
var CHANGE =
|
|
module.CHANGE = AND(
|
|
AT('path', L),
|
|
AT('type', OR(S, undefined)),
|
|
SIDE_VALUES)
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// flat diff root (Array)...
|
|
var DIFF_FLAT =
|
|
module.DIFF_FLAT = OR(
|
|
L(CHANGE),
|
|
null)
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------
|
|
// Tree diff...
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Basic change...
|
|
var BASIC_CHANGE =
|
|
module.BASIC_CHANGE = AND(
|
|
AT('type', 'Basic'),
|
|
SIDE_VALUES)
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Object change...
|
|
var OBJECT_ITEM =
|
|
module.OBJECT_ITEM = OR(
|
|
[S, DIFF_TREE],
|
|
[S, S, DIFF_TREE])
|
|
|
|
var OBJECT_CHANGE =
|
|
module.OBJECT_CHANGE = AND(
|
|
AT('type', 'Object'),
|
|
AT('items', L(OBJECT_ITEM)),
|
|
// XXX
|
|
AT('item_order', undefined))
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Array change...
|
|
var ARRAY_ITEM =
|
|
module.ARRAY_ITEM = OR(
|
|
[ANY, ANY, DIFF_TREE],
|
|
[[ANY, N], [ANY, N], DIFF_TREE])
|
|
|
|
var ARRAY_ITEMS =
|
|
module.ARRAY_ITEMS = AND(
|
|
AT('length', OR(
|
|
[N, N],
|
|
undefined)),
|
|
AT('items',
|
|
L(OR(
|
|
ARRAY_ITEM,
|
|
OBJECT_ITEM))),
|
|
// XXX
|
|
AT('item_order', undefined))
|
|
|
|
var ARRAY_CHANGE =
|
|
module.ARRAY_CHANGE = AND(
|
|
AT('type', 'Array'),
|
|
ARRAY_ITEMS)
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Text change...
|
|
var TEXT_CHANGE =
|
|
module.TEXT_CHANGE = AND(
|
|
AT('type', 'Text'),
|
|
ARRAY_ITEMS)
|
|
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Tree - the tree node...
|
|
// XXX 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 -- the root data structure...
|
|
|
|
var DIFF_OBJECT =
|
|
module.DIFF_OBJECT = AND(
|
|
// format metadata...
|
|
AT('format', diff.FORMAT_NAME),
|
|
//AT('version', S(/\d+\.\d+\.\d+/)),
|
|
AT('version', diff.FORMAT_VERSION),
|
|
|
|
// instance metadata...
|
|
AT('options',
|
|
AND(
|
|
AT('tree_diff', OR(B, NULL)),
|
|
AT('keep_none', OR(B, NULL)),
|
|
AT('min_text_length', OR(N, NULL)),
|
|
AT('no_attributes', OR(B, NULL)),
|
|
AT('NONE', OR(ANY, NULL)),
|
|
AT('EMPTY', OR(ANY, NULL)),
|
|
AT('no_length', OR(B, NULL)),
|
|
AT('cmp', OR(F, NULL)) )),
|
|
AT('placeholders',
|
|
AND(
|
|
AT('NONE',
|
|
VAR('NONE', ANY)),
|
|
AT('EMPTY',
|
|
VAR('EMPTY', ANY)))),
|
|
AT('timestamp', N),
|
|
|
|
// 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 })
|