From a56ea206d70bafd1b2c105a38019c61ac299403c Mon Sep 17 00:00:00 2001 From: tjduigna Date: Thu, 23 Jun 2022 09:02:19 -0400 Subject: [PATCH 1/7] feat: moves mixins --- package-lock.json | 233 ++++++++++++++++++++++++--- package.json | 8 +- src/entity/index.js | 11 +- src/entity/mixins.js | 66 -------- src/entity/mixins/context.js | 90 +++++++++++ src/entity/mixins/context_runtime.js | 25 +++ src/entity/mixins/hash.js | 37 +++++ src/entity/mixins/props.js | 65 ++++++++ src/entity/mixins/repetition.js | 28 ++++ src/entity/mixins/runtime_items.js | 159 ++++++++++++++++++ src/entity/other.js | 39 +++-- 11 files changed, 656 insertions(+), 105 deletions(-) delete mode 100644 src/entity/mixins.js create mode 100644 src/entity/mixins/context.js create mode 100644 src/entity/mixins/context_runtime.js create mode 100644 src/entity/mixins/hash.js create mode 100644 src/entity/mixins/props.js create mode 100644 src/entity/mixins/repetition.js create mode 100644 src/entity/mixins/runtime_items.js diff --git a/package-lock.json b/package-lock.json index 58a7d81e..d99434bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1443,6 +1443,18 @@ "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -1803,6 +1815,11 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "complex.js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.4.tgz", + "integrity": "sha512-Syl95HpxUTS0QjwNxencZsKukgh1zdS9uXeXX2Us0pHaqBR6kiZZi0AkZ9VpZFwHJyVIUVzI4EumjWdXP3fy6w==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1879,6 +1896,11 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, + "decimal.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-9.0.1.tgz", + "integrity": "sha512-2h0iKbJwnImBk4TGk7CG1xadoA0g3LDPlQhQzbZ221zvG0p2YVUedbKIPsOZXKZGx6YmZMJKYOalpCMxSdDqTQ==" + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -2023,6 +2045,11 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, + "escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2391,13 +2418,60 @@ } } }, - "eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "eslint-plugin-react": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", + "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", "dev": true, "requires": { - "prettier-linter-helpers": "^1.0.0" + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "eslint-plugin-simple-import-sort": { @@ -2527,12 +2601,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2612,6 +2680,11 @@ "signal-exit": "^3.0.2" } }, + "fraction.js": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.4.tgz", + "integrity": "sha512-aK/oGatyYLTtXRHjfEsytX5fieeR5H4s8sLorzcT12taFS+dbMZejnvm9gRa8mZAPwci24ucjq9epDyaq5u8Iw==" + }, "fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -3218,6 +3291,11 @@ "istanbul-lib-report": "^3.0.0" } }, + "javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3553,6 +3631,15 @@ } } }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "loupe": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", @@ -3580,6 +3667,21 @@ "semver": "^5.6.0" } }, + "mathjs": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-3.20.2.tgz", + "integrity": "sha512-3f6/+uf1cUtIz1rYFz775wekl/UEDSQ3mU6xdxW7qzpvvhc2v28i3UtLsGTRB+u8OqDWoSX6Dz8gehaGFs6tCA==", + "requires": { + "complex.js": "2.0.4", + "decimal.js": "9.0.1", + "escape-latex": "^1.0.0", + "fraction.js": "4.0.4", + "javascript-natural-sort": "0.7.1", + "seed-random": "2.2.0", + "tiny-emitter": "2.0.2", + "typed-function": "0.10.7" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4056,6 +4158,12 @@ } } }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -4089,6 +4197,27 @@ "es-abstract": "^1.19.1" } }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, "object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -4249,14 +4378,11 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true }, "process-on-spawn": { "version": "1.0.0", @@ -4273,6 +4399,17 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -4288,6 +4425,12 @@ "safe-buffer": "^5.1.0" } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4460,6 +4603,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==" + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -4659,6 +4807,22 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, "string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -4777,6 +4941,11 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "tiny-emitter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", + "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -4840,6 +5009,11 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-function": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-0.10.7.tgz", + "integrity": "sha512-3mlZ5AwRMbLvUKkc8a1TI4RUJUS2H27pmD5q0lHRObgsoWzhDAX01yg82kwSP1FUw922/4Y9ZliIEh0qJZcz+g==" + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -4866,6 +5040,22 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==" }, + "underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "requires": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -4899,6 +5089,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", diff --git a/package.json b/package.json index 310ae2a8..cfbe7d96 100644 --- a/package.json +++ b/package.json @@ -50,22 +50,24 @@ "lodash": "^4.17.21", "mathjs": "^3.9.0", "mixwith": "^0.1.1", - "underscore": "^1.13.3" + "underscore": "^1.13.3", + "underscore.string": "^3.3.4" }, "devDependencies": { "chai": "^4.3.4", "eslint": "7.32.0", "eslint-config-airbnb": "19.0.2", "eslint-config-prettier": "8.3.0", + "eslint-plugin-react": "^7.30.0", "eslint-plugin-import": "2.25.3", "eslint-plugin-jsdoc": "37.1.0", "eslint-plugin-jsx-a11y": "6.5.1", - "eslint-plugin-prettier": "4.0.0", "eslint-plugin-simple-import-sort": "7.0.0", "husky": "^7.0.4", "lint-staged": "^12.1.2", "mocha": "^9.1.3", - "nyc": "^15.1.0" + "nyc": "^15.1.0", + "prettier": "^2.7.1" }, "engines": { "node": ">=12.0.0" diff --git a/src/entity/index.js b/src/entity/index.js index a884459b..8cbfd8dc 100644 --- a/src/entity/index.js +++ b/src/entity/index.js @@ -7,6 +7,8 @@ import { DefaultableInMemoryEntity, NamedDefaultableInMemoryEntity, HasMetadataNamedDefaultableInMemoryEntity, + NamedDefaultableRepetitionContextAndRenderInMemoryEntity, + NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity, } from "./other"; import { @@ -15,7 +17,7 @@ import { HasMetadataMixin, TaggableMixin, NamedEntityMixin, -} from "./mixins"; +} from "./mixins/props"; import { InMemoryEntitySet } from "./set"; import { ENTITY_SET_TYPES } from "./set/enums"; @@ -23,7 +25,10 @@ import { ENTITY_SET_TYPES } from "./set/enums"; import { constructEntitySetFactoryByConfig } from "./set/factory"; import { InMemoryEntitySetMixin, InMemoryEntityInSetMixin } from "./set/mixins"; import * as selectorsForEntitySet from "./set/selectors"; -import { OrderedInMemoryEntityInSetMixin, OrderedInMemoryEntitySetMixin } from "./set/ordered/mixins"; +import { + OrderedInMemoryEntityInSetMixin, + OrderedInMemoryEntitySetMixin, +} from "./set/ordered/mixins"; export { @@ -32,6 +37,8 @@ export { DefaultableInMemoryEntity, NamedDefaultableInMemoryEntity, HasMetadataNamedDefaultableInMemoryEntity, + NamedDefaultableRepetitionContextAndRenderInMemoryEntity, + NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity, DefaultableMixin, HasDescriptionMixin, diff --git a/src/entity/mixins.js b/src/entity/mixins.js deleted file mode 100644 index e721240b..00000000 --- a/src/entity/mixins.js +++ /dev/null @@ -1,66 +0,0 @@ -export const DefaultableMixin = (superclass) => class extends superclass { - - get isDefault() { - return this.prop('isDefault', false); - } - - // Define in superclass - // static get defaultConfig() { - // } - - static createDefault() { - return new this.prototype.constructor(this.defaultConfig); - } - -}; - -export const TaggableMixin = (superclass) => class extends superclass { - - get tags() {return this.prop('tags', [])} - - set tags(array) {this.setProp('tags', array)} - - // only keep unique elements in tags - setTags(array) {this.tags = array.filter((value, index, self) => self.indexOf(value) === index)} - -}; - -export const HasMetadataMixin = (superclass) => class extends superclass { - - get metadata() {return this.prop('metadata', {})} - - set metadata(object) {this.setProp('metadata', object)} - - updateMetadata(object) {this.metadata = Object.assign({}, this.metadata, object)} - -}; - -export const HasDescriptionMixin = (superclass) => class extends superclass { - - get description() {return this.prop('description', '')} - - set description(string) {this.setProp('description', string)} - - get descriptionObject() {return this.prop('descriptionObject')} - - set descriptionObject(obj) {this.setProp('descriptionObject', obj)} - -}; - -export const NamedEntityMixin = (superclass) => class extends superclass { - - get name() { - return this.prop('name', ''); - } - - set name(name) { - this.setProp('name', name); - } - - // to be used when getter is overriden - setName(name) { - this.setProp('name', name); - } - -}; - diff --git a/src/entity/mixins/context.js b/src/entity/mixins/context.js new file mode 100644 index 00000000..fac0eeaa --- /dev/null +++ b/src/entity/mixins/context.js @@ -0,0 +1,90 @@ +import { deepClone } from "../../utils/clone"; + +export const ContextAndRenderFieldsMixin = (superclass) => { + return class extends superclass { + constructor(config) { + super(config); + this._context = config.context || {}; + } + + // in-memory, or "volatile" context that is reset when the `parent` object is destroyed + get context() { + return this._context; + } + + set context(newContext) { + this._context = newContext; + } + + updateContext(ctx = {}, executeRender = false) { + this._context = Object.assign({}, this.context, ctx); + executeRender && this.render(); + } + + // to get "persistent" context, that is stored in database and further should be provided to constructor + // when the `parent` object is re-created + getPersistentContext() { + return this.prop("context"); + } + + // to make context persistent in `_json` + updatePersistentContext(ctx = {}) { + this.setProp("context", Object.assign({}, ctx)); + } + + // to get persistent and volatile context combined + getCombinedContext() { + return Object.assign({}, this.getPersistentContext(), this.context); + } + + // override in subclasses + render(context = this.context) { + throw new Error("RenderInitMixin: render not implemented in derived class"); + } + }; +}; + +/* + * @summary Handles logic for domain-specific context, eg. "important settings". + * Important settings are stored inside "important" property and have context providers associated with it. + */ +export const DomainContextProviderMixin = (superclass) => { + return class extends superclass { + constructor(config) { + super(config); + this._contextProviders = []; + } + + get contextProviders() { + // override in children + return this._contextProviders; + } + }; +}; + +export const ImportantSettingsProviderMixin = (superclass) => { + return class extends DomainContextProviderMixin(superclass) { + get important() { + return deepClone(this._json.important || {}); + } + + setImportant(key, value) { + this.setProp("important", {[key]: value}) + } + + /** + * @return {JSONSchemaFormDataProvider[]} + */ + get importantSettingsProviders() { + return this.contextProviders.filter(p => p.domain === "important"); + } + + get isImportantEdited() { + return this.prop("important.isEdited"); + } + + set isImportantEdited(bool) { + this.setProp("important", Object.assign(this.important, {isEdited: bool})); + } + }; +}; diff --git a/src/entity/mixins/context_runtime.js b/src/entity/mixins/context_runtime.js new file mode 100644 index 00000000..b83fce18 --- /dev/null +++ b/src/entity/mixins/context_runtime.js @@ -0,0 +1,25 @@ +export const RuntimeContextFieldMixin = (superclass) => { + return class extends superclass { + constructor(config) { + super(config); + this._runtimeContext = config.runtimeContext || {}; + } + + // in-memory, or "volatile" runtimeContext that is reset when the `parent` object is destroyed + get runtimeContext() { + return this._runtimeContext; + } + + set runtimeContext(newContext) { + this._runtimeContext = newContext; + } + + updateRuntimeContext(ctx = {}) { + this.runtimeContext = Object.assign(this._runtimeContext, ctx); + } + + toJSON() { + return Object.assign({}, super.toJSON(), {runtimeContext: this._runtimeContext}); + } + }; +}; diff --git a/src/entity/mixins/hash.js b/src/entity/mixins/hash.js new file mode 100644 index 00000000..4d83c50b --- /dev/null +++ b/src/entity/mixins/hash.js @@ -0,0 +1,37 @@ +import { calculateHashFromObject } from "../../utils/hash"; +import { removeCommentsFromSourceCode, removeEmptyLinesFromString } from "../../utils/str"; + +export const HashedEntityMixin = (superclass) => { + return class extends superclass { + /* + * @summary Returns an object based on meaningful fields for this unit, that will be used to calculate the hash + * Must be overridden. + */ + getHashObject() { + return {}; + } + + /** + * @summary Calculates hash based on meaningful fields and unit-specific fields. Unit-specific fields are + * separated into _typeSpecificHash function which can be overwritten by child classes. + * head and next are also important but not considered since they are included in subworkflow hash. + */ + calculateHash() { + return calculateHashFromObject(this.getHashObject()); + } + }; +}; + +export const HashedInputArrayMixin = (superclass) => { + return class extends superclass { + /* + * @summary expects an array with elements containing field [{content: "..."}] + */ + get hashFromArrayInputContent() { + const objectForHashing = this.input.map(i => + removeEmptyLinesFromString(removeCommentsFromSourceCode(i.content)) + ); + return calculateHashFromObject(objectForHashing) + } + }; +}; diff --git a/src/entity/mixins/props.js b/src/entity/mixins/props.js new file mode 100644 index 00000000..72da5b98 --- /dev/null +++ b/src/entity/mixins/props.js @@ -0,0 +1,65 @@ +export const DefaultableMixin = (superclass) => { + return class extends superclass { + get isDefault() { + return this.prop("isDefault", false); + } + + // Define in superclass + // static get defaultConfig() { + // } + + static createDefault() { + return new this.prototype.constructor(this.defaultConfig); + } + }; +}; + +export const TaggableMixin = (superclass) => { + return class extends superclass { + get tags() {return this.prop("tags", [])} + + set tags(array) {this.setProp("tags", array)} + + // only keep unique elements in tags + setTags(array) {this.tags = array.filter((value, index, self) => self.indexOf(value) === index)} + }; +}; + +export const HasMetadataMixin = (superclass) => { + return class extends superclass { + get metadata() {return this.prop("metadata", {})} + + set metadata(object) {this.setProp("metadata", object)} + + updateMetadata(object) {this.metadata = Object.assign({}, this.metadata, object)} + }; +}; + +export const HasDescriptionMixin = (superclass) => { + return class extends superclass { + get description() {return this.prop("description", "")} + + set description(string) {this.setProp("description", string)} + + get descriptionObject() {return this.prop("descriptionObject")} + + set descriptionObject(obj) {this.setProp("descriptionObject", obj)} + }; +}; + +export const NamedEntityMixin = (superclass) => { + return class extends superclass { + get name() { + return this.prop("name", ""); + } + + set name(name) { + this.setProp("name", name); + } + + // to be used when getter is overriden + setName(name) { + this.setProp("name", name); + } + }; +}; diff --git a/src/entity/mixins/repetition.js b/src/entity/mixins/repetition.js new file mode 100644 index 00000000..759063ae --- /dev/null +++ b/src/entity/mixins/repetition.js @@ -0,0 +1,28 @@ +export const HasRepetitionMixin = (superclass) => { + return class extends superclass { + get repetition() { + return this._repetition || 0 + } + + setRepetition(repetition) { + this._repetition = repetition; + + if (["Subworkflow", "Workflow"].find(n => this.constructor.name === n)) { + this.units.forEach(u => u.setRepetition(repetition)); + } + + if (this.constructor.name === "Workflow") { + this.subworkflows.forEach(sw => sw.setRepetition(repetition)); + this.workflows.forEach(wf => wf.setRepetition(repetition)); + } + } + + get totalRepetitions() { + return this._totalRepetitions || 1 + } + + setTotalRepetitions(totalRepetition) { + this._totalRepetitions = totalRepetition; + } + }; +}; diff --git a/src/entity/mixins/runtime_items.js b/src/entity/mixins/runtime_items.js new file mode 100644 index 00000000..a1bacb23 --- /dev/null +++ b/src/entity/mixins/runtime_items.js @@ -0,0 +1,159 @@ +import _ from "underscore"; +import s from "underscore.string"; + +/* + * @summary Contains runtime items: results, monitors, pre/postProcessors + * Is meant to work with Entity, InMemoryEntity b/c of `prop` extraction from `_json`. + */ + +export const RuntimeItemsMixin = (superclass) => { + return class extends superclass { + // converts "string" to {"name": "string"} + _safeMakeNameObjectFromString(name) { + if (!name) return; + let result = name; + if (_.isString(name)) result = {name}; + if (!_.isObject(result) || _.isArray(result) || !result.name) + throw new Error( + "RuntimeItemsMixin._safeMakeNameObjectFromString: failed while creating a named object", + ); + return result; + } + + get results() { + return this.prop("results", this.defaultResults).map((r) => {return this._safeMakeNameObjectFromString(r)}); + } + + get monitors() { + return this.prop("monitors", this.defaultMonitors).map(this._safeMakeNameObjectFromString) + } + + get preProcessors() { + return this.prop("preProcessors", this.defaultPreProcessors).map(this._safeMakeNameObjectFromString) + } + + get postProcessors() { + return this.prop("postProcessors", this.defaultPostProcessors).map(this._safeMakeNameObjectFromString) + } + + get defaultResults() {return []} + + get defaultMonitors() {return []} + + get defaultPreProcessors() {return []} + + get defaultPostProcessors() {return []} + + get hashObjectFromRuntimeItems() { + return { + results: this.results, + preProcessors: this.preProcessors, + postProcessors: this.postProcessors, + }; + } + }; +}; + +export const RuntimeItemsUILogicMixin = (superclass) => { + return class extends RuntimeItemsMixin(superclass) { + constructor(config) { + super(config); + this._initRuntimeItems( + ["results", "monitors", "preProcessors", "postProcessors"], + config, + ); + } + + setRuntimeItemsToDefaultValues() { + ["results", "monitors", "preProcessors", "postProcessors"].map((name) => + this.setProp(name, this[`default${s.capitalize(name)}`]), + ); + } + + /** + * @summary Must pass config for subclasses to override and use initialization logic + * @param keys + * @param config + * @private + */ + _initRuntimeItems(keys, config) { + // keeping this separate from constructor so that it can be overridden in mixing (eg. in `ExecutionUnit`) + const me = this; + keys.map((key) => { + if (!me._json[key]) me._json[key] = me[`default${s.capitalize(key)}`]; + }); + } + + _addRuntimeItem(key = "results", config) { + this._json[key].push(this._safeMakeNameObjectFromString(config)); + } + + _removeRuntimeItem(key = "results", config) { + config = this._safeMakeNameObjectFromString(config); + this._removeRuntimeItemByName(key, config.name); + } + + _removeRuntimeItemByName(key, name) { + this._json[key] = this._json[key].filter(x => x.name !== name); + } + + _toggleRuntimeItem(key = "results", data, isAdding) { + isAdding ? this._addRuntimeItem(key, data) : this._removeRuntimeItem(key, data); + } + + toggleResult(data, isAdding) { + this._toggleRuntimeItem("results", data, isAdding); + } + + toggleMonitor(data, isAdding) { + this._toggleRuntimeItem("monitors", data, isAdding); + } + + togglePreProcessor(data, isAdding) { + this._toggleRuntimeItem("preProcessors", data, isAdding); + } + + togglePostProcessor(data, isAdding) { + this._toggleRuntimeItem("postProcessors", data, isAdding); + } + + get resultNames() { + return this.results.map(r => { + return r && r.name + }) + } + + get monitorNames() { + return this.monitors.map(r => r.name) + } + + get postProcessorNames() { + return this.postProcessors.map(r => r.name) + } + + get preProcessorNames() { + return this.preProcessors.map(r => r.name) + } + + getResultByName(name) { + return this.results.find(r => r.name === name); + } + }; +}; + +// "Placeholder" mixin. Used to indicate the presence of the fields in parent class. +export const RuntimeItemsUIAllowedMixin = (superclass) => { + return class extends superclass { + get allowedResults() { + return []; + } + + get allowedMonitors() { + return []; + } + + get allowedPostProcessors() { + return []; + } + }; +}; diff --git a/src/entity/other.js b/src/entity/other.js index e4f917e7..a01074dc 100644 --- a/src/entity/other.js +++ b/src/entity/other.js @@ -1,29 +1,38 @@ import { mix } from "mixwith"; import { InMemoryEntity } from "./in_memory"; -import { DefaultableMixin, HasMetadataMixin, NamedEntityMixin } from "./mixins"; +import { DefaultableMixin, HasMetadataMixin, NamedEntityMixin } from "./mixins/props"; +import { ContextAndRenderFieldsMixin } from "./mixins/context"; +import { HashedEntityMixin } from "./mixins/hash"; +import { HasRepetitionMixin } from "./mixins/repetition"; +import { RuntimeItemsUILogicMixin, RuntimeItemsUIAllowedMixin } from "./mixins/runtime_items"; -export class DefaultableInMemoryEntity extends mix(InMemoryEntity).with( - DefaultableMixin -) { +export class DefaultableInMemoryEntity extends mix(InMemoryEntity).with(DefaultableMixin) {} -} +export class NamedInMemoryEntity extends mix(InMemoryEntity).with(NamedEntityMixin) {} -export class NamedInMemoryEntity extends mix(InMemoryEntity).with( - NamedEntityMixin -) { - -} export class NamedDefaultableInMemoryEntity extends mix(InMemoryEntity).with( DefaultableMixin, NamedEntityMixin, -) { - -} +) {} export class HasMetadataNamedDefaultableInMemoryEntity extends mix(InMemoryEntity).with( DefaultableMixin, NamedEntityMixin, HasMetadataMixin, -) { +) {} + +export class NamedDefaultableRepetitionContextAndRenderInMemoryEntity extends mix( + InMemoryEntity, +).with(DefaultableMixin, NamedEntityMixin, HasRepetitionMixin, ContextAndRenderFieldsMixin) {} -} +export class NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity extends mix( + InMemoryEntity, +).with( + DefaultableMixin, + NamedEntityMixin, + HasRepetitionMixin, + ContextAndRenderFieldsMixin, + RuntimeItemsUILogicMixin, + RuntimeItemsUIAllowedMixin, + HashedEntityMixin, +) {} From 454a1b94032469a28fe80d174f855745dd8bb8b6 Mon Sep 17 00:00:00 2001 From: tjduigna Date: Thu, 23 Jun 2022 09:36:00 -0400 Subject: [PATCH 2/7] fix: rename entity --- src/entity/index.js | 7 +++++-- src/entity/other.js | 11 ++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/entity/index.js b/src/entity/index.js index 8cbfd8dc..e60c1464 100644 --- a/src/entity/index.js +++ b/src/entity/index.js @@ -7,7 +7,7 @@ import { DefaultableInMemoryEntity, NamedDefaultableInMemoryEntity, HasMetadataNamedDefaultableInMemoryEntity, - NamedDefaultableRepetitionContextAndRenderInMemoryEntity, + NamedDefaultableRepetitionImportantSettingsInMemoryEntity, NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity, } from "./other"; @@ -19,6 +19,8 @@ import { NamedEntityMixin, } from "./mixins/props"; +import { RuntimeContextFieldMixin } from "./mixins/context_runtime"; + import { InMemoryEntitySet } from "./set"; import { ENTITY_SET_TYPES } from "./set/enums"; @@ -37,7 +39,7 @@ export { DefaultableInMemoryEntity, NamedDefaultableInMemoryEntity, HasMetadataNamedDefaultableInMemoryEntity, - NamedDefaultableRepetitionContextAndRenderInMemoryEntity, + NamedDefaultableRepetitionImportantSettingsInMemoryEntity, NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity, DefaultableMixin, @@ -45,6 +47,7 @@ export { HasMetadataMixin, TaggableMixin, NamedEntityMixin, + RuntimeContextFieldMixin, InMemoryEntitySet, ENTITY_SET_TYPES, diff --git a/src/entity/other.js b/src/entity/other.js index a01074dc..dbc7890c 100644 --- a/src/entity/other.js +++ b/src/entity/other.js @@ -1,7 +1,7 @@ import { mix } from "mixwith"; import { InMemoryEntity } from "./in_memory"; import { DefaultableMixin, HasMetadataMixin, NamedEntityMixin } from "./mixins/props"; -import { ContextAndRenderFieldsMixin } from "./mixins/context"; +import { ContextAndRenderFieldsMixin, ImportantSettingsProviderMixin } from "./mixins/context"; import { HashedEntityMixin } from "./mixins/hash"; import { HasRepetitionMixin } from "./mixins/repetition"; import { RuntimeItemsUILogicMixin, RuntimeItemsUIAllowedMixin } from "./mixins/runtime_items"; @@ -21,9 +21,14 @@ export class HasMetadataNamedDefaultableInMemoryEntity extends mix(InMemoryEntit HasMetadataMixin, ) {} -export class NamedDefaultableRepetitionContextAndRenderInMemoryEntity extends mix( +export class NamedDefaultableRepetitionImportantSettingsInMemoryEntity extends mix( InMemoryEntity, -).with(DefaultableMixin, NamedEntityMixin, HasRepetitionMixin, ContextAndRenderFieldsMixin) {} +).with( + DefaultableMixin, + NamedEntityMixin, + HasRepetitionMixin, + ImportantSettingsProviderMixin, +) {} export class NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity extends mix( InMemoryEntity, From fbabe601cc37e66fd322da420a0a0c725eba9e1c Mon Sep 17 00:00:00 2001 From: tjduigna Date: Thu, 30 Jun 2022 13:59:31 -0400 Subject: [PATCH 3/7] fix: base class for unit --- src/entity/index.js | 4 ++-- src/entity/other.js | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/entity/index.js b/src/entity/index.js index e60c1464..addf5172 100644 --- a/src/entity/index.js +++ b/src/entity/index.js @@ -8,7 +8,7 @@ import { NamedDefaultableInMemoryEntity, HasMetadataNamedDefaultableInMemoryEntity, NamedDefaultableRepetitionImportantSettingsInMemoryEntity, - NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity, + NamedDefaultableRepetitionRuntimeItemsImportantSettingsContextAndRenderHashedInMemoryEntity, } from "./other"; import { @@ -40,7 +40,7 @@ export { NamedDefaultableInMemoryEntity, HasMetadataNamedDefaultableInMemoryEntity, NamedDefaultableRepetitionImportantSettingsInMemoryEntity, - NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity, + NamedDefaultableRepetitionRuntimeItemsImportantSettingsContextAndRenderHashedInMemoryEntity DefaultableMixin, HasDescriptionMixin, diff --git a/src/entity/other.js b/src/entity/other.js index dbc7890c..fbdba8e3 100644 --- a/src/entity/other.js +++ b/src/entity/other.js @@ -30,14 +30,15 @@ export class NamedDefaultableRepetitionImportantSettingsInMemoryEntity extends m ImportantSettingsProviderMixin, ) {} -export class NamedDefaultableRepetitionRuntimeContextAndRenderInMemoryEntity extends mix( +export class NamedDefaultableRepetitionRuntimeItemsImportantSettingsContextAndRenderHashedInMemoryEntity extends mix( InMemoryEntity, ).with( - DefaultableMixin, NamedEntityMixin, + DefaultableMixin, HasRepetitionMixin, - ContextAndRenderFieldsMixin, RuntimeItemsUILogicMixin, RuntimeItemsUIAllowedMixin, + ImportantSettingsProviderMixin, + ContextAndRenderFieldsMixin, HashedEntityMixin, ) {} From ca79533e06207dc62e3717fa7df42619e693c685 Mon Sep 17 00:00:00 2001 From: tjduigna Date: Thu, 30 Jun 2022 14:16:15 -0400 Subject: [PATCH 4/7] feat: add base class for workflow --- src/entity/index.js | 4 +++- src/entity/other.js | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/entity/index.js b/src/entity/index.js index addf5172..fbabe213 100644 --- a/src/entity/index.js +++ b/src/entity/index.js @@ -7,6 +7,7 @@ import { DefaultableInMemoryEntity, NamedDefaultableInMemoryEntity, HasMetadataNamedDefaultableInMemoryEntity, + NamedDefaultableRepetitionContextAndRenderInMemoryEntity, NamedDefaultableRepetitionImportantSettingsInMemoryEntity, NamedDefaultableRepetitionRuntimeItemsImportantSettingsContextAndRenderHashedInMemoryEntity, } from "./other"; @@ -39,8 +40,9 @@ export { DefaultableInMemoryEntity, NamedDefaultableInMemoryEntity, HasMetadataNamedDefaultableInMemoryEntity, + NamedDefaultableRepetitionContextAndRenderInMemoryEntity, NamedDefaultableRepetitionImportantSettingsInMemoryEntity, - NamedDefaultableRepetitionRuntimeItemsImportantSettingsContextAndRenderHashedInMemoryEntity + NamedDefaultableRepetitionRuntimeItemsImportantSettingsContextAndRenderHashedInMemoryEntity, DefaultableMixin, HasDescriptionMixin, diff --git a/src/entity/other.js b/src/entity/other.js index fbdba8e3..c516205b 100644 --- a/src/entity/other.js +++ b/src/entity/other.js @@ -30,6 +30,15 @@ export class NamedDefaultableRepetitionImportantSettingsInMemoryEntity extends m ImportantSettingsProviderMixin, ) {} +export class NamedDefaultableRepetitionContextAndRenderInMemoryEntity extends mix( + InMemoryEntity, +).with( + DefaultableMixin, + NamedEntityMixin, + HasRepetitionMixin, + ContextAndRenderFieldsMixin, +) {} + export class NamedDefaultableRepetitionRuntimeItemsImportantSettingsContextAndRenderHashedInMemoryEntity extends mix( InMemoryEntity, ).with( From 99dab19985313f193011638eb06ae87c7c9a6f91 Mon Sep 17 00:00:00 2001 From: tjduigna Date: Thu, 30 Jun 2022 14:30:28 -0400 Subject: [PATCH 5/7] fix: clean and export runtime items mixin --- src/entity/index.js | 2 ++ src/entity/mixins/runtime_items.js | 25 ++++++++----------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/entity/index.js b/src/entity/index.js index fbabe213..bdd97f18 100644 --- a/src/entity/index.js +++ b/src/entity/index.js @@ -20,6 +20,7 @@ import { NamedEntityMixin, } from "./mixins/props"; +import { RuntimeItemsMixin } from "./mixins/runtime_items"; import { RuntimeContextFieldMixin } from "./mixins/context_runtime"; import { InMemoryEntitySet } from "./set"; @@ -49,6 +50,7 @@ export { HasMetadataMixin, TaggableMixin, NamedEntityMixin, + RuntimeItemsMixin, RuntimeContextFieldMixin, InMemoryEntitySet, diff --git a/src/entity/mixins/runtime_items.js b/src/entity/mixins/runtime_items.js index a1bacb23..d90d8bb4 100644 --- a/src/entity/mixins/runtime_items.js +++ b/src/entity/mixins/runtime_items.js @@ -1,6 +1,8 @@ import _ from "underscore"; import s from "underscore.string"; +import { safeMakeObject } from "../../utils/object"; + /* * @summary Contains runtime items: results, monitors, pre/postProcessors * Is meant to work with Entity, InMemoryEntity b/c of `prop` extraction from `_json`. @@ -8,32 +10,21 @@ import s from "underscore.string"; export const RuntimeItemsMixin = (superclass) => { return class extends superclass { - // converts "string" to {"name": "string"} - _safeMakeNameObjectFromString(name) { - if (!name) return; - let result = name; - if (_.isString(name)) result = {name}; - if (!_.isObject(result) || _.isArray(result) || !result.name) - throw new Error( - "RuntimeItemsMixin._safeMakeNameObjectFromString: failed while creating a named object", - ); - return result; - } get results() { - return this.prop("results", this.defaultResults).map((r) => {return this._safeMakeNameObjectFromString(r)}); + return this.prop("results", this.defaultResults).map(safeMakeObject); } get monitors() { - return this.prop("monitors", this.defaultMonitors).map(this._safeMakeNameObjectFromString) + return this.prop("monitors", this.defaultMonitors).map(safeMakeObject); } get preProcessors() { - return this.prop("preProcessors", this.defaultPreProcessors).map(this._safeMakeNameObjectFromString) + return this.prop("preProcessors", this.defaultPreProcessors).map(safeMakeObject); } get postProcessors() { - return this.prop("postProcessors", this.defaultPostProcessors).map(this._safeMakeNameObjectFromString) + return this.prop("postProcessors", this.defaultPostProcessors).map(safeMakeObject); } get defaultResults() {return []} @@ -85,11 +76,11 @@ export const RuntimeItemsUILogicMixin = (superclass) => { } _addRuntimeItem(key = "results", config) { - this._json[key].push(this._safeMakeNameObjectFromString(config)); + this._json[key].push(safeMakeObject(config)); } _removeRuntimeItem(key = "results", config) { - config = this._safeMakeNameObjectFromString(config); + config = safeMakeObject(config); this._removeRuntimeItemByName(key, config.name); } From a1e8432fae583c92be877f4f60d90659c8da6daf Mon Sep 17 00:00:00 2001 From: tjduigna Date: Thu, 30 Jun 2022 15:59:19 -0400 Subject: [PATCH 6/7] fix: export hashed input array --- src/entity/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/entity/index.js b/src/entity/index.js index bdd97f18..12f089af 100644 --- a/src/entity/index.js +++ b/src/entity/index.js @@ -20,6 +20,7 @@ import { NamedEntityMixin, } from "./mixins/props"; +import { HashedInputArrayMixin } from "./mixins/hash"; import { RuntimeItemsMixin } from "./mixins/runtime_items"; import { RuntimeContextFieldMixin } from "./mixins/context_runtime"; @@ -52,6 +53,7 @@ export { NamedEntityMixin, RuntimeItemsMixin, RuntimeContextFieldMixin, + HashedInputArrayMixin, InMemoryEntitySet, ENTITY_SET_TYPES, From 8d1c8aef290348c65ed5ef07dea60326b6542d82 Mon Sep 17 00:00:00 2001 From: tjduigna Date: Fri, 1 Jul 2022 16:05:57 -0400 Subject: [PATCH 7/7] fix: remove circular logic in constructor --- src/entity/mixins/runtime_items.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/entity/mixins/runtime_items.js b/src/entity/mixins/runtime_items.js index d90d8bb4..5bc44bae 100644 --- a/src/entity/mixins/runtime_items.js +++ b/src/entity/mixins/runtime_items.js @@ -47,13 +47,6 @@ export const RuntimeItemsMixin = (superclass) => { export const RuntimeItemsUILogicMixin = (superclass) => { return class extends RuntimeItemsMixin(superclass) { - constructor(config) { - super(config); - this._initRuntimeItems( - ["results", "monitors", "preProcessors", "postProcessors"], - config, - ); - } setRuntimeItemsToDefaultValues() { ["results", "monitors", "preProcessors", "postProcessors"].map((name) =>