UNPKG

json-joy

Version:

Collection of libraries for building collaborative editing apps.

63 lines (62 loc) 2.7 kB
export var VALIDATE_RESULT; (function (VALIDATE_RESULT) { VALIDATE_RESULT[VALIDATE_RESULT["SUCCESS"] = 0] = "SUCCESS"; VALIDATE_RESULT[VALIDATE_RESULT["INVALID_OP"] = 1] = "INVALID_OP"; VALIDATE_RESULT[VALIDATE_RESULT["INVALID_COMPONENT"] = 2] = "INVALID_COMPONENT"; VALIDATE_RESULT[VALIDATE_RESULT["ADJACENT_SAME_TYPE"] = 3] = "ADJACENT_SAME_TYPE"; VALIDATE_RESULT[VALIDATE_RESULT["NO_TRAILING_RETAIN"] = 4] = "NO_TRAILING_RETAIN"; })(VALIDATE_RESULT || (VALIDATE_RESULT = {})); export const validate = (op) => { if (!(op instanceof Array)) return VALIDATE_RESULT.INVALID_OP; if (op.length === 0) return VALIDATE_RESULT.INVALID_OP; let last; for (let i = 0; i < op.length; i++) { const component = op[i]; switch (typeof component) { case 'number': { if (!component) return VALIDATE_RESULT.INVALID_COMPONENT; if (component !== Math.round(component)) return VALIDATE_RESULT.INVALID_COMPONENT; if (component > 0) { const lastComponentIsRetain = typeof last === 'number' && last > 0; if (lastComponentIsRetain) return VALIDATE_RESULT.ADJACENT_SAME_TYPE; } else { const lastComponentIsDelete = typeof last === 'number' && last < 0; if (lastComponentIsDelete) return VALIDATE_RESULT.ADJACENT_SAME_TYPE; } break; } case 'string': { if (!component.length) return VALIDATE_RESULT.INVALID_COMPONENT; const lastComponentIsInsert = typeof last === 'string'; if (lastComponentIsInsert) return VALIDATE_RESULT.ADJACENT_SAME_TYPE; break; } case 'object': { if (!(component instanceof Array)) return VALIDATE_RESULT.INVALID_COMPONENT; if (component.length !== 1) return VALIDATE_RESULT.INVALID_COMPONENT; const lastComponentIsRetainedDelete = last instanceof Array; if (lastComponentIsRetainedDelete) return VALIDATE_RESULT.ADJACENT_SAME_TYPE; break; } default: return VALIDATE_RESULT.INVALID_COMPONENT; } last = component; } const isLastRetain = typeof last === 'number' && last > 0; if (isLastRetain) return VALIDATE_RESULT.NO_TRAILING_RETAIN; return VALIDATE_RESULT.SUCCESS; };