objectmodel 4.4.4 → 4.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +8 -8
- package/.eslintrc.json +25 -25
- package/LICENSE +22 -22
- package/README.md +67 -67
- package/build/add-banner.js +13 -13
- package/build/bundle-entry.dev.js +2 -2
- package/build/bundle-entry.js +11 -11
- package/dist/object-model.cjs +84 -83
- package/dist/object-model.js +84 -83
- package/dist/object-model.js.map +1 -1
- package/dist/object-model.min.js +2 -2
- package/dist/object-model.min.js.map +1 -1
- package/index.html +4 -4
- package/package.json +70 -70
- package/rollup.config.js +13 -13
- package/src/helpers.js +43 -43
- package/src/list-model.js +43 -43
- package/src/object-model.d.ts +8 -7
- package/src/object-model.js +1 -0
- package/test/basic-model.spec.cjs +272 -272
- package/test/bench/array.html +51 -51
- package/test/bench/bench-lib.js +49 -49
- package/test/bench/map-no-cast.html +53 -53
- package/test/bench/map-set.html +52 -52
- package/test/bench/map.html +51 -51
- package/test/bench/object-models.html +87 -87
- package/test/index.cjs +13 -13
- package/test/map-model.spec.cjs +236 -236
- package/test/model.spec.cjs +30 -30
- package/test/object-model.spec.cjs +2 -1
- package/test/object-model.test-d.ts +7 -2
- package/test/set-model.spec.cjs +222 -222
- package/test/umd.html +25 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-model.min.js","sources":["../src/helpers.js","../src/object-model.js","../src/list-model.js","../src/array-model.js","../src/function-model.js","../src/map-model.js","../src/set-model.js"],"sourcesContent":["export const\n\tObjectProto = Object.prototype,\n\tbettertypeof = x => ObjectProto.toString.call(x).match(/\\s([a-zA-Z]+)/)[1],\n\tgetProto = Object.getPrototypeOf,\n\tsetProto = Object.setPrototypeOf,\n\n\thas = (o, prop) => ObjectProto.hasOwnProperty.call(o, prop),\n\tis = (Constructor, obj) => obj instanceof Constructor,\n\tisFunction = f => typeof f === \"function\",\n\tisObject = o => o && typeof o === \"object\",\n\tisString = s => typeof s === \"string\",\n\tisPlainObject = o => isObject(o) && getProto(o) === ObjectProto,\n\tisIterable = x => x && isFunction(x[Symbol.iterator]),\n\n\tproxify = (val, traps) => new Proxy(val, traps),\n\n\tmerge = (target, src = {}) => {\n\t\tfor (let key in src) {\n\t\t\tif (isPlainObject(src[key])) {\n\t\t\t\tconst o = {}\n\t\t\t\tmerge(o, target[key])\n\t\t\t\tmerge(o, src[key])\n\t\t\t\ttarget[key] = o\n\t\t\t} else {\n\t\t\t\ttarget[key] = src[key]\n\t\t\t}\n\t\t}\n\t\treturn target\n\t},\n\n\tdefine = (obj, key, value, enumerable = false) => {\n\t\tObject.defineProperty(obj, key, { value, enumerable, writable: true, configurable: true })\n\t},\n\n\textend = (child, parent, props) => {\n\t\tchild.prototype = Object.assign(Object.create(parent.prototype, {\n\t\t\tconstructor: {\n\t\t\t\tvalue: child,\n\t\t\t\twritable: true,\n\t\t\t\tconfigurable: true\n\t\t\t}\n\t\t}), props)\n\t\tsetProto(child, parent)\n\t}","import {\r\n\tbettertypeof, define, extend, getProto, has,\r\n\tis, isFunction, isObject, isPlainObject, isString,\r\n\tmerge, ObjectProto, proxify, setProto\r\n} from \"./helpers.js\"\r\n\r\nexport const\r\n\t_check = Symbol(),\r\n\t_checked = Symbol(), // used to skip validation at instanciation for perf\r\n\t_original = Symbol(), // used to bypass proxy\r\n\tCHECK_ONCE = Symbol(),\r\n\r\n\tinitModel = (def, constructor, parent, init, getTraps, useNew) => {\r\n\t\tconst model = function (val = model.default, mode) {\r\n\t\t\tif (useNew && !is(model, this)) return new model(val)\r\n\t\t\tif (init) val = init(val, model, this)\r\n\r\n\t\t\tif (mode === _checked || check(model, val))\r\n\t\t\t\treturn getTraps && mode !== CHECK_ONCE ? proxify(val, getTraps(model)) : val\r\n\t\t}\r\n\r\n\t\tif (parent) extend(model, parent)\r\n\t\tsetProto(model, constructor.prototype)\r\n\t\tmodel.constructor = constructor\r\n\t\tmodel.definition = def\r\n\t\tmodel.assertions = [...model.assertions]\r\n\t\tdefine(model, \"errors\", [])\r\n\t\tdelete model.name\r\n\t\treturn model\r\n\t},\r\n\r\n\tinitObjectModel = (obj, model, _this) => {\r\n\t\tif (is(model, obj)) return obj\r\n\r\n\t\tif (!isObject(obj) && !isFunction(obj) && obj !== undefined) {\r\n\t\t\t// short circuit validation if not receiving an object as expected\r\n\t\t\treturn obj\r\n\t\t}\r\n\r\n\t\tmerge(_this, model.default)\r\n\t\tif (model.parentClass) merge(obj, new model.parentClass(obj))\r\n\t\tmerge(_this, obj)\r\n\t\treturn _this\r\n\t},\r\n\r\n\textendModel = (child, parent, newProps) => {\r\n\t\textend(child, parent, newProps)\r\n\t\tchild.assertions.push(...parent.assertions)\r\n\t\treturn child\r\n\t},\r\n\r\n\tstackError = (errors, expected, received, path, message) => {\r\n\t\terrors.push({ expected, received, path, message })\r\n\t},\r\n\r\n\tunstackErrors = (model, collector = model.errorCollector) => {\r\n\t\tconst nbErrors = model.errors.length\r\n\t\tif (nbErrors > 0) {\r\n\t\t\tconst errors = model.errors.map(err => {\r\n\t\t\t\tif (!err.message) {\r\n\t\t\t\t\terr.message = \"expecting \" + (err.path ? err.path + \" to be \" : \"\") + formatDefinition(err.expected)\r\n\t\t\t\t\t\t+ \", got \" + (err.received != null ? bettertypeof(err.received) + \" \" : \"\") + format(err.received)\r\n\t\t\t\t}\r\n\t\t\t\treturn err\r\n\t\t\t})\r\n\r\n\t\t\tmodel.errors.length = 0\r\n\t\t\tcollector.call(model, errors) // throw all errors collected\r\n\t\t}\r\n\t\treturn nbErrors\r\n\t},\r\n\r\n\tisModelInstance = i => i && getProto(i) && is(Model, getProto(i).constructor),\r\n\r\n\tparseDefinition = (def) => {\r\n\t\tif (isPlainObject(def)) {\r\n\t\t\tdef = {}\r\n\t\t\tfor (let key in def) { def[key] = parseDefinition(def[key]) }\r\n\t\t}\r\n\t\tif (!Array.isArray(def)) return [def]\r\n\t\telse if (def.length === 1) return [def[0], undefined, null]\r\n\r\n\t\treturn def\r\n\t},\r\n\r\n\tformatDefinition = (def, stack) => {\r\n\t\tconst parts = parseDefinition(def).map(d => format(d, stack))\r\n\t\treturn parts.length > 1 ? parts.join(\" or \") : parts[0]\r\n\t},\r\n\r\n\tformatAssertions = fns => fns.length ? `(${fns.map(f => f.name || f.description || f)})` : \"\",\r\n\r\n\textendDefinition = (def, newParts = []) => {\r\n\t\tif (newParts.length > 0) {\r\n\t\t\tdef = [].concat(def, ...[].concat(newParts))// clone to lose ref\r\n\t\t\t\t.filter((value, index, self) => self.indexOf(value) === index) // remove duplicates\r\n\t\t}\r\n\r\n\t\treturn def\r\n\t},\r\n\r\n\tcheck = (model, obj) => {\r\n\t\tmodel[_check](obj, null, model.errors, [], true);\r\n\t\treturn !unstackErrors(model)\r\n\t},\r\n\r\n\tcheckDefinition = (obj, def, path, errors, stack, shouldCast) => {\r\n\t\tconst indexFound = stack.indexOf(def)\r\n\t\tif (indexFound !== -1 && stack.indexOf(def, indexFound + 1) !== -1)\r\n\t\t\treturn obj // if found twice in call stack, cycle detected, skip validation\r\n\r\n\t\tif (Array.isArray(def) && def.length === 1 && obj != null) {\r\n\t\t\tdef = def[0] // shorten validation path for optionals\r\n\t\t}\r\n\r\n\t\tif (is(Model, def)) {\r\n\t\t\tif (shouldCast) obj = cast(obj, def)\r\n\t\t\tdef[_check](obj, path, errors, stack.concat(def), shouldCast)\r\n\t\t}\r\n\t\telse if (isPlainObject(def)) {\r\n\t\t\tfor (let key in def) {\r\n\t\t\t\tconst val = obj ? obj[key] : undefined\r\n\t\t\t\tcheckDefinition(val, def[key], formatPath(path, key), errors, stack, shouldCast)\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconst pdef = parseDefinition(def)\r\n\t\t\tif (pdef.some(part => checkDefinitionPart(obj, part, path, stack, shouldCast))) {\r\n\t\t\t\treturn shouldCast ? cast(obj, def) : obj\r\n\t\t\t}\r\n\r\n\t\t\tstackError(errors, def, obj, path)\r\n\t\t}\r\n\r\n\t\treturn obj\r\n\t},\r\n\r\n\tcheckDefinitionPart = (obj, def, path, stack, shouldCast) => {\r\n\t\tif (def === Any) return true\r\n\t\tif (obj == null) return obj === def\r\n\t\tif (isPlainObject(def) || is(Model, def)) { // object or model as part of union type\r\n\t\t\tconst errors = []\r\n\t\t\tcheckDefinition(obj, def, path, errors, stack, shouldCast)\r\n\t\t\treturn !errors.length\r\n\t\t}\r\n\t\tif (is(RegExp, def)) return def.test(obj)\r\n\t\tif (def === Number || def === Date) return obj.constructor === def && !isNaN(obj)\r\n\t\treturn obj === def\r\n\t\t\t|| (isFunction(def) && is(def, obj))\r\n\t\t\t|| obj.constructor === def\r\n\t},\r\n\r\n\tcheckAssertions = (obj, model, path, errors = model.errors) => {\r\n\t\tfor (let assertion of model.assertions) {\r\n\t\t\tlet result\r\n\t\t\ttry {\r\n\t\t\t\tresult = assertion.call(model, obj)\r\n\t\t\t} catch (err) {\r\n\t\t\t\tresult = err\r\n\t\t\t}\r\n\t\t\tif (result !== true) {\r\n\t\t\t\tconst onFail = isFunction(assertion.description) ? assertion.description : (assertionResult, value) =>\r\n\t\t\t\t\t`assertion \"${assertion.description}\" returned ${format(assertionResult)} `\r\n\t\t\t\t\t+ `for ${path ? path + \" =\" : \"value\"} ${format(value)}`\r\n\t\t\t\tstackError(errors, assertion, obj, path, onFail.call(model, result, obj, path))\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tformat = (obj, stack = []) => {\r\n\t\tif (stack.length > 15 || stack.includes(obj)) return \"...\"\r\n\t\tif (obj === null || obj === undefined) return String(obj)\r\n\t\tif (isString(obj)) return `\"${obj}\"`\r\n\t\tif (is(Model, obj)) return obj.toString(stack)\r\n\r\n\t\tstack.unshift(obj)\r\n\r\n\t\tif (isFunction(obj)) return obj.name || obj.toString()\r\n\t\tif (is(Map, obj) || is(Set, obj)) return format([...obj])\r\n\t\tif (Array.isArray(obj)) return `[${obj.map(item => format(item, stack)).join(\", \")}]`\r\n\t\tif (obj.toString && obj.toString !== ObjectProto.toString) return obj.toString()\r\n\t\tif (isObject(obj)) {\r\n\t\t\tconst props = Object.keys(obj),\r\n\t\t\t\tindent = \"\\t\".repeat(stack.length)\r\n\t\t\treturn `{${props.map(\r\n\t\t\t\tkey => `\\n${indent + key}: ${format(obj[key], [...stack])}`\r\n\t\t\t).join(\", \")} ${props.length ? `\\n${indent.slice(1)}` : \"\"}}`\r\n\t\t}\r\n\r\n\t\treturn String(obj)\r\n\t},\r\n\r\n\tformatPath = (path, key) => path ? path + \".\" + key : key,\r\n\r\n\tcontrolMutation = (model, def, path, o, key, privateAccess, applyMutation) => {\r\n\t\tconst newPath = formatPath(path, key),\r\n\t\t\tisPrivate = model.conventionForPrivate(key),\r\n\t\t\tisConstant = model.conventionForConstant(key),\r\n\t\t\tisOwnProperty = has(o, key),\r\n\t\t\tinitialPropDescriptor = isOwnProperty && Object.getOwnPropertyDescriptor(o, key)\r\n\r\n\t\tif (key in def && ((isPrivate && !privateAccess) || (isConstant && o[key] !== undefined)))\r\n\t\t\tcannot(`modify ${isPrivate ? \"private\" : \"constant\"} property ${key}`, model)\r\n\r\n\t\tapplyMutation()\r\n\t\tif (has(def, key)) checkDefinition(o[key], def[key], newPath, model.errors, [])\r\n\t\tcheckAssertions(o, model, newPath)\r\n\r\n\t\tconst nbErrors = model.errors.length\r\n\t\tif (nbErrors) {\r\n\t\t\tif (isOwnProperty) Object.defineProperty(o, key, initialPropDescriptor)\r\n\t\t\telse delete o[key] // back to the initial property defined in prototype chain\r\n\r\n\t\t\tunstackErrors(model)\r\n\t\t}\r\n\r\n\t\treturn !nbErrors\r\n\t},\r\n\r\n\tcannot = (msg, model) => {\r\n\t\tmodel.errors.push({ message: \"cannot \" + msg })\r\n\t},\r\n\r\n\tcast = (obj, defNode = []) => {\r\n\t\tif (!obj || isPlainObject(defNode) || is(BasicModel, defNode) || isModelInstance(obj))\r\n\t\t\treturn obj // no value or not leaf or already a model instance\r\n\r\n\t\tconst def = parseDefinition(defNode),\r\n\t\t\tsuitableModels = []\r\n\r\n\t\tfor (let part of def) {\r\n\t\t\tif (is(Model, part) && !is(BasicModel, part) && part.test(obj))\r\n\t\t\t\tsuitableModels.push(part)\r\n\t\t}\r\n\r\n\t\tif (suitableModels.length === 1) {\r\n\t\t\t// automatically cast to suitable model when explicit (autocasting)\r\n\t\t\treturn new suitableModels[0](obj, _checked)\r\n\t\t}\r\n\r\n\t\tif (suitableModels.length > 1)\r\n\t\t\tconsole.warn(`Ambiguous model for value ${format(obj)}, could be ${suitableModels.join(\" or \")}`)\r\n\r\n\t\treturn obj\r\n\t},\r\n\r\n\r\n\tgetProp = (val, model, def, path, privateAccess) => {\r\n\t\tif (!isPlainObject(def)) return cast(val, def)\r\n\t\treturn proxify(val, getTraps(model, def, path, privateAccess))\r\n\t},\r\n\r\n\tgetTraps = (model, def, path, privateAccess) => {\r\n\t\tconst grantPrivateAccess = f => proxify(f, {\r\n\t\t\tapply(fn, ctx, args) {\r\n\t\t\t\tprivateAccess = true\r\n\t\t\t\tconst result = Reflect.apply(fn, ctx, args)\r\n\t\t\t\tprivateAccess = false\r\n\t\t\t\treturn result\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\treturn {\r\n\t\t\tget(o, key) {\r\n\t\t\t\tif (key === _original) return o\r\n\r\n\t\t\t\tif (!isString(key)) return Reflect.get(o, key)\r\n\r\n\t\t\t\tconst newPath = formatPath(path, key)\r\n\t\t\t\tconst inDef = has(def, key)\r\n\t\t\t\tconst defPart = def[key]\r\n\r\n\t\t\t\tif (!privateAccess && inDef && model.conventionForPrivate(key)) {\r\n\t\t\t\t\tcannot(`access to private property ${newPath}`, model)\r\n\t\t\t\t\tunstackErrors(model)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet value = o[key]\r\n\r\n\t\t\t\tif (inDef && value && has(o, key) && !isPlainObject(defPart) && !isModelInstance(value)) {\r\n\t\t\t\t\tReflect.set(o, key, value = cast(value, defPart)) // cast nested models\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isFunction(value) && key !== \"constructor\" && !privateAccess) {\r\n\t\t\t\t\treturn grantPrivateAccess(value)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isPlainObject(defPart) && !value) {\r\n\t\t\t\t\to[key] = value = {} // null-safe traversal\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn getProp(value, model, defPart, newPath, privateAccess)\r\n\t\t\t},\r\n\r\n\t\t\tset(o, key, val) {\r\n\t\t\t\treturn controlMutation(model, def, path, o, key, privateAccess, () => Reflect.set(o, key, cast(val, def[key])))\r\n\t\t\t},\r\n\r\n\t\t\tdeleteProperty(o, key) {\r\n\t\t\t\treturn controlMutation(model, def, path, o, key, privateAccess, () => Reflect.deleteProperty(o, key))\r\n\t\t\t},\r\n\r\n\t\t\tdefineProperty(o, key, args) {\r\n\t\t\t\treturn controlMutation(model, def, path, o, key, privateAccess, () => Reflect.defineProperty(o, key, args))\r\n\t\t\t},\r\n\r\n\t\t\thas(o, key) {\r\n\t\t\t\treturn Reflect.has(o, key) && Reflect.has(def, key) && !model.conventionForPrivate(key)\r\n\t\t\t},\r\n\r\n\t\t\townKeys(o) {\r\n\t\t\t\treturn Reflect.ownKeys(o).filter(key => Reflect.has(def, key) && !model.conventionForPrivate(key))\r\n\t\t\t},\r\n\r\n\t\t\tgetOwnPropertyDescriptor(o, key) {\r\n\t\t\t\tlet descriptor\r\n\t\t\t\tif (!model.conventionForPrivate(key)) {\r\n\t\t\t\t\tdescriptor = Object.getOwnPropertyDescriptor(def, key)\r\n\t\t\t\t\tif (descriptor !== undefined) descriptor.value = o[key]\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn descriptor\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\nexport function Model(def) {\r\n\treturn isPlainObject(def) ? new ObjectModel(def) : new BasicModel(def)\r\n}\r\n\r\nObject.assign(Model.prototype, {\r\n\tname: \"Model\",\r\n\tassertions: [],\r\n\r\n\tconventionForConstant: key => key.toUpperCase() === key,\r\n\tconventionForPrivate: key => key[0] === \"_\",\r\n\r\n\ttoString(stack) {\r\n\t\treturn has(this, \"name\") ? this.name : formatDefinition(this.definition, stack) + formatAssertions(this.assertions)\r\n\t},\r\n\r\n\tas(name) {\r\n\t\tdefine(this, \"name\", name)\r\n\t\treturn this\r\n\t},\r\n\r\n\tdefaultTo(val) {\r\n\t\tthis.default = this(val)\r\n\t\treturn this\r\n\t},\r\n\r\n\t[_check](obj, path, errors, stack, shouldCast) {\r\n\t\tcheckDefinition(obj, this.definition, path, errors, stack, shouldCast)\r\n\t\tcheckAssertions(obj, this, path, errors)\r\n\t},\r\n\r\n\ttest(obj, errorCollector) {\r\n\t\tlet model = this\r\n\t\twhile (!has(model, \"errorCollector\")) {\r\n\t\t\tmodel = getProto(model)\r\n\t\t}\r\n\r\n\t\tconst initialErrorCollector = model.errorCollector\r\n\t\tlet failed\r\n\r\n\t\tmodel.errorCollector = errors => {\r\n\t\t\tfailed = true\r\n\t\t\tif (errorCollector) errorCollector.call(this, errors)\r\n\t\t}\r\n\r\n\t\tnew this(obj) // may trigger errorCollector\r\n\r\n\t\tmodel.errorCollector = initialErrorCollector\r\n\t\treturn !failed\r\n\t},\r\n\r\n\terrorCollector(errors) {\r\n\t\tconst e = new TypeError(errors.map(e => e.message).join(\"\\n\"))\r\n\t\te.stack = e.stack.replace(/\\n.*object-model(.|\\n)*object-model.*/, \"\") // blackbox objectmodel in stacktrace\r\n\t\tthrow e\r\n\t},\r\n\r\n\tassert(assertion, description = format(assertion)) {\r\n\t\tdefine(assertion, \"description\", description)\r\n\t\tthis.assertions = this.assertions.concat(assertion)\r\n\t\treturn this\r\n\t}\r\n})\r\n\r\nModel.CHECK_ONCE = CHECK_ONCE\r\n\r\nexport function BasicModel(def) {\r\n\treturn initModel(def, BasicModel)\r\n}\r\n\r\nextend(BasicModel, Model, {\r\n\textend(...newParts) {\r\n\t\tconst child = extendModel(new BasicModel(extendDefinition(this.definition, newParts)), this)\r\n\t\tfor (let part of newParts) {\r\n\t\t\tif (is(BasicModel, part)) child.assertions.push(...part.assertions)\r\n\t\t}\r\n\r\n\t\treturn child\r\n\t}\r\n})\r\n\r\nexport function ObjectModel(def) {\r\n\treturn initModel(def, ObjectModel, Object, initObjectModel, model => getTraps(model, def), true)\r\n}\r\n\r\nextend(ObjectModel, Model, {\r\n\tdefaultTo(obj) {\r\n\t\tconst def = this.definition\r\n\t\tfor (let key in obj) {\r\n\t\t\tif (has(def, key)) {\r\n\t\t\t\tobj[key] = checkDefinition(obj[key], def[key], key, this.errors, [], true)\r\n\t\t\t}\r\n\t\t}\r\n\t\tunstackErrors(this)\r\n\t\tthis.default = obj;\r\n\t\treturn this\r\n\t},\r\n\r\n\ttoString(stack) {\r\n\t\treturn format(this.definition, stack)\r\n\t},\r\n\r\n\textend(...newParts) {\r\n\t\tconst definition = { ...this.definition }\r\n\t\tconst proto = { ...this.prototype }\r\n\t\tconst defaults = { ...this.default }\r\n\t\tconst newAssertions = []\r\n\r\n\t\tfor (let part of newParts) {\r\n\t\t\tif (is(Model, part)) {\r\n\t\t\t\tmerge(definition, part.definition)\r\n\t\t\t\tmerge(defaults, part.default)\r\n\t\t\t\tnewAssertions.push(...part.assertions)\r\n\t\t\t}\r\n\t\t\tif (isFunction(part)) merge(proto, part.prototype)\r\n\t\t\tif (isObject(part)) merge(definition, part)\r\n\t\t}\r\n\r\n\t\tconst submodel = extendModel(new ObjectModel(definition), this, proto).defaultTo(defaults)\r\n\t\tsubmodel.assertions = [...this.assertions, ...newAssertions]\r\n\r\n\t\tif (getProto(this) !== ObjectModel.prototype) { // extended class\r\n\t\t\tsubmodel.parentClass = this\r\n\t\t}\r\n\r\n\t\treturn submodel\r\n\t},\r\n\r\n\t[_check](obj, path, errors, stack, shouldCast) {\r\n\t\tif (isObject(obj)) {\r\n\t\t\tcheckDefinition(obj[_original] || obj, this.definition, path, errors, stack, shouldCast)\r\n\t\t}\r\n\t\telse stackError(errors, this, obj, path)\r\n\r\n\t\tcheckAssertions(obj, this, path, errors)\r\n\t}\r\n})\r\n\r\nexport const Any = proxify(BasicModel(), {\r\n\tapply(target, ctx, [def]) {\r\n\t\tconst anyOf = Object.create(Any)\r\n\t\tanyOf.definition = def;\r\n\t\treturn anyOf\r\n\t}\r\n})\r\nAny.definition = Any\r\nAny.toString = () => \"Any\"\r\n\r\nAny.remaining = function (def) { this.definition = def }\r\nextend(Any.remaining, Any, {\r\n\ttoString() { return \"...\" + formatDefinition(this.definition) }\r\n})\r\nAny[Symbol.iterator] = function* () { yield new Any.remaining(this.definition) }","\nimport { _original, checkAssertions, checkDefinition, initModel, unstackErrors } from \"./object-model.js\"\nimport { has, isFunction, proxify } from \"./helpers.js\"\n\nexport const initListModel = (base, constructor, def, init, clone, mutators, otherTraps) => {\n\n\treturn initModel(def, constructor, base, init, model => Object.assign({\n\t\tgetPrototypeOf: () => model.prototype,\n\t\tget(l, key) {\n\t\t\tif (key === _original) return l\n\n\t\t\tconst val = l[key]\n\t\t\treturn isFunction(val) ? proxify(val, {\n\t\t\t\tapply(fn, ctx, args) {\n\t\t\t\t\tif (has(mutators, key)) {\n\t\t\t\t\t\t// indexes of arguments to check def + cast\n\t\t\t\t\t\tconst [begin, end = args.length - 1, getArgDef] = mutators[key]\n\t\t\t\t\t\tfor (let i = begin; i <= end; i++) {\n\t\t\t\t\t\t\tconst argDef = getArgDef ? getArgDef(i) : model.definition\n\t\t\t\t\t\t\targs[i] = checkDefinition(\n\t\t\t\t\t\t\t\targs[i],\n\t\t\t\t\t\t\t\targDef,\n\t\t\t\t\t\t\t\t`${base.name}.${key} arguments[${i}]`,\n\t\t\t\t\t\t\t\tmodel.errors,\n\t\t\t\t\t\t\t\t[],\n\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (model.assertions.length > 0) {\n\t\t\t\t\t\t\tconst testingClone = clone(l)\n\t\t\t\t\t\t\tfn.apply(testingClone, args)\n\t\t\t\t\t\t\tcheckAssertions(testingClone, model, `after ${key} mutation`)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tunstackErrors(model)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn fn.apply(l, args)\n\t\t\t\t}\n\t\t\t}) : val\n\t\t}\n\t}, otherTraps))\n}","import {\r\n\t_original, _check, cast, checkAssertions, checkDefinition,\r\n\textendDefinition, extendModel, formatDefinition, Model, stackError, unstackErrors\r\n} from \"./object-model.js\"\r\nimport { initListModel } from \"./list-model.js\"\r\nimport { extend } from \"./helpers.js\"\r\n\r\nexport default function ArrayModel(initialDefinition) {\r\n\tconst model = initListModel(\r\n\t\tArray,\r\n\t\tArrayModel,\r\n\t\tinitialDefinition,\r\n\t\ta => Array.isArray(a) ? a.map(arg => cast(arg, model.definition)) : a,\r\n\t\ta => [...a],\r\n\t\t{\r\n\t\t\t\"copyWithin\": [],\r\n\t\t\t\"fill\": [0, 0],\r\n\t\t\t\"pop\": [],\r\n\t\t\t\"push\": [0],\r\n\t\t\t\"reverse\": [],\r\n\t\t\t\"shift\": [],\r\n\t\t\t\"sort\": [],\r\n\t\t\t\"splice\": [2],\r\n\t\t\t\"unshift\": [0]\r\n\t\t},\r\n\t\t{\r\n\t\t\tset(arr, key, val) {\r\n\t\t\t\treturn controlMutation(model, arr, key, val, (a, v) => a[key] = v, true)\r\n\t\t\t},\r\n\r\n\t\t\tdeleteProperty(arr, key) {\r\n\t\t\t\treturn controlMutation(model, arr, key, undefined, a => delete a[key])\r\n\t\t\t}\r\n\t\t}\r\n\t)\r\n\r\n\treturn model\r\n}\r\n\r\nextend(ArrayModel, Model, {\r\n\ttoString(stack) {\r\n\t\treturn \"Array of \" + formatDefinition(this.definition, stack)\r\n\t},\r\n\r\n\t[_check](arr, path, errors, stack, shouldCast) {\r\n\t\tif (Array.isArray(arr))\r\n\t\t\t(arr[_original] || arr).forEach((a, i) => checkDefinition(a, this.definition, `${path || \"Array\"}[${i}]`, errors, stack, shouldCast))\r\n\t\telse stackError(errors, this, arr, path)\r\n\r\n\t\tcheckAssertions(arr, this, path, errors)\r\n\t},\r\n\r\n\textend(...newParts) {\r\n\t\treturn extendModel(new ArrayModel(extendDefinition(this.definition, newParts)), this)\r\n\t}\r\n})\r\n\r\nconst controlMutation = (model, array, key, value, applyMutation, canBeExtended) => {\r\n\tconst path = `Array[${key}]`\r\n\tconst isInDef = (+key >= 0 && (canBeExtended || key in array))\r\n\tif (isInDef) value = checkDefinition(value, model.definition, path, model.errors, [], true)\r\n\r\n\tconst testArray = [...array]\r\n\tapplyMutation(testArray)\r\n\tcheckAssertions(testArray, model, path)\r\n\tconst isSuccess = !unstackErrors(model)\r\n\tif (isSuccess) applyMutation(array, value)\r\n\treturn isSuccess\r\n}","import {\r\n\t_check, _original, Any, checkAssertions, checkDefinition, extendDefinition, extendModel,\r\n\tformatDefinition, initModel, Model, stackError, unstackErrors\r\n} from \"./object-model.js\"\r\nimport { extend, is, isFunction } from \"./helpers.js\"\r\n\r\nexport default function FunctionModel(...argsDef) {\r\n\treturn initModel({ arguments: argsDef }, FunctionModel, Function, null, model => ({\r\n\t\tgetPrototypeOf: () => model.prototype,\r\n\r\n\t\tget(fn, key) {\r\n\t\t\treturn key === _original ? fn : fn[key]\r\n\t\t},\r\n\r\n\t\tapply(fn, ctx, args) {\r\n\t\t\tconst def = model.definition\r\n\t\t\tconst remainingArgDef = def.arguments.find(argDef => is(Any.remaining, argDef))\r\n\t\t\tconst nbArgsToCheck = remainingArgDef ? Math.max(args.length, def.arguments.length - 1) : def.arguments.length\r\n\r\n\t\t\tfor (let i = 0; i < nbArgsToCheck; i++) {\r\n\t\t\t\tconst argDef = remainingArgDef && i >= def.arguments.length - 1 ? remainingArgDef.definition : def.arguments[i]\r\n\t\t\t\targs[i] = checkDefinition(args[i], argDef, `arguments[${i}]`, model.errors, [], true)\r\n\t\t\t}\r\n\r\n\t\t\tcheckAssertions(args, model, \"arguments\")\r\n\r\n\t\t\tlet result\r\n\t\t\tif (!model.errors.length) {\r\n\t\t\t\tresult = Reflect.apply(fn, ctx, args)\r\n\t\t\t\tif (\"return\" in def)\r\n\t\t\t\t\tresult = checkDefinition(result, def.return, \"return value\", model.errors, [], true)\r\n\t\t\t}\r\n\t\t\tunstackErrors(model)\r\n\t\t\treturn result\r\n\t\t}\r\n\t}))\r\n}\r\n\r\nextend(FunctionModel, Model, {\r\n\ttoString(stack = []) {\r\n\t\tlet out = `Function(${this.definition.arguments.map(\r\n\t\t\targDef => formatDefinition(argDef, [...stack])\r\n\t\t).join(\", \")})`\r\n\r\n\t\tif (\"return\" in this.definition) {\r\n\t\t\tout += \" => \" + formatDefinition(this.definition.return, stack)\r\n\t\t}\r\n\t\treturn out\r\n\t},\r\n\r\n\treturn(def) {\r\n\t\tthis.definition.return = def\r\n\t\treturn this\r\n\t},\r\n\r\n\t[_check](f, path, errors) {\r\n\t\tif (!isFunction(f)) stackError(errors, \"Function\", f, path)\r\n\t}\r\n})","import {\r\n\t_check, cast, checkAssertions, checkDefinition,\r\n\textendDefinition, extendModel, format, formatDefinition, Model, stackError\r\n} from \"./object-model.js\"\r\nimport { initListModel } from \"./list-model.js\"\r\nimport { extend, is, isIterable } from \"./helpers.js\"\r\n\r\nexport default function MapModel(initialKeyDefinition, initialValueDefinition) {\r\n\tconst getDef = i => i === 0 ? model.definition.key : model.definition.value;\r\n\tconst model = initListModel(\r\n\t\tMap,\r\n\t\tMapModel,\r\n\t\t{ key: initialKeyDefinition, value: initialValueDefinition },\r\n\t\tit => isIterable(it) ? new Map([...it].map(pair => pair.map((x, i) => cast(x, getDef(i))))) : it,\r\n\t\tmap => new Map(map),\r\n\t\t{\r\n\t\t\t\"set\": [0, 1, getDef],\r\n\t\t\t\"delete\": [],\r\n\t\t\t\"clear\": []\r\n\t\t}\r\n\t)\r\n\r\n\treturn model\r\n}\r\n\r\nextend(MapModel, Model, {\r\n\ttoString(stack) {\r\n\t\treturn `Map of ${formatDefinition(this.definition.key, stack)} : ${formatDefinition(this.definition.value, stack)}`\r\n\t},\r\n\r\n\t[_check](map, path, errors, stack, shouldCast) {\r\n\t\tif (is(Map, map)) {\r\n\t\t\tpath = path || \"Map\"\r\n\t\t\tfor (let [key, value] of map) {\r\n\t\t\t\tcheckDefinition(key, this.definition.key, `${path} key`, errors, stack, shouldCast)\r\n\t\t\t\tcheckDefinition(value, this.definition.value, `${path}[${format(key)}]`, errors, stack, shouldCast)\r\n\t\t\t}\r\n\t\t} else stackError(errors, this, map, path)\r\n\r\n\t\tcheckAssertions(map, this, path, errors)\r\n\t},\r\n\r\n\textend(keyParts, valueParts) {\r\n\t\treturn extendModel(new MapModel(\r\n\t\t\textendDefinition(this.definition.key, keyParts),\r\n\t\t\textendDefinition(this.definition.value, valueParts)\r\n\t\t), this)\r\n\t}\r\n})","import {\r\n\t_check, cast, checkAssertions, checkDefinition,\r\n\textendDefinition, extendModel, formatDefinition, Model, stackError\r\n} from \"./object-model.js\"\r\nimport { initListModel } from \"./list-model.js\"\r\nimport { extend, is, isIterable } from \"./helpers.js\"\r\n\r\nexport default function SetModel(initialDefinition) {\r\n\tconst model = initListModel(\r\n\t\tSet,\r\n\t\tSetModel,\r\n\t\tinitialDefinition,\r\n\t\tit => isIterable(it) ? new Set([...it].map(val => cast(val, model.definition))) : it,\r\n\t\tset => new Set(set),\r\n\t\t{\r\n\t\t\t\"add\": [0, 0],\r\n\t\t\t\"delete\": [],\r\n\t\t\t\"clear\": []\r\n\t\t}\r\n\t)\r\n\r\n\treturn model\r\n}\r\n\r\nextend(SetModel, Model, {\r\n\ttoString(stack) {\r\n\t\treturn \"Set of \" + formatDefinition(this.definition, stack)\r\n\t},\r\n\r\n\t[_check](set, path, errors, stack, shouldCast) {\r\n\t\tif (is(Set, set)) {\r\n\t\t\tfor (let item of set.values()) {\r\n\t\t\t\tcheckDefinition(item, this.definition, `${path || \"Set\"} value`, errors, stack, shouldCast)\r\n\t\t\t}\r\n\t\t} else stackError(errors, this, set, path)\r\n\t\tcheckAssertions(set, this, path, errors)\r\n\t},\r\n\r\n\textend(...newParts) {\r\n\t\treturn extendModel(new SetModel(extendDefinition(this.definition, newParts)), this)\r\n\t}\r\n})"],"names":["ObjectProto","Object","prototype","getProto","getPrototypeOf","setProto","setPrototypeOf","has","o","prop","hasOwnProperty","call","is","Constructor","obj","isFunction","f","isObject","isString","s","isPlainObject","isIterable","x","Symbol","iterator","proxify","val","traps","Proxy","merge","target","src","key","define","value","enumerable","defineProperty","writable","configurable","extend","child","parent","props","assign","create","constructor","_check","_checked","_original","CHECK_ONCE","initModel","def","init","getTraps","useNew","model","default","mode","this","check","definition","assertions","name","initObjectModel","_this","undefined","parentClass","extendModel","newProps","push","stackError","errors","expected","received","path","message","unstackErrors","collector","errorCollector","nbErrors","length","map","err","formatDefinition","toString","match","format","isModelInstance","i","Model","parseDefinition","Array","isArray","stack","parts","d","join","extendDefinition","newParts","concat","filter","index","self","indexOf","checkDefinition","shouldCast","indexFound","cast","formatPath","some","part","checkDefinitionPart","Any","RegExp","test","Number","Date","isNaN","checkAssertions","assertion","result","onFail","description","assertionResult","includes","String","unshift","Map","Set","item","keys","indent","repeat","slice","controlMutation","privateAccess","applyMutation","newPath","isPrivate","conventionForPrivate","isConstant","conventionForConstant","isOwnProperty","initialPropDescriptor","getOwnPropertyDescriptor","cannot","msg","defNode","BasicModel","suitableModels","console","warn","get","Reflect","inDef","defPart","set","apply","fn","ctx","args","getProp","deleteProperty","ownKeys","descriptor","ObjectModel","toUpperCase","fns","as","defaultTo","initialErrorCollector","failed","e","TypeError","replace","assert","proto","defaults","newAssertions","submodel","anyOf","remaining","initListModel","base","clone","mutators","otherTraps","l","begin","end","getArgDef","argDef","testingClone","ArrayModel","initialDefinition","a","arg","copyWithin","fill","pop","reverse","shift","sort","splice","arr","v","forEach","array","canBeExtended","testArray","isSuccess","FunctionModel","argsDef","arguments","Function","remainingArgDef","find","nbArgsToCheck","Math","max","return","MapModel","initialKeyDefinition","initialValueDefinition","getDef","it","pair","delete","clear","SetModel","add","out","keyParts","valueParts","values"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"object-model.min.js","sources":["../src/helpers.js","../src/object-model.js","../src/list-model.js","../src/array-model.js","../src/function-model.js","../src/map-model.js","../src/set-model.js"],"sourcesContent":["export const\r\n\tObjectProto = Object.prototype,\r\n\tbettertypeof = x => ObjectProto.toString.call(x).match(/\\s([a-zA-Z]+)/)[1],\r\n\tgetProto = Object.getPrototypeOf,\r\n\tsetProto = Object.setPrototypeOf,\r\n\r\n\thas = (o, prop) => ObjectProto.hasOwnProperty.call(o, prop),\r\n\tis = (Constructor, obj) => obj instanceof Constructor,\r\n\tisFunction = f => typeof f === \"function\",\r\n\tisObject = o => o && typeof o === \"object\",\r\n\tisString = s => typeof s === \"string\",\r\n\tisPlainObject = o => isObject(o) && getProto(o) === ObjectProto,\r\n\tisIterable = x => x && isFunction(x[Symbol.iterator]),\r\n\r\n\tproxify = (val, traps) => new Proxy(val, traps),\r\n\r\n\tmerge = (target, src = {}) => {\r\n\t\tfor (let key in src) {\r\n\t\t\tif (isPlainObject(src[key])) {\r\n\t\t\t\tconst o = {}\r\n\t\t\t\tmerge(o, target[key])\r\n\t\t\t\tmerge(o, src[key])\r\n\t\t\t\ttarget[key] = o\r\n\t\t\t} else {\r\n\t\t\t\ttarget[key] = src[key]\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn target\r\n\t},\r\n\r\n\tdefine = (obj, key, value, enumerable = false) => {\r\n\t\tObject.defineProperty(obj, key, { value, enumerable, writable: true, configurable: true })\r\n\t},\r\n\r\n\textend = (child, parent, props) => {\r\n\t\tchild.prototype = Object.assign(Object.create(parent.prototype, {\r\n\t\t\tconstructor: {\r\n\t\t\t\tvalue: child,\r\n\t\t\t\twritable: true,\r\n\t\t\t\tconfigurable: true\r\n\t\t\t}\r\n\t\t}), props)\r\n\t\tsetProto(child, parent)\r\n\t}","import {\r\n\tbettertypeof, define, extend, getProto, has,\r\n\tis, isFunction, isObject, isPlainObject, isString,\r\n\tmerge, ObjectProto, proxify, setProto\r\n} from \"./helpers.js\"\r\n\r\nexport const\r\n\t_check = Symbol(),\r\n\t_checked = Symbol(), // used to skip validation at instanciation for perf\r\n\t_original = Symbol(), // used to bypass proxy\r\n\tCHECK_ONCE = Symbol(),\r\n\r\n\tinitModel = (def, constructor, parent, init, getTraps, useNew) => {\r\n\t\tconst model = function (val = model.default, mode) {\r\n\t\t\tif (useNew && !is(model, this)) return new model(val)\r\n\t\t\tif (init) val = init(val, model, this)\r\n\r\n\t\t\tif (mode === _checked || check(model, val))\r\n\t\t\t\treturn getTraps && mode !== CHECK_ONCE ? proxify(val, getTraps(model)) : val\r\n\t\t}\r\n\r\n\t\tif (parent) extend(model, parent)\r\n\t\tsetProto(model, constructor.prototype)\r\n\t\tmodel.constructor = constructor\r\n\t\tmodel.definition = def\r\n\t\tmodel.assertions = [...model.assertions]\r\n\t\tdefine(model, \"errors\", [])\r\n\t\tdelete model.name\r\n\t\treturn model\r\n\t},\r\n\r\n\tinitObjectModel = (obj, model, _this) => {\r\n\t\tif (is(model, obj)) return obj\r\n\r\n\t\tif (!isObject(obj) && !isFunction(obj) && obj !== undefined) {\r\n\t\t\t// short circuit validation if not receiving an object as expected\r\n\t\t\treturn obj\r\n\t\t}\r\n\r\n\t\tmerge(_this, model.default)\r\n\t\tif (model.parentClass) merge(obj, new model.parentClass(obj))\r\n\t\tmerge(_this, obj)\r\n\t\treturn _this\r\n\t},\r\n\r\n\textendModel = (child, parent, newProps) => {\r\n\t\textend(child, parent, newProps)\r\n\t\tchild.assertions.push(...parent.assertions)\r\n\t\treturn child\r\n\t},\r\n\r\n\tstackError = (errors, expected, received, path, message) => {\r\n\t\terrors.push({ expected, received, path, message })\r\n\t},\r\n\r\n\tunstackErrors = (model, collector = model.errorCollector) => {\r\n\t\tconst nbErrors = model.errors.length\r\n\t\tif (nbErrors > 0) {\r\n\t\t\tconst errors = model.errors.map(err => {\r\n\t\t\t\tif (!err.message) {\r\n\t\t\t\t\terr.message = \"expecting \" + (err.path ? err.path + \" to be \" : \"\") + formatDefinition(err.expected)\r\n\t\t\t\t\t\t+ \", got \" + (err.received != null ? bettertypeof(err.received) + \" \" : \"\") + format(err.received)\r\n\t\t\t\t}\r\n\t\t\t\terr.model = model\r\n\t\t\t\treturn err\r\n\t\t\t})\r\n\r\n\t\t\tmodel.errors.length = 0\r\n\t\t\tcollector.call(model, errors) // throw all errors collected\r\n\t\t}\r\n\t\treturn nbErrors\r\n\t},\r\n\r\n\tisModelInstance = i => i && getProto(i) && is(Model, getProto(i).constructor),\r\n\r\n\tparseDefinition = (def) => {\r\n\t\tif (isPlainObject(def)) {\r\n\t\t\tdef = {}\r\n\t\t\tfor (let key in def) { def[key] = parseDefinition(def[key]) }\r\n\t\t}\r\n\t\tif (!Array.isArray(def)) return [def]\r\n\t\telse if (def.length === 1) return [def[0], undefined, null]\r\n\r\n\t\treturn def\r\n\t},\r\n\r\n\tformatDefinition = (def, stack) => {\r\n\t\tconst parts = parseDefinition(def).map(d => format(d, stack))\r\n\t\treturn parts.length > 1 ? parts.join(\" or \") : parts[0]\r\n\t},\r\n\r\n\tformatAssertions = fns => fns.length ? `(${fns.map(f => f.name || f.description || f)})` : \"\",\r\n\r\n\textendDefinition = (def, newParts = []) => {\r\n\t\tif (newParts.length > 0) {\r\n\t\t\tdef = [].concat(def, ...[].concat(newParts))// clone to lose ref\r\n\t\t\t\t.filter((value, index, self) => self.indexOf(value) === index) // remove duplicates\r\n\t\t}\r\n\r\n\t\treturn def\r\n\t},\r\n\r\n\tcheck = (model, obj) => {\r\n\t\tmodel[_check](obj, null, model.errors, [], true);\r\n\t\treturn !unstackErrors(model)\r\n\t},\r\n\r\n\tcheckDefinition = (obj, def, path, errors, stack, shouldCast) => {\r\n\t\tconst indexFound = stack.indexOf(def)\r\n\t\tif (indexFound !== -1 && stack.indexOf(def, indexFound + 1) !== -1)\r\n\t\t\treturn obj // if found twice in call stack, cycle detected, skip validation\r\n\r\n\t\tif (Array.isArray(def) && def.length === 1 && obj != null) {\r\n\t\t\tdef = def[0] // shorten validation path for optionals\r\n\t\t}\r\n\r\n\t\tif (is(Model, def)) {\r\n\t\t\tif (shouldCast) obj = cast(obj, def)\r\n\t\t\tdef[_check](obj, path, errors, stack.concat(def), shouldCast)\r\n\t\t}\r\n\t\telse if (isPlainObject(def)) {\r\n\t\t\tfor (let key in def) {\r\n\t\t\t\tconst val = obj ? obj[key] : undefined\r\n\t\t\t\tcheckDefinition(val, def[key], formatPath(path, key), errors, stack, shouldCast)\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconst pdef = parseDefinition(def)\r\n\t\t\tif (pdef.some(part => checkDefinitionPart(obj, part, path, stack, shouldCast))) {\r\n\t\t\t\treturn shouldCast ? cast(obj, def) : obj\r\n\t\t\t}\r\n\r\n\t\t\tstackError(errors, def, obj, path)\r\n\t\t}\r\n\r\n\t\treturn obj\r\n\t},\r\n\r\n\tcheckDefinitionPart = (obj, def, path, stack, shouldCast) => {\r\n\t\tif (def === Any) return true\r\n\t\tif (obj == null) return obj === def\r\n\t\tif (isPlainObject(def) || is(Model, def)) { // object or model as part of union type\r\n\t\t\tconst errors = []\r\n\t\t\tcheckDefinition(obj, def, path, errors, stack, shouldCast)\r\n\t\t\treturn !errors.length\r\n\t\t}\r\n\t\tif (is(RegExp, def)) return def.test(obj)\r\n\t\tif (def === Number || def === Date) return obj.constructor === def && !isNaN(obj)\r\n\t\treturn obj === def\r\n\t\t\t|| (isFunction(def) && is(def, obj))\r\n\t\t\t|| obj.constructor === def\r\n\t},\r\n\r\n\tcheckAssertions = (obj, model, path, errors = model.errors) => {\r\n\t\tfor (let assertion of model.assertions) {\r\n\t\t\tlet result\r\n\t\t\ttry {\r\n\t\t\t\tresult = assertion.call(model, obj)\r\n\t\t\t} catch (err) {\r\n\t\t\t\tresult = err\r\n\t\t\t}\r\n\t\t\tif (result !== true) {\r\n\t\t\t\tconst onFail = isFunction(assertion.description) ? assertion.description : (assertionResult, value) =>\r\n\t\t\t\t\t`assertion \"${assertion.description}\" returned ${format(assertionResult)} `\r\n\t\t\t\t\t+ `for ${path ? path + \" =\" : \"value\"} ${format(value)}`\r\n\t\t\t\tstackError(errors, assertion, obj, path, onFail.call(model, result, obj, path))\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tformat = (obj, stack = []) => {\r\n\t\tif (stack.length > 15 || stack.includes(obj)) return \"...\"\r\n\t\tif (obj === null || obj === undefined) return String(obj)\r\n\t\tif (isString(obj)) return `\"${obj}\"`\r\n\t\tif (is(Model, obj)) return obj.toString(stack)\r\n\r\n\t\tstack.unshift(obj)\r\n\r\n\t\tif (isFunction(obj)) return obj.name || obj.toString()\r\n\t\tif (is(Map, obj) || is(Set, obj)) return format([...obj])\r\n\t\tif (Array.isArray(obj)) return `[${obj.map(item => format(item, stack)).join(\", \")}]`\r\n\t\tif (obj.toString && obj.toString !== ObjectProto.toString) return obj.toString()\r\n\t\tif (isObject(obj)) {\r\n\t\t\tconst props = Object.keys(obj),\r\n\t\t\t\tindent = \"\\t\".repeat(stack.length)\r\n\t\t\treturn `{${props.map(\r\n\t\t\t\tkey => `\\n${indent + key}: ${format(obj[key], [...stack])}`\r\n\t\t\t).join(\", \")} ${props.length ? `\\n${indent.slice(1)}` : \"\"}}`\r\n\t\t}\r\n\r\n\t\treturn String(obj)\r\n\t},\r\n\r\n\tformatPath = (path, key) => path ? path + \".\" + key : key,\r\n\r\n\tcontrolMutation = (model, def, path, o, key, privateAccess, applyMutation) => {\r\n\t\tconst newPath = formatPath(path, key),\r\n\t\t\tisPrivate = model.conventionForPrivate(key),\r\n\t\t\tisConstant = model.conventionForConstant(key),\r\n\t\t\tisOwnProperty = has(o, key),\r\n\t\t\tinitialPropDescriptor = isOwnProperty && Object.getOwnPropertyDescriptor(o, key)\r\n\r\n\t\tif (key in def && ((isPrivate && !privateAccess) || (isConstant && o[key] !== undefined)))\r\n\t\t\tcannot(`modify ${isPrivate ? \"private\" : \"constant\"} property ${key}`, model)\r\n\r\n\t\tapplyMutation()\r\n\t\tif (has(def, key)) checkDefinition(o[key], def[key], newPath, model.errors, [])\r\n\t\tcheckAssertions(o, model, newPath)\r\n\r\n\t\tconst nbErrors = model.errors.length\r\n\t\tif (nbErrors) {\r\n\t\t\tif (isOwnProperty) Object.defineProperty(o, key, initialPropDescriptor)\r\n\t\t\telse delete o[key] // back to the initial property defined in prototype chain\r\n\r\n\t\t\tunstackErrors(model)\r\n\t\t}\r\n\r\n\t\treturn !nbErrors\r\n\t},\r\n\r\n\tcannot = (msg, model) => {\r\n\t\tmodel.errors.push({ message: \"cannot \" + msg })\r\n\t},\r\n\r\n\tcast = (obj, defNode = []) => {\r\n\t\tif (!obj || isPlainObject(defNode) || is(BasicModel, defNode) || isModelInstance(obj))\r\n\t\t\treturn obj // no value or not leaf or already a model instance\r\n\r\n\t\tconst def = parseDefinition(defNode),\r\n\t\t\tsuitableModels = []\r\n\r\n\t\tfor (let part of def) {\r\n\t\t\tif (is(Model, part) && !is(BasicModel, part) && part.test(obj))\r\n\t\t\t\tsuitableModels.push(part)\r\n\t\t}\r\n\r\n\t\tif (suitableModels.length === 1) {\r\n\t\t\t// automatically cast to suitable model when explicit (autocasting)\r\n\t\t\treturn new suitableModels[0](obj, _checked)\r\n\t\t}\r\n\r\n\t\tif (suitableModels.length > 1)\r\n\t\t\tconsole.warn(`Ambiguous model for value ${format(obj)}, could be ${suitableModels.join(\" or \")}`)\r\n\r\n\t\treturn obj\r\n\t},\r\n\r\n\r\n\tgetProp = (val, model, def, path, privateAccess) => {\r\n\t\tif (!isPlainObject(def)) return cast(val, def)\r\n\t\treturn proxify(val, getTraps(model, def, path, privateAccess))\r\n\t},\r\n\r\n\tgetTraps = (model, def, path, privateAccess) => {\r\n\t\tconst grantPrivateAccess = f => proxify(f, {\r\n\t\t\tapply(fn, ctx, args) {\r\n\t\t\t\tprivateAccess = true\r\n\t\t\t\tconst result = Reflect.apply(fn, ctx, args)\r\n\t\t\t\tprivateAccess = false\r\n\t\t\t\treturn result\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\treturn {\r\n\t\t\tget(o, key) {\r\n\t\t\t\tif (key === _original) return o\r\n\r\n\t\t\t\tif (!isString(key)) return Reflect.get(o, key)\r\n\r\n\t\t\t\tconst newPath = formatPath(path, key)\r\n\t\t\t\tconst inDef = has(def, key)\r\n\t\t\t\tconst defPart = def[key]\r\n\r\n\t\t\t\tif (!privateAccess && inDef && model.conventionForPrivate(key)) {\r\n\t\t\t\t\tcannot(`access to private property ${newPath}`, model)\r\n\t\t\t\t\tunstackErrors(model)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet value = o[key]\r\n\r\n\t\t\t\tif (inDef && value && has(o, key) && !isPlainObject(defPart) && !isModelInstance(value)) {\r\n\t\t\t\t\tReflect.set(o, key, value = cast(value, defPart)) // cast nested models\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isFunction(value) && key !== \"constructor\" && !privateAccess) {\r\n\t\t\t\t\treturn grantPrivateAccess(value)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isPlainObject(defPart) && !value) {\r\n\t\t\t\t\to[key] = value = {} // null-safe traversal\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn getProp(value, model, defPart, newPath, privateAccess)\r\n\t\t\t},\r\n\r\n\t\t\tset(o, key, val) {\r\n\t\t\t\treturn controlMutation(model, def, path, o, key, privateAccess, () => Reflect.set(o, key, cast(val, def[key])))\r\n\t\t\t},\r\n\r\n\t\t\tdeleteProperty(o, key) {\r\n\t\t\t\treturn controlMutation(model, def, path, o, key, privateAccess, () => Reflect.deleteProperty(o, key))\r\n\t\t\t},\r\n\r\n\t\t\tdefineProperty(o, key, args) {\r\n\t\t\t\treturn controlMutation(model, def, path, o, key, privateAccess, () => Reflect.defineProperty(o, key, args))\r\n\t\t\t},\r\n\r\n\t\t\thas(o, key) {\r\n\t\t\t\treturn Reflect.has(o, key) && Reflect.has(def, key) && !model.conventionForPrivate(key)\r\n\t\t\t},\r\n\r\n\t\t\townKeys(o) {\r\n\t\t\t\treturn Reflect.ownKeys(o).filter(key => Reflect.has(def, key) && !model.conventionForPrivate(key))\r\n\t\t\t},\r\n\r\n\t\t\tgetOwnPropertyDescriptor(o, key) {\r\n\t\t\t\tlet descriptor\r\n\t\t\t\tif (!model.conventionForPrivate(key)) {\r\n\t\t\t\t\tdescriptor = Object.getOwnPropertyDescriptor(def, key)\r\n\t\t\t\t\tif (descriptor !== undefined) descriptor.value = o[key]\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn descriptor\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\nexport function Model(def) {\r\n\treturn isPlainObject(def) ? new ObjectModel(def) : new BasicModel(def)\r\n}\r\n\r\nObject.assign(Model.prototype, {\r\n\tname: \"Model\",\r\n\tassertions: [],\r\n\r\n\tconventionForConstant: key => key.toUpperCase() === key,\r\n\tconventionForPrivate: key => key[0] === \"_\",\r\n\r\n\ttoString(stack) {\r\n\t\treturn has(this, \"name\") ? this.name : formatDefinition(this.definition, stack) + formatAssertions(this.assertions)\r\n\t},\r\n\r\n\tas(name) {\r\n\t\tdefine(this, \"name\", name)\r\n\t\treturn this\r\n\t},\r\n\r\n\tdefaultTo(val) {\r\n\t\tthis.default = this(val)\r\n\t\treturn this\r\n\t},\r\n\r\n\t[_check](obj, path, errors, stack, shouldCast) {\r\n\t\tcheckDefinition(obj, this.definition, path, errors, stack, shouldCast)\r\n\t\tcheckAssertions(obj, this, path, errors)\r\n\t},\r\n\r\n\ttest(obj, errorCollector) {\r\n\t\tlet model = this\r\n\t\twhile (!has(model, \"errorCollector\")) {\r\n\t\t\tmodel = getProto(model)\r\n\t\t}\r\n\r\n\t\tconst initialErrorCollector = model.errorCollector\r\n\t\tlet failed\r\n\r\n\t\tmodel.errorCollector = errors => {\r\n\t\t\tfailed = true\r\n\t\t\tif (errorCollector) errorCollector.call(this, errors)\r\n\t\t}\r\n\r\n\t\tnew this(obj) // may trigger errorCollector\r\n\r\n\t\tmodel.errorCollector = initialErrorCollector\r\n\t\treturn !failed\r\n\t},\r\n\r\n\terrorCollector(errors) {\r\n\t\tconst e = new TypeError(errors.map(e => e.message).join(\"\\n\"))\r\n\t\te.stack = e.stack.replace(/\\n.*object-model(.|\\n)*object-model.*/, \"\") // blackbox objectmodel in stacktrace\r\n\t\tthrow e\r\n\t},\r\n\r\n\tassert(assertion, description = format(assertion)) {\r\n\t\tdefine(assertion, \"description\", description)\r\n\t\tthis.assertions = this.assertions.concat(assertion)\r\n\t\treturn this\r\n\t}\r\n})\r\n\r\nModel.CHECK_ONCE = CHECK_ONCE\r\n\r\nexport function BasicModel(def) {\r\n\treturn initModel(def, BasicModel)\r\n}\r\n\r\nextend(BasicModel, Model, {\r\n\textend(...newParts) {\r\n\t\tconst child = extendModel(new BasicModel(extendDefinition(this.definition, newParts)), this)\r\n\t\tfor (let part of newParts) {\r\n\t\t\tif (is(BasicModel, part)) child.assertions.push(...part.assertions)\r\n\t\t}\r\n\r\n\t\treturn child\r\n\t}\r\n})\r\n\r\nexport function ObjectModel(def) {\r\n\treturn initModel(def, ObjectModel, Object, initObjectModel, model => getTraps(model, def), true)\r\n}\r\n\r\nextend(ObjectModel, Model, {\r\n\tdefaultTo(obj) {\r\n\t\tconst def = this.definition\r\n\t\tfor (let key in obj) {\r\n\t\t\tif (has(def, key)) {\r\n\t\t\t\tobj[key] = checkDefinition(obj[key], def[key], key, this.errors, [], true)\r\n\t\t\t}\r\n\t\t}\r\n\t\tunstackErrors(this)\r\n\t\tthis.default = obj;\r\n\t\treturn this\r\n\t},\r\n\r\n\ttoString(stack) {\r\n\t\treturn format(this.definition, stack)\r\n\t},\r\n\r\n\textend(...newParts) {\r\n\t\tconst definition = { ...this.definition }\r\n\t\tconst proto = { ...this.prototype }\r\n\t\tconst defaults = { ...this.default }\r\n\t\tconst newAssertions = []\r\n\r\n\t\tfor (let part of newParts) {\r\n\t\t\tif (is(Model, part)) {\r\n\t\t\t\tmerge(definition, part.definition)\r\n\t\t\t\tmerge(defaults, part.default)\r\n\t\t\t\tnewAssertions.push(...part.assertions)\r\n\t\t\t}\r\n\t\t\tif (isFunction(part)) merge(proto, part.prototype)\r\n\t\t\tif (isObject(part)) merge(definition, part)\r\n\t\t}\r\n\r\n\t\tconst submodel = extendModel(new ObjectModel(definition), this, proto).defaultTo(defaults)\r\n\t\tsubmodel.assertions = [...this.assertions, ...newAssertions]\r\n\r\n\t\tif (getProto(this) !== ObjectModel.prototype) { // extended class\r\n\t\t\tsubmodel.parentClass = this\r\n\t\t}\r\n\r\n\t\treturn submodel\r\n\t},\r\n\r\n\t[_check](obj, path, errors, stack, shouldCast) {\r\n\t\tif (isObject(obj)) {\r\n\t\t\tcheckDefinition(obj[_original] || obj, this.definition, path, errors, stack, shouldCast)\r\n\t\t}\r\n\t\telse stackError(errors, this, obj, path)\r\n\r\n\t\tcheckAssertions(obj, this, path, errors)\r\n\t}\r\n})\r\n\r\nexport const Any = proxify(BasicModel(), {\r\n\tapply(target, ctx, [def]) {\r\n\t\tconst anyOf = Object.create(Any)\r\n\t\tanyOf.definition = def;\r\n\t\treturn anyOf\r\n\t}\r\n})\r\nAny.definition = Any\r\nAny.toString = () => \"Any\"\r\n\r\nAny.remaining = function (def) { this.definition = def }\r\nextend(Any.remaining, Any, {\r\n\ttoString() { return \"...\" + formatDefinition(this.definition) }\r\n})\r\nAny[Symbol.iterator] = function* () { yield new Any.remaining(this.definition) }","\r\nimport { _original, checkAssertions, checkDefinition, initModel, unstackErrors } from \"./object-model.js\"\r\nimport { has, isFunction, proxify } from \"./helpers.js\"\r\n\r\nexport const initListModel = (base, constructor, def, init, clone, mutators, otherTraps) => {\r\n\r\n\treturn initModel(def, constructor, base, init, model => Object.assign({\r\n\t\tgetPrototypeOf: () => model.prototype,\r\n\t\tget(l, key) {\r\n\t\t\tif (key === _original) return l\r\n\r\n\t\t\tconst val = l[key]\r\n\t\t\treturn isFunction(val) ? proxify(val, {\r\n\t\t\t\tapply(fn, ctx, args) {\r\n\t\t\t\t\tif (has(mutators, key)) {\r\n\t\t\t\t\t\t// indexes of arguments to check def + cast\r\n\t\t\t\t\t\tconst [begin, end = args.length - 1, getArgDef] = mutators[key]\r\n\t\t\t\t\t\tfor (let i = begin; i <= end; i++) {\r\n\t\t\t\t\t\t\tconst argDef = getArgDef ? getArgDef(i) : model.definition\r\n\t\t\t\t\t\t\targs[i] = checkDefinition(\r\n\t\t\t\t\t\t\t\targs[i],\r\n\t\t\t\t\t\t\t\targDef,\r\n\t\t\t\t\t\t\t\t`${base.name}.${key} arguments[${i}]`,\r\n\t\t\t\t\t\t\t\tmodel.errors,\r\n\t\t\t\t\t\t\t\t[],\r\n\t\t\t\t\t\t\t\ttrue\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (model.assertions.length > 0) {\r\n\t\t\t\t\t\t\tconst testingClone = clone(l)\r\n\t\t\t\t\t\t\tfn.apply(testingClone, args)\r\n\t\t\t\t\t\t\tcheckAssertions(testingClone, model, `after ${key} mutation`)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tunstackErrors(model)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn fn.apply(l, args)\r\n\t\t\t\t}\r\n\t\t\t}) : val\r\n\t\t}\r\n\t}, otherTraps))\r\n}","import {\r\n\t_original, _check, cast, checkAssertions, checkDefinition,\r\n\textendDefinition, extendModel, formatDefinition, Model, stackError, unstackErrors\r\n} from \"./object-model.js\"\r\nimport { initListModel } from \"./list-model.js\"\r\nimport { extend } from \"./helpers.js\"\r\n\r\nexport default function ArrayModel(initialDefinition) {\r\n\tconst model = initListModel(\r\n\t\tArray,\r\n\t\tArrayModel,\r\n\t\tinitialDefinition,\r\n\t\ta => Array.isArray(a) ? a.map(arg => cast(arg, model.definition)) : a,\r\n\t\ta => [...a],\r\n\t\t{\r\n\t\t\t\"copyWithin\": [],\r\n\t\t\t\"fill\": [0, 0],\r\n\t\t\t\"pop\": [],\r\n\t\t\t\"push\": [0],\r\n\t\t\t\"reverse\": [],\r\n\t\t\t\"shift\": [],\r\n\t\t\t\"sort\": [],\r\n\t\t\t\"splice\": [2],\r\n\t\t\t\"unshift\": [0]\r\n\t\t},\r\n\t\t{\r\n\t\t\tset(arr, key, val) {\r\n\t\t\t\treturn controlMutation(model, arr, key, val, (a, v) => a[key] = v, true)\r\n\t\t\t},\r\n\r\n\t\t\tdeleteProperty(arr, key) {\r\n\t\t\t\treturn controlMutation(model, arr, key, undefined, a => delete a[key])\r\n\t\t\t}\r\n\t\t}\r\n\t)\r\n\r\n\treturn model\r\n}\r\n\r\nextend(ArrayModel, Model, {\r\n\ttoString(stack) {\r\n\t\treturn \"Array of \" + formatDefinition(this.definition, stack)\r\n\t},\r\n\r\n\t[_check](arr, path, errors, stack, shouldCast) {\r\n\t\tif (Array.isArray(arr))\r\n\t\t\t(arr[_original] || arr).forEach((a, i) => checkDefinition(a, this.definition, `${path || \"Array\"}[${i}]`, errors, stack, shouldCast))\r\n\t\telse stackError(errors, this, arr, path)\r\n\r\n\t\tcheckAssertions(arr, this, path, errors)\r\n\t},\r\n\r\n\textend(...newParts) {\r\n\t\treturn extendModel(new ArrayModel(extendDefinition(this.definition, newParts)), this)\r\n\t}\r\n})\r\n\r\nconst controlMutation = (model, array, key, value, applyMutation, canBeExtended) => {\r\n\tconst path = `Array[${key}]`\r\n\tconst isInDef = (+key >= 0 && (canBeExtended || key in array))\r\n\tif (isInDef) value = checkDefinition(value, model.definition, path, model.errors, [], true)\r\n\r\n\tconst testArray = [...array]\r\n\tapplyMutation(testArray)\r\n\tcheckAssertions(testArray, model, path)\r\n\tconst isSuccess = !unstackErrors(model)\r\n\tif (isSuccess) applyMutation(array, value)\r\n\treturn isSuccess\r\n}","import {\r\n\t_check, _original, Any, checkAssertions, checkDefinition, extendDefinition, extendModel,\r\n\tformatDefinition, initModel, Model, stackError, unstackErrors\r\n} from \"./object-model.js\"\r\nimport { extend, is, isFunction } from \"./helpers.js\"\r\n\r\nexport default function FunctionModel(...argsDef) {\r\n\treturn initModel({ arguments: argsDef }, FunctionModel, Function, null, model => ({\r\n\t\tgetPrototypeOf: () => model.prototype,\r\n\r\n\t\tget(fn, key) {\r\n\t\t\treturn key === _original ? fn : fn[key]\r\n\t\t},\r\n\r\n\t\tapply(fn, ctx, args) {\r\n\t\t\tconst def = model.definition\r\n\t\t\tconst remainingArgDef = def.arguments.find(argDef => is(Any.remaining, argDef))\r\n\t\t\tconst nbArgsToCheck = remainingArgDef ? Math.max(args.length, def.arguments.length - 1) : def.arguments.length\r\n\r\n\t\t\tfor (let i = 0; i < nbArgsToCheck; i++) {\r\n\t\t\t\tconst argDef = remainingArgDef && i >= def.arguments.length - 1 ? remainingArgDef.definition : def.arguments[i]\r\n\t\t\t\targs[i] = checkDefinition(args[i], argDef, `arguments[${i}]`, model.errors, [], true)\r\n\t\t\t}\r\n\r\n\t\t\tcheckAssertions(args, model, \"arguments\")\r\n\r\n\t\t\tlet result\r\n\t\t\tif (!model.errors.length) {\r\n\t\t\t\tresult = Reflect.apply(fn, ctx, args)\r\n\t\t\t\tif (\"return\" in def)\r\n\t\t\t\t\tresult = checkDefinition(result, def.return, \"return value\", model.errors, [], true)\r\n\t\t\t}\r\n\t\t\tunstackErrors(model)\r\n\t\t\treturn result\r\n\t\t}\r\n\t}))\r\n}\r\n\r\nextend(FunctionModel, Model, {\r\n\ttoString(stack = []) {\r\n\t\tlet out = `Function(${this.definition.arguments.map(\r\n\t\t\targDef => formatDefinition(argDef, [...stack])\r\n\t\t).join(\", \")})`\r\n\r\n\t\tif (\"return\" in this.definition) {\r\n\t\t\tout += \" => \" + formatDefinition(this.definition.return, stack)\r\n\t\t}\r\n\t\treturn out\r\n\t},\r\n\r\n\treturn(def) {\r\n\t\tthis.definition.return = def\r\n\t\treturn this\r\n\t},\r\n\r\n\t[_check](f, path, errors) {\r\n\t\tif (!isFunction(f)) stackError(errors, \"Function\", f, path)\r\n\t}\r\n})","import {\r\n\t_check, cast, checkAssertions, checkDefinition,\r\n\textendDefinition, extendModel, format, formatDefinition, Model, stackError\r\n} from \"./object-model.js\"\r\nimport { initListModel } from \"./list-model.js\"\r\nimport { extend, is, isIterable } from \"./helpers.js\"\r\n\r\nexport default function MapModel(initialKeyDefinition, initialValueDefinition) {\r\n\tconst getDef = i => i === 0 ? model.definition.key : model.definition.value;\r\n\tconst model = initListModel(\r\n\t\tMap,\r\n\t\tMapModel,\r\n\t\t{ key: initialKeyDefinition, value: initialValueDefinition },\r\n\t\tit => isIterable(it) ? new Map([...it].map(pair => pair.map((x, i) => cast(x, getDef(i))))) : it,\r\n\t\tmap => new Map(map),\r\n\t\t{\r\n\t\t\t\"set\": [0, 1, getDef],\r\n\t\t\t\"delete\": [],\r\n\t\t\t\"clear\": []\r\n\t\t}\r\n\t)\r\n\r\n\treturn model\r\n}\r\n\r\nextend(MapModel, Model, {\r\n\ttoString(stack) {\r\n\t\treturn `Map of ${formatDefinition(this.definition.key, stack)} : ${formatDefinition(this.definition.value, stack)}`\r\n\t},\r\n\r\n\t[_check](map, path, errors, stack, shouldCast) {\r\n\t\tif (is(Map, map)) {\r\n\t\t\tpath = path || \"Map\"\r\n\t\t\tfor (let [key, value] of map) {\r\n\t\t\t\tcheckDefinition(key, this.definition.key, `${path} key`, errors, stack, shouldCast)\r\n\t\t\t\tcheckDefinition(value, this.definition.value, `${path}[${format(key)}]`, errors, stack, shouldCast)\r\n\t\t\t}\r\n\t\t} else stackError(errors, this, map, path)\r\n\r\n\t\tcheckAssertions(map, this, path, errors)\r\n\t},\r\n\r\n\textend(keyParts, valueParts) {\r\n\t\treturn extendModel(new MapModel(\r\n\t\t\textendDefinition(this.definition.key, keyParts),\r\n\t\t\textendDefinition(this.definition.value, valueParts)\r\n\t\t), this)\r\n\t}\r\n})","import {\r\n\t_check, cast, checkAssertions, checkDefinition,\r\n\textendDefinition, extendModel, formatDefinition, Model, stackError\r\n} from \"./object-model.js\"\r\nimport { initListModel } from \"./list-model.js\"\r\nimport { extend, is, isIterable } from \"./helpers.js\"\r\n\r\nexport default function SetModel(initialDefinition) {\r\n\tconst model = initListModel(\r\n\t\tSet,\r\n\t\tSetModel,\r\n\t\tinitialDefinition,\r\n\t\tit => isIterable(it) ? new Set([...it].map(val => cast(val, model.definition))) : it,\r\n\t\tset => new Set(set),\r\n\t\t{\r\n\t\t\t\"add\": [0, 0],\r\n\t\t\t\"delete\": [],\r\n\t\t\t\"clear\": []\r\n\t\t}\r\n\t)\r\n\r\n\treturn model\r\n}\r\n\r\nextend(SetModel, Model, {\r\n\ttoString(stack) {\r\n\t\treturn \"Set of \" + formatDefinition(this.definition, stack)\r\n\t},\r\n\r\n\t[_check](set, path, errors, stack, shouldCast) {\r\n\t\tif (is(Set, set)) {\r\n\t\t\tfor (let item of set.values()) {\r\n\t\t\t\tcheckDefinition(item, this.definition, `${path || \"Set\"} value`, errors, stack, shouldCast)\r\n\t\t\t}\r\n\t\t} else stackError(errors, this, set, path)\r\n\t\tcheckAssertions(set, this, path, errors)\r\n\t},\r\n\r\n\textend(...newParts) {\r\n\t\treturn extendModel(new SetModel(extendDefinition(this.definition, newParts)), this)\r\n\t}\r\n})"],"names":["ObjectProto","Object","prototype","getProto","getPrototypeOf","setProto","setPrototypeOf","has","o","prop","hasOwnProperty","call","is","Constructor","obj","isFunction","f","isObject","isString","s","isPlainObject","isIterable","x","Symbol","iterator","proxify","val","traps","Proxy","merge","target","src","key","define","value","enumerable","defineProperty","writable","configurable","extend","child","parent","props","assign","create","constructor","_check","_checked","_original","CHECK_ONCE","initModel","def","init","getTraps","useNew","model","default","mode","this","check","definition","assertions","name","initObjectModel","_this","undefined","parentClass","extendModel","newProps","push","stackError","errors","expected","received","path","message","unstackErrors","collector","errorCollector","nbErrors","length","map","err","formatDefinition","toString","match","format","isModelInstance","i","Model","parseDefinition","Array","isArray","stack","parts","d","join","extendDefinition","newParts","concat","filter","index","self","indexOf","checkDefinition","shouldCast","indexFound","cast","formatPath","some","part","checkDefinitionPart","Any","RegExp","test","Number","Date","isNaN","checkAssertions","assertion","result","onFail","description","assertionResult","includes","String","unshift","Map","Set","item","keys","indent","repeat","slice","controlMutation","privateAccess","applyMutation","newPath","isPrivate","conventionForPrivate","isConstant","conventionForConstant","isOwnProperty","initialPropDescriptor","getOwnPropertyDescriptor","cannot","msg","defNode","BasicModel","suitableModels","console","warn","get","Reflect","inDef","defPart","set","apply","fn","ctx","args","getProp","deleteProperty","ownKeys","descriptor","ObjectModel","toUpperCase","fns","as","defaultTo","initialErrorCollector","failed","e","TypeError","replace","assert","proto","defaults","newAssertions","submodel","anyOf","remaining","initListModel","base","clone","mutators","otherTraps","l","begin","end","getArgDef","argDef","testingClone","ArrayModel","initialDefinition","a","arg","copyWithin","fill","pop","reverse","shift","sort","splice","arr","v","forEach","array","canBeExtended","testArray","isSuccess","FunctionModel","argsDef","arguments","Function","remainingArgDef","find","nbArgsToCheck","Math","max","return","MapModel","initialKeyDefinition","initialValueDefinition","getDef","it","pair","delete","clear","SetModel","add","out","keyParts","valueParts","values"],"mappings":"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"}
|
package/index.html
CHANGED
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
<li>Constants and private properties based on name conventions</li>
|
|
149
149
|
<li>Explicit error messages</li>
|
|
150
150
|
<li>Customizable error handlers</li>
|
|
151
|
-
<li>all in <strong class="size-gzip">4.
|
|
151
|
+
<li>all in <strong class="size-gzip">4.06 kB</strong> minified and gzipped,
|
|
152
152
|
even less when using tree-shaking
|
|
153
153
|
</li>
|
|
154
154
|
</ul>
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
|
|
157
157
|
<div id="download">
|
|
158
158
|
<h2>Download</h2>
|
|
159
|
-
<h3>Current version: v<span class="version">4.4.
|
|
159
|
+
<h3>Current version: v<span class="version">4.4.5</span></h3>
|
|
160
160
|
<ul>
|
|
161
161
|
<li>
|
|
162
162
|
From <a href="https://www.npmjs.com/package/objectmodel" target="_blank" rel="noopener">
|
|
@@ -167,11 +167,11 @@
|
|
|
167
167
|
<a href="http://cdn.pika.dev/objectmodel" rel="noopener">cdn.pika.dev/objectmodel</a>
|
|
168
168
|
</li>
|
|
169
169
|
<li>Minified <abbr title="ECMAScript module">ESM</abbr> bundle
|
|
170
|
-
(<strong class="size-gzip">4.
|
|
170
|
+
(<strong class="size-gzip">4.06 kB</strong> gzipped) :
|
|
171
171
|
<a href="dist/object-model.min.js">object-model.min.js</a>
|
|
172
172
|
</li>
|
|
173
173
|
<li>Source files :
|
|
174
|
-
<a class="link-zip" href="https://github.com/sylvainpolletvillard/ObjectModel/archive/v4.4.
|
|
174
|
+
<a class="link-zip" href="https://github.com/sylvainpolletvillard/ObjectModel/archive/v4.4.5.zip">object-model-4.4.5.zip</a>
|
|
175
175
|
</li>
|
|
176
176
|
</ul>
|
|
177
177
|
|
package/package.json
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "objectmodel",
|
|
3
|
-
"version": "4.4.
|
|
4
|
-
"description": "Strong Dynamically Typed Object Modeling for JavaScript",
|
|
5
|
-
"author": "Sylvain Pollet-Villard",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"homepage": "http://objectmodel.js.org",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "https://github.com/sylvainpolletvillard/ObjectModel.git"
|
|
11
|
-
},
|
|
12
|
-
"scripts": {
|
|
13
|
-
"prepare": "cjyes",
|
|
14
|
-
"build": "npm-run-all build:* && npm run info && cjyes",
|
|
15
|
-
"build:js": "rollup -c",
|
|
16
|
-
"build:min": "rollup -c --environment BUILD:production",
|
|
17
|
-
"watch": "npm-run-all --parallel watch:*",
|
|
18
|
-
"watch:js": "npm run build:js -- --watch",
|
|
19
|
-
"watch:min": "npm run build:min -- --watch",
|
|
20
|
-
"info": "npm-run-all info:*",
|
|
21
|
-
"info:banner": "node build/add-banner.js",
|
|
22
|
-
"info:docs": "node build/update-docs.js",
|
|
23
|
-
"lint": "eslint . --fix",
|
|
24
|
-
"test": "npm-run-all test:*",
|
|
25
|
-
"test:unit": "qunit test/index.cjs",
|
|
26
|
-
"test:tsd": "tsd"
|
|
27
|
-
},
|
|
28
|
-
"devDependencies": {
|
|
29
|
-
"cjyes": "^0.3.1",
|
|
30
|
-
"eslint": "^8.
|
|
31
|
-
"esm": "^3.2.25",
|
|
32
|
-
"gzip-size": "^7.0.0",
|
|
33
|
-
"npm-run-all": "^4.1.5",
|
|
34
|
-
"pretty-bytes": "^6.0.0",
|
|
35
|
-
"qunit": "^2.19.1",
|
|
36
|
-
"rollup": "^2.75.6",
|
|
37
|
-
"rollup-plugin-terser": "^7.0.2",
|
|
38
|
-
"tsd": "^0.
|
|
39
|
-
},
|
|
40
|
-
"type": "module",
|
|
41
|
-
"main": "dist/object-model.js",
|
|
42
|
-
"exports": {
|
|
43
|
-
"import": "./dist/object-model.js",
|
|
44
|
-
"require": "./dist/object-model.cjs"
|
|
45
|
-
},
|
|
46
|
-
"types": "types/index.d.ts",
|
|
47
|
-
"tsd": {
|
|
48
|
-
"directory": "test"
|
|
49
|
-
},
|
|
50
|
-
"engines": {
|
|
51
|
-
"npm": ">=6.14",
|
|
52
|
-
"node": ">=13"
|
|
53
|
-
},
|
|
54
|
-
"keywords": [
|
|
55
|
-
"typed",
|
|
56
|
-
"types",
|
|
57
|
-
"typing",
|
|
58
|
-
"type-checking",
|
|
59
|
-
"dynamic",
|
|
60
|
-
"strong",
|
|
61
|
-
"model",
|
|
62
|
-
"definition",
|
|
63
|
-
"object",
|
|
64
|
-
"assertion",
|
|
65
|
-
"inheritance",
|
|
66
|
-
"composition",
|
|
67
|
-
"structures",
|
|
68
|
-
"proxy"
|
|
69
|
-
]
|
|
70
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "objectmodel",
|
|
3
|
+
"version": "4.4.5",
|
|
4
|
+
"description": "Strong Dynamically Typed Object Modeling for JavaScript",
|
|
5
|
+
"author": "Sylvain Pollet-Villard",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "http://objectmodel.js.org",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/sylvainpolletvillard/ObjectModel.git"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"prepare": "cjyes",
|
|
14
|
+
"build": "npm-run-all build:* && npm run info && cjyes",
|
|
15
|
+
"build:js": "rollup -c",
|
|
16
|
+
"build:min": "rollup -c --environment BUILD:production",
|
|
17
|
+
"watch": "npm-run-all --parallel watch:*",
|
|
18
|
+
"watch:js": "npm run build:js -- --watch",
|
|
19
|
+
"watch:min": "npm run build:min -- --watch",
|
|
20
|
+
"info": "npm-run-all info:*",
|
|
21
|
+
"info:banner": "node build/add-banner.js",
|
|
22
|
+
"info:docs": "node build/update-docs.js",
|
|
23
|
+
"lint": "eslint . --fix",
|
|
24
|
+
"test": "npm-run-all test:*",
|
|
25
|
+
"test:unit": "qunit test/index.cjs",
|
|
26
|
+
"test:tsd": "tsd"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"cjyes": "^0.3.1",
|
|
30
|
+
"eslint": "^8.48.0",
|
|
31
|
+
"esm": "^3.2.25",
|
|
32
|
+
"gzip-size": "^7.0.0",
|
|
33
|
+
"npm-run-all": "^4.1.5",
|
|
34
|
+
"pretty-bytes": "^6.0.0",
|
|
35
|
+
"qunit": "^2.19.1",
|
|
36
|
+
"rollup": "^2.75.6",
|
|
37
|
+
"rollup-plugin-terser": "^7.0.2",
|
|
38
|
+
"tsd": "^0.28.1"
|
|
39
|
+
},
|
|
40
|
+
"type": "module",
|
|
41
|
+
"main": "dist/object-model.js",
|
|
42
|
+
"exports": {
|
|
43
|
+
"import": "./dist/object-model.js",
|
|
44
|
+
"require": "./dist/object-model.cjs"
|
|
45
|
+
},
|
|
46
|
+
"types": "types/index.d.ts",
|
|
47
|
+
"tsd": {
|
|
48
|
+
"directory": "test"
|
|
49
|
+
},
|
|
50
|
+
"engines": {
|
|
51
|
+
"npm": ">=6.14",
|
|
52
|
+
"node": ">=13"
|
|
53
|
+
},
|
|
54
|
+
"keywords": [
|
|
55
|
+
"typed",
|
|
56
|
+
"types",
|
|
57
|
+
"typing",
|
|
58
|
+
"type-checking",
|
|
59
|
+
"dynamic",
|
|
60
|
+
"strong",
|
|
61
|
+
"model",
|
|
62
|
+
"definition",
|
|
63
|
+
"object",
|
|
64
|
+
"assertion",
|
|
65
|
+
"inheritance",
|
|
66
|
+
"composition",
|
|
67
|
+
"structures",
|
|
68
|
+
"proxy"
|
|
69
|
+
]
|
|
70
|
+
}
|
package/rollup.config.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { terser } from "rollup-plugin-terser";
|
|
2
|
-
|
|
3
|
-
const isProduction = process.env.BUILD === 'production';
|
|
4
|
-
|
|
5
|
-
export default {
|
|
6
|
-
input: 'build/bundle-entry' + (isProduction ? '.js' : '.dev.js'),
|
|
7
|
-
output: {
|
|
8
|
-
file: 'dist/object-model' + (isProduction ? '.min.js' : '.js'),
|
|
9
|
-
format: 'esm',
|
|
10
|
-
sourcemap: true,
|
|
11
|
-
extend: true
|
|
12
|
-
},
|
|
13
|
-
plugins: isProduction ? [terser()] : []
|
|
1
|
+
import { terser } from "rollup-plugin-terser";
|
|
2
|
+
|
|
3
|
+
const isProduction = process.env.BUILD === 'production';
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
input: 'build/bundle-entry' + (isProduction ? '.js' : '.dev.js'),
|
|
7
|
+
output: {
|
|
8
|
+
file: 'dist/object-model' + (isProduction ? '.min.js' : '.js'),
|
|
9
|
+
format: 'esm',
|
|
10
|
+
sourcemap: true,
|
|
11
|
+
extend: true
|
|
12
|
+
},
|
|
13
|
+
plugins: isProduction ? [terser()] : []
|
|
14
14
|
};
|
package/src/helpers.js
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
export const
|
|
2
|
-
ObjectProto = Object.prototype,
|
|
3
|
-
bettertypeof = x => ObjectProto.toString.call(x).match(/\s([a-zA-Z]+)/)[1],
|
|
4
|
-
getProto = Object.getPrototypeOf,
|
|
5
|
-
setProto = Object.setPrototypeOf,
|
|
6
|
-
|
|
7
|
-
has = (o, prop) => ObjectProto.hasOwnProperty.call(o, prop),
|
|
8
|
-
is = (Constructor, obj) => obj instanceof Constructor,
|
|
9
|
-
isFunction = f => typeof f === "function",
|
|
10
|
-
isObject = o => o && typeof o === "object",
|
|
11
|
-
isString = s => typeof s === "string",
|
|
12
|
-
isPlainObject = o => isObject(o) && getProto(o) === ObjectProto,
|
|
13
|
-
isIterable = x => x && isFunction(x[Symbol.iterator]),
|
|
14
|
-
|
|
15
|
-
proxify = (val, traps) => new Proxy(val, traps),
|
|
16
|
-
|
|
17
|
-
merge = (target, src = {}) => {
|
|
18
|
-
for (let key in src) {
|
|
19
|
-
if (isPlainObject(src[key])) {
|
|
20
|
-
const o = {}
|
|
21
|
-
merge(o, target[key])
|
|
22
|
-
merge(o, src[key])
|
|
23
|
-
target[key] = o
|
|
24
|
-
} else {
|
|
25
|
-
target[key] = src[key]
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return target
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
define = (obj, key, value, enumerable = false) => {
|
|
32
|
-
Object.defineProperty(obj, key, { value, enumerable, writable: true, configurable: true })
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
extend = (child, parent, props) => {
|
|
36
|
-
child.prototype = Object.assign(Object.create(parent.prototype, {
|
|
37
|
-
constructor: {
|
|
38
|
-
value: child,
|
|
39
|
-
writable: true,
|
|
40
|
-
configurable: true
|
|
41
|
-
}
|
|
42
|
-
}), props)
|
|
43
|
-
setProto(child, parent)
|
|
1
|
+
export const
|
|
2
|
+
ObjectProto = Object.prototype,
|
|
3
|
+
bettertypeof = x => ObjectProto.toString.call(x).match(/\s([a-zA-Z]+)/)[1],
|
|
4
|
+
getProto = Object.getPrototypeOf,
|
|
5
|
+
setProto = Object.setPrototypeOf,
|
|
6
|
+
|
|
7
|
+
has = (o, prop) => ObjectProto.hasOwnProperty.call(o, prop),
|
|
8
|
+
is = (Constructor, obj) => obj instanceof Constructor,
|
|
9
|
+
isFunction = f => typeof f === "function",
|
|
10
|
+
isObject = o => o && typeof o === "object",
|
|
11
|
+
isString = s => typeof s === "string",
|
|
12
|
+
isPlainObject = o => isObject(o) && getProto(o) === ObjectProto,
|
|
13
|
+
isIterable = x => x && isFunction(x[Symbol.iterator]),
|
|
14
|
+
|
|
15
|
+
proxify = (val, traps) => new Proxy(val, traps),
|
|
16
|
+
|
|
17
|
+
merge = (target, src = {}) => {
|
|
18
|
+
for (let key in src) {
|
|
19
|
+
if (isPlainObject(src[key])) {
|
|
20
|
+
const o = {}
|
|
21
|
+
merge(o, target[key])
|
|
22
|
+
merge(o, src[key])
|
|
23
|
+
target[key] = o
|
|
24
|
+
} else {
|
|
25
|
+
target[key] = src[key]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return target
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
define = (obj, key, value, enumerable = false) => {
|
|
32
|
+
Object.defineProperty(obj, key, { value, enumerable, writable: true, configurable: true })
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
extend = (child, parent, props) => {
|
|
36
|
+
child.prototype = Object.assign(Object.create(parent.prototype, {
|
|
37
|
+
constructor: {
|
|
38
|
+
value: child,
|
|
39
|
+
writable: true,
|
|
40
|
+
configurable: true
|
|
41
|
+
}
|
|
42
|
+
}), props)
|
|
43
|
+
setProto(child, parent)
|
|
44
44
|
}
|
package/src/list-model.js
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
import { _original, checkAssertions, checkDefinition, initModel, unstackErrors } from "./object-model.js"
|
|
3
|
-
import { has, isFunction, proxify } from "./helpers.js"
|
|
4
|
-
|
|
5
|
-
export const initListModel = (base, constructor, def, init, clone, mutators, otherTraps) => {
|
|
6
|
-
|
|
7
|
-
return initModel(def, constructor, base, init, model => Object.assign({
|
|
8
|
-
getPrototypeOf: () => model.prototype,
|
|
9
|
-
get(l, key) {
|
|
10
|
-
if (key === _original) return l
|
|
11
|
-
|
|
12
|
-
const val = l[key]
|
|
13
|
-
return isFunction(val) ? proxify(val, {
|
|
14
|
-
apply(fn, ctx, args) {
|
|
15
|
-
if (has(mutators, key)) {
|
|
16
|
-
// indexes of arguments to check def + cast
|
|
17
|
-
const [begin, end = args.length - 1, getArgDef] = mutators[key]
|
|
18
|
-
for (let i = begin; i <= end; i++) {
|
|
19
|
-
const argDef = getArgDef ? getArgDef(i) : model.definition
|
|
20
|
-
args[i] = checkDefinition(
|
|
21
|
-
args[i],
|
|
22
|
-
argDef,
|
|
23
|
-
`${base.name}.${key} arguments[${i}]`,
|
|
24
|
-
model.errors,
|
|
25
|
-
[],
|
|
26
|
-
true
|
|
27
|
-
)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (model.assertions.length > 0) {
|
|
31
|
-
const testingClone = clone(l)
|
|
32
|
-
fn.apply(testingClone, args)
|
|
33
|
-
checkAssertions(testingClone, model, `after ${key} mutation`)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
unstackErrors(model)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return fn.apply(l, args)
|
|
40
|
-
}
|
|
41
|
-
}) : val
|
|
42
|
-
}
|
|
43
|
-
}, otherTraps))
|
|
1
|
+
|
|
2
|
+
import { _original, checkAssertions, checkDefinition, initModel, unstackErrors } from "./object-model.js"
|
|
3
|
+
import { has, isFunction, proxify } from "./helpers.js"
|
|
4
|
+
|
|
5
|
+
export const initListModel = (base, constructor, def, init, clone, mutators, otherTraps) => {
|
|
6
|
+
|
|
7
|
+
return initModel(def, constructor, base, init, model => Object.assign({
|
|
8
|
+
getPrototypeOf: () => model.prototype,
|
|
9
|
+
get(l, key) {
|
|
10
|
+
if (key === _original) return l
|
|
11
|
+
|
|
12
|
+
const val = l[key]
|
|
13
|
+
return isFunction(val) ? proxify(val, {
|
|
14
|
+
apply(fn, ctx, args) {
|
|
15
|
+
if (has(mutators, key)) {
|
|
16
|
+
// indexes of arguments to check def + cast
|
|
17
|
+
const [begin, end = args.length - 1, getArgDef] = mutators[key]
|
|
18
|
+
for (let i = begin; i <= end; i++) {
|
|
19
|
+
const argDef = getArgDef ? getArgDef(i) : model.definition
|
|
20
|
+
args[i] = checkDefinition(
|
|
21
|
+
args[i],
|
|
22
|
+
argDef,
|
|
23
|
+
`${base.name}.${key} arguments[${i}]`,
|
|
24
|
+
model.errors,
|
|
25
|
+
[],
|
|
26
|
+
true
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (model.assertions.length > 0) {
|
|
31
|
+
const testingClone = clone(l)
|
|
32
|
+
fn.apply(testingClone, args)
|
|
33
|
+
checkAssertions(testingClone, model, `after ${key} mutation`)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
unstackErrors(model)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return fn.apply(l, args)
|
|
40
|
+
}
|
|
41
|
+
}) : val
|
|
42
|
+
}
|
|
43
|
+
}, otherTraps))
|
|
44
44
|
}
|