diff --git a/build.sh b/build.sh new file mode 100755 index 00000000..b3ece62c --- /dev/null +++ b/build.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +# Update everything (just in case) +npm rebuild +npm install --no-optional + +# Built and test +grunt --production --force diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 09870362..2bdc9b85 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -37,6 +37,7 @@ "grunt-notify": "~0.4.5", "grunt-replace": "~1.0.1", "grunt-sonar-runner": "2.4.8", + "grunt-stylelint": "0.16.0", "grunt-webpack": "~4.0.3", "json2csv": "~3.8.0", "karma": "~1", @@ -56,6 +57,7 @@ "serve-index": "~1.8.0", "serve-static": "~1.11.2", "sonar-web-frontend-reporters": "~3.2.0", + "stylelint": "^13.13.1", "terser-webpack-plugin": "~4.2.3", "url-loader": "~4.1.1", "webpack": "~4.46.0", @@ -237,6 +239,12 @@ "@babel/types": "^7.15.4" } }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true + }, "@babel/helper-hoist-variables": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", @@ -345,6 +353,12 @@ "@babel/types": "^7.15.4" } }, + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true + }, "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", @@ -1235,6 +1249,48 @@ "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1348,6 +1404,251 @@ "picomatch": "^2.2.2" } }, + "@stylelint/postcss-css-in-js": { + "version": "0.37.3", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz", + "integrity": "sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==", + "dev": true, + "requires": { + "@babel/core": "^7.17.9" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + } + }, + "@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true + }, + "@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + } + }, + "@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "requires": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true + }, + "@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "requires": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + } + }, + "@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.28.5" + } + }, + "@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + } + }, + "@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + } + }, + "@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + } + }, + "browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "requires": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true + }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", + "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", + "dev": true, + "requires": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + } + }, "@surma/rollup-plugin-off-main-thread": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", @@ -1380,18 +1681,45 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dev": true, + "requires": { + "@types/unist": "^2" + } + }, "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, + "@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, "@types/node": { "version": "16.9.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -1407,6 +1735,12 @@ "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", "dev": true }, + "@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -1968,6 +2302,12 @@ "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", "dev": true }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -2042,6 +2382,12 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -2084,6 +2430,45 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2206,6 +2591,12 @@ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "dev": true }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2297,6 +2688,12 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, + "baseline-browser-mapping": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz", + "integrity": "sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==", + "dev": true + }, "batch": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", @@ -2922,6 +3319,24 @@ "upper-case-first": "^1.1.0" } }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true + }, "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", @@ -3215,6 +3630,23 @@ } } }, + "clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "dev": true, + "requires": { + "is-regexp": "^2.0.0" + }, + "dependencies": { + "is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true + } + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3634,6 +4066,33 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "dependencies": { + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + } + } + }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -3924,6 +4383,16 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + } + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -4946,6 +5415,15 @@ "strip-eof": "^1.0.0" } }, + "execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "requires": { + "clone-regexp": "^2.1.0" + } + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -5242,6 +5720,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -5469,6 +5953,12 @@ } } }, + "flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -6011,6 +6501,34 @@ "ini": "^1.3.4" } }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -6038,6 +6556,12 @@ } } }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, "globule": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", @@ -6065,6 +6589,15 @@ } } }, + "gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "gonzales-pe-sl": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz", @@ -6417,23 +6950,83 @@ "integrity": "sha1-jGo5MChN51IVBN6Dcb+DzR/CuYM=", "dev": true }, - "grunt-webpack": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-4.0.3.tgz", - "integrity": "sha512-hRnTf7y9pe4K+M/AKUJFgHykZeyIOUHhZSMVD0/jF/uXphMCen7txPIz8IOnJoa6bX0JrpoueOwo7FgS/OtC2Q==", - "dev": true, - "requires": { - "deep-for-each": "^3.0.0", - "lodash": "^4.17.19" - } - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "grunt-stylelint": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.16.0.tgz", + "integrity": "sha512-ullm0h9iCdgPEDq1TNwKL5HteXA4zke6wbYoRtsO32ATCU3zfUXmDN9unhu+joEcdgJKOPcd2+7UhRNXO1rr+w==", "dev": true, "requires": { - "minimist": "^1.2.5", + "chalk": "^4.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "grunt-webpack": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-4.0.3.tgz", + "integrity": "sha512-hRnTf7y9pe4K+M/AKUJFgHykZeyIOUHhZSMVD0/jF/uXphMCen7txPIz8IOnJoa6bX0JrpoueOwo7FgS/OtC2Q==", + "dev": true, + "requires": { + "deep-for-each": "^3.0.0", + "lodash": "^4.17.19" + } + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", "source-map": "^0.6.1", "uglify-js": "^3.1.4", @@ -6477,6 +7070,12 @@ "har-schema": "^2.0.0" } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6703,6 +7302,12 @@ "uglify-js": "2.6.x" } }, + "html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true + }, "htmlhint": { "version": "0.9.13", "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.9.13.tgz", @@ -6992,6 +7597,24 @@ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, + "import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -7109,6 +7732,22 @@ "kind-of": "^3.0.2" } }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7157,6 +7796,12 @@ "kind-of": "^3.0.2" } }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -7224,6 +7869,12 @@ "is-extglob": "^2.1.1" } }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true + }, "is-installed-globally": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", @@ -7321,6 +7972,12 @@ "path-is-inside": "^1.0.2" } }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -7392,6 +8049,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-upper-case": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", @@ -7688,12 +8351,24 @@ } } }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -7972,6 +8647,15 @@ } } }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -8138,6 +8822,12 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", @@ -8343,12 +9033,79 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "log4js": { "version": "0.6.38", "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", @@ -8397,6 +9154,12 @@ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -8509,6 +9272,12 @@ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -8520,6 +9289,39 @@ "safe-buffer": "^5.1.2" } }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true + }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", @@ -8625,6 +9427,16 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, "micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -8680,6 +9492,12 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "mini-css-extract-plugin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", @@ -8742,6 +9560,31 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, "minipass": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", @@ -9310,6 +10153,18 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==", + "dev": true + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -9346,6 +10201,12 @@ "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", "dev": true }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -9691,6 +10552,23 @@ "no-case": "^2.2.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-asn1": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", @@ -9704,6 +10582,20 @@ "safe-buffer": "^5.1.1" } }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -9886,6 +10778,12 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -9945,34 +10843,82 @@ "source-map-js": "^0.6.2" } }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", "dev": true, "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "htmlparser2": "^3.10.0" } }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", + "postcss": "^7.0.14" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, @@ -9980,6 +10926,112 @@ "icss-utils": "^5.0.0" } }, + "postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "requires": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "requires": { + "postcss": "^7.0.6" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "postcss-selector-parser": { "version": "6.0.6", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", @@ -9990,6 +11042,12 @@ "util-deprecate": "^1.0.2" } }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true + }, "postcss-value-parser": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", @@ -10217,6 +11275,12 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -10880,6 +11944,35 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dev": true, + "requires": { + "mdast-util-to-markdown": "^0.6.0" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -13079,6 +14172,12 @@ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -13394,6 +14493,576 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "stylelint": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", + "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", + "dev": true, + "requires": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^2.0.0", + "chalk": "^4.1.1", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.3", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.4", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.5", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.6.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "dependencies": { + "fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + } + }, + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + } + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", + "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -13403,6 +15072,12 @@ "has-flag": "^3.0.0" } }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, "swap-case": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", @@ -13794,6 +15469,12 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true + }, "true-case-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", @@ -13906,6 +15587,15 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", @@ -13988,6 +15678,28 @@ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, + "unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -14027,6 +15739,30 @@ "crypto-random-string": "^1.0.0" } }, + "unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", + "dev": true, + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -14124,6 +15860,24 @@ } } }, + "update-browserslist-db": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "dev": true, + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "dependencies": { + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + } + } + }, "update-notifier": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", @@ -14353,6 +16107,36 @@ } } }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + } + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -16121,6 +17905,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", @@ -16180,6 +17970,12 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true } } } diff --git a/src/requisition-convert-to-order/convert-to-order.controller.js b/src/requisition-convert-to-order/convert-to-order.controller.js deleted file mode 100644 index 298ab456..00000000 --- a/src/requisition-convert-to-order/convert-to-order.controller.js +++ /dev/null @@ -1,384 +0,0 @@ -/* - * This program is part of the OpenLMIS logistics management information system platform software. - * Copyright © 2017 VillageReach - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - *   - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  - * See the GNU Affero General Public License for more details. You should have received a copy of - * the GNU Affero General Public License along with this program. If not, see - * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  - */ - -(function() { - - 'use strict'; - - /** - * @ngdoc controller - * @name requisition-convert-to-order.controller:ConvertToOrderController - * - * @description - * Controller for converting requisitions to orders. - */ - - angular - .module('requisition-convert-to-order') - .controller('ConvertToOrderController', ConvertToOrderController); - - ConvertToOrderController.$inject = [ - '$stateParams', 'requisitionService', 'notificationService', 'facilities', 'programs', - 'confirmService', 'loadingModalService', 'requisitions', '$state', 'UuidGenerator', '$window' - ]; - - function ConvertToOrderController($stateParams, requisitionService, notificationService, facilities, programs, - confirmService, loadingModalService, requisitions, $state, UuidGenerator, - $window) { - - var vm = this, - uuidGenerator = new UuidGenerator(), - key = uuidGenerator.generate(); - - vm.$onInit = function() { - if ($stateParams.storageKey === undefined) { - $stateParams.storageKey = uuidGenerator.generate(); - $state.go($state.current.name, $stateParams, { - reload: false, - notify: false - }); - } - - vm.selectedRequisitionsStorageKey = 'requisition-convert-to-order/selected-requisitions/' - + $stateParams.storageKey; - - loadPreviouslySelectedRequisitions(); - }; - - vm.convertToOrder = convertToOrder; - vm.releaseWithoutOrder = releaseWithoutOrder; - vm.getSelected = getSelected; - vm.toggleSelectAll = toggleSelectAll; - vm.setSelectAll = setSelectAll; - vm.onRequisitionSelect = onRequisitionSelect; - vm.search = search; - vm.$window = $window; - - /** - * @ngdoc property - * @propertyOf requisition-convert-to-order.controller:ConvertToOrderController - * @name requisitions - * @type {Array} - * - * @description - * Holds requisitions that will be displayed on screen. - */ - vm.requisitions = requisitions; - - /** - * @ngdoc property - * @propertyOf requisition-convert-to-order.controller:ConvertToOrderController - * @name facilities - * @type {Array} - * - * @description - * Holds facilities for program select. - */ - vm.facilities = facilities; - - /** - * @ngdoc property - * @propertyOf requisition-convert-to-order.controller:ConvertToOrderController - * @name programs - * @type {Array} - * - * @description - * Holds programs for program select. - */ - vm.programs = programs; - - /** - * @ngdoc property - * @propertyOf requisition-convert-to-order.controller:ConvertToOrderController - * @name programId - * @type {String} - * - * @description - * Holds program id filter. - */ - vm.programId = $stateParams.programId; - - /** - * @ngdoc property - * @propertyOf requisition-convert-to-order.controller:ConvertToOrderController - * @name facilityId - * @type {String} - * - * @description - * Holds filter value. - */ - vm.facilityId = $stateParams.facilityId; - - /** - * @ngdoc property - * @propertyOf requisition-convert-to-order.controller:ConvertToOrderController - * @name sort - * @type {String} - * - * @description - * Holds field to sort by. - */ - vm.sort = $stateParams.sort; - - /** - * @ngdoc property - * @propertyOf requisition-convert-to-order.controller:ConvertToOrderController - * @name infoMessage - * @type {Object} - * - * @description - * Holds message that should be displayed to user. - */ - vm.infoMessage = getInfoMessage(); - - /** - * @ngdoc property - * @propertyOf requisition-convert-to-order.controller:ConvertToOrderController - * @name selectAll - * @type {Boolean} - * - * @description - * Indicates if all requisitions from list all selected or not. - */ - vm.selectAll = false; - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name getSelected - * - * @description - * Returns a list of requisitions selected by user, that are supposed to be converted to - * orders. - * - * @return {Array} list of selected requisitions - */ - function getSelected() { - var storageSelected = $window.sessionStorage.getItem(vm.selectedRequisitionsStorageKey); - - storageSelected = storageSelected ? JSON.parse(storageSelected) : {}; - - var selected = []; - - for (var requisitionId in storageSelected) { - if (storageSelected.hasOwnProperty(requisitionId)) { - selected.push(storageSelected[requisitionId]); - } - } - - angular.forEach(vm.requisitions, function(requisition) { - if (requisition.$selected && storageSelected[requisition.requisition.id] === undefined) { - selected.push(requisition); - } - }); - - return selected; - } - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name toggleSelectAll - * - * @description - * Responsible for marking/unmarking all requisitions as selected. - * - * @param {Boolean} selectAll Determines if all requisitions should be selected or not - */ - function toggleSelectAll(selectAll) { - angular.forEach(vm.requisitions, function(requisition) { - requisition.$selected = selectAll; - vm.onRequisitionSelect(requisition); - }); - } - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name setSelectAll - * - * @description - * Responsible for making the checkbox "select all" checked when all requisitions are - * selected by user. - */ - function setSelectAll() { - var value = true; - angular.forEach(vm.requisitions, function(requisition) { - value = value && requisition.$selected; - }); - vm.selectAll = value; - } - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name loadPreviouslySelectedRequisitions - * - * @description - * Selects checkboxes on current page if checked before - */ - function loadPreviouslySelectedRequisitions() { - var storageRequisitions = $window.sessionStorage.getItem(vm.selectedRequisitionsStorageKey); - storageRequisitions = storageRequisitions ? JSON.parse(storageRequisitions) : {}; - - for (var i = 0; i < vm.requisitions.length; i++) { - var r = vm.requisitions[i].requisition; - - if (storageRequisitions[r.id] !== undefined) { - vm.requisitions[i].$selected = true; - } - } - - setSelectAll(); - } - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name onRequisitionSelect - * - * @description - * Syncs requisition selection with storage - */ - function onRequisitionSelect(requisition) { - var storageRequisitions = $window.sessionStorage.getItem(vm.selectedRequisitionsStorageKey); - - storageRequisitions = storageRequisitions ? JSON.parse(storageRequisitions) : {}; - - var requisitionId = requisition.requisition.id; - - if (requisition.$selected) { - storageRequisitions[requisitionId] = requisition; - } else { - delete storageRequisitions[requisitionId]; - } - - $window.sessionStorage.setItem( - vm.selectedRequisitionsStorageKey, JSON.stringify(storageRequisitions) - ); - - setSelectAll(); - } - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name convertToOrder - * - * @description - * Responsible for converting selected requisitions to orders. - */ - function convertToOrder() { - release(true); - } - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name releaseWithoutOrder - * - * @description - * Responsible for releasing selected requisitions without creating orders. - */ - function releaseWithoutOrder() { - release(false); - } - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name getInfoMessage - * - * @description - * Responsible for setting proper info message to display to user. - * - * @return {Object} message that should be displayed to user - */ - function getInfoMessage() { - if (!vm.requisitions.length) { - return 'requisitionConvertToOrder.noSearchResults'; - } - return undefined; - } - - /** - * @ngdoc method - * @methodOf requisition-convert-to-order.controller:ConvertToOrderController - * @name search - * - * @description - * Reloads the page with new search parameters. - */ - function search() { - var stateParams = angular.copy($stateParams); - - stateParams.programId = vm.programId; - stateParams.facilityId = vm.facilityId; - stateParams.sort = vm.sort; - - $state.go('openlmis.requisitions.convertToOrder', stateParams, { - reload: true - }); - } - - function release(withOrder) { - var requisitions = getSelected(); - if (requisitions.length > 0) { - var missingDepots = requisitions - .filter(function(item) { - return !item.requisition.supplyingFacility; - }); - if (missingDepots.length > 0) { - notificationService.error('requisitionConvertToOrder.noSupplyingDepotSelected'); - } else { - confirmService.confirm(withOrder ? - 'requisitionConvertToOrder.convertToOrder.confirm' : - 'requisitionConvertToOrder.releaseWithoutOrder.confirm') - .then(function() { - loadingModalService.open(); - - var promise = withOrder ? - requisitionService.convertToOrder(requisitions, key) : - requisitionService.releaseWithoutOrder(requisitions, key); - - promise - .then(function() { - notificationService.success(withOrder ? - 'requisitionConvertToOrder.convertToOrder.success' : - 'requisitionConvertToOrder.releaseWithoutOrder.success'); - }) - .catch(function() { - loadingModalService.close(); - notificationService.error('requisitionConvertToOrder.errorOccurred'); - key = uuidGenerator.generate(); - }) - .finally(function() { - vm.$window.sessionStorage.removeItem(vm.selectedRequisitionsStorageKey); - - $state.go($state.current.name, $stateParams, { - reload: true - }); - }); - }); - } - } else { - withOrder ? - notificationService.error('requisitionConvertToOrder.selectAtLeastOneRnr') : - notificationService.error('requisitionConvertToOrder.selectAtLeastOneRnrWithoutOrder'); - } - } - } - -})(); diff --git a/src/requisition-convert-to-order/convert-to-order.controller.spec.js b/src/requisition-convert-to-order/convert-to-order.controller.spec.js deleted file mode 100644 index 21fa6740..00000000 --- a/src/requisition-convert-to-order/convert-to-order.controller.spec.js +++ /dev/null @@ -1,643 +0,0 @@ -/* - * This program is part of the OpenLMIS logistics management information system platform software. - * Copyright © 2017 VillageReach - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - *   - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  - * See the GNU Affero General Public License for more details. You should have received a copy of - * the GNU Affero General Public License along with this program. If not, see - * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  - */ - -describe('ConvertToOrderController', function() { - - var UuidGenerator, ProgramDataBuilder, FacilityDataBuilder; - - beforeEach(function() { - module('requisition-convert-to-order', function($provide) { - $provide.value('featureFlagService', { - set: function() {}, - get: function() {} - }); - }); - module('requisition-view-tab'); - - inject(function($injector) { - this.$q = $injector.get('$q'); - this.$rootScope = $injector.get('$rootScope'); - this.requisitionService = $injector.get('requisitionService'); - this.notificationService = $injector.get('notificationService'); - this.$state = $injector.get('$state'); - this.confirmService = $injector.get('confirmService'); - this.loadingModalService = $injector.get('loadingModalService'); - - UuidGenerator = $injector.get('UuidGenerator'); - ProgramDataBuilder = $injector.get('ProgramDataBuilder'); - FacilityDataBuilder = $injector.get('FacilityDataBuilder'); - - this.key = 'key'; - this.generatedControllerKey = 'requisition-convert-to-order/selected-requisitions/' - + this.key; - spyOn(UuidGenerator.prototype, 'generate').andCallFake(function() { - return 'key'; - }); - - this.stateParams = { - programId: 'program-id', - facilityId: 'facility-id', - page: 0, - size: 10 - }; - this.supplyingDepots = [ - new FacilityDataBuilder().build(), - new FacilityDataBuilder().build() - ]; - this.facilities = [ - new FacilityDataBuilder().build(), - new FacilityDataBuilder().build() - ]; - this.programs = [ - new ProgramDataBuilder().build(), - new ProgramDataBuilder().build() - ]; - this.requisitions = [ - { - requisition: { - id: 'requisitionId1', - facility: new FacilityDataBuilder().build(), - program: new ProgramDataBuilder().build() - }, - supplyingDepots: this.supplyingDepots - }, - { - requisition: { - id: 'requisitonId2', - facility: new FacilityDataBuilder().build(), - program: new ProgramDataBuilder().build() - }, - supplyingDepots: this.supplyingDepots - } - ]; - - var window = $injector.get('$window'); - - this.vm = $injector.get('$controller')('ConvertToOrderController', { - requisitions: this.requisitions, - $stateParams: this.stateParams, - facilities: this.facilities, - programs: this.programs, - $window: window - }); - }); - }); - - afterEach(function() { - inject(function($injector) { - var selected = this.vm.getSelected(); - for (var i = 0; i < selected.length; i++) { - selected[i].$selected = false; - this.vm.onRequisitionSelect(selected[i]); - } - - $injector.get('$window').sessionStorage.clear(); - }); - }); - - it('should assign facilities', function() { - expect(this.vm.facilities).toEqual(this.facilities); - }); - - it('should assign programs', function() { - expect(this.vm.programs).toEqual(this.programs); - }); - - it('should get all selected requisitions', function() { - this.vm.requisitions[0].$selected = true; - - var selectedRequisitions = this.vm.getSelected(); - - expect(selectedRequisitions).toEqual([this.requisitions[0]]); - }); - - it('should get an empty array if no requisition is selected', function() { - var selectedRequisitions = this.vm.getSelected(); - - expect(selectedRequisitions).toEqual([]); - }); - - describe('convertToOrder', function() { - var confirmDeferred, convertDeferred, loadingDeferred; - - beforeEach(function() { - confirmDeferred = this.$q.defer(); - convertDeferred = this.$q.defer(); - loadingDeferred = this.$q.defer(); - - spyOn(this.loadingModalService, 'open').andReturn(loadingDeferred.promise); - spyOn(this.loadingModalService, 'close').andReturn(); - spyOn(this.confirmService, 'confirm').andReturn(confirmDeferred.promise); - spyOn(this.requisitionService, 'convertToOrder').andReturn(convertDeferred.promise); - spyOn(this.notificationService, 'error').andReturn(); - spyOn(this.notificationService, 'success').andReturn(); - }); - - it('should show error if no requisition is selected', function() { - this.vm.convertToOrder(); - - expect(this.notificationService.error) - .toHaveBeenCalledWith('requisitionConvertToOrder.selectAtLeastOneRnr'); - }); - - it('should not call requisitionService if no requisition is selected', function() { - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.requisitionService.convertToOrder).not.toHaveBeenCalled(); - }); - - it('should show error if requisition does not have facility selected', function() { - this.vm.requisitions[0].$selected = true; - - this.vm.convertToOrder(); - - expect(this.notificationService.error) - .toHaveBeenCalledWith('requisitionConvertToOrder.noSupplyingDepotSelected'); - }); - - it('should not call requisitionService if requisition does not have facility selected', function() { - this.vm.requisitions[0].$selected = true; - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.requisitionService.convertToOrder).not.toHaveBeenCalled(); - }); - - it('should call confirmation modal', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.confirmService.confirm) - .toHaveBeenCalledWith('requisitionConvertToOrder.convertToOrder.confirm'); - }); - - it('should bring up loading modal if confirmation passed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.loadingModalService.open).toHaveBeenCalled(); - }); - - it('should call requisitionService if confirmation passed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - var requisition = this.vm.requisitions[0], - key = this.key; - - expect(this.requisitionService.convertToOrder).toHaveBeenCalledWith([ - requisition - ], key); - }); - - it('should show alert if convert passed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - loadingDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.notificationService.success) - .toHaveBeenCalledWith('requisitionConvertToOrder.convertToOrder.success'); - }); - - it('should show error if convert failed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.reject(); - this.$rootScope.$apply(); - - expect(this.notificationService.error) - .toHaveBeenCalledWith('requisitionConvertToOrder.errorOccurred'); - }); - - it('should close loading modal if convert failed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.reject(); - this.$rootScope.$apply(); - - expect(this.loadingModalService.close).toHaveBeenCalled(); - }); - - it('should clear selected requisitions if convert passed', function() { - // INFO: Needed to not call vm.onInit() - this.vm.selectedRequisitionsStorageKey = this.generatedControllerKey; - - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - this.vm.onRequisitionSelect(this.vm.requisitions[0]); - - expect(this.vm.$window.sessionStorage.getItem(this.generatedControllerKey)) - .not.toBe(null); - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - loadingDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.vm.$window.sessionStorage.getItem(this.generatedControllerKey)) - .toBe(null); - }); - - it('should clear selected requisitions if convert failed', function() { - // INFO: Needed to not call vm.onInit() - this.vm.selectedRequisitionsStorageKey = this.generatedControllerKey; - - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - this.vm.onRequisitionSelect(this.vm.requisitions[0]); - - expect(this.vm.$window.sessionStorage.getItem(this.generatedControllerKey)) - .not.toBe(null); - - this.vm.convertToOrder(); - confirmDeferred.resolve(); - convertDeferred.reject(); - this.$rootScope.$apply(); - - expect(this.vm.$window.sessionStorage.getItem(this.generatedControllerKey)).toBe(null); - }); - - }); - - describe('releaseWithoutOrder', function() { - var confirmDeferred, convertDeferred, loadingDeferred; - - beforeEach(function() { - confirmDeferred = this.$q.defer(); - convertDeferred = this.$q.defer(); - loadingDeferred = this.$q.defer(); - - spyOn(this.loadingModalService, 'open').andReturn(loadingDeferred.promise); - spyOn(this.loadingModalService, 'close').andReturn(); - spyOn(this.confirmService, 'confirm').andReturn(confirmDeferred.promise); - spyOn(this.requisitionService, 'releaseWithoutOrder').andReturn(convertDeferred.promise); - spyOn(this.notificationService, 'error').andReturn(); - spyOn(this.notificationService, 'success').andReturn(); - }); - - it('should show error if no requisition is selected', function() { - this.vm.releaseWithoutOrder(); - - expect(this.notificationService.error) - .toHaveBeenCalledWith('requisitionConvertToOrder.selectAtLeastOneRnrWithoutOrder'); - }); - - it('should not call requisitionService if no requisition is selected', function() { - this.vm.releaseWithoutOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.requisitionService.releaseWithoutOrder).not.toHaveBeenCalled(); - }); - - it('should show error if requisition does not have facility selected', function() { - this.vm.requisitions[0].$selected = true; - - this.vm.releaseWithoutOrder(); - - expect(this.notificationService.error) - .toHaveBeenCalledWith('requisitionConvertToOrder.noSupplyingDepotSelected'); - }); - - it('should not call requisitionService if requisition does not have facility selected', function() { - this.vm.requisitions[0].$selected = true; - - this.vm.releaseWithoutOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.requisitionService.releaseWithoutOrder).not.toHaveBeenCalled(); - }); - - it('should call confirmation modal', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.releaseWithoutOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.confirmService.confirm) - .toHaveBeenCalledWith('requisitionConvertToOrder.releaseWithoutOrder.confirm'); - }); - - it('should bring up loading modal if confirmation passed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.releaseWithoutOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.loadingModalService.open).toHaveBeenCalled(); - }); - - it('should call requisitionService if confirmation passed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.releaseWithoutOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - - var requisition = this.vm.requisitions[0], - key = this.key; - - expect(this.requisitionService.releaseWithoutOrder).toHaveBeenCalledWith([ - requisition - ], key); - }); - - it('should show alert if release without order passed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.releaseWithoutOrder(); - confirmDeferred.resolve(); - convertDeferred.resolve(); - this.$rootScope.$apply(); - loadingDeferred.resolve(); - this.$rootScope.$apply(); - - expect(this.notificationService.success) - .toHaveBeenCalledWith('requisitionConvertToOrder.releaseWithoutOrder.success'); - }); - - it('should show error if release without order failed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.releaseWithoutOrder(); - confirmDeferred.resolve(); - convertDeferred.reject(); - this.$rootScope.$apply(); - - expect(this.notificationService.error) - .toHaveBeenCalledWith('requisitionConvertToOrder.errorOccurred'); - }); - - it('should close loading modal if release without order failed', function() { - this.vm.requisitions[0].$selected = true; - this.vm.requisitions[0].requisition.supplyingFacility = this.supplyingDepots[0]; - - this.vm.releaseWithoutOrder(); - confirmDeferred.resolve(); - convertDeferred.reject(); - this.$rootScope.$apply(); - - expect(this.loadingModalService.close).toHaveBeenCalled(); - }); - - }); - - it('should show error when trying to convert to order with no supplying depot selected', function() { - this.vm.requisitions[0].$selected = true; - - spyOn(this.requisitionService, 'convertToOrder').andReturn(this.$q.when()); - spyOn(this.notificationService, 'error').andCallThrough(); - - this.vm.convertToOrder(); - - expect(this.requisitionService.convertToOrder).not.toHaveBeenCalled(); - expect(this.notificationService.error) - .toHaveBeenCalledWith('requisitionConvertToOrder.noSupplyingDepotSelected'); - }); - - it('should show error when trying to convert to order with no requisition selected', function() { - spyOn(this.requisitionService, 'convertToOrder').andReturn(this.$q.when()); - spyOn(this.notificationService, 'error').andCallThrough(); - - this.vm.convertToOrder(); - - expect(this.requisitionService.convertToOrder).not.toHaveBeenCalled(); - expect(this.notificationService.error) - .toHaveBeenCalledWith('requisitionConvertToOrder.selectAtLeastOneRnr'); - }); - - it('should select all requisitions', function() { - this.vm.toggleSelectAll(true); - - expect(this.vm.requisitions[0].$selected).toBe(true); - expect(this.vm.requisitions[1].$selected).toBe(true); - }); - - it('should deselect all requisitions', function() { - this.vm.toggleSelectAll(false); - - expect(this.vm.requisitions[0].$selected).toBe(false); - expect(this.vm.requisitions[1].$selected).toBe(false); - }); - - it('should set "select all" option when all requisitions are selected by user', function() { - for (var i = 0; i < this.vm.requisitions.length; i++) { - this.vm.requisitions[i].$selected = true; - this.vm.onRequisitionSelect(this.vm.requisitions[i]); - } - - this.vm.setSelectAll(); - - expect(this.vm.selectAll).toBe(true); - }); - - it('should not set "select all" option when not all requisitions are selected by user', function() { - this.vm.requisitions[0].$selected = true; - this.vm.onRequisitionSelect(this.vm.requisitions[0]); - - for (var i = 1; i < this.vm.requisitions.length; i++) { - this.vm.requisitions[i].$selected = false; - this.vm.onRequisitionSelect(this.vm.requisitions[i]); - } - - this.vm.setSelectAll(); - - expect(this.vm.selectAll).toBe(false); - }); - - describe('search', function() { - - beforeEach(function() { - spyOn(this.$state, 'go').andReturn(); - }); - - it('should expose search method', function() { - expect(angular.isFunction(this.vm.search)).toBe(true); - }); - - it('should call state go method', function() { - this.vm.search(); - - expect(this.$state.go).toHaveBeenCalled(); - }); - - it('should call state go method with changed params', function() { - this.vm.programId = 'programId'; - this.vm.facilityId = 'facilityId'; - this.vm.sort = 'sort'; - - this.vm.search(); - - expect(this.$state.go).toHaveBeenCalledWith('openlmis.requisitions.convertToOrder', { - programId: 'programId', - facilityId: 'facilityId', - sort: 'sort', - page: 0, - size: 10 - }, { - reload: true - }); - }); - }); - - describe('load selection from other pages', function() { - beforeEach(function() { - inject(function($injector) { - var requisitions = [ - { - requisition: { - id: 'currentPagePreselectedRequisitionId', - facility: new FacilityDataBuilder().build(), - program: new ProgramDataBuilder().build(), - supplyingFacility: this.supplyingDepots[0] - }, - $selected: true, - supplyingDepots: this.supplyingDepots - }, - { - requisition: { - id: 'otherPagePreselectedRequisitionId', - facility: new FacilityDataBuilder().build(), - program: new ProgramDataBuilder().build(), - supplyingFacility: this.supplyingDepots[0] - }, - $selected: true, - supplyingDepots: this.supplyingDepots - } - ]; - - var window = $injector.get('$window'); - - var itemKey = 'requisition-convert-to-order/selected-requisitions/key'; - - window.sessionStorage.setItem(itemKey, JSON.stringify({ - currentPagePreselectedRequisitionId: requisitions[0], - otherPagePreselectedRequisitionId: requisitions[1] - })); - - var state = { - go: function() { - // NOP - }, - current: { - name: 'current' - } - }; - - this.vm = $injector.get('$controller')('ConvertToOrderController', { - requisitions: requisitions.slice(0, 1), - $stateParams: { - programId: 'program-id', - facilityId: 'facility-id', - page: 0, - size: 10 - }, - facilities: this.vm.facilities, - programs: this.vm.programs, - $window: window, - $state: state - }); - - this.vm.$onInit(); - }); - - }); - - afterEach(function() { - inject(function($injector) { - $injector.get('$window').sessionStorage.clear(); - }); - }); - - it('should have preselected requisitions', function() { - expect(this.vm.getSelected().length).toBe(2); - }); - - it('should have preselected requisition from other page', function() { - var selected = this.vm.getSelected(); - - var numberOfSelectedOnOtherPages = 0; - - for (var i = 0; i < selected.length; i++) { - var s = selected[i]; - var found = false; - - for (var j = 0; j < this.vm.requisitions.length; j++) { - var r = this.vm.requisitions[j]; - - if (r.$selected && r.requisition.id === s.requisition.id) { - found = true; - break; - } - } - - if (found) { - numberOfSelectedOnOtherPages++; - } - } - - expect(numberOfSelectedOnOtherPages).toBeGreaterThan(0); - }); - }); - -}); diff --git a/src/requisition-convert-to-order/convert-to-order.html b/src/requisition-convert-to-order/convert-to-order.html deleted file mode 100644 index d7068a18..00000000 --- a/src/requisition-convert-to-order/convert-to-order.html +++ /dev/null @@ -1,67 +0,0 @@ -

{{'requisitionConvertToOrder.convertRequisitionsToOrder' | message}}

-
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{vm.infoMessage | message}}
- - {{'requisitionConvertToOrder.program' | message}}{{'requisitionConvertToOrder.facility' | message}}{{'requisitionConvertToOrder.districtName' | message}}{{'requisitionConvertToOrder.period' | message}}{{'requisitionConvertToOrder.startDate' | message}}{{'requisitionConvertToOrder.endDate' | message}}{{'requisitionConvertToOrder.dateApproved' | message}}{{'requisitionConvertToOrder.emergency' | message}}{{'requisitionConvertToOrder.supplyingDepot' | message}}
- - {{item.requisition.program.name}}{{item.requisition.facility.code}} - {{item.requisition.facility.name}}{{item.requisition.facility.geographicZone.name}}{{item.requisition.processingPeriod.name}}{{item.requisition.processingPeriod.startDate | openlmisDate}}{{item.requisition.processingPeriod.endDate | openlmisDate}}{{item.requisition.statusChanges.APPROVED.changeDate | openlmisDate}} - - - -
- -
-
- - -
diff --git a/src/requisition-convert-to-order/convert-to-order.routes.js b/src/requisition-convert-to-order/convert-to-order.routes.js deleted file mode 100644 index 6d20a09a..00000000 --- a/src/requisition-convert-to-order/convert-to-order.routes.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This program is part of the OpenLMIS logistics management information system platform software. - * Copyright © 2017 VillageReach - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - *   - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  - * See the GNU Affero General Public License for more details. You should have received a copy of - * the GNU Affero General Public License along with this program. If not, see - * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  - */ - -(function() { - - 'use strict'; - - angular - .module('requisition-convert-to-order') - .config(routes); - - routes.$inject = ['$stateProvider', 'FULFILLMENT_RIGHTS']; - - function routes($stateProvider, FULFILLMENT_RIGHTS) { - - $stateProvider.state('openlmis.requisitions.convertToOrder', { - showInNavigation: true, - label: 'requisitionConvertToOrder.convertToOrder.label', - url: '/convertToOrder?programId&facilityId&sort&page&size&storageKey', - controller: 'ConvertToOrderController', - controllerAs: 'vm', - templateUrl: 'requisition-convert-to-order/convert-to-order.html', - accessRights: [FULFILLMENT_RIGHTS.ORDERS_EDIT], - resolve: { - programs: function(programService) { - return programService.getAll(); - }, - facilities: function(facilityService) { - return facilityService.getAllMinimal(); - }, - requisitions: function(paginationService, requisitionService, $stateParams) { - return paginationService.registerUrl($stateParams, function(stateParams) { - return requisitionService.forConvert(stateParams); - }); - } - } - }); - } - -})(); diff --git a/src/requisition-convert-to-order/convert-to-order.routes.spec.js b/src/requisition-convert-to-order/convert-to-order.routes.spec.js deleted file mode 100644 index 0102f320..00000000 --- a/src/requisition-convert-to-order/convert-to-order.routes.spec.js +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This program is part of the OpenLMIS logistics management information system platform software. - * Copyright © 2017 VillageReach - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU Affero General Public License as published by the Free Software Foundation, either - * version 3 of the License, or (at your option) any later version. - *   - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  - * See the GNU Affero General Public License for more details. You should have received a copy of - * the GNU Affero General Public License along with this program. If not, see - * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  - */ - -describe('openlmis.requisitions.convertToOrder', function() { - - beforeEach(function() { - module('requisition-convert-to-order', function($provide) { - $provide.value('featureFlagService', { - set: function() {}, - get: function() {} - }); - }); - module('requisition-view-tab'); - - var ProgramDataBuilder, FacilityDataBuilder, RequisitionDataBuilder, - PageDataBuilder; - - inject(function($injector) { - ProgramDataBuilder = $injector.get('ProgramDataBuilder'); - FacilityDataBuilder = $injector.get('FacilityDataBuilder'); - RequisitionDataBuilder = $injector.get('RequisitionDataBuilder'); - PageDataBuilder = $injector.get('PageDataBuilder'); - - this.$q = $injector.get('$q'); - this.$location = $injector.get('$location'); - this.$rootScope = $injector.get('$rootScope'); - this.facilityService = $injector.get('facilityService'); - this.programService = $injector.get('programService'); - this.paginationService = $injector.get('paginationService'); - this.requisitionService = $injector.get('requisitionService'); - this.$state = $injector.get('$state'); - this.$templateCache = $injector.get('$templateCache'); - }); - - this.programs = [ - new ProgramDataBuilder().build(), - new ProgramDataBuilder().build() - ]; - - this.facilities = [ - new FacilityDataBuilder().build(), - new FacilityDataBuilder().build() - ]; - - this.requisitions = [ - { - requisition: new RequisitionDataBuilder().buildJson(), - supplyingDepots: [ - new FacilityDataBuilder().build(), - new FacilityDataBuilder().build() - ] - }, - { - requisition: new RequisitionDataBuilder().buildJson(), - supplyingDepots: [ - new FacilityDataBuilder().build(), - new FacilityDataBuilder().build() - ] - } - ]; - - spyOn(this.requisitionService, 'forConvert') - .andReturn(this.$q.resolve(new PageDataBuilder() - .withContent(this.requisitions) - .build())); - spyOn(this.programService, 'getAll').andReturn(this.$q.resolve(this.programs)); - spyOn(this.facilityService, 'getAllMinimal').andReturn(this.$q.resolve(this.facilities)); - spyOn(this.$templateCache, 'get').andCallThrough(); - - this.goToUrl = goToUrl; - this.getResolvedValue = getResolvedValue; - }); - - describe('state', function() { - - it('should be available under "/requisitions/convertToOrder" URI', function() { - expect(this.$state.current.name).not.toEqual('openlmis.requisitions.convertToOrder'); - - this.goToUrl('/requisitions/convertToOrder'); - - expect(this.$state.current.name).toEqual('openlmis.requisitions.convertToOrder'); - }); - - it('should use template', function() { - this.goToUrl('/requisitions/convertToOrder'); - - expect(this.$templateCache.get) - .toHaveBeenCalledWith('requisition-convert-to-order/convert-to-order.html'); - }); - - it('should resolve facilities', function() { - this.goToUrl('/requisitions/convertToOrder'); - - expect(this.getResolvedValue('facilities')).toEqual(this.facilities); - expect(this.facilityService.getAllMinimal).toHaveBeenCalled(); - }); - - it('should resolve programs', function() { - this.goToUrl('/requisitions/convertToOrder'); - - expect(this.getResolvedValue('programs')).toEqual(this.programs); - expect(this.programService.getAll).toHaveBeenCalled(); - }); - }); - - function goToUrl(url) { - this.$location.url(url); - this.$rootScope.$apply(); - } - - function getResolvedValue(name) { - return this.$state.$current.locals.globals[name]; - } - -}); diff --git a/src/requisition-convert-to-order/messages_en.json b/src/requisition-convert-to-order/messages_en.json deleted file mode 100644 index 7c3289b8..00000000 --- a/src/requisition-convert-to-order/messages_en.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "requisitionConvertToOrder.all": "All", - "requisitionConvertToOrder.convertRequisitionsToOrder": "Convert Requisitions to Order", - "requisitionConvertToOrder.convertToOrder.confirm": "Are you sure you want to convert this R&R(s) to order(s)?", - "requisitionConvertToOrder.convertToOrder.label": "Convert to Order", - "requisitionConvertToOrder.convertToOrder.success": "The requisition(s) have been successfully converted to an order(s)", - "requisitionConvertToOrder.releaseWithoutOrder.label": "Release without order", - "requisitionConvertToOrder.releaseWithoutOrder.confirm": "Are you sure you want to release this R&R(s) without order(s)?", - "requisitionConvertToOrder.releaseWithoutOrder.success": "The requisition(s) have been successfully released without order(s)", - "requisitionConvertToOrder.dateApproved": "Date approved", - "requisitionConvertToOrder.districtName": "District name", - "requisitionConvertToOrder.emergency": "Emergency", - "requisitionConvertToOrder.endDate": "End date", - "requisitionConvertToOrder.errorOccurred": "Error occurred", - "requisitionConvertToOrder.facility": "Facility", - "requisitionConvertToOrder.facilityCode": "Facility code", - "requisitionConvertToOrder.facilityName": "Facility name", - "requisitionConvertToOrder.noRequisitionToConvert": "No requisitions to be converted to orders", - "requisitionConvertToOrder.noSearchResults": "No requisitions for convert found", - "requisitionConvertToOrder.noSupplyingDepotSelected": "Supplying depot not selected", - "requisitionConvertToOrder.period": "Period", - "requisitionConvertToOrder.program": "Program", - "requisitionConvertToOrder.search": "Search", - "requisitionConvertToOrder.selectAtLeastOneRnr": "Please select at least one requisition for converting to order.", - "requisitionConvertToOrder.selectAtLeastOneRnrWithoutOrder" : "Please select at least one requisition to release without order.", - "requisitionConvertToOrder.startDate": "Start date", - "requisitionConvertToOrder.supplyingDepot": "Supplying depot", - "requisitionConvertToOrder.searchInfo": "In order to filter Requisitions type in one of the following parameters: Program Name, Facility Name or Facility Code and click \"Search\" button." -} \ No newline at end of file diff --git a/src/requisition-initiate/period.factory.js b/src/requisition-initiate/period.factory.js index a39d261a..baf4848f 100644 --- a/src/requisition-initiate/period.factory.js +++ b/src/requisition-initiate/period.factory.js @@ -65,6 +65,16 @@ var periodGridLineItems = []; angular.forEach(periods, function(period, id) { + // Compare with the first period in the list + const start1 = new Date(period.startDate); + const end1 = new Date(period.endDate); + const start2 = new Date(periods[0].startDate); + const end2 = new Date(periods[0].endDate); + + // Always show proceed button for periods with the same start and end date as the first period + if(start1.getTime() === start2.getTime() && end1.getTime() === end2.getTime()) { + period.alsoShowProceed = true; + } periodGridLineItems.push(createPeriodGridItem(period, emergency, id)); }); @@ -77,8 +87,9 @@ startDate: period.startDate, endDate: period.endDate, rnrStatus: messageService.get(getRnrStatus(period, emergency, id)), - activeForRnr: (emergency || id === 0), - rnrId: (period.requisitionId) ? period.requisitionId : null + activeForRnr: (emergency || id === 0 || period.alsoShowProceed), + rnrId: (period.requisitionId) ? period.requisitionId : null, + id: period.id }; } @@ -102,11 +113,11 @@ return period.requisitionStatus ? period.requisitionStatus : ( - (emergency || id === 0) ? + (emergency || id === 0 || period.alsoShowProceed) ? 'requisitionInitiate.notYetStarted' : 'requisitionInitiate.previousPending' ); } } -})(); +})(); \ No newline at end of file diff --git a/src/requisition-order-create/order-create.routes.js b/src/requisition-order-create/order-create.routes.js old mode 100644 new mode 100755 index fb4e25f9..c311d75f --- a/src/requisition-order-create/order-create.routes.js +++ b/src/requisition-order-create/order-create.routes.js @@ -30,7 +30,7 @@ label: 'requisition.orderCreate', isOffline: false, priority: 14, - showInNavigation: showRequisitionLessOrder, + showInNavigation: false, //Removing order create for Lesotho eLMIS views: { '@': { templateUrl: 'requisition-order-create/order-create.html' diff --git a/src/requisition-product-grid/product-grid-cell.directive.js b/src/requisition-product-grid/product-grid-cell.directive.js index 08dd25fa..d42afdbd 100644 --- a/src/requisition-product-grid/product-grid-cell.directive.js +++ b/src/requisition-product-grid/product-grid-cell.directive.js @@ -140,8 +140,9 @@ function canEditColumn(column) { var TBMonthlyColumns = TEMPLATE_COLUMNS.getTbMonthlyColumns(); - if (program.name === TB_MONTHLY_PROGRAM && column.name === TEMPLATE_COLUMNS.TOTAL_RECEIVED_QUANTITY) { - return true; + // Total received quantity should never be editable + if (column.name === TEMPLATE_COLUMNS.TOTAL_RECEIVED_QUANTITY) { + return false; } return (column.source === COLUMN_SOURCES.USER_INPUT || diff --git a/src/requisition-redistribution/messages_en.json b/src/requisition-redistribution/messages_en.json new file mode 100755 index 00000000..39123d1a --- /dev/null +++ b/src/requisition-redistribution/messages_en.json @@ -0,0 +1,39 @@ +{ + + "requisitionRedistribution.approve.confirm": "Are you sure you want to approve this R&R?", + "requisitionRedistribution.delete.confirm": "Are you sure you want to delete this R&R?", + "requisitionRedistribution.delete.failure": "Failed to delete requisition!", + "requisitionRedistribution.delete.label": "Delete", + "requisitionRedistribution.delete.success": "Requisition has been deleted!", + "requisitionRedistribution.emergency": "Emergency", + "requisitionRedistribution.facility": "Facility", + "requisitionRedistribution.fullSupplyProducts": "Full supply product(s)", + "requisitionRedistribution.nonFullSupplyProducts": "Non full supply product(s)", + "requisitionRedistribution.operatedBy": "Operated by", + "requisitionRedistribution.print": "Print", + "requisitionRedistribution.province": "Province", + "requisitionRedistribution.region": "Region", + "requisitionRedistribution.regular": "Regular", + "requisitionRedistribution.reject.confirm": "Are you sure you want to reject this R&R?", + "requisitionRedistribution.reject.failure": "Failed to reject requisition!", + "requisitionRedistribution.reject.label": "Reject", + "requisitionRedistribution.rnrHasErrors": "R&R has errors, please correct them to proceed.", + "requisitionRedistribution.submit.confirm": "Are you sure you want to redistribute this R&R?", + "requisitionRedistribution.requisition.error": "R&R has errors", + "requisitionRedistribution.approvedQuantity": "Approved Quantity", + "requisitionRedistribution.cancel": "Cancel", + "requisitionRedistribution.redistribution.label": "Redistribution", + "requisitionRedistribution.removeRow" : "Remove", + "requisitionRedistribution.reportAndRequisitionFor" : "Report and Requisition for", + "requisitionRedistribution.addRow": "Add", + "requisitionRedistribution.productName": "Product", + "requisitionRedistribution.productCode": "Product Code", + "requisitionRedistribution.quantityToIssue": "Quantity To Issue", + "requisitionRedistribution.requestedQuantity": "Requested Quantity", + "requisitionRedistribution.remarks": "Remarks", + "requisitionRedistribution.requestedQuantityExplanation": "Requested Quantity Explanation", + "requisitionRedistribution.submit.label": "Submit", + "requisitionRedistribution.submit.error": "Approved quantity does not match Quantity to Issue. Please correct before proceeding", + "requisitionRedistribution.supplyingFacility": "Supplying Facility", + "requisitionRedistribution.fail": "Approved quantity does not match Quantity to Issue. Please correct before proceeding." +} \ No newline at end of file diff --git a/src/requisition-redistribution/redistribution-toolbar.html b/src/requisition-redistribution/redistribution-toolbar.html new file mode 100755 index 00000000..d8fe0f4d --- /dev/null +++ b/src/requisition-redistribution/redistribution-toolbar.html @@ -0,0 +1,6 @@ +
+
+ +
+
+ diff --git a/src/requisition-redistribution/requisition-redistribution.controller.js b/src/requisition-redistribution/requisition-redistribution.controller.js new file mode 100755 index 00000000..4e651006 --- /dev/null +++ b/src/requisition-redistribution/requisition-redistribution.controller.js @@ -0,0 +1,310 @@ +/* + * This program is part of the OpenLMIS logistics management information system platform software. + * Copyright © 2017 VillageReach + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + *   + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  + * See the GNU Affero General Public License for more details. You should have received a copy of + * the GNU Affero General Public License along with this program. If not, see + * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  + */ + + +(function() { + + 'use strict'; + + /** + * @ngdoc controller + * @name requisition-redistribution.controller:RequisitionRedistributionController + * + * @description + * Responsible for Redistribution module of Requisitions. + */ + + angular + .module('requisition-redistribution') + .controller('RequisitionRedistributionController', controller); + + controller.$inject = ['stateTrackerService','requisition','user','facility', 'program', '$state', 'processingPeriod', + 'orderCreateService', 'notificationService', 'alertService', 'loadingModalService', 'confirmService', 'healthFacilities', + 'hospitalFacilities', 'districtFacilities']; + + function controller(stateTrackerService, requisition, user, facility, program, $state, processingPeriod, + orderCreateService, notificationService, alertService, loadingModalService, confirmService, healthFacilities, + hospitalFacilities, districtFacilities) { + + var vm = this; + + vm.$onInit = onInit; + vm.requisition = requisition; + vm.requisitionLineItems = undefined; + vm.program = undefined; + vm.facility = undefined; + vm.processingPeriod = undefined; + vm.displaySubmitButton = undefined; + vm.displaySubmitAndAuthorizeButton = undefined; + vm.displayAuthorizeButton = undefined; + vm.displayDeleteButton = undefined; + vm.displayApproveAndRejectButtons = undefined; + vm.displayRejectButton = undefined; + vm.displaySkipButton = undefined; + vm.displaySyncButton = undefined; + vm.requisitionType = undefined; + vm.supplyingFacilities = undefined; + vm.submitRedistribution = submitRedistribution; + vm.createProcessAndSendOrder = createProcessAndSendOrder; + vm.redistributeRequisition = redistributeRequisition; + vm.submitOrders = submitOrders; + vm.filteredProducts = filteredProducts; + vm.filterFacilities = filterFacilities; + vm.calculatePacksToShip = calculatePacksToShip; + + function onInit() { + + vm.facility = facility; + vm.hospitals = hospitalFacilities; + vm.healthCenters = healthFacilities; + vm.dhmts = districtFacilities; + vm.filteredSupplyingFacilities = filterFacilities(); + vm.program = program; + vm.processingPeriod = processingPeriod; + vm.requisitionLineItems = requisition.requisitionLineItems; + vm.redistributedRequisition = angular.copy(requisition);//Keep the requisition copy for processing in redistributeRequisition() + vm.requisitionType = 'requisitionView.emergency'; + vm.requisitionTypeClass = 'emergency'; + // Starting Each Row with Add Row Button Visible + vm.requisitionLineItems.forEach(item => { + item.addRowButton = true; + }); + vm.requisitionLineItems.forEach(item => { + item.removeRowButton = false; + }); + vm.totalApprovedQty = vm.getApprovedQuantity(); + } + + //Merging Facility Arrays + function getSupplyingFacilities(...arrays) { + return arrays.reduce((acc, array) => acc.concat(array), []); + } + + + //Select facilities in the same district as requesting facility as well as all DHMT facilities + function filterFacilities() { + + var supplierFacilities = getSupplyingFacilities(vm.hospitals, vm.healthCenters, vm.dhmts); + + const zoneId = vm.facility.type.code === 'dist_store' ? vm.facility.geographicZone.id + : vm.facility.geographicZone.parent?.id; + + + if (vm.facility.type.code === 'dist_store') { + return supplierFacilities.filter(item => + item.type.code === 'dist_store' || item.geographicZone?.parent?.id === zoneId + ); + } + return supplierFacilities.filter(item => + (item.type.code === 'dist_store' && item.geographicZone?.id === zoneId) || + (item.geographicZone?.parent?.id === zoneId) + ); + } + + + //Compute the total approved quantity for the requisition + vm.getApprovedQuantity = function(){ + let totalApprovedQty = 0; + vm.requisitionLineItems.forEach((item) => { + totalApprovedQty += item.approvedQuantity; + }); + return totalApprovedQty; + } + + //Compute the total quantity to issue for the requisition + vm.getQuantityToIssue = function(){ + let quantityToIssue = 0; + vm.requisitionLineItems.forEach((item) => { + quantityToIssue += item.quantityToIssue; + }); + return quantityToIssue; + } + + //Assembles orders for each requisition line item and passes them on for processing. + function submitRedistribution() { + + // validate that approved quantity and quantity to issue match + if (vm.totalApprovedQty !== vm.getQuantityToIssue()) { + failWithMessage('requisitionRedistribution.fail')(); + reloadState(); + } + else { + confirmService + .confirm('requisitionRedistribution.submit.confirm') + .then(function () { + let orderLineItems = []; + //build an order object for each requisition line item + vm.requisitionLineItems.forEach(lineItem => { + const order = { + emergency: true, + createdBy: { id: user.id }, + program: { id: program.id }, + requestingFacility: { id: facility.id }, + receivingFacility: { id: facility.id }, + supplyingFacility: { id: lineItem.supplyingFacility.id }, + facility: { id: facility.id } + }; + orderLineItems.push(order); + }); + let requestedItems = vm.requisitionLineItems; + //Pass the array of orders and their respective requisition line items to submitOrders for further processing + submitOrders(requestedItems, orderLineItems); + }) + } + } + + + function submitOrders(requisitionItems, orderItems) { + let orderLineItems = orderItems; + while (orderLineItems.length > 0) { + //create a new array for orders having the same supplying facility ID and their corresponding requisition line items + let supplyingFacilityId = orderLineItems[0].supplyingFacility.id; + let ordersArray = orderLineItems.filter((lineItem) => lineItem.supplyingFacility.id === supplyingFacilityId); + let requestedItems = requisitionItems.filter((lineItem) => lineItem.supplyingFacility.id === supplyingFacilityId); + + //Update the original array of orders to exclude the filterd orders having the same supplying facility ID + orderLineItems = orderLineItems.filter(item => !ordersArray.includes(item)); + + //if the array of orders is not empty, pass to createProcessAndSendOrder function for futher processing + if (ordersArray.length > 0) { + let ordersForProcessing = ordersArray; + let order = ordersForProcessing[0]; + createProcessAndSendOrder(order, requestedItems); + } + } + //When all the orders have been sent, set requisition state to Redistributed. + redistributeRequisition(); + } + + function createProcessAndSendOrder(order, requestedItems) { + orderCreateService.create(order) + .then((createdOrder) => { + return orderCreateService.get(createdOrder.id); + }) + .then((fetchedOrder) => { + requestedItems.forEach((lineItem) => { + let packs = calculatePacksToShip(lineItem); + + fetchedOrder.orderLineItems.push({ + orderable: lineItem.orderable, + orderedQuantity: packs, //lineItem.packsToShip, + soh: 45 + }); + }); + + return orderCreateService.send(fetchedOrder); + }) + .then(() => { + notificationService.success('Successfully submitted.'); + }) + .catch((error) => { + console.error('Error processing order:', error); + }); + } + + //Calculate packs to ship for each line item + function calculatePacksToShip(lineItem){ + var netContent = lineItem.orderable.netContent, + quantityToIssue = lineItem.quantityToIssue, + packRoundingThreshold = lineItem.orderable.packRoundingThreshold; + var packsToShip = quantityToIssue / netContent, + remainder = quantityToIssue % netContent; + if(remainder > packRoundingThreshold){ + packsToShip += 1; + } + return Math.floor(packsToShip); + } + + /*Updates the status of the requisition to show that for all requisition line items, + orders have been created and sent for supply */ + function redistributeRequisition() { + + vm.requisition = angular.copy(vm.redistributedRequisition); + vm.requisition .extraData = { isRedistributed: true }; + return vm.requisition .$save() + .then(() => vm.requisition .$approve() + .then(() => stateTrackerService.goToPreviousState('openlmis.requisitions.approvalList'))); + } + + //filters all line items with the same product as that of the given index + function filteredProducts (index){ + let selectedProduct = vm.requisitionLineItems[index]; + return vm.requisitionLineItems.filter(lineItem => lineItem.orderable.productCode === selectedProduct.orderable.productCode); + } + + //Computes the total quantity to be issued for a single product that may be supplied by different facilities. + vm.totalQuantityToIssue = function(index){ + let total = 0; + let selectedProducts = filteredProducts(index); + for(let i=0; i< selectedProducts.length; i++){ + total += selectedProducts[i].quantityToIssue; + } + return total; + }; + + /*Controls the visibility of the button that adds another row so that a + single product may be supplied by different facilities.*/ + vm.showAddButton = function(index) { + let item = vm.requisitionLineItems[index]; + let selectedProducts = filteredProducts(index); + let quantityToIssue = vm.totalQuantityToIssue(index); + let approvedQuantity = item.approvedQuantity; + if (quantityToIssue >= approvedQuantity) { + selectedProducts.forEach((product) => { + product.addRowButton = false; //Hide Add Row Button + }); + } + else if (quantityToIssue < approvedQuantity){ + selectedProducts.forEach((product) => { + product.addRowButton = true; + }); + } + }; + + //Adds a row to the table + vm.addRow = function(index, item) { + // Create a new item object with default values + var newLineItem = angular.copy(item); + + newLineItem.supplyingFacility = null; + newLineItem.quantityToIssue = 0; + newLineItem.remarks = item.remarks; + newLineItem.addRowButton = true; + newLineItem.removeRowButton = true; + + // Insert the new item into the array at the specified index + vm.requisitionLineItems.splice(index + 1, 0, newLineItem); + }; + + //Removes a line item from Redistribution table + vm.removeLineItem = function (index) { + vm.requisitionLineItems.splice(index, 1); + vm.showAddButton(index); + } + + //Provides a fail message when quantity to issue for all line items fails validation + function failWithMessage(message) { + return function() { + loadingModalService.close(); + alertService.error(message); + }; + } + + function reloadState() { + $state.reload(); + } + + } +})(); \ No newline at end of file diff --git a/src/requisition-redistribution/requisition-redistribution.html b/src/requisition-redistribution/requisition-redistribution.html new file mode 100755 index 00000000..366fddea --- /dev/null +++ b/src/requisition-redistribution/requisition-redistribution.html @@ -0,0 +1,53 @@ +
+

{{'requisitionRedistribution.reportAndRequisitionFor' | message}} {{vm.program.name}} ({{vm.facility.type.name}})

+ +
+

+ {{ 'requisitionRedistribution.outdated' | message}} + +

+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{'requisitionRedistribution.productCode'|message}}{{'requisitionRedistribution.productName'|message}}{{'requisitionRedistribution.requestedQuantity'|message}}{{'requisitionRedistribution.requestedQuantityExplanation'|message}}{{'requisitionRedistribution.approvedQuantity'|message}}{{'requisitionRedistribution.supplyingFacility'|message}}{{'requisitionRedistribution.quantityToIssue'|message}}{{'requisitionRedistribution.remarks'|message}}Action
{{item.orderable.productCode}}{{item.orderable.fullProductName}}{{item.requestedQuantity}}{{item.requestedQuantityExplanation}}{{item.approvedQuantity}} + +
+
+
+ + + diff --git a/src/requisition-convert-to-order/convert-to-order.module.js b/src/requisition-redistribution/requisition-redistribution.module.js old mode 100644 new mode 100755 similarity index 60% rename from src/requisition-convert-to-order/convert-to-order.module.js rename to src/requisition-redistribution/requisition-redistribution.module.js index 0493cb1d..a16d8b90 --- a/src/requisition-convert-to-order/convert-to-order.module.js +++ b/src/requisition-redistribution/requisition-redistribution.module.js @@ -18,19 +18,36 @@ 'use strict'; /** - * @module requisition-convert-to-order + * @module requisition-redistribution * * @description - * Responsible for requisition convert to order screen. + * Provides redistribution state and controller. */ - angular.module('requisition-convert-to-order', [ - 'requisition', - 'openlmis-date', + angular.module('requisition-redistribution', [ + 'ui.router', + 'openlmis-config', 'referencedata-facility', - 'referencedata-program', - 'openlmis-modal', + 'ngResource', + 'stockmanagement', + 'openlmis-repository', + 'openlmis-class-extender', + 'referencedata-user', + 'openlmis-urls', 'openlmis-pagination', - 'ui.router' + 'requisition-view', + 'requisition', + 'requisition-summary', + 'requisition-validation', + 'requisition-status-messages', + 'requisition-view-tab', + 'openlmis-templates', + 'openlmis-i18n', + 'openlmis-state-tracker', + 'openlmis-modal', + 'openlmis-date', + 'openlmis-invalid', + 'openlmis-permissions', + 'requisition-order-create' ]); })(); diff --git a/src/requisition-redistribution/requisition-redistribution.routes.js b/src/requisition-redistribution/requisition-redistribution.routes.js new file mode 100755 index 00000000..17a56baf --- /dev/null +++ b/src/requisition-redistribution/requisition-redistribution.routes.js @@ -0,0 +1,99 @@ +/* + * This program is part of the OpenLMIS logistics management information system platform software. + * Copyright © 2017 VillageReach + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU Affero General Public License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + *   + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  + * See the GNU Affero General Public License for more details. You should have received a copy of + * the GNU Affero General Public License along with this program. If not, see + * http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  + */ + +(function() { + + 'use strict'; + + angular + .module('requisition-redistribution') + .config(routes); + +routes.$inject = ['$stateProvider']; + + function routes($stateProvider) { + $stateProvider.state('openlmis.redistribution', { + url: '/redistribution/:rnr', + isOffline: true, + controller: 'RequisitionRedistributionController', + controllerAs: 'vm', + templateUrl: 'requisition-redistribution/requisition-redistribution.html', + resolve: { + user: function(currentUserService) { + return currentUserService.getUserInfo(); + }, + requisition: function($stateParams,requisitionService) { + return requisitionService.get($stateParams.rnr); + }, + facility: function(facilityService, requisition) { + return facilityService.get(requisition.facility.id); + }, + districtFacilities: function (facilityService) { + var paginationParams = {}; + var queryParams = { + "type": "dist_store" + }; + return facilityService.query(paginationParams, queryParams) + .then(function (result) { + return result.content; + }) + .catch(function (error) { + // Handle any errors that may occur during the query + console.error("Error:", error); + return []; + }); + }, + hospitalFacilities: function (facilityService) { + var paginationParams = {}; + var queryParams = { + "type": "hospital" + }; + return facilityService.query(paginationParams, queryParams) + .then(function (result) { + return result.content; + }) + .catch(function (error) { + // Handle any errors that may occur during the query + console.error("Error:", error); + return []; + }); + }, + healthFacilities: function (facilityService, facility) { + var paginationParams = {}; + var queryParams = { + "type": "health_center", + }; + return facilityService.query(paginationParams, queryParams) + .then(function (result) { + return result.content; + }) + .catch(function (error) { + // Handle any errors that may occur during the query + console.error("Error:", error); + return []; + }); + }, + program: function(programService, requisition) { + return programService.get(requisition.program.id); + }, + processingPeriod: function(periodService, requisition) { + return periodService.get(requisition.processingPeriod.id); + } + } + }); + + } +})(); + diff --git a/src/requisition-search/messages_en.json b/src/requisition-search/messages_en.json old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search-cache.run.js b/src/requisition-search/requisition-search-cache.run.js old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search-cache.run.spec.js b/src/requisition-search/requisition-search-cache.run.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search.controller.js b/src/requisition-search/requisition-search.controller.js old mode 100644 new mode 100755 index ac2fee2a..14bca947 --- a/src/requisition-search/requisition-search.controller.js +++ b/src/requisition-search/requisition-search.controller.js @@ -28,12 +28,12 @@ .controller('RequisitionSearchController', RequisitionSearchController); RequisitionSearchController.$inject = [ - '$state', '$filter', '$stateParams', 'facilities', 'offlineService', 'localStorageFactory', 'confirmService', + '$state', '$filter', '$stateParams', 'facilities', 'homeFacility', 'offlineService', 'localStorageFactory', 'confirmService', 'requisitions', 'REQUISITION_STATUS', 'requisitionService', 'TB_STORAGE', 'LEPROSY_STORAGE', 'RequisitionViewService' ]; - function RequisitionSearchController($state, $filter, $stateParams, facilities, offlineService, localStorageFactory, + function RequisitionSearchController($state, $filter, $stateParams, facilities, homeFacility, offlineService, localStorageFactory, confirmService, requisitions, REQUISITION_STATUS, requisitionService, TB_STORAGE, LEPROSY_STORAGE) { @@ -57,6 +57,17 @@ */ vm.facilities = undefined; + /** + * @ngdoc property + * @propertyOf requisition-search.controller:RequisitionViewController + * @name homeFacility + * @type {Array} + * + * @description + * home facility of the user. + */ + vm.homeFacility = undefined; + /** * @ngdoc property * @propertyOf requisition-search.controller:RequisitionViewController @@ -172,6 +183,12 @@ */ function onInit() { vm.requisitions = requisitions; + vm.homeFacility = homeFacility; + vm.requisitions.forEach(item => { + if(item.extraData.isRedistributed){ + item.status = 'REDISTRIBUTED'; + } + }); vm.facilities = facilities; vm.statuses = REQUISITION_STATUS.$toList(); @@ -291,7 +308,12 @@ stateParams.initiatedDateFrom = vm.startDate ? $filter('isoDate')(vm.startDate) : null; stateParams.initiatedDateTo = vm.endDate ? $filter('isoDate')(vm.endDate) : null; stateParams.offline = vm.offline; - stateParams.requisitionStatus = vm.selectedStatus; + if (vm.homeFacility.code === "NDSO") { + stateParams.requisitionStatus = "IN_APPROVAL"; + } + else{ + stateParams.requisitionStatus = vm.selectedStatus; + } $state.go('openlmis.requisitions.search', stateParams, { reload: true diff --git a/src/requisition-search/requisition-search.controller.spec.js b/src/requisition-search/requisition-search.controller.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search.filter.js b/src/requisition-search/requisition-search.filter.js old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search.filter.spec.js b/src/requisition-search/requisition-search.filter.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search.html b/src/requisition-search/requisition-search.html old mode 100644 new mode 100755 index 4950926b..230de386 --- a/src/requisition-search/requisition-search.html +++ b/src/requisition-search/requisition-search.html @@ -70,7 +70,10 @@

{{'requisitionSearch.viewRequisitions' | message}}

{{requisition.processingPeriod.startDate | openlmisDate}} {{requisition.processingPeriod.endDate | openlmisDate}} {{requisition.createdDate | openlmisDate}} - {{requisition.status | requisitionStatus}} + Acknowledged + Redistributed + {{requisition.status | requisitionStatus}} + diff --git a/src/requisition-search/requisition-search.module.js b/src/requisition-search/requisition-search.module.js old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search.routes.js b/src/requisition-search/requisition-search.routes.js old mode 100644 new mode 100755 index 0cdba61e..fe2f3531 --- a/src/requisition-search/requisition-search.routes.js +++ b/src/requisition-search/requisition-search.routes.js @@ -50,6 +50,12 @@ } return undefined; }); + }, + homeFacility: function(facilityFactory, $stateParams) { + if (!$stateParams.facility) { + return facilityFactory.getUserHomeFacility(); + } + return $stateParams.facility; } } }); diff --git a/src/requisition-search/requisition-search.routes.spec.js b/src/requisition-search/requisition-search.routes.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search.service.js b/src/requisition-search/requisition-search.service.js old mode 100644 new mode 100755 diff --git a/src/requisition-search/requisition-search.service.spec.js b/src/requisition-search/requisition-search.service.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-view-tab/requisition-view-tab.controller.js b/src/requisition-view-tab/requisition-view-tab.controller.js index f9314c05..9fe6bacc 100644 --- a/src/requisition-view-tab/requisition-view-tab.controller.js +++ b/src/requisition-view-tab/requisition-view-tab.controller.js @@ -29,17 +29,17 @@ .controller('ViewTabController', ViewTabController); ViewTabController.$inject = [ - '$filter', 'selectProductsModalService', 'requisitionValidator', 'requisition', 'columns', 'messageService', + '$filter', '$state', 'selectProductsModalService', 'requisitionValidator', 'requisition', 'columns', 'messageService', 'lineItems', 'alertService', 'canSubmit', 'canAuthorize', 'fullSupply', 'TEMPLATE_COLUMNS', '$q', 'OpenlmisArrayDecorator', 'canApproveAndReject', 'items', 'paginationService', '$stateParams', - 'requisitionCacheService', 'canUnskipRequisitionItemWhenApproving', 'program', 'TB_MONTHLY_PROGRAM', '$scope' + 'requisitionCacheService', 'canUnskipRequisitionItemWhenApproving', 'program', 'TB_MONTHLY_PROGRAM', 'homeFacility','$scope' ]; - function ViewTabController($filter, selectProductsModalService, requisitionValidator, requisition, columns, + function ViewTabController($filter, $state, selectProductsModalService, requisitionValidator, requisition, columns, messageService, lineItems, alertService, canSubmit, canAuthorize, fullSupply, TEMPLATE_COLUMNS, $q, OpenlmisArrayDecorator, canApproveAndReject, items, paginationService, $stateParams, requisitionCacheService, - canUnskipRequisitionItemWhenApproving, program, TB_MONTHLY_PROGRAM, $scope) { + canUnskipRequisitionItemWhenApproving, program, TB_MONTHLY_PROGRAM, homeFacility, $scope) { var vm = this; vm.$onInit = onInit; vm.deleteLineItem = deleteLineItem; @@ -54,6 +54,9 @@ vm.cacheRequisition = cacheRequisition; vm.userCanEditColumn = userCanEditColumn; vm.monthlyTBColumns = TEMPLATE_COLUMNS.getTbMonthlyColumns(); + vm.disabledRequisitionEdit = disabledRequisitionEdit; + vm.search = search; + // vm.showSkippedLineItems = true; /** * @ngdoc property @@ -65,6 +68,7 @@ * Holds all requisition line items. */ vm.lineItems = undefined; + vm.searchKeyword = undefined; /** * @ngdoc property @@ -177,6 +181,7 @@ vm.items = items; vm.filteredItems = lineItems; vm.requisition = requisition; + vm.homeFacility = homeFacility; vm.columns = columns; vm.program = program; vm.userCanEdit = canAuthorize || canSubmit || canUnskipRequisitionItemWhenApproving; @@ -188,7 +193,7 @@ vm.noProductsMessage = getNoProductsMessage(); vm.canApproveAndReject = canApproveAndReject; vm.paginationId = fullSupply ? 'fullSupplyList' : 'nonFullSupplyList'; - vm.fullSupply = fullSupply; + vm.requisition = disabledRequisitionEdit(); registerSkippedItemsWatcher(); } @@ -209,6 +214,37 @@ }); } + function search() { + console.log("Keyword", vm.searchKeyword); + $stateParams.searchKeyword = vm.searchKeyword; + $state.go('openlmis.requisitions.requisition.fullSupply', $stateParams, { + reload: true + //inherit: false, + }); + } + + // Allows requisition line items to be editable by skipping or unskipping line item + function disabledRequisitionEdit(){ + vm.requisition = requisition; + // Make all requisition line item skipped at Warehouses + if(vm.homeFacility.type.name === 'Warehouse'){ + vm.requisition.requisitionLineItems.forEach(function(lineItem) { + lineItem.skipped = true; + }); + return vm.requisition; + } + else if(vm.homeFacility !== 'Warehouse'){ + //Unskip all skipped requisition line items where requested quantity is greater than zero. + //This will allow them to be editable + vm.requisition.requisitionLineItems.forEach(function(lineItem) { + if(lineItem.requestedQuantity > 0 ){ + lineItem.skipped = ""; + } + }); + return vm.requisition; + } + } + /** * @ngdoc method * @methodOf requisition-view-tab.controller:ViewTabController diff --git a/src/requisition-view/_requisition-header.scss b/src/requisition-view/_requisition-header.scss old mode 100644 new mode 100755 diff --git a/src/requisition-view/_requisition-view.scss b/src/requisition-view/_requisition-view.scss old mode 100644 new mode 100755 diff --git a/src/requisition-view/full-supply.routes.js b/src/requisition-view/full-supply.routes.js index d3d1f939..e86fce09 100644 --- a/src/requisition-view/full-supply.routes.js +++ b/src/requisition-view/full-supply.routes.js @@ -26,14 +26,14 @@ function routes(selectProductsModalStateProvider) { selectProductsModalStateProvider .stateWithAddOrderablesChildState('openlmis.requisitions.requisition.fullSupply', { - url: '/fullSupply?fullSupplyListPage&fullSupplyListSize', + url: '/fullSupply?fullSupplyListPage&fullSupplyListSize&searchKeyword', templateUrl: 'requisition-view-tab/requisition-view-tab.html', controller: 'ViewTabController', controllerAs: 'vm', isOffline: true, nonTrackable: true, resolve: { - lineItems: function($filter, requisition) { + lineItems: function($filter, requisition, $stateParams) { var filterObject = requisition.template.hideSkippedLineItems() ? { skipped: '!true', @@ -46,7 +46,13 @@ } }; var fullSupplyLineItems = $filter('filter')(requisition.requisitionLineItems, filterObject); - + + + // Filter by search keyword + if ($stateParams.searchKeyword) { + fullSupplyLineItems = $filter('filter')(fullSupplyLineItems, $stateParams.searchKeyword); + } + return $filter('orderBy')(fullSupplyLineItems, [ '$program.orderableCategoryDisplayOrder', '$program.orderableCategoryDisplayName', diff --git a/src/requisition-view/full-supply.routes.spec.js b/src/requisition-view/full-supply.routes.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/header.html b/src/requisition-view/header.html old mode 100644 new mode 100755 diff --git a/src/requisition-view/messages_en.json b/src/requisition-view/messages_en.json old mode 100644 new mode 100755 index 46d8f259..94617870 --- a/src/requisition-view/messages_en.json +++ b/src/requisition-view/messages_en.json @@ -80,5 +80,6 @@ "requisitionView.rejection.reason.update" : "Update", "requisitionView.rejection.reason.warning.message" : "There is no reason", "requisitionView.rejection.reason.action" : "Action", - "requisitionView.rejection.reason.action.remove" : "Remove" + "requisitionView.rejection.reason.action.remove" : "Remove", + "requisitionView.redistribution.label": "Redistribute" } diff --git a/src/requisition-view/non-full-supply.routes.js b/src/requisition-view/non-full-supply.routes.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/non-full-supply.routes.spec.js b/src/requisition-view/non-full-supply.routes.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/rejection-reason-modal.html b/src/requisition-view/rejection-reason-modal.html old mode 100644 new mode 100755 diff --git a/src/requisition-view/requisition-stock-count-date-modal.controller.js b/src/requisition-view/requisition-stock-count-date-modal.controller.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/requisition-stock-count-date-modal.controller.spec.js b/src/requisition-view/requisition-stock-count-date-modal.controller.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/requisition-stock-count-date-modal.html b/src/requisition-view/requisition-stock-count-date-modal.html old mode 100644 new mode 100755 diff --git a/src/requisition-view/requisition-stock-count-date-modal.js b/src/requisition-view/requisition-stock-count-date-modal.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/requisition-toolbar.html b/src/requisition-view/requisition-toolbar.html old mode 100644 new mode 100755 index 6bc5bddf..56e7e4c1 --- a/src/requisition-view/requisition-toolbar.html +++ b/src/requisition-view/requisition-toolbar.html @@ -4,9 +4,11 @@ - - + + + + diff --git a/src/requisition-view/requisition-view.controller.js b/src/requisition-view/requisition-view.controller.js old mode 100644 new mode 100755 index 5aa3ee73..b4ba29a9 --- a/src/requisition-view/requisition-view.controller.js +++ b/src/requisition-view/requisition-view.controller.js @@ -34,17 +34,17 @@ '$scope', 'RequisitionWatcher', 'accessTokenFactory', 'messageService', 'stateTrackerService', 'RequisitionStockCountDateModal', 'localStorageFactory', 'canSubmit', 'canAuthorize', 'canApproveAndReject', 'canDelete', 'canSkip', 'canSync', 'program', 'facility', 'processingPeriod', - 'rejectionReasonModalService', '$q', 'TB_STORAGE', 'LEPROSY_STORAGE', '$rootScope', 'RequisitionViewService' + 'rejectionReasonModalService', '$q', 'TB_STORAGE', 'LEPROSY_STORAGE', '$rootScope', 'RequisitionViewService', 'homeFacility' ]; - + function RequisitionViewController($state, requisition, requisitionValidator, requisitionService, loadingModalService, alertService, notificationService, confirmService, offlineService, $window, requisitionUrlFactory, $filter, $scope, RequisitionWatcher, accessTokenFactory, messageService, stateTrackerService, RequisitionStockCountDateModal, localStorageFactory, canSubmit, canAuthorize, - canApproveAndReject, canDelete, canSkip, canSync, - program, facility, processingPeriod, rejectionReasonModalService, $q, - TB_STORAGE, LEPROSY_STORAGE, $rootScope, RequisitionViewService) { + canApproveAndReject, canDelete, canSkip, canSync, program, facility, + processingPeriod, rejectionReasonModalService, $q, TB_STORAGE, LEPROSY_STORAGE, + $rootScope, RequisitionViewService, homeFacility) { var vm = this, watcher = new RequisitionWatcher($scope, requisition, localStorageFactory('requisitions')); @@ -241,7 +241,8 @@ vm.isNonFullSupplyTabValid = isNonFullSupplyTabValid; vm.close = close; vm.loadRejectionReasonModal = loadRejectionReasonModal; - + vm.goToRedistribution = goToRedistribution; + /** * @ngdoc method * @methodOf requisition-view.controller:RequisitionViewController @@ -263,6 +264,39 @@ vm.displayRejectButton = canApproveAndReject && !vm.requisition.extraData.originalRequisition; vm.displaySkipButton = canSkip; vm.displaySyncButton = canSync; + vm.homeFacility = homeFacility; + } + + function goToRedistribution(requisitionId) { + $state.go('openlmis.redistribution', { + rnr: requisitionId, + requisition: vm.requisition + }); + + } + + vm.isEmergencyRequisition = function(){ + + if(vm.requisition.emergency && (vm.homeFacility.type.code === "dist_store" || vm.homeFacility.type.code === "central_store") ){ + return true; + } + else{ + return false; + } + } + + vm.inDHMTForApproval = function(){ + if(vm.requisition.hasOwnProperty('supervisoryNode')){ + if((vm.homeFacility.type.code === "dist_store" || vm.homeFacility.type.code === "central_store") && vm.requisition.status === "IN_APPROVAL"){ + return false; + } + else{ + return true; + } + } + else{ + return true; + } } function setTypeAndClass() { @@ -396,6 +430,7 @@ failWithMessage('requisitionView.rnrHasErrors')(); } }); + function saveThenSubmit() { var loadingPromise = loadingModalService.open(); @@ -505,22 +540,28 @@ * Otherwise, a success notification modal will be shown. */ function approveRnr() { + // Unskip skipped line items when approving + vm.requisition.requisitionLineItems.forEach(function (lineItem) { + if (lineItem.requestedQuantity > 0) { + lineItem.skipped = ""; + } + }); confirmService.confirm( 'requisitionView.approve.confirm', 'requisitionView.approve.label' - ).then(function() { + ).then(function () { if (requisitionValidator.validateRequisition(requisition)) { var loadingPromise = loadingModalService.open(); - vm.requisition.$save().then(function() { - vm.requisition.$approve().then(function() { + vm.requisition.$save().then(function () { + vm.requisition.$approve().then(function () { watcher.disableWatcher(); - loadingPromise.then(function() { + loadingPromise.then(function () { notificationService.success('requisitionView.approve.success'); clearPatientsLocalStorage(); }); stateTrackerService.goToPreviousState('openlmis.requisitions.approvalList'); }, loadingModalService.close); - }, function(response) { + }, function (response) { handleSaveError(response.status); }); } else { diff --git a/src/requisition-view/requisition-view.controller.spec.js b/src/requisition-view/requisition-view.controller.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/requisition-view.factory.js b/src/requisition-view/requisition-view.factory.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/requisition-view.factory.spec.js b/src/requisition-view/requisition-view.factory.spec.js old mode 100644 new mode 100755 diff --git a/src/requisition-view/requisition-view.html b/src/requisition-view/requisition-view.html old mode 100644 new mode 100755 index 6ff32a40..9cf6cf16 --- a/src/requisition-view/requisition-view.html +++ b/src/requisition-view/requisition-view.html @@ -14,6 +14,7 @@

{{:: 'requisitionView.reportAndRequisitionFor' | message}} {{vm.program.name +