From 50d45334980c6aad819e21ac8d28dcb20e4d9730 Mon Sep 17 00:00:00 2001 From: "Drew J. Sonne" Date: Mon, 10 Aug 2020 19:44:58 +0100 Subject: [PATCH 1/8] Implemented primitive parser --- package-lock.json | 3631 +++++++++++++++++++ package.json | 54 +- scripts/clean-build.sh | 10 + src/__tests__/primitive-parser.spec.ts | 186 + src/__tests__/primitive-types.spec.ts | 44 + src/index.ts | 0 src/parsers/primitive.ts | 185 + src/parsers/simple-test.ts | 42 + src/tokens/base.ts | 19 + src/tokens/collection.ts | 21 + src/tokens/primitive/comment-start-token.ts | 23 + src/tokens/primitive/comment-token.ts | 20 + src/tokens/primitive/line-end-token.ts | 20 + src/tokens/primitive/number-token.ts | 21 + src/tokens/primitive/operator-token.ts | 18 + src/tokens/primitive/period-token.ts | 21 + src/tokens/primitive/space-token.ts | 22 + src/tokens/primitive/wildcard-token.ts | 21 + src/tokens/primitive/word-token.ts | 21 + 19 files changed, 4353 insertions(+), 26 deletions(-) create mode 100644 package-lock.json create mode 100644 scripts/clean-build.sh create mode 100644 src/__tests__/primitive-parser.spec.ts create mode 100644 src/__tests__/primitive-types.spec.ts create mode 100644 src/index.ts create mode 100644 src/parsers/primitive.ts create mode 100644 src/parsers/simple-test.ts create mode 100644 src/tokens/base.ts create mode 100644 src/tokens/collection.ts create mode 100644 src/tokens/primitive/comment-start-token.ts create mode 100644 src/tokens/primitive/comment-token.ts create mode 100644 src/tokens/primitive/line-end-token.ts create mode 100644 src/tokens/primitive/number-token.ts create mode 100644 src/tokens/primitive/operator-token.ts create mode 100644 src/tokens/primitive/period-token.ts create mode 100644 src/tokens/primitive/space-token.ts create mode 100644 src/tokens/primitive/wildcard-token.ts create mode 100644 src/tokens/primitive/word-token.ts diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6d204b6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3631 @@ +{ + "name": "@drewsonne/maya-calculator-parser", + "version": "1.0.15", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "dev": true, + "requires": { + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@drewsonne/maya-dates": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@drewsonne/maya-dates/-/maya-dates-1.0.15.tgz", + "integrity": "sha512-88IncpJAeMrfkV5EiymUli0iTIKhH7CSyIe+q2dxKNPGp0U+YDOzEJWYRcw6jDVlWRcbv3Gbr99/d2sBpK2nNw==", + "requires": { + "moonbeams": "^2.0.3" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "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 + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@types/chai": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.12.tgz", + "integrity": "sha512-aN5IAC8QNtSUdQzxu7lGBgYAOuU1tmRU4c9dIq5OKGf/SBVjXo+ffM2wEjudAWbgpOhy60nLoAGH1xm8fpCKFQ==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "@types/node": { + "version": "14.0.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", + "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "backbone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz", + "integrity": "sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==", + "dev": true, + "requires": { + "underscore": ">=1.8.3" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001112", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001112.tgz", + "integrity": "sha512-J05RTQlqsatidif/38aN3PGULCLrg8OYQOlJUKbeYVzC2mGZkZLIztwRlB3MtrfLmawUmjFlNJvy/uhwniIe1Q==", + "dev": true + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.526", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.526.tgz", + "integrity": "sha512-HiroW5ZbGwgT8kCnoEO8qnGjoTPzJxduvV/Vv/wH63eo2N6Zj3xT5fmmaSPAPUM05iN9/5fIEkIg3owTtV6QZg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + } + } + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "fromentries": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", + "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "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 + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "highlight.js": { + "version": "9.18.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.3.tgz", + "integrity": "sha512-zBZAmhSupHIl5sITeMqIJnYCDfAEc3Gdkqj65wC1lpI468MMQeeQkhcIAvk+RylAkxrCcI9xy9piHiXeQ1BdzQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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 + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "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" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jquery": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lunr": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.8.tgz", + "integrity": "sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "moonbeams": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/moonbeams/-/moonbeams-2.0.3.tgz", + "integrity": "sha512-S+fCR3yeMvrB2E67NftXQX+GxPJBekHuoGYGUZzPR/0r0hLVZKejR7K5f0n55voqTyNQRfBpkY/BcO7lJIIBVQ==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "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" + } + } + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "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" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-node": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", + "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "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 + }, + "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" + } + }, + "typedoc": { + "version": "0.16.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.16.11.tgz", + "integrity": "sha512-YEa5i0/n0yYmLJISJ5+po6seYfJQJ5lQYcHCPF9ffTF92DB/TAZO/QrazX5skPHNPtmlIht5FdTXCM2kC7jQFQ==", + "dev": true, + "requires": { + "@types/minimatch": "3.0.3", + "fs-extra": "^8.1.0", + "handlebars": "^4.7.2", + "highlight.js": "^9.17.1", + "lodash": "^4.17.15", + "marked": "^0.8.0", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shelljs": "^0.8.3", + "typedoc-default-themes": "^0.7.2", + "typescript": "3.7.x" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "marked": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", + "dev": true + }, + "typescript": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "dev": true + } + } + }, + "typedoc-default-themes": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.7.2.tgz", + "integrity": "sha512-fiFKlFO6VTqjcno8w6WpTsbCgXmfPHVjnLfYkmByZE7moaz+E2DSpAT+oHtDHv7E0BM5kAhPrHJELP2J2Y2T9A==", + "dev": true, + "requires": { + "backbone": "^1.4.0", + "jquery": "^3.4.1", + "lunr": "^2.3.8", + "underscore": "^1.9.1" + } + }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true + }, + "uglify-js": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.1.tgz", + "integrity": "sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q==", + "dev": true, + "optional": true + }, + "underscore": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", + "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "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 + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "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" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 16755a6..51b8c1e 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { - "name": "@drewsonne/maya-date-parser", - "version": "1.0.0", - "description": "Node.js package to parse maya date calculator instructions to executable code", - "main": "src/index.js", + "name": "@drewsonne/maya-calculator-parser", + "version": "1.0.15", + "description": "Typescript package to parse plaintext calculations and create operators", + "main": "src/index.ts", "repository": { "type": "git", - "url": "git+ssh://git@github.com/drewsonne/maya-date-parser.git" + "url": "git+ssh://git@github.com/drewsonne/aya-calculator-parser.git" }, "keywords": [ "digital-humanities", @@ -16,31 +16,33 @@ "license": "GPL-3.0", "private": false, "devDependencies": { - "esdoc": "1.1.0", - "esdoc-standard-plugin": "1.0.0", - "eslint": "^6.8.0", - "eslint-config-airbnb-base": "^14.0.0", - "eslint-plugin-import": "^2.19.1", - "eslint-plugin-jest": "^23.3.0", - "jest-cli": "^25.1.0", + "@babel/preset-env": "^7.8.4", + "@types/chai": "^4.2.10", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.26", + "chai": "^4.2.0", + "mocha": "^7.1.0", + "nyc": "^15.0.0", "regenerator-runtime": "^0.13.3", - "@babel/preset-env": "^7.8.4" - }, - "scripts": { - "test": "jest" - }, - "jest": { - "testEnvironment": "node", - "transform": { - "^.+\\.[t|j]sx?$": "babel-jest" - } + "ts-node": "^8.10.2", + "typedoc": "^0.16.11", + "typescript": "^3.9.7" }, "dependencies": { - "@drewsonne/maya-dates": "^1.0.13" + "@drewsonne/maya-dates": "^1.0.15" }, + "scripts": { + "test": "mocha -r ts-node/register 'src/**/*.spec.ts'", + "build": "tsc", + "build:check": "tsc --noEmit", + "build:clean": " ./scripts/clean-build.sh", + "build:docs": "typedoc --out docs src/" + }, + "files": [ + "lib" + ], "bugs": { - "url": "https://github.com/drewsonne/maya-date-parser/issues" + "url": "https://github.com/drewsonne/maya-calculator-parser/issues" }, - "homepage": "https://github.com/drewsonne/maya-date-parser#readme", - "preset": "react-native" + "homepage": "https://github.com/drewsonne/maya-calculator-parser#readme" } diff --git a/scripts/clean-build.sh b/scripts/clean-build.sh new file mode 100644 index 0000000..26dbc6c --- /dev/null +++ b/scripts/clean-build.sh @@ -0,0 +1,10 @@ +#! /usr/bin/env bash +set -x + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +cd "${DIR}" || exit +cd .. + +find ./src \ + \( -name "*.js" -o -name "*.d.ts.map" -o -name "*.d.ts" -o -name "*.js.map" \) \ + -delete diff --git a/src/__tests__/primitive-parser.spec.ts b/src/__tests__/primitive-parser.spec.ts new file mode 100644 index 0000000..225db0e --- /dev/null +++ b/src/__tests__/primitive-parser.spec.ts @@ -0,0 +1,186 @@ +import {expect} from 'chai' +import 'mocha' +import PrimitiveParser from "../parsers/primitive"; +import {IToken} from "../tokens/base"; +import NumberToken from "../tokens/primitive/number-token"; +import PeriodToken from "../tokens/primitive/period-token"; +import TokenCollection from "../tokens/collection"; +import LineEndToken from "../tokens/primitive/line-end-token"; +import SpaceToken from "../tokens/primitive/space-token"; +import WordToken from "../tokens/primitive/word-token"; +import WildcardToken from "../tokens/primitive/wildcard-token"; +import CommentStartToken from "../tokens/primitive/comment-start-token"; +import CommentToken from "../tokens/primitive/comment-token"; +import OperatorToken from "../tokens/primitive/operator-token"; + + +const NT = (n) => new NumberToken(n) +const WT = (w) => new WordToken(w) +const CT = (c) => new CommentToken(c) +const OT = (o) => new OperatorToken(o) +const PT = new PeriodToken() +const LET = new LineEndToken() +const ST = new SpaceToken() +const WCT = new WildcardToken() +const CST = new CommentStartToken() + +describe('primitive parser', () => { + + describe('should parse operators', () => { + const operations: [string, TokenCollection][] = [ + [ + '4 Ajaw 8 Kumk\'u - 5 Kimi 4 Mol', + [ + NT(4), ST, WT('Ajaw'), ST, NT(8), ST, WT('Kumk\'u'), + ST, OT('-'), ST, + NT(5), ST, WT('Kimi'), ST, NT(4), ST, WT('Mol') + ] + ], + [ + '9.2.10.10.10 + 10.5.1', + [ + NT(9), PT, NT(2), PT, NT(10), PT, NT(10), PT, NT(10), + ST, OT('+'), ST, + NT(10), PT, NT(5), PT, NT(1)] + ] + ].map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + operations.forEach((pattern) => { + const [rawString, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + const tokenised = new PrimitiveParser().parse(rawString) + expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }); + }) + + describe('should parse comments', () => { + const fullLines: [string, TokenCollection][] = [ + [ + '1Ok * * 9.*.10.10.10 # Hello world, this is a comment', + [ + NT(1), WT('Ok'), ST, WCT, ST, WCT, ST, NT(9), PT, WCT, PT, NT(10), PT, NT(10), PT, NT(10), + ST, CST, ST, CT('Hello world, this is a comment') + ] + ], + [ + "1Ok * * 9.*.10.10.10 # Hello world, this is a comment\n#Another comment", + [ + NT(1), WT('Ok'), ST, WCT, ST, WCT, ST, NT(9), PT, WCT, PT, NT(10), PT, NT(10), PT, NT(10), + ST, CST, ST, CT('Hello world, this is a comment'), LET, + CST, CT('Another comment') + ] + ] + + ].map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + fullLines.forEach((pattern) => { + const [rawString, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + const tokenised = new PrimitiveParser().parse(rawString) + // expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }); + }); + + describe('should parse full dates', () => { + const fullDates: [string, TokenCollection][] = [ + [ + '1Ok * * 9.*.10.10.10', + [NT(1), WT('Ok'), ST, WCT, ST, WCT, ST, NT(9), PT, WCT, PT, NT(10), PT, NT(10), PT, NT(10)] + ] + ].map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + fullDates.forEach((pattern) => { + const [rawString, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + const tokenised = new PrimitiveParser().parse(rawString) + expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }) + }); + describe('should parse calendar rounds', () => { + const crs: [string, TokenCollection][] = [ + ['4 Ajaw 8 Kumk\'u', [NT(4), ST, WT('Ajaw'), ST, NT(8), ST, WT('Kumk\'u')]], + ['3 Kawak **', [NT(3), ST, WT('Kawak'), ST, WCT, WCT]], + ['* Ajaw 8 Kumk\'u', [WCT, ST, WT('Ajaw'), ST, NT(8), ST, WT('Kumk\'u')]], + ['6 Manik\' 5 Mol', [NT(6), ST, WT('Manik\''), ST, NT(5), ST, WT('Mol')]], + ['6Manik\' 5Mol', [NT(6), WT('Manik\''), ST, NT(5), WT('Mol')]], + ['* * 12 Mol', [WCT, ST, WCT, ST, NT(12), ST, WT('Mol')]], + ['3 Kawak 7 Kumk\'u', [NT(3), ST, WT('Kawak'), ST, NT(7), ST, WT('Kumk\'u')]], + ['4 Ajaw 8 Kumk\'u', [NT(4), ST, WT('Ajaw'), ST, NT(8), ST, WT('Kumk\'u')]], + ['** 13 Xul', [WCT, WCT, ST, NT(13), ST, WT('Xul')]], + ['6 Kimi * * ', [NT(6), ST, WT('Kimi'), ST, WCT, ST, WCT, ST]], + ['5 Kimi 4 Mol', [NT(5), ST, WT('Kimi'), ST, NT(4), ST, WT('Mol')]], + ['* Chikchan 3 Mol', [WCT, ST, WT('Chikchan'), ST, NT(3), ST, WT('Mol')]], + ].map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + crs.forEach((pattern) => { + const [rawString, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + const tokenised = new PrimitiveParser().parse(rawString) + expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }) + }) + + describe('should parse long counts', () => { + const dates: [string, IToken[]][] = [ + ['7.13', [NT(7), PT, NT(13)]], + ['0.0.0.7.13', [NT(0), PT, NT(0), PT, NT(0), PT, NT(7), PT, NT(13)]], + ['9.16.19.17.19', [NT(9), PT, NT(16), PT, NT(19), PT, NT(17), PT, NT(19)]], + ["10.10\n9.9", [NT(10), PT, NT(10), LET, NT(9), PT, NT(9)]], + [" 8. 7. 6. 5. 4.17. 2. 1", [ + ST, NT(8), PT, + ST, NT(7), PT, + ST, NT(6), PT, + ST, NT(5), PT, + ST, NT(4), PT, + NT(17), PT, + ST, NT(2), PT, + ST, NT(1), + ]] + ] + + const parsed: [string, TokenCollection][] = dates.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + parsed.forEach((pattern) => { + const [rawString, expectedTokens] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + const tokenised = new PrimitiveParser().parse(rawString) + expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }) + }) + +}) diff --git a/src/__tests__/primitive-types.spec.ts b/src/__tests__/primitive-types.spec.ts new file mode 100644 index 0000000..8f51ed4 --- /dev/null +++ b/src/__tests__/primitive-types.spec.ts @@ -0,0 +1,44 @@ +import {expect} from 'chai' +import 'mocha' +import NumberToken from "../tokens/primitive/number-token"; +import {IToken, Token} from "../tokens/base"; +import WildcardToken from "../tokens/primitive/wildcard-token"; +import WordToken from "../tokens/primitive/word-token"; +import PeriodToken from "../tokens/primitive/period-token"; +import SpaceToken from "../tokens/primitive/space-token"; +import CommentStartToken from "../tokens/primitive/comment-start-token"; +import LineEndToken from "../tokens/primitive/line-end-token"; + + +describe('primitive number parser', () => { + + describe('should parse numbers', () => { + const dates: [string, NumberToken][] = [ + ['713', new NumberToken(713)], + ['13', new NumberToken(13)], + ['10', new NumberToken(10)], + ['19', new NumberToken(19)] + ]; + dates.forEach((number: [string, NumberToken]) => { + const [raw, expected] = number + it(`'${raw}' -> ${expected}`, () => { + const actual = NumberToken.parse(raw) + expect(actual.equal(expected)).to.be.true + expect(`${actual}`).to.equal(`${expected}`) + }); + }) + }); + + describe('should fail parsing non-numbers', () => { + const non_numbers: any[] = [null, undefined, '10.6', {}, []] + type ParserType = (typeof NumberToken | typeof PeriodToken | typeof WordToken | typeof WildcardToken | typeof SpaceToken | typeof CommentStartToken | typeof LineEndToken) + const parsers: ParserType[] = [NumberToken, PeriodToken, WordToken, WildcardToken] + non_numbers.forEach((non_number) => { + parsers.forEach((parser) => { + it(`${parser.name}: ${non_number}`, () => { + expect(() => parser.parse(non_number)).to.throw(`Could not parse: '${non_number}'`) + }); + }); + }); + }); +}); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/parsers/primitive.ts b/src/parsers/primitive.ts new file mode 100644 index 0000000..ba756ec --- /dev/null +++ b/src/parsers/primitive.ts @@ -0,0 +1,185 @@ +import {IToken} from "../tokens/base"; +import PrimitiveTest from "./simple-test"; +import NumberToken from "../tokens/primitive/number-token"; +import PeriodToken from "../tokens/primitive/period-token"; +import LineEndToken from "../tokens/primitive/line-end-token"; +import SpaceToken from "../tokens/primitive/space-token"; +import WordToken from "../tokens/primitive/word-token"; +import WildcardToken from "../tokens/primitive/wildcard-token"; +import TokenCollection from "../tokens/collection"; +import CommentStartToken from "../tokens/primitive/comment-start-token"; +import CommentToken from "../tokens/primitive/comment-token"; +import OperatorToken from "../tokens/primitive/operator-token"; + +enum PrimitiveParserStateValue { + WAITING, + PARSING_NUMBER, + PARSING_WORD, + PARSING_COMMENT_START, + PARSING_COMMENT_BODY, +} + +class PrimitiveParserState { + private state: PrimitiveParserStateValue + + constructor() { + this.state = PrimitiveParserStateValue.WAITING + } + + isWaiting(): boolean { + return this.state === PrimitiveParserStateValue.WAITING + } + + isParsingNumber(): boolean { + return this.state === PrimitiveParserStateValue.PARSING_NUMBER + } + + isParsingWord(): boolean { + return this.state === PrimitiveParserStateValue.PARSING_WORD + } + + isParsingCommentStart(): boolean { + return this.state === PrimitiveParserStateValue.PARSING_COMMENT_START + } + + isParsingCommentBody(): boolean { + return this.state === PrimitiveParserStateValue.PARSING_COMMENT_BODY + } + + reset() { + this.state = PrimitiveParserStateValue.WAITING + } + + startParsingNumber() { + this.state = PrimitiveParserStateValue.PARSING_NUMBER + } + + startParsingWord() { + this.state = PrimitiveParserStateValue.PARSING_WORD + } + + startParsingComment() { + this.state = PrimitiveParserStateValue.PARSING_COMMENT_START + } + + startParsingCommentBody() { + this.state = PrimitiveParserStateValue.PARSING_COMMENT_BODY + } +} + +export default class PrimitiveParser { + private state: PrimitiveParserState + + constructor() { + this.state = new PrimitiveParserState() + } + + parse(rawText: string): TokenCollection { + let tokens: IToken[] = [] + let cache: string[] = [] + for (let cursor = 0; cursor < rawText.length; cursor += 1) { + const cell = rawText[cursor]; + if (this.state.isWaiting()) { + if (PrimitiveTest.isLetter(cell)) { + this.state.startParsingWord() + cache.push(cell) + } else if (PrimitiveTest.isNumber(cell)) { + this.state.startParsingNumber() + cache.push(cell) + } else if (PrimitiveTest.isPeriod(cell)) { + tokens.push(PeriodToken.parse(cell)) + } else if (PrimitiveTest.isSpace(cell)) { + tokens.push(SpaceToken.parse(cell)) + } else if (PrimitiveTest.isWildcard(cell)) { + tokens.push(WildcardToken.parse(cell)) + } else if (PrimitiveTest.isCommentStart(cell)) { + tokens.push(CommentStartToken.parse(cell)) + this.state.startParsingComment() + } else if (PrimitiveTest.isOperator(cell)) { + tokens.push(OperatorToken.parse(cell)) + this.state.reset() + } else { + throw new Error('Primitive parser in unexpected state') + } + } else if (this.state.isParsingNumber()) { + if (PrimitiveTest.isLetter(cell)) { + tokens.push(NumberToken.parse(cache.join(''))) + cache = [cell] + this.state.startParsingWord() + } else if (PrimitiveTest.isNumber(cell)) { + cache.push(cell) + } else if (PrimitiveTest.isPeriod(cell)) { + tokens.push(NumberToken.parse(cache.join(''))) + tokens.push(PeriodToken.parse(cell)) + cache = [] + this.state.reset() + } else if (PrimitiveTest.isCarriageReturn(cell)) { + tokens.push(NumberToken.parse(cache.join(''))) + tokens.push(LineEndToken.parse(cell)) + cache = [] + this.state.reset() + } else if (PrimitiveTest.isSpace(cell)) { + tokens.push(NumberToken.parse(cache.join(''))) + tokens.push(SpaceToken.parse(cell)) + cache = [] + this.state.reset() + } else { + throw new Error('Primitive parser in unexpected state') + } + } else if (this.state.isParsingWord()) { + if (PrimitiveTest.isLetter(cell)) { + cache.push(cell) + } else if (PrimitiveTest.isNumber(cell)) { + throw new Error('Primitive parser in unexpected state') + } else if (PrimitiveTest.isPeriod(cell)) { + throw new Error('Primitive parser in unexpected state') + } else if (PrimitiveTest.isSpace(cell)) { + tokens.push(WordToken.parse(cache.join(''))) + tokens.push(SpaceToken.parse(cell)) + cache = [] + this.state.reset() + } else { + throw new Error('Primitive parser in unexpected state') + } + } else if (this.state.isParsingCommentStart()) { + if (PrimitiveTest.isSpace(cell)) { + tokens.push(SpaceToken.parse(cell)) + this.state.startParsingCommentBody() + } else if (PrimitiveTest.isCommentLetter(cell)) { + cache = [cell] + this.state.startParsingCommentBody() + } else { + throw new Error('Primitive parser in unexpected state') + } + } else if (this.state.isParsingCommentBody()) { + if (PrimitiveTest.isCommentLetter(cell)) { + cache.push(cell) + } else if (PrimitiveTest.isCarriageReturn(cell)) { + tokens.push(CommentToken.parse(cache.join(''))) + tokens.push(LineEndToken.parse(cell)) + cache = [] + this.state.reset() + } else { + throw new Error('Primitive parser in unexpected state') + } + } else { + throw new Error('Primitive parser in unexpected state') + } + } + if (cache.length > 0) { + if (this.state.isParsingNumber()) { + tokens.push(NumberToken.parse(cache.join(''))) + } else if (this.state.isParsingWord()) { + tokens.push(WordToken.parse(cache.join(''))) + } else if (this.state.isParsingCommentBody()) { + tokens.push(CommentToken.parse(cache.join(''))) + } else { + throw new Error('Primitive parser in unexpected state') + } + } + this.state.reset() + return new TokenCollection(tokens) + } + + +} diff --git a/src/parsers/simple-test.ts b/src/parsers/simple-test.ts new file mode 100644 index 0000000..44e1381 --- /dev/null +++ b/src/parsers/simple-test.ts @@ -0,0 +1,42 @@ +export default class PrimitiveTest { + static isLetter(raw: string): boolean { + return this.regexTest(raw, /^['a-zA-Z]$/) + } + + static isCommentLetter(raw: string): boolean { + return this.regexTest(raw, /[^\n]/) + } + + static isNumber(cell: string): boolean { + return this.regexTest(cell, /^\d$/) + } + + static regexTest(cell: string, pattern: RegExp): boolean { + const result = cell.match(pattern) + return (result !== null) + } + + static isPeriod(cell: string): boolean { + return cell === '.' + } + + static isCarriageReturn(cell: string) { + return cell === "\n" + } + + static isSpace(cell: string): boolean { + return cell === ' ' + } + + static isWildcard(cell: string): boolean { + return cell === '*' + } + + static isCommentStart(cell: string): boolean { + return cell === '#'; + } + + static isOperator(cell: string): boolean { + return ['-', '+'].includes(cell) + } +} diff --git a/src/tokens/base.ts b/src/tokens/base.ts new file mode 100644 index 0000000..2537c27 --- /dev/null +++ b/src/tokens/base.ts @@ -0,0 +1,19 @@ +export abstract class Token implements IToken { + public value: T + + constructor(value: T) { + this.value = value + } + + abstract equal(otherToken: IToken): boolean + + toString(): string { + return `${this.value}` + } +} + +export interface IToken { + equal(otherToken: IToken): boolean + + value: any +} diff --git a/src/tokens/collection.ts b/src/tokens/collection.ts new file mode 100644 index 0000000..571a3e8 --- /dev/null +++ b/src/tokens/collection.ts @@ -0,0 +1,21 @@ +import {IToken} from "./base"; + +export default class TokenCollection { + public tokens: IToken[] + + constructor(tokens: IToken[]) { + this.tokens = tokens + } + + get length(): number { + return this.tokens.length + } + + toString(): string { + return this.tokens.join(', ') + } + + index(i: number): IToken { + return this.tokens[i] + } +} diff --git a/src/tokens/primitive/comment-start-token.ts b/src/tokens/primitive/comment-start-token.ts new file mode 100644 index 0000000..834a216 --- /dev/null +++ b/src/tokens/primitive/comment-start-token.ts @@ -0,0 +1,23 @@ +import {IToken, Token} from "../base"; + +export default class CommentStartToken extends Token { + constructor() { + super('#'); + } + + static parse(raw: string): CommentStartToken { + if (raw === '#') { + return new CommentStartToken() + } + throw new Error(`Could not parse: '${raw}'`) + + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof CommentStartToken) { + return otherToken.value === this.value + } + return false + } + +} diff --git a/src/tokens/primitive/comment-token.ts b/src/tokens/primitive/comment-token.ts new file mode 100644 index 0000000..48f4785 --- /dev/null +++ b/src/tokens/primitive/comment-token.ts @@ -0,0 +1,20 @@ +import {IToken, Token} from "../base"; + +export default class CommentToken extends Token { + equal(otherToken: IToken): boolean { + if (otherToken instanceof CommentToken) { + return otherToken.value === this.value + } + return false; + } + + static parse(raw: string): CommentToken { + const wordPattern = /[\n]+/; + if (typeof raw === 'string') { + if (!raw.match(wordPattern)) { + return new CommentToken(raw) + } + } + throw new Error(`Could not parse: '${raw}'`) + } +} diff --git a/src/tokens/primitive/line-end-token.ts b/src/tokens/primitive/line-end-token.ts new file mode 100644 index 0000000..1ecc368 --- /dev/null +++ b/src/tokens/primitive/line-end-token.ts @@ -0,0 +1,20 @@ +import {IToken, Token} from "../base"; + +export default class LineEndToken extends Token { + constructor() { + super("\n"); + } + + static parse(raw: string): LineEndToken { + if (raw === "\n") { + return new LineEndToken() + } + throw new Error(`Could not parse: '${raw}'`) + + } + + equal(otherToken: IToken): boolean { + return (otherToken instanceof LineEndToken) + } + +} diff --git a/src/tokens/primitive/number-token.ts b/src/tokens/primitive/number-token.ts new file mode 100644 index 0000000..1766646 --- /dev/null +++ b/src/tokens/primitive/number-token.ts @@ -0,0 +1,21 @@ +import {IToken, Token} from "../base"; + +export default class NumberToken extends Token { + static parse(raw: string): NumberToken { + const parsed = parseInt(raw, 10) + if (`${parsed}` !== raw) { + throw new Error(`Could not parse: '${raw}'`) + } else if (!isNaN(parsed)) { + return new NumberToken(parsed) + } else { + throw new Error(`Could not parse: '${raw}'`) + } + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof NumberToken) { + return otherToken.value === this.value + } + return false + } +} diff --git a/src/tokens/primitive/operator-token.ts b/src/tokens/primitive/operator-token.ts new file mode 100644 index 0000000..138d35c --- /dev/null +++ b/src/tokens/primitive/operator-token.ts @@ -0,0 +1,18 @@ +import {IToken, Token} from "../base"; + +export default class OperatorToken extends Token { + static parse(raw: string): OperatorToken { + if (['+', '-'].includes(raw)) { + return new OperatorToken(raw) + } + throw new Error(`Could not parse: '${raw}'`) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof OperatorToken) { + return otherToken.value === this.value + } + return false + } + +} diff --git a/src/tokens/primitive/period-token.ts b/src/tokens/primitive/period-token.ts new file mode 100644 index 0000000..14ce796 --- /dev/null +++ b/src/tokens/primitive/period-token.ts @@ -0,0 +1,21 @@ +import {IToken, Token} from "../base"; + +export default class PeriodToken extends Token { + constructor() { + super('.'); + } + + static parse(raw: string): PeriodToken { + if (raw === '.') { + return new PeriodToken() + } + throw new Error(`Could not parse: '${raw}'`) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof PeriodToken) { + return otherToken.value === this.value + } + return false + } +} diff --git a/src/tokens/primitive/space-token.ts b/src/tokens/primitive/space-token.ts new file mode 100644 index 0000000..ebb5b87 --- /dev/null +++ b/src/tokens/primitive/space-token.ts @@ -0,0 +1,22 @@ +import {IToken, Token} from "../base"; + +export default class SpaceToken extends Token { + constructor() { + super(' '); + } + + static parse(raw: string): SpaceToken { + if (raw === ' ') { + return new SpaceToken() + } + throw new Error(`Could not parse: '${raw}'`) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof SpaceToken) { + return otherToken.value === this.value + } + return false; + } + +} diff --git a/src/tokens/primitive/wildcard-token.ts b/src/tokens/primitive/wildcard-token.ts new file mode 100644 index 0000000..c8c966a --- /dev/null +++ b/src/tokens/primitive/wildcard-token.ts @@ -0,0 +1,21 @@ +import {IToken, Token} from "../base"; + +export default class WildcardToken extends Token { + constructor() { + super('*'); + } + + static parse(raw: string): WildcardToken { + if (raw === '*') { + return new WildcardToken() + } + throw new Error(`Could not parse: '${raw}'`) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof WildcardToken) { + return otherToken.value === this.value + } + return false + } +} diff --git a/src/tokens/primitive/word-token.ts b/src/tokens/primitive/word-token.ts new file mode 100644 index 0000000..ccf68b6 --- /dev/null +++ b/src/tokens/primitive/word-token.ts @@ -0,0 +1,21 @@ +import {IToken, Token} from "../base"; + +export default class WordToken extends Token { + static parse(raw: string): WordToken { + const wordPattern = /[^'a-zA-Z]+/; + if (typeof raw === 'string') { + if (!raw.match(wordPattern)) { + return new WordToken(raw) + } + } + throw new Error(`Could not parse: '${raw}'`) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof WordToken) { + return otherToken.value === this.value + } + return false; + } + +} From d95e8bbb4db7a3b0c6bdea0b23bd03ea1ef8baad Mon Sep 17 00:00:00 2001 From: "Drew J. Sonne" Date: Mon, 10 Aug 2020 19:52:18 +0100 Subject: [PATCH 2/8] Add tsconfig.json --- tsconfig.json | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 tsconfig.json diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..907cb22 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "target": "ES5", + "module": "commonjs", + "moduleResolution": "Node", + "esModuleInterop": true, + "resolveJsonModule": true, + "lib": [ + "es6", + "ES2016.Array.Include", + "es2015", + "es2016", + "es2019" + ], + "types": ["node"], + "declaration": true, + "outDir": "lib", + "rootDir": "src", + "strict": true, + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "sourceMap": true, + "inlineSources": true, + "declarationMap": true + }, + "exclude": [ + "lib", + "node_modules", + "src/**/*.spec.ts" + ], + "include": [ + "src", + "decs.d.ts" + ], + "publishConfig": { + "access": "public" + } +} From 96c2fd56613641b093a0ae4c212571b5d6189f30 Mon Sep 17 00:00:00 2001 From: "Drew J. Sonne" Date: Mon, 10 Aug 2020 19:58:31 +0100 Subject: [PATCH 3/8] Fixed strict mode --- src/__tests__/primitive-parser.spec.ts | 30 +++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/__tests__/primitive-parser.spec.ts b/src/__tests__/primitive-parser.spec.ts index 225db0e..0f443dd 100644 --- a/src/__tests__/primitive-parser.spec.ts +++ b/src/__tests__/primitive-parser.spec.ts @@ -14,10 +14,10 @@ import CommentToken from "../tokens/primitive/comment-token"; import OperatorToken from "../tokens/primitive/operator-token"; -const NT = (n) => new NumberToken(n) -const WT = (w) => new WordToken(w) -const CT = (c) => new CommentToken(c) -const OT = (o) => new OperatorToken(o) +const NT = (n: number) => new NumberToken(n) +const WT = (w: string) => new WordToken(w) +const CT = (c: string) => new CommentToken(c) +const OT = (o: string) => new OperatorToken(o) const PT = new PeriodToken() const LET = new LineEndToken() const ST = new SpaceToken() @@ -27,7 +27,7 @@ const CST = new CommentStartToken() describe('primitive parser', () => { describe('should parse operators', () => { - const operations: [string, TokenCollection][] = [ + const looseOperations: [string, IToken[]][] = [ [ '4 Ajaw 8 Kumk\'u - 5 Kimi 4 Mol', [ @@ -43,7 +43,10 @@ describe('primitive parser', () => { ST, OT('+'), ST, NT(10), PT, NT(5), PT, NT(1)] ] - ].map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + ] + const operations: [string, TokenCollection][] = looseOperations.map((row: [string, IToken[]]) => { + return [row[0], new TokenCollection(row[1])]; + }) operations.forEach((pattern) => { const [rawString, expectedTokens]: [string, TokenCollection] = pattern it(`${rawString} -> ${expectedTokens}`, () => { @@ -61,7 +64,7 @@ describe('primitive parser', () => { }) describe('should parse comments', () => { - const fullLines: [string, TokenCollection][] = [ + const looseFullLines: [string, IToken[]][] = [ [ '1Ok * * 9.*.10.10.10 # Hello world, this is a comment', [ @@ -78,7 +81,8 @@ describe('primitive parser', () => { ] ] - ].map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + ] + const fullLines: [string, TokenCollection][] = looseFullLines.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) fullLines.forEach((pattern) => { const [rawString, expectedTokens]: [string, TokenCollection] = pattern it(`${rawString} -> ${expectedTokens}`, () => { @@ -96,12 +100,13 @@ describe('primitive parser', () => { }); describe('should parse full dates', () => { - const fullDates: [string, TokenCollection][] = [ + const looseFullDates: [string, IToken[]][] = [ [ '1Ok * * 9.*.10.10.10', [NT(1), WT('Ok'), ST, WCT, ST, WCT, ST, NT(9), PT, WCT, PT, NT(10), PT, NT(10), PT, NT(10)] ] - ].map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + ] + const fullDates: [string, TokenCollection][] = looseFullDates.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) fullDates.forEach((pattern) => { const [rawString, expectedTokens]: [string, TokenCollection] = pattern it(`${rawString} -> ${expectedTokens}`, () => { @@ -118,7 +123,7 @@ describe('primitive parser', () => { }) }); describe('should parse calendar rounds', () => { - const crs: [string, TokenCollection][] = [ + const looseCrs: [string, IToken[]][] = [ ['4 Ajaw 8 Kumk\'u', [NT(4), ST, WT('Ajaw'), ST, NT(8), ST, WT('Kumk\'u')]], ['3 Kawak **', [NT(3), ST, WT('Kawak'), ST, WCT, WCT]], ['* Ajaw 8 Kumk\'u', [WCT, ST, WT('Ajaw'), ST, NT(8), ST, WT('Kumk\'u')]], @@ -131,7 +136,8 @@ describe('primitive parser', () => { ['6 Kimi * * ', [NT(6), ST, WT('Kimi'), ST, WCT, ST, WCT, ST]], ['5 Kimi 4 Mol', [NT(5), ST, WT('Kimi'), ST, NT(4), ST, WT('Mol')]], ['* Chikchan 3 Mol', [WCT, ST, WT('Chikchan'), ST, NT(3), ST, WT('Mol')]], - ].map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + ] + const crs: [string, TokenCollection][] = looseCrs.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) crs.forEach((pattern) => { const [rawString, expectedTokens]: [string, TokenCollection] = pattern it(`${rawString} -> ${expectedTokens}`, () => { From f32068cb63b0164d75b64d7ec43b7244a1b9bffa Mon Sep 17 00:00:00 2001 From: "Drew J. Sonne" Date: Thu, 13 Aug 2020 18:11:22 +0100 Subject: [PATCH 4/8] Add all token parsers --- .gitignore | 8 + package-lock.json | 14 +- package.json | 4 +- ...-parser.spec.ts => layer-0-parser.spec.ts} | 37 +-- src/__tests__/layer-1-parser.spec.ts | 203 ++++++++++++++++ src/__tests__/layer-1-tokens.spec.ts | 61 +++++ src/__tests__/layer-2-parser.spec.ts | 221 ++++++++++++++++++ src/__tests__/layer-3-parser.spec.ts | 91 ++++++++ src/__tests__/primitive-types.spec.ts | 19 +- .../{primitive.ts => layer-0-parser.ts} | 123 +++++----- .../{simple-test.ts => layer-0-test.ts} | 2 +- src/parsers/layer-1-parser.ts | 166 +++++++++++++ src/parsers/layer-1-test.ts | 61 +++++ src/parsers/layer-2-parser.ts | 100 ++++++++ src/parsers/layer-2-test.ts | 59 +++++ src/parsers/layer-3-parser.ts | 77 ++++++ src/tokens/base.ts | 7 +- src/tokens/collection.ts | 17 +- src/tokens/i-token.ts | 5 + .../comment-start-token.ts | 3 +- .../{primitive => layer-0}/comment-token.ts | 3 +- .../{primitive => layer-0}/line-end-token.ts | 3 +- .../{primitive => layer-0}/number-token.ts | 3 +- .../{primitive => layer-0}/operator-token.ts | 3 +- .../{primitive => layer-0}/period-token.ts | 3 +- .../{primitive => layer-0}/space-token.ts | 3 +- .../{primitive => layer-0}/wildcard-token.ts | 3 +- .../{primitive => layer-0}/word-token.ts | 3 +- src/tokens/layer-1/calendar-round-token.ts | 45 ++++ src/tokens/layer-1/long-count-token.ts | 37 +++ .../layer-2/calendar-round-operation-token.ts | 26 +++ ...calendar-round-wildcard-operation-token.ts | 20 ++ .../layer-2/long-count-operation-token.ts | 18 ++ .../long-count-wildcard-operation-token.ts | 20 ++ src/tokens/layer-3/full-date-token.ts | 18 ++ .../full-date-wildcard-operation-token.ts | 21 ++ 36 files changed, 1396 insertions(+), 111 deletions(-) rename src/__tests__/{primitive-parser.spec.ts => layer-0-parser.spec.ts} (85%) create mode 100644 src/__tests__/layer-1-parser.spec.ts create mode 100644 src/__tests__/layer-1-tokens.spec.ts create mode 100644 src/__tests__/layer-2-parser.spec.ts create mode 100644 src/__tests__/layer-3-parser.spec.ts rename src/parsers/{primitive.ts => layer-0-parser.ts} (50%) rename src/parsers/{simple-test.ts => layer-0-test.ts} (95%) create mode 100644 src/parsers/layer-1-parser.ts create mode 100644 src/parsers/layer-1-test.ts create mode 100644 src/parsers/layer-2-parser.ts create mode 100644 src/parsers/layer-2-test.ts create mode 100644 src/parsers/layer-3-parser.ts create mode 100644 src/tokens/i-token.ts rename src/tokens/{primitive => layer-0}/comment-start-token.ts (86%) rename src/tokens/{primitive => layer-0}/comment-token.ts (87%) rename src/tokens/{primitive => layer-0}/line-end-token.ts (84%) rename src/tokens/{primitive => layer-0}/number-token.ts (88%) rename src/tokens/{primitive => layer-0}/operator-token.ts (85%) rename src/tokens/{primitive => layer-0}/period-token.ts (86%) rename src/tokens/{primitive => layer-0}/space-token.ts (86%) rename src/tokens/{primitive => layer-0}/wildcard-token.ts (86%) rename src/tokens/{primitive => layer-0}/word-token.ts (87%) create mode 100644 src/tokens/layer-1/calendar-round-token.ts create mode 100644 src/tokens/layer-1/long-count-token.ts create mode 100644 src/tokens/layer-2/calendar-round-operation-token.ts create mode 100644 src/tokens/layer-2/calendar-round-wildcard-operation-token.ts create mode 100644 src/tokens/layer-2/long-count-operation-token.ts create mode 100644 src/tokens/layer-2/long-count-wildcard-operation-token.ts create mode 100644 src/tokens/layer-3/full-date-token.ts create mode 100644 src/tokens/layer-3/full-date-wildcard-operation-token.ts diff --git a/.gitignore b/.gitignore index eb79dd5..c6584a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,10 @@ node_modules .idea +dist +src/**/*.d.ts.map +src/**/*.d.ts +src/**/*.js.map +src/**/*.js +lib +.nyc_output +Develop diff --git a/package-lock.json b/package-lock.json index 6d204b6..c36bc13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@drewsonne/maya-calculator-parser", - "version": "1.0.15", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1033,11 +1033,12 @@ } }, "@drewsonne/maya-dates": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@drewsonne/maya-dates/-/maya-dates-1.0.15.tgz", - "integrity": "sha512-88IncpJAeMrfkV5EiymUli0iTIKhH7CSyIe+q2dxKNPGp0U+YDOzEJWYRcw6jDVlWRcbv3Gbr99/d2sBpK2nNw==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/@drewsonne/maya-dates/-/maya-dates-1.0.19.tgz", + "integrity": "sha512-k2FjQm5Gr0D3rlOhoGeYq/vx9MJUumTQWlBXxHBy+jwCQHvTFJ5l+QM0AgVfL2tggS8MLtgdnwq/p17bN4IHHw==", "requires": { - "moonbeams": "^2.0.3" + "moonbeams": "^2.0.3", + "typescript": "^3.9.7" } }, "@istanbuljs/load-nyc-config": { @@ -3201,8 +3202,7 @@ "typescript": { "version": "3.9.7", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "dev": true + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" }, "uglify-js": { "version": "3.10.1", diff --git a/package.json b/package.json index 51b8c1e..4ea2620 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@drewsonne/maya-calculator-parser", - "version": "1.0.15", + "version": "1.0.0", "description": "Typescript package to parse plaintext calculations and create operators", "main": "src/index.ts", "repository": { @@ -29,7 +29,7 @@ "typescript": "^3.9.7" }, "dependencies": { - "@drewsonne/maya-dates": "^1.0.15" + "@drewsonne/maya-dates": "^1.0.19" }, "scripts": { "test": "mocha -r ts-node/register 'src/**/*.spec.ts'", diff --git a/src/__tests__/primitive-parser.spec.ts b/src/__tests__/layer-0-parser.spec.ts similarity index 85% rename from src/__tests__/primitive-parser.spec.ts rename to src/__tests__/layer-0-parser.spec.ts index 0f443dd..77fb464 100644 --- a/src/__tests__/primitive-parser.spec.ts +++ b/src/__tests__/layer-0-parser.spec.ts @@ -1,17 +1,17 @@ import {expect} from 'chai' import 'mocha' -import PrimitiveParser from "../parsers/primitive"; -import {IToken} from "../tokens/base"; -import NumberToken from "../tokens/primitive/number-token"; -import PeriodToken from "../tokens/primitive/period-token"; +import Layer0Parser from "../parsers/layer-0-parser"; +import NumberToken from "../tokens/layer-0/number-token"; +import PeriodToken from "../tokens/layer-0/period-token"; import TokenCollection from "../tokens/collection"; -import LineEndToken from "../tokens/primitive/line-end-token"; -import SpaceToken from "../tokens/primitive/space-token"; -import WordToken from "../tokens/primitive/word-token"; -import WildcardToken from "../tokens/primitive/wildcard-token"; -import CommentStartToken from "../tokens/primitive/comment-start-token"; -import CommentToken from "../tokens/primitive/comment-token"; -import OperatorToken from "../tokens/primitive/operator-token"; +import LineEndToken from "../tokens/layer-0/line-end-token"; +import SpaceToken from "../tokens/layer-0/space-token"; +import WordToken from "../tokens/layer-0/word-token"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; +import CommentStartToken from "../tokens/layer-0/comment-start-token"; +import CommentToken from "../tokens/layer-0/comment-token"; +import OperatorToken from "../tokens/layer-0/operator-token"; +import {IToken} from "../tokens/i-token"; const NT = (n: number) => new NumberToken(n) @@ -24,7 +24,7 @@ const ST = new SpaceToken() const WCT = new WildcardToken() const CST = new CommentStartToken() -describe('primitive parser', () => { +describe('layer-0 parser', () => { describe('should parse operators', () => { const looseOperations: [string, IToken[]][] = [ @@ -50,7 +50,7 @@ describe('primitive parser', () => { operations.forEach((pattern) => { const [rawString, expectedTokens]: [string, TokenCollection] = pattern it(`${rawString} -> ${expectedTokens}`, () => { - const tokenised = new PrimitiveParser().parse(rawString) + const tokenised = new Layer0Parser().parse(rawString) expect(tokenised.length).to.eq(expectedTokens.length) for (let i = 0; i < tokenised.length; i++) { expect( @@ -86,7 +86,7 @@ describe('primitive parser', () => { fullLines.forEach((pattern) => { const [rawString, expectedTokens]: [string, TokenCollection] = pattern it(`${rawString} -> ${expectedTokens}`, () => { - const tokenised = new PrimitiveParser().parse(rawString) + const tokenised = new Layer0Parser().parse(rawString) // expect(tokenised.length).to.eq(expectedTokens.length) for (let i = 0; i < tokenised.length; i++) { expect( @@ -110,7 +110,7 @@ describe('primitive parser', () => { fullDates.forEach((pattern) => { const [rawString, expectedTokens]: [string, TokenCollection] = pattern it(`${rawString} -> ${expectedTokens}`, () => { - const tokenised = new PrimitiveParser().parse(rawString) + const tokenised = new Layer0Parser().parse(rawString) expect(tokenised.length).to.eq(expectedTokens.length) for (let i = 0; i < tokenised.length; i++) { expect( @@ -141,7 +141,7 @@ describe('primitive parser', () => { crs.forEach((pattern) => { const [rawString, expectedTokens]: [string, TokenCollection] = pattern it(`${rawString} -> ${expectedTokens}`, () => { - const tokenised = new PrimitiveParser().parse(rawString) + const tokenised = new Layer0Parser().parse(rawString) expect(tokenised.length).to.eq(expectedTokens.length) for (let i = 0; i < tokenised.length; i++) { expect( @@ -169,14 +169,15 @@ describe('primitive parser', () => { NT(17), PT, ST, NT(2), PT, ST, NT(1), - ]] + ]], + ['*.*.*.7.13', [WCT, PT, WCT, PT, WCT, PT, NT(7), PT, NT(13)]] ] const parsed: [string, TokenCollection][] = dates.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) parsed.forEach((pattern) => { const [rawString, expectedTokens] = pattern it(`${rawString} -> ${expectedTokens}`, () => { - const tokenised = new PrimitiveParser().parse(rawString) + const tokenised = new Layer0Parser().parse(rawString) expect(tokenised.length).to.eq(expectedTokens.length) for (let i = 0; i < tokenised.length; i++) { expect( diff --git a/src/__tests__/layer-1-parser.spec.ts b/src/__tests__/layer-1-parser.spec.ts new file mode 100644 index 0000000..3ed9390 --- /dev/null +++ b/src/__tests__/layer-1-parser.spec.ts @@ -0,0 +1,203 @@ +import {expect} from 'chai' +import 'mocha' +import NumberToken from "../tokens/layer-0/number-token"; +import WordToken from "../tokens/layer-0/word-token"; +import CommentToken from "../tokens/layer-0/comment-token"; +import OperatorToken from "../tokens/layer-0/operator-token"; +import PeriodToken from "../tokens/layer-0/period-token"; +import LineEndToken from "../tokens/layer-0/line-end-token"; +import SpaceToken from "../tokens/layer-0/space-token"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; +import CommentStartToken from "../tokens/layer-0/comment-start-token"; +import TokenCollection from "../tokens/collection"; +import CalendarRoundToken from "../tokens/layer-1/calendar-round-token"; +import LongCountToken from "../tokens/layer-1/long-count-token"; +import {IToken} from "../tokens/i-token"; +import Layer0Parser from "../parsers/layer-0-parser"; + +const NT = (n: number) => new NumberToken(n) +const WT = (w: string) => new WordToken(w) +const CT = (c: string) => new CommentToken(c) +const OT = (o: string) => new OperatorToken(o) +const PT = new PeriodToken() +const LET = new LineEndToken() +const ST = new SpaceToken() +const WCT = new WildcardToken() +const CST = new CommentStartToken() + + +describe('layer-1 parser', () => { + + describe('should parse operators', () => { + const looseOperations: [string, IToken[]][] = [ + [ + '4 Ajaw 8 Kumk\'u - 5 Kimi 4 Mol', + [ + CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')]), + OT('-'), + CalendarRoundToken.parse([NT(5), WT('Kimi'), NT(4), WT('Mol')]), + + ] + ], + [ + '9.2.10.10.10 + 10.5.1', + [ + LongCountToken.parse([NT(9), PT, NT(2), PT, NT(10), PT, NT(10), PT, NT(10)]), + OT('+'), + LongCountToken.parse([NT(10), PT, NT(5), PT, NT(1)]) + ] + ] + ] + const operations: [string, TokenCollection][] = looseOperations.map((row: [string, IToken[]]) => { + return [row[0], new TokenCollection(row[1])]; + }) + operations.forEach((pattern) => { + const [rawText, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawText} -> ${expectedTokens}`, () => { + + const layer1Tokens = new Layer0Parser().parse(rawText).processLayer1() + + expect(layer1Tokens.length).to.eq(expectedTokens.length) + for (let i = 0; i < layer1Tokens.length; i++) { + expect( + layer1Tokens.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }); + }) + + describe('should parse calendar rounds', () => { + const looseCrs: [string, IToken[]][] = [ + [ + '4 Ajaw 8 Kumk\'u', + [CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')])] + ], + [ + "4 Ajaw 8 Kumk\'u\n3 Kawak **", + [ + CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')]), + CalendarRoundToken.parse([NT(3), WT('Kawak'), WCT, WCT]) + ] + ], + [ + '3 Kawak **', + [CalendarRoundToken.parse([NT(3), WT('Kawak'), WCT, WCT])] + ], + [ + '* Ajaw 8 Kumk\'u', + [CalendarRoundToken.parse([WCT, WT('Ajaw'), NT(8), WT('Kumk\'u')])] + ], + [ + '6 Manik\' 5 Mol', + [CalendarRoundToken.parse([NT(6), WT('Manik\''), NT(5), WT('Mol')])] + ], + [ + '6 Manik\' 5 Mol', + [CalendarRoundToken.parse([NT(6), WT('Manik\''), NT(5), WT('Mol')])] + ], + [ + '* * 12 Mol', + [CalendarRoundToken.parse([WCT, WCT, NT(12), WT('Mol')])] + ], + [ + '3 Kawak 7 Kumk\'u', + [CalendarRoundToken.parse([NT(3), WT('Kawak'), NT(7), WT('Kumk\'u')])] + ], + [ + '4 Ajaw 8 Kumk\'u', + [CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')])] + ], + [ + '** 13 Xul', + [CalendarRoundToken.parse([WCT, WCT, NT(13), WT('Xul')])] + ], + [ + '6 Kimi * * ', + [CalendarRoundToken.parse([NT(6), WT('Kimi'), WCT, WCT])] + ], + [ + '5 Kimi 4 Mol', + [CalendarRoundToken.parse([NT(5), WT('Kimi'), NT(4), WT('Mol')])] + ], + [ + '* Chikchan 3 Mol #Hello, world', + [ + CalendarRoundToken.parse([WCT, WT('Chikchan'), NT(3), WT('Mol')]), + CT('Hello, world') + ] + ], + ] + const crs: [string, TokenCollection][] = looseCrs.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + crs.forEach((pattern) => { + const [rawString, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + + const tokenised = new Layer0Parser().parse(rawString).processLayer1() + + expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }) + }) + + describe('should parse long counts', () => { + const looseLongCounts: [string, IToken[]][] = [ + // [ + // '7.13', + // [LongCountToken.parse([NT(7), PT, NT(13)])] + // ], + [ + '0.0.0.7.13', + [LongCountToken.parse([NT(0), PT, NT(0), PT, NT(0), PT, NT(7), PT, NT(13)])] + ], + [ + '9.16.19.17.19', + [LongCountToken.parse([NT(9), PT, NT(16), PT, NT(19), PT, NT(17), PT, NT(19)])] + ], + [ + "10.10\n9.9", + [LongCountToken.parse([NT(10), PT, NT(10)]), LongCountToken.parse([NT(9), PT, NT(9)])] + ], + [ + ' 8. 7. 6. 5. 4.17. 2. 1', + [LongCountToken.parse([ + NT(8), PT, + NT(7), PT, + NT(6), PT, + NT(5), PT, + NT(4), PT, + NT(17), PT, + NT(2), PT, + NT(1), + ])] + ] + ] + + const longcounts: [string, TokenCollection][] = looseLongCounts.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + longcounts.forEach((pattern) => { + const [rawString, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + const tokenised = new Layer0Parser().parse(rawString).processLayer1() + expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }) + }) + +}) + diff --git a/src/__tests__/layer-1-tokens.spec.ts b/src/__tests__/layer-1-tokens.spec.ts new file mode 100644 index 0000000..31ca2fa --- /dev/null +++ b/src/__tests__/layer-1-tokens.spec.ts @@ -0,0 +1,61 @@ +import 'mocha' +import {expect} from 'chai' +import CalendarRoundToken from "../tokens/layer-1/calendar-round-token"; +import NumberToken from "../tokens/layer-0/number-token"; +import WordToken from "../tokens/layer-0/word-token"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; +import LongCountToken from "../tokens/layer-1/long-count-token"; +import PeriodToken from "../tokens/layer-0/period-token"; +import CalendarRoundFactory from "@drewsonne/maya-dates/lib/factory/calendar-round"; +import {CalendarRound, origin} from "@drewsonne/maya-dates/lib/cr/calendar-round"; +import LongCount from "@drewsonne/maya-dates/lib/lc/long-count"; +import {Wildcard} from "@drewsonne/maya-dates/lib/wildcard"; + +const NT = (n: number) => new NumberToken(n) +const WT = (w: string) => new WordToken(w) +const WCT = new WildcardToken() +const PT = new PeriodToken() + +describe('calendar-round token', () => { + describe('should convert to calendar-round object', () => { + const crs: [CalendarRoundToken, CalendarRound][] = [ + [ + CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')]), + origin + ], + [ + CalendarRoundToken.parse([WCT, WT('Ajaw'), NT(8), WT('Kumk\'u')]), + new CalendarRoundFactory().parse('*Ajaw 8 Kumk\'u') + ] + ] + crs.forEach((args) => { + const [crt, cr] = args + it(`${crt}.calendarRound -> ${cr}`, () => { + expect(crt.calendarRound).to.eq(cr) + }) + }) + }) +}) + +describe('long-count token', () => { + describe('should convert to long-count object', () => { + const lcs: [LongCountToken, LongCount][] = [ + [ + LongCountToken.parse([NT(9), PT, NT(2), PT, NT(10), PT, NT(10), PT, NT(10)]), + new LongCount(10, 10, 10, 2, 9) + ], + [ + LongCountToken.parse([WCT, PT, NT(2), PT, NT(10), PT, NT(10), PT, NT(10)]), + new LongCount(10, 10, 10, 2, new Wildcard()) + ] + ] + lcs.forEach((args) => { + const [lct, lc] = args + it(`${lct}.longCount --> ${lc}`, () => { + const parsedLc = lct.longCount + const result = parsedLc.equal(lc) + expect(result).to.be.true + }) + }) + }) +}) diff --git a/src/__tests__/layer-2-parser.spec.ts b/src/__tests__/layer-2-parser.spec.ts new file mode 100644 index 0000000..9cc6e4a --- /dev/null +++ b/src/__tests__/layer-2-parser.spec.ts @@ -0,0 +1,221 @@ +import {expect} from 'chai' +import 'mocha' +import NumberToken from "../tokens/layer-0/number-token"; +import WordToken from "../tokens/layer-0/word-token"; +import CommentToken from "../tokens/layer-0/comment-token"; +import OperatorToken from "../tokens/layer-0/operator-token"; +import PeriodToken from "../tokens/layer-0/period-token"; +import LineEndToken from "../tokens/layer-0/line-end-token"; +import SpaceToken from "../tokens/layer-0/space-token"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; +import CommentStartToken from "../tokens/layer-0/comment-start-token"; +import TokenCollection from "../tokens/collection"; +import CalendarRoundToken from "../tokens/layer-1/calendar-round-token"; +import LongCountToken from "../tokens/layer-1/long-count-token"; +import {IToken} from "../tokens/i-token"; +import Layer0Parser from "../parsers/layer-0-parser"; +import LongCountWildcardOperationToken from "../tokens/layer-2/long-count-wildcard-operation-token"; +import CalendarRoundWildcardOperationToken from "../tokens/layer-2/calendar-round-wildcard-operation-token"; +import CalendarRoundOperationToken from "../tokens/layer-2/calendar-round-operation-token"; +import LongCountOperationToken from "../tokens/layer-2/long-count-operation-token"; + +const NT = (n: number) => new NumberToken(n) +const WT = (w: string) => new WordToken(w) +const CT = (c: string) => new CommentToken(c) +const OT = (o: string) => new OperatorToken(o) +const PT = new PeriodToken() +const WCT = new WildcardToken() + + +describe('layer-2 parser', () => { + + describe('should parse operators', () => { + const looseOperations: [string, IToken[]][] = [ + [ + '4 Ajaw 8 Kumk\'u - 5 Kimi 4 Mol', + [ + CalendarRoundOperationToken.parse( + CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')]), + OT('-'), + CalendarRoundToken.parse([NT(5), WT('Kimi'), NT(4), WT('Mol')]), + ) + ] + ], + [ + '9.2.10.10.10 + 10.5.1', + [ + LongCountOperationToken.parse( + LongCountToken.parse([NT(9), PT, NT(2), PT, NT(10), PT, NT(10), PT, NT(10)]), + OT('+'), + LongCountToken.parse([NT(10), PT, NT(5), PT, NT(1)]) + ) + ] + ], + [ + '1Ok * *', + [ + CalendarRoundWildcardOperationToken.parse( + CalendarRoundToken.parse([NT(1), WT('Ok'), WCT, WCT]), + ) + ] + ], + [ + '9.*.10.10.10', + [ + LongCountWildcardOperationToken.parse( + LongCountToken.parse([NT(9), PT, WCT, PT, NT(10), PT, NT(10), PT, NT(10)]), + ) + ] + ] + ] + const operations: [string, TokenCollection][] = looseOperations.map((row: [string, IToken[]]) => { + return [row[0], new TokenCollection(row[1])]; + }) + operations.forEach((pattern) => { + const [rawText, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawText} -> ${expectedTokens}`, () => { + + const layer1Tokens = new Layer0Parser().parse(rawText).processLayer1().processLayer2() + + expect(layer1Tokens.length).to.eq(expectedTokens.length) + for (let i = 0; i < layer1Tokens.length; i++) { + expect( + layer1Tokens.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }); + }) + + describe('should parse calendar rounds', () => { + const looseCrs: [string, IToken[]][] = [ + [ + '4 Ajaw 8 Kumk\'u', + [CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')])] + ], + [ + "4 Ajaw 8 Kumk\'u\n3 Kawak **", + [ + CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')]), + CalendarRoundWildcardOperationToken.parse(CalendarRoundToken.parse([NT(3), WT('Kawak'), WCT, WCT])) + ] + ], + [ + '3 Kawak **', + [CalendarRoundWildcardOperationToken.parse(CalendarRoundToken.parse([NT(3), WT('Kawak'), WCT, WCT]))] + ], + [ + '* Ajaw 8 Kumk\'u', + [CalendarRoundWildcardOperationToken.parse(CalendarRoundToken.parse([WCT, WT('Ajaw'), NT(8), WT('Kumk\'u')]))] + ], + [ + '6 Manik\' 5 Mol', + [CalendarRoundToken.parse([NT(6), WT('Manik\''), NT(5), WT('Mol')])] + ], + [ + '* * 12 Mol', + [CalendarRoundWildcardOperationToken.parse(CalendarRoundToken.parse([WCT, WCT, NT(12), WT('Mol')]))] + ], + [ + '3 Kawak 7 Kumk\'u', + [CalendarRoundToken.parse([NT(3), WT('Kawak'), NT(7), WT('Kumk\'u')])] + ], + [ + '4 Ajaw 8 Kumk\'u', + [CalendarRoundToken.parse([NT(4), WT('Ajaw'), NT(8), WT('Kumk\'u')])] + ], + [ + '** 13 Xul', + [CalendarRoundWildcardOperationToken.parse(CalendarRoundToken.parse([WCT, WCT, NT(13), WT('Xul')]))] + ], + [ + '6 Kimi * * ', + [CalendarRoundWildcardOperationToken.parse(CalendarRoundToken.parse([NT(6), WT('Kimi'), WCT, WCT]))] + ], + [ + '5 Kimi 4 Mol', + [CalendarRoundToken.parse([NT(5), WT('Kimi'), NT(4), WT('Mol')])] + ], + [ + '* Chikchan 3 Mol #Hello, world', + [ + CalendarRoundWildcardOperationToken.parse( + CalendarRoundToken.parse([WCT, WT('Chikchan'), NT(3), WT('Mol')]) + ), + CT('Hello, world') + ] + ], + ] + const crs: [string, TokenCollection][] = looseCrs.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + crs.forEach((pattern) => { + const [rawString, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + + const tokenised = new Layer0Parser().parse(rawString).processLayer1().processLayer2() + + expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }) + }) + + describe('should parse long counts', () => { + const looseLongCounts: [string, IToken[]][] = [ + [ + '7.13', + [LongCountToken.parse([NT(7), PT, NT(13)])] + ], + [ + '0.0.0.7.13', + [LongCountToken.parse([NT(0), PT, NT(0), PT, NT(0), PT, NT(7), PT, NT(13)])] + ], + [ + '9.16.19.17.19', + [LongCountToken.parse([NT(9), PT, NT(16), PT, NT(19), PT, NT(17), PT, NT(19)])] + ], + [ + "10.10\n9.9", + [LongCountToken.parse([NT(10), PT, NT(10)]), LongCountToken.parse([NT(9), PT, NT(9)])] + ], + [ + ' 8. 7. 6. 5. 4.17. 2. 1', + [LongCountToken.parse([ + NT(8), PT, + NT(7), PT, + NT(6), PT, + NT(5), PT, + NT(4), PT, + NT(17), PT, + NT(2), PT, + NT(1), + ])] + ] + ] + + const longcounts: [string, TokenCollection][] = looseLongCounts.map((row: [string, IToken[]]) => [row[0], new TokenCollection(row[1])]) + longcounts.forEach((pattern) => { + const [rawString, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawString} -> ${expectedTokens}`, () => { + const tokenised = new Layer0Parser().parse(rawString).processLayer1() + expect(tokenised.length).to.eq(expectedTokens.length) + for (let i = 0; i < tokenised.length; i++) { + expect( + tokenised.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }) + }) + +}) + diff --git a/src/__tests__/layer-3-parser.spec.ts b/src/__tests__/layer-3-parser.spec.ts new file mode 100644 index 0000000..73cfc22 --- /dev/null +++ b/src/__tests__/layer-3-parser.spec.ts @@ -0,0 +1,91 @@ +import 'mocha' +import {expect} from 'chai' +import {IToken} from "../tokens/i-token"; +import TokenCollection from "../tokens/collection"; +import Layer0Parser from "../parsers/layer-0-parser"; +import FullDateWildcardOperationToken from "../tokens/layer-3/full-date-wildcard-operation-token"; +import LongCountWildcardOperationToken from "../tokens/layer-2/long-count-wildcard-operation-token"; +import LongCountToken from "../tokens/layer-1/long-count-token"; +import CalendarRoundWildcardOperationToken from "../tokens/layer-2/calendar-round-wildcard-operation-token"; +import CalendarRoundToken from "../tokens/layer-1/calendar-round-token"; +import NumberToken from "../tokens/layer-0/number-token"; +import WordToken from "../tokens/layer-0/word-token"; +import PeriodToken from "../tokens/layer-0/period-token"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; +import FullDateToken from "../tokens/layer-3/full-date-token"; + +const NT = (n: number) => new NumberToken(n) +const WT = (w: string) => new WordToken(w) +const PT = new PeriodToken() +const WCT = new WildcardToken() + + +describe('layer-3 parser', () => { + describe('should parse operators', () => { + const looseFullDates: [string, IToken[]][] = [ + [ + '1Ok * * 9.*.10.10.10', + [ + FullDateWildcardOperationToken.parse( + CalendarRoundWildcardOperationToken.parse( + CalendarRoundToken.parse([NT(1), WT('Ok'), WCT, WCT]), + ), + LongCountWildcardOperationToken.parse( + LongCountToken.parse([NT(9), PT, WCT, PT, NT(10), PT, NT(10), PT, NT(10)]), + ) + ) + ] + ], + [ + '1Ok * * 9.4.10.10.10', + [ + FullDateWildcardOperationToken.parse( + CalendarRoundWildcardOperationToken.parse( + CalendarRoundToken.parse([NT(1), WT('Ok'), WCT, WCT]), + ), + LongCountToken.parse([NT(9), PT, NT(4), PT, NT(10), PT, NT(10), PT, NT(10)]), + ) + ] + ], + [ + '1Ok 18 Kumk\'u 9.*.10.10.10', + [ + FullDateWildcardOperationToken.parse( + CalendarRoundToken.parse([NT(1), WT('Ok'), NT(18), WT('Kumk\'u')]), + LongCountWildcardOperationToken.parse( + LongCountToken.parse([NT(9), PT, WCT, PT, NT(10), PT, NT(10), PT, NT(10)]), + ) + ) + ] + ], + [ + '7 Chikchan 18 Sip 9.10. 2. 5. 5', + [ + FullDateToken.parse( + CalendarRoundToken.parse([NT(7), WT('Chikchan'), NT(18), WT('Sip')]), + LongCountToken.parse([NT(9), PT, NT(10), PT, NT(2), PT, NT(5), PT, NT(5)]) + ) + ] + ] + ] + const operations: [string, TokenCollection][] = looseFullDates.map((row: [string, IToken[]]) => { + return [row[0], new TokenCollection(row[1])]; + }); + operations.forEach((pattern) => { + const [rawText, expectedTokens]: [string, TokenCollection] = pattern + it(`${rawText} -> ${expectedTokens}`, () => { + + const layer3Tokens = new Layer0Parser().parse(rawText).processLayer1().processLayer2().processLayer3() + + expect(layer3Tokens.length).to.eq(expectedTokens.length) + for (let i = 0; i < layer3Tokens.length; i++) { + expect( + layer3Tokens.index(i).equal( + expectedTokens.index(i) + ), `Comparing ${i}` + ).to.be.true + } + }) + }); + }) +}) diff --git a/src/__tests__/primitive-types.spec.ts b/src/__tests__/primitive-types.spec.ts index 8f51ed4..ab7334d 100644 --- a/src/__tests__/primitive-types.spec.ts +++ b/src/__tests__/primitive-types.spec.ts @@ -1,16 +1,17 @@ import {expect} from 'chai' import 'mocha' -import NumberToken from "../tokens/primitive/number-token"; -import {IToken, Token} from "../tokens/base"; -import WildcardToken from "../tokens/primitive/wildcard-token"; -import WordToken from "../tokens/primitive/word-token"; -import PeriodToken from "../tokens/primitive/period-token"; -import SpaceToken from "../tokens/primitive/space-token"; -import CommentStartToken from "../tokens/primitive/comment-start-token"; -import LineEndToken from "../tokens/primitive/line-end-token"; +import NumberToken from "../tokens/layer-0/number-token"; +import {Token} from "../tokens/base"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; +import WordToken from "../tokens/layer-0/word-token"; +import PeriodToken from "../tokens/layer-0/period-token"; +import SpaceToken from "../tokens/layer-0/space-token"; +import CommentStartToken from "../tokens/layer-0/comment-start-token"; +import LineEndToken from "../tokens/layer-0/line-end-token"; +import {IToken} from "../tokens/i-token"; -describe('primitive number parser', () => { +describe('layer-0 number parser', () => { describe('should parse numbers', () => { const dates: [string, NumberToken][] = [ diff --git a/src/parsers/primitive.ts b/src/parsers/layer-0-parser.ts similarity index 50% rename from src/parsers/primitive.ts rename to src/parsers/layer-0-parser.ts index ba756ec..7e1d6fb 100644 --- a/src/parsers/primitive.ts +++ b/src/parsers/layer-0-parser.ts @@ -1,17 +1,17 @@ -import {IToken} from "../tokens/base"; -import PrimitiveTest from "./simple-test"; -import NumberToken from "../tokens/primitive/number-token"; -import PeriodToken from "../tokens/primitive/period-token"; -import LineEndToken from "../tokens/primitive/line-end-token"; -import SpaceToken from "../tokens/primitive/space-token"; -import WordToken from "../tokens/primitive/word-token"; -import WildcardToken from "../tokens/primitive/wildcard-token"; +import Layer0Test from "./layer-0-test"; +import NumberToken from "../tokens/layer-0/number-token"; +import PeriodToken from "../tokens/layer-0/period-token"; +import LineEndToken from "../tokens/layer-0/line-end-token"; +import SpaceToken from "../tokens/layer-0/space-token"; +import WordToken from "../tokens/layer-0/word-token"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; import TokenCollection from "../tokens/collection"; -import CommentStartToken from "../tokens/primitive/comment-start-token"; -import CommentToken from "../tokens/primitive/comment-token"; -import OperatorToken from "../tokens/primitive/operator-token"; +import CommentStartToken from "../tokens/layer-0/comment-start-token"; +import CommentToken from "../tokens/layer-0/comment-token"; +import OperatorToken from "../tokens/layer-0/operator-token"; +import {IToken} from "../tokens/i-token"; -enum PrimitiveParserStateValue { +enum Layer0ParserStateValue { WAITING, PARSING_NUMBER, PARSING_WORD, @@ -19,59 +19,59 @@ enum PrimitiveParserStateValue { PARSING_COMMENT_BODY, } -class PrimitiveParserState { - private state: PrimitiveParserStateValue +class Layer0ParserState { + private state: Layer0ParserStateValue constructor() { - this.state = PrimitiveParserStateValue.WAITING + this.state = Layer0ParserStateValue.WAITING + } + + reset() { + this.state = Layer0ParserStateValue.WAITING } isWaiting(): boolean { - return this.state === PrimitiveParserStateValue.WAITING + return this.state === Layer0ParserStateValue.WAITING } isParsingNumber(): boolean { - return this.state === PrimitiveParserStateValue.PARSING_NUMBER + return this.state === Layer0ParserStateValue.PARSING_NUMBER } isParsingWord(): boolean { - return this.state === PrimitiveParserStateValue.PARSING_WORD + return this.state === Layer0ParserStateValue.PARSING_WORD } isParsingCommentStart(): boolean { - return this.state === PrimitiveParserStateValue.PARSING_COMMENT_START + return this.state === Layer0ParserStateValue.PARSING_COMMENT_START } isParsingCommentBody(): boolean { - return this.state === PrimitiveParserStateValue.PARSING_COMMENT_BODY - } - - reset() { - this.state = PrimitiveParserStateValue.WAITING + return this.state === Layer0ParserStateValue.PARSING_COMMENT_BODY } startParsingNumber() { - this.state = PrimitiveParserStateValue.PARSING_NUMBER + this.state = Layer0ParserStateValue.PARSING_NUMBER } startParsingWord() { - this.state = PrimitiveParserStateValue.PARSING_WORD + this.state = Layer0ParserStateValue.PARSING_WORD } startParsingComment() { - this.state = PrimitiveParserStateValue.PARSING_COMMENT_START + this.state = Layer0ParserStateValue.PARSING_COMMENT_START } startParsingCommentBody() { - this.state = PrimitiveParserStateValue.PARSING_COMMENT_BODY + this.state = Layer0ParserStateValue.PARSING_COMMENT_BODY } } -export default class PrimitiveParser { - private state: PrimitiveParserState +export default class Layer0Parser { + private state: Layer0ParserState constructor() { - this.state = new PrimitiveParserState() + this.state = new Layer0ParserState() } parse(rawText: string): TokenCollection { @@ -80,90 +80,95 @@ export default class PrimitiveParser { for (let cursor = 0; cursor < rawText.length; cursor += 1) { const cell = rawText[cursor]; if (this.state.isWaiting()) { - if (PrimitiveTest.isLetter(cell)) { + if (Layer0Test.isLetter(cell)) { this.state.startParsingWord() cache.push(cell) - } else if (PrimitiveTest.isNumber(cell)) { + } else if (Layer0Test.isNumber(cell)) { this.state.startParsingNumber() cache.push(cell) - } else if (PrimitiveTest.isPeriod(cell)) { + } else if (Layer0Test.isPeriod(cell)) { tokens.push(PeriodToken.parse(cell)) - } else if (PrimitiveTest.isSpace(cell)) { + } else if (Layer0Test.isSpace(cell)) { tokens.push(SpaceToken.parse(cell)) - } else if (PrimitiveTest.isWildcard(cell)) { + } else if (Layer0Test.isWildcard(cell)) { tokens.push(WildcardToken.parse(cell)) - } else if (PrimitiveTest.isCommentStart(cell)) { + } else if (Layer0Test.isCommentStart(cell)) { tokens.push(CommentStartToken.parse(cell)) this.state.startParsingComment() - } else if (PrimitiveTest.isOperator(cell)) { + } else if (Layer0Test.isOperator(cell)) { tokens.push(OperatorToken.parse(cell)) this.state.reset() } else { throw new Error('Primitive parser in unexpected state') } } else if (this.state.isParsingNumber()) { - if (PrimitiveTest.isLetter(cell)) { + if (Layer0Test.isLetter(cell)) { tokens.push(NumberToken.parse(cache.join(''))) cache = [cell] this.state.startParsingWord() - } else if (PrimitiveTest.isNumber(cell)) { + } else if (Layer0Test.isNumber(cell)) { cache.push(cell) - } else if (PrimitiveTest.isPeriod(cell)) { + } else if (Layer0Test.isPeriod(cell)) { tokens.push(NumberToken.parse(cache.join(''))) tokens.push(PeriodToken.parse(cell)) cache = [] this.state.reset() - } else if (PrimitiveTest.isCarriageReturn(cell)) { + } else if (Layer0Test.isCarriageReturn(cell)) { tokens.push(NumberToken.parse(cache.join(''))) tokens.push(LineEndToken.parse(cell)) cache = [] this.state.reset() - } else if (PrimitiveTest.isSpace(cell)) { + } else if (Layer0Test.isSpace(cell)) { tokens.push(NumberToken.parse(cache.join(''))) tokens.push(SpaceToken.parse(cell)) cache = [] this.state.reset() } else { - throw new Error('Primitive parser in unexpected state') + throw new Error('Layer-0 parser in unexpected state') } } else if (this.state.isParsingWord()) { - if (PrimitiveTest.isLetter(cell)) { + if (Layer0Test.isLetter(cell)) { cache.push(cell) - } else if (PrimitiveTest.isNumber(cell)) { - throw new Error('Primitive parser in unexpected state') - } else if (PrimitiveTest.isPeriod(cell)) { - throw new Error('Primitive parser in unexpected state') - } else if (PrimitiveTest.isSpace(cell)) { + } else if (Layer0Test.isNumber(cell)) { + throw new Error('Layer-0 parser in unexpected state') + } else if (Layer0Test.isPeriod(cell)) { + throw new Error('Layer-0 parser in unexpected state') + } else if (Layer0Test.isSpace(cell)) { tokens.push(WordToken.parse(cache.join(''))) tokens.push(SpaceToken.parse(cell)) cache = [] this.state.reset() + } else if (Layer0Test.isCarriageReturn(cell)) { + tokens.push(WordToken.parse(cache.join(''))) + tokens.push(LineEndToken.parse(cell)) + cache = [] + this.state.reset() } else { - throw new Error('Primitive parser in unexpected state') + throw new Error('Layer-0 parser in unexpected state') } } else if (this.state.isParsingCommentStart()) { - if (PrimitiveTest.isSpace(cell)) { + if (Layer0Test.isSpace(cell)) { tokens.push(SpaceToken.parse(cell)) this.state.startParsingCommentBody() - } else if (PrimitiveTest.isCommentLetter(cell)) { + } else if (Layer0Test.isCommentLetter(cell)) { cache = [cell] this.state.startParsingCommentBody() } else { - throw new Error('Primitive parser in unexpected state') + throw new Error('Layer-0 parser in unexpected state') } } else if (this.state.isParsingCommentBody()) { - if (PrimitiveTest.isCommentLetter(cell)) { + if (Layer0Test.isCommentLetter(cell)) { cache.push(cell) - } else if (PrimitiveTest.isCarriageReturn(cell)) { + } else if (Layer0Test.isCarriageReturn(cell)) { tokens.push(CommentToken.parse(cache.join(''))) tokens.push(LineEndToken.parse(cell)) cache = [] this.state.reset() } else { - throw new Error('Primitive parser in unexpected state') + throw new Error('Layer-0 parser in unexpected state') } } else { - throw new Error('Primitive parser in unexpected state') + throw new Error('Layer-0 parser in unexpected state') } } if (cache.length > 0) { @@ -174,7 +179,7 @@ export default class PrimitiveParser { } else if (this.state.isParsingCommentBody()) { tokens.push(CommentToken.parse(cache.join(''))) } else { - throw new Error('Primitive parser in unexpected state') + throw new Error('Layer-0 parser in unexpected state') } } this.state.reset() diff --git a/src/parsers/simple-test.ts b/src/parsers/layer-0-test.ts similarity index 95% rename from src/parsers/simple-test.ts rename to src/parsers/layer-0-test.ts index 44e1381..9ba2187 100644 --- a/src/parsers/simple-test.ts +++ b/src/parsers/layer-0-test.ts @@ -1,4 +1,4 @@ -export default class PrimitiveTest { +export default class Layer0Test { static isLetter(raw: string): boolean { return this.regexTest(raw, /^['a-zA-Z]$/) } diff --git a/src/parsers/layer-1-parser.ts b/src/parsers/layer-1-parser.ts new file mode 100644 index 0000000..f380ce2 --- /dev/null +++ b/src/parsers/layer-1-parser.ts @@ -0,0 +1,166 @@ +import TokenCollection from "../tokens/collection"; +import NumberToken from "../tokens/layer-0/number-token"; +import SpaceToken from "../tokens/layer-0/space-token"; +import WordToken from "../tokens/layer-0/word-token"; +import CalendarRoundToken from "../tokens/layer-1/calendar-round-token"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; +import {Comment} from "typedoc/dist/lib/models"; +import CommentToken from "../tokens/layer-0/comment-token"; +import PeriodToken from "../tokens/layer-0/period-token"; +import LongCountToken from "../tokens/layer-1/long-count-token"; +import LineEndToken from "../tokens/layer-0/line-end-token"; +import {IToken} from "../tokens/i-token"; +import OperatorToken from "../tokens/layer-0/operator-token"; +import CommentStartToken from "../tokens/layer-0/comment-start-token"; +import {isFullCR, isPartialCR} from "./layer-1-test"; + +enum Layer1ParserStateValue { + WAITING, + PARSING_DATE, + PARSING_CALENDAR_ROUND, + PARSING_LONG_COUNT, +} + +class Layer1ParserState { + private state: Layer1ParserStateValue + + constructor() { + this.state = Layer1ParserStateValue.WAITING + } + + reset() { + this.state = Layer1ParserStateValue.WAITING + } + + isWaiting(): boolean { + return this.state === Layer1ParserStateValue.WAITING + } + + isParsingDate(): boolean { + return this.state === Layer1ParserStateValue.PARSING_DATE + } + + isParsingCalendarRound(): boolean { + return this.state === Layer1ParserStateValue.PARSING_CALENDAR_ROUND + } + + isParsingLongCount(): boolean { + return this.state === Layer1ParserStateValue.PARSING_LONG_COUNT + } + + startParsingDate() { + this.state = Layer1ParserStateValue.PARSING_DATE + } + + startParsingCalendarRound() { + this.state = Layer1ParserStateValue.PARSING_CALENDAR_ROUND + } + + startParsingLongCount() { + this.state = Layer1ParserStateValue.PARSING_LONG_COUNT + } +} + + +export default class Layer1Parser { + private state: Layer1ParserState + + constructor() { + this.state = new Layer1ParserState() + } + + parse(layer0Tokens: TokenCollection) { + let tokens: IToken[] = [] + let cache: IToken[] = [] + for (let cursor = 0; cursor < layer0Tokens.length; cursor += 1) { + const layer0Token = layer0Tokens.index(cursor); + if (this.state.isWaiting()) { + if ((layer0Token instanceof NumberToken) || (layer0Token instanceof WildcardToken)) { + cache.push(layer0Token) + this.state.startParsingDate() + } else if ( + (layer0Token instanceof CommentToken) || + (layer0Token instanceof OperatorToken) + ) { + tokens.push(layer0Token) + } else if ((layer0Token instanceof SpaceToken) || (layer0Token instanceof CommentStartToken)) { + continue + } else if (layer0Token instanceof CommentToken) { + tokens.push(layer0Token) + } else { + throw new Error('Layer-1 parser in unexpected state') + } + } else if (this.state.isParsingDate()) { + if (layer0Token instanceof SpaceToken) { + cache.push(layer0Token) + } else if (layer0Token instanceof WordToken) { + cache.push(layer0Token) + this.state.startParsingCalendarRound() + } else if (layer0Token instanceof WildcardToken) { + cache.push(layer0Token) + } else if (layer0Token instanceof NumberToken) { + cache.push(layer0Token) + } else if (layer0Token instanceof PeriodToken) { + cache.push(layer0Token) + this.state.startParsingLongCount() + } else { + throw new Error('Layer-1 parser in unexpected state') + } + } else if (this.state.isParsingCalendarRound()) { + if (isFullCR(cache)) { + tokens.push( + CalendarRoundToken.parse(cache) + ) + cache = [] + this.state.reset() + } else if (isPartialCR(cache)) { + cache.push(layer0Token) + } else { + throw new Error('Layer-1 parser in unexpected state') + } + } else if (this.state.isParsingLongCount()) { + if ( + (layer0Token instanceof NumberToken) || + (layer0Token instanceof PeriodToken) || + (layer0Token instanceof WildcardToken) + ) { + cache.push(layer0Token) + } else if ((layer0Token instanceof LineEndToken)) { + tokens.push(LongCountToken.parse(cache)) + cache = [] + } else if (layer0Token instanceof SpaceToken) { + continue + } else if (layer0Token instanceof OperatorToken) { + tokens.push(LongCountToken.parse(cache)) + tokens.push(layer0Token) + cache = [] + this.state.reset() + } else { + throw new Error('Layer-1 parser in unexpected state') + } + } else { + throw new Error('Layer-1 parser in unexpected state') + } + } + if (cache.length > 0) { + if (this.state.isParsingCalendarRound()) { + if (isFullCR(cache)) { + tokens.push( + CalendarRoundToken.parse(cache) + ) + cache = [] + } else { + throw new Error('Layer-1 parser in unexpected state') + } + } else if (this.state.isParsingLongCount()) { + tokens.push( + LongCountToken.parse(cache) + ) + cache = [] + } else { + throw new Error('Layer-1 parser in unexpected state') + } + } + return new TokenCollection(tokens); + } +} diff --git a/src/parsers/layer-1-test.ts b/src/parsers/layer-1-test.ts new file mode 100644 index 0000000..9d195d4 --- /dev/null +++ b/src/parsers/layer-1-test.ts @@ -0,0 +1,61 @@ +import SpaceToken from "../tokens/layer-0/space-token"; +import NumberToken from "../tokens/layer-0/number-token"; +import WordToken from "../tokens/layer-0/word-token"; +import WildcardToken from "../tokens/layer-0/wildcard-token"; +import {IToken} from "../tokens/i-token"; +import PeriodToken from "../tokens/layer-0/period-token"; +import CommentToken from "../tokens/layer-0/comment-token"; + +export function isWordToken(t: IToken): t is WordToken { + return t instanceof WordToken +} + +export function isNumberToken(t: IToken): t is NumberToken { + return t instanceof NumberToken +} + +export function isWildcardToken(t: IToken): t is WildcardToken { + return t instanceof WildcardToken +} + +export function isPeriodToken(t: IToken): t is PeriodToken { + return t instanceof PeriodToken +} + +export function isCommentToken(t: IToken): t is CommentToken { + return t instanceof CommentToken +} + +export function isCRCoeff(c: IToken): boolean { + return isNumberToken(c) || isWildcardToken(c) +} + +export function isCRUnit(c: IToken): boolean { + return isWordToken(c) || isWildcardToken(c) +} + +export function isPartialCR(raw: IToken[]): boolean { + const tokens = raw.filter((t) => !(t instanceof SpaceToken)) + if (tokens.length === 0) { + return true + } else if (tokens.length === 1) { + return isCRCoeff(tokens[0]) + } else if (tokens.length === 2) { + return isCRCoeff(tokens[0]) && isCRUnit(tokens[1]) + } else if (tokens.length === 3) { + return isCRCoeff(tokens[0]) && isCRUnit(tokens[1]) && isCRCoeff(tokens[2]) + } else if (tokens.length === 4) { + return isFullCR(tokens) + } + return false +} + +export function isFullCR(raw: IToken[]): boolean { + const tokens = raw.filter((t) => !(t instanceof SpaceToken)) + if (tokens.length === 4) { + return isCRCoeff(tokens[0]) && isCRUnit(tokens[1]) && isCRCoeff(tokens[2]) && isCRUnit(tokens[3]) + } + return false +} + + diff --git a/src/parsers/layer-2-parser.ts b/src/parsers/layer-2-parser.ts new file mode 100644 index 0000000..6a06adf --- /dev/null +++ b/src/parsers/layer-2-parser.ts @@ -0,0 +1,100 @@ +import TokenCollection from "../tokens/collection"; +import {IToken} from "../tokens/i-token"; +import { + isCalendarRoundOperation, isCalendarRoundToken, + isFullOperation, isLongCountOperation, + isLongCountToken, isOperatorToken, + isPartialOperation +} from "./layer-2-test"; +import CalendarRoundOperationToken from "../tokens/layer-2/calendar-round-operation-token"; +import LongCountOperationToken from "../tokens/layer-2/long-count-operation-token"; +import CalendarRoundWildcardOperationToken from "../tokens/layer-2/calendar-round-wildcard-operation-token"; +import LongCountWildcardOperationToken from "../tokens/layer-2/long-count-wildcard-operation-token"; +import {isCommentToken} from "./layer-1-test"; + + +export default class Layer2Parser { + + parse(layer1Tokens: TokenCollection): TokenCollection { + let tokens: IToken[] = [] + let cache: IToken[] = [] + for (let cursor = 0; cursor < layer1Tokens.length; cursor += 1) { + const layer1Token = layer1Tokens.index(cursor); + if (isLongCountToken(layer1Token)) { + if (layer1Token.isPartial()) { + tokens.push(LongCountWildcardOperationToken.parse(layer1Token)) + } else if (isOperatorToken(cache[0])) { + if (tokens.length > 0) { + const lastToken = tokens.pop() + if (lastToken !== undefined) { + const operator = cache.pop() + if (operator !== undefined) { + if (isLongCountToken(lastToken)) { + tokens.push(LongCountOperationToken.parse(lastToken, operator, layer1Token)) + } else { + tokens.push(lastToken) + } + } else { + debugger + } + } else { + debugger + } + } else { + debugger + } + } else { + tokens.push(layer1Token) + } + } else if (isCalendarRoundToken(layer1Token)) { + if (layer1Token.isPartial()) { + tokens.push(CalendarRoundWildcardOperationToken.parse(layer1Token)) + } else if (isOperatorToken(cache[0])) { + if (tokens.length > 0) { + const lastToken = tokens.pop() + if (lastToken !== undefined) { + const operator = cache.pop() + if (operator !== undefined) { + if (isCalendarRoundToken(lastToken)) { + tokens.push(CalendarRoundOperationToken.parse(lastToken, operator, layer1Token)) + } else { + tokens.push(lastToken) + } + } else { + debugger + } + } else { + debugger + } + } else { + debugger + } + } else { + tokens.push(layer1Token) + } + } else if (isPartialOperation(cache, layer1Token)) { + cache.push(layer1Token) + } else if (isFullOperation(cache, layer1Token)) { + cache.push(layer1Token) + if (isLongCountOperation([cache[0], cache[1], cache[2]])) { + tokens.push(LongCountOperationToken.parse(cache[0], cache[1], cache[2])) + } else if (isCalendarRoundOperation([cache[0], cache[1], cache[2]])) { + tokens.push(CalendarRoundOperationToken.parse(cache[0], cache[1], cache[2])) + } else { + debugger + } + cache = [] + } else if (isOperatorToken(layer1Token)) { + cache.push(layer1Token) + } else if (isCommentToken(layer1Token)) { + tokens.push(layer1Token) + } else { + throw new Error('Layer-2 parser in unexpected state') + } + } + if (cache.length > 0) { + debugger + } + return new TokenCollection(tokens) + } +} diff --git a/src/parsers/layer-2-test.ts b/src/parsers/layer-2-test.ts new file mode 100644 index 0000000..7d4efa5 --- /dev/null +++ b/src/parsers/layer-2-test.ts @@ -0,0 +1,59 @@ +import {IToken} from "../tokens/i-token"; +import CalendarRoundToken from "../tokens/layer-1/calendar-round-token"; +import LongCountToken from "../tokens/layer-1/long-count-token"; +import OperatorToken from "../tokens/layer-0/operator-token"; +import CalendarRoundWildcardOperationToken from "../tokens/layer-2/calendar-round-wildcard-operation-token"; +import LongCountWildcardOperationToken from "../tokens/layer-2/long-count-wildcard-operation-token"; + + +export function isPartialOperation(cache: IToken[], layer1Token: IToken): boolean { + const full = cache.concat([layer1Token]) + if (full.length === 1) { + return isToken(full[0]) + } + if (full.length === 2) { + return isToken(full[0]) && isOperatorToken(full[1]) + } + return false; +} + +export function isFullOperation(cache: IToken[], layer1Token: IToken) { + const full = cache.concat([layer1Token]) + if (full.length === 3) { + return isToken(full[0]) && isOperatorToken(full[1]) && isToken(full[2]) + } + return false; +} + +export function isLongCountOperation(tokens: [IToken, IToken, IToken]): boolean { + return isLongCountToken(tokens[0]) && isOperatorToken(tokens[1]) && isLongCountToken(tokens[2]) +} + +export function isCalendarRoundOperation(tokens: [IToken, IToken, IToken]): boolean { + return isCalendarRoundToken(tokens[0]) && isOperatorToken(tokens[1]) && isCalendarRoundToken(tokens[2]) +} + +export function isLongCountToken(t: IToken): t is LongCountToken { + return (t instanceof LongCountToken) +} + +export function isCalendarRoundToken(t: IToken): t is CalendarRoundToken { + return (t instanceof CalendarRoundToken) +} + +export function isCalendarRoundWildcardOperationToken(t: IToken): t is CalendarRoundWildcardOperationToken { + return (t instanceof CalendarRoundWildcardOperationToken) +} + +export function isLongCountWildcardOperationToken(t: IToken): t is LongCountWildcardOperationToken { + return t instanceof LongCountWildcardOperationToken +} + +export function isToken(t: IToken): boolean { + return isCalendarRoundToken(t) || isLongCountToken(t) +} + + +export function isOperatorToken(t: IToken): t is OperatorToken { + return (t instanceof OperatorToken) +} diff --git a/src/parsers/layer-3-parser.ts b/src/parsers/layer-3-parser.ts new file mode 100644 index 0000000..daffaf1 --- /dev/null +++ b/src/parsers/layer-3-parser.ts @@ -0,0 +1,77 @@ +import TokenCollection from "../tokens/collection"; +import {IToken} from "../tokens/i-token"; +import { + isCalendarRoundToken, + isCalendarRoundWildcardOperationToken, isLongCountToken, + isLongCountWildcardOperationToken +} from "./layer-2-test"; +import FullDateWildcardOperationToken from "../tokens/layer-3/full-date-wildcard-operation-token"; +import FullDateToken from "../tokens/layer-3/full-date-token"; + +class FIFOQueue { + private readonly size: number; + private queue: T[]; + + constructor(length: number) { + this.size = length + this.queue = [] + } + + push(item: T): T | undefined { + this.queue.push(item) + if (this.queue.length <= this.size) { + return undefined + } else { + return this.queue.shift() + } + } + + get length(): number { + return this.queue.length + } + + isFull(): boolean { + return this.size === this.length + } + + peek(size: number): T[] { + return this.queue.slice(0, size) + } + + reset() { + this.queue = [] + } +} + + +export default class Layer3Parser { + + parse(layer2Tokens: TokenCollection): TokenCollection { + const tokens: IToken[] = [] + let window: FIFOQueue = new FIFOQueue(2); + for (let cursor = 0; cursor < layer2Tokens.length; cursor += 1) { + const currentToken = window.push(layer2Tokens.index(cursor)); + if (window.isFull()) { + if (currentToken !== undefined) { + tokens.push(currentToken) + } + const [former, latter]: IToken[] = window.peek(2) + if ( + isCalendarRoundWildcardOperationToken(former) || + isLongCountWildcardOperationToken(latter) + ) { + tokens.push(FullDateWildcardOperationToken.parse(former, latter)) + } else if ( + isCalendarRoundToken(former) && + isLongCountToken(latter) + ) { + tokens.push(FullDateToken.parse(former, latter)) + } else { + debugger + } + } + } + return new TokenCollection(tokens) + } +} + diff --git a/src/tokens/base.ts b/src/tokens/base.ts index 2537c27..eb8b014 100644 --- a/src/tokens/base.ts +++ b/src/tokens/base.ts @@ -1,3 +1,5 @@ +import {IToken} from "./i-token"; + export abstract class Token implements IToken { public value: T @@ -12,8 +14,3 @@ export abstract class Token implements IToken { } } -export interface IToken { - equal(otherToken: IToken): boolean - - value: any -} diff --git a/src/tokens/collection.ts b/src/tokens/collection.ts index 571a3e8..f92366c 100644 --- a/src/tokens/collection.ts +++ b/src/tokens/collection.ts @@ -1,4 +1,7 @@ -import {IToken} from "./base"; +import {IToken} from "./i-token"; +import Layer1Parser from "../parsers/layer-1-parser"; +import Layer2Parser from "../parsers/layer-2-parser"; +import Layer3Parser from "../parsers/layer-3-parser"; export default class TokenCollection { public tokens: IToken[] @@ -18,4 +21,16 @@ export default class TokenCollection { index(i: number): IToken { return this.tokens[i] } + + processLayer1(): TokenCollection { + return new Layer1Parser().parse(this) + } + + processLayer2(): TokenCollection { + return new Layer2Parser().parse(this) + } + + processLayer3(): TokenCollection { + return new Layer3Parser().parse(this) + } } diff --git a/src/tokens/i-token.ts b/src/tokens/i-token.ts new file mode 100644 index 0000000..8f3f22d --- /dev/null +++ b/src/tokens/i-token.ts @@ -0,0 +1,5 @@ +export interface IToken { + equal(otherToken: IToken): boolean + + value: any +} diff --git a/src/tokens/primitive/comment-start-token.ts b/src/tokens/layer-0/comment-start-token.ts similarity index 86% rename from src/tokens/primitive/comment-start-token.ts rename to src/tokens/layer-0/comment-start-token.ts index 834a216..fdc6f5d 100644 --- a/src/tokens/primitive/comment-start-token.ts +++ b/src/tokens/layer-0/comment-start-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class CommentStartToken extends Token { constructor() { diff --git a/src/tokens/primitive/comment-token.ts b/src/tokens/layer-0/comment-token.ts similarity index 87% rename from src/tokens/primitive/comment-token.ts rename to src/tokens/layer-0/comment-token.ts index 48f4785..16b4fd2 100644 --- a/src/tokens/primitive/comment-token.ts +++ b/src/tokens/layer-0/comment-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class CommentToken extends Token { equal(otherToken: IToken): boolean { diff --git a/src/tokens/primitive/line-end-token.ts b/src/tokens/layer-0/line-end-token.ts similarity index 84% rename from src/tokens/primitive/line-end-token.ts rename to src/tokens/layer-0/line-end-token.ts index 1ecc368..8f23424 100644 --- a/src/tokens/primitive/line-end-token.ts +++ b/src/tokens/layer-0/line-end-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class LineEndToken extends Token { constructor() { diff --git a/src/tokens/primitive/number-token.ts b/src/tokens/layer-0/number-token.ts similarity index 88% rename from src/tokens/primitive/number-token.ts rename to src/tokens/layer-0/number-token.ts index 1766646..95cd0b0 100644 --- a/src/tokens/primitive/number-token.ts +++ b/src/tokens/layer-0/number-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class NumberToken extends Token { static parse(raw: string): NumberToken { diff --git a/src/tokens/primitive/operator-token.ts b/src/tokens/layer-0/operator-token.ts similarity index 85% rename from src/tokens/primitive/operator-token.ts rename to src/tokens/layer-0/operator-token.ts index 138d35c..8f2651d 100644 --- a/src/tokens/primitive/operator-token.ts +++ b/src/tokens/layer-0/operator-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class OperatorToken extends Token { static parse(raw: string): OperatorToken { diff --git a/src/tokens/primitive/period-token.ts b/src/tokens/layer-0/period-token.ts similarity index 86% rename from src/tokens/primitive/period-token.ts rename to src/tokens/layer-0/period-token.ts index 14ce796..5cdbba4 100644 --- a/src/tokens/primitive/period-token.ts +++ b/src/tokens/layer-0/period-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class PeriodToken extends Token { constructor() { diff --git a/src/tokens/primitive/space-token.ts b/src/tokens/layer-0/space-token.ts similarity index 86% rename from src/tokens/primitive/space-token.ts rename to src/tokens/layer-0/space-token.ts index ebb5b87..1ffabb5 100644 --- a/src/tokens/primitive/space-token.ts +++ b/src/tokens/layer-0/space-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class SpaceToken extends Token { constructor() { diff --git a/src/tokens/primitive/wildcard-token.ts b/src/tokens/layer-0/wildcard-token.ts similarity index 86% rename from src/tokens/primitive/wildcard-token.ts rename to src/tokens/layer-0/wildcard-token.ts index c8c966a..ff9cfdd 100644 --- a/src/tokens/primitive/wildcard-token.ts +++ b/src/tokens/layer-0/wildcard-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class WildcardToken extends Token { constructor() { diff --git a/src/tokens/primitive/word-token.ts b/src/tokens/layer-0/word-token.ts similarity index 87% rename from src/tokens/primitive/word-token.ts rename to src/tokens/layer-0/word-token.ts index ccf68b6..325e7e6 100644 --- a/src/tokens/primitive/word-token.ts +++ b/src/tokens/layer-0/word-token.ts @@ -1,4 +1,5 @@ -import {IToken, Token} from "../base"; +import {Token} from "../base"; +import {IToken} from "../i-token"; export default class WordToken extends Token { static parse(raw: string): WordToken { diff --git a/src/tokens/layer-1/calendar-round-token.ts b/src/tokens/layer-1/calendar-round-token.ts new file mode 100644 index 0000000..b9a2fc5 --- /dev/null +++ b/src/tokens/layer-1/calendar-round-token.ts @@ -0,0 +1,45 @@ +import {Token} from "../base"; +import SpaceToken from "../layer-0/space-token"; +import WordToken from "../layer-0/word-token"; +import NumberToken from "../layer-0/number-token"; +import {IToken} from "../i-token"; +import WildcardToken from "../layer-0/wildcard-token"; +import {CalendarRound, getCalendarRound, origin} from "@drewsonne/maya-dates/lib/cr/calendar-round"; +import {getTzolkin, Tzolkin} from "@drewsonne/maya-dates/lib/cr/tzolkin"; +import {getHaab, Haab} from "@drewsonne/maya-dates/lib/cr/haab"; +import {coefficientParser as _} from "@drewsonne/maya-dates/lib/cr/component/coefficient"; +import {getTzolkinDay} from "@drewsonne/maya-dates/lib/cr/component/tzolkinDay"; +import {getHaabMonth} from "@drewsonne/maya-dates/lib/cr/component/haabMonth"; + +export default class CalendarRoundToken extends Token { + static parse(tokens: IToken[]): CalendarRoundToken { + const spaceLess: IToken[] = tokens.filter((t) => { + return !(t instanceof SpaceToken) && (t instanceof WordToken || t instanceof NumberToken || t instanceof WildcardToken) + }) + return new CalendarRoundToken(spaceLess) + } + + equal(otherToken: CalendarRoundToken): boolean { + if (this.value.length === otherToken.value.length) { + return otherToken.value.every( + (otherSubToken, index) => otherSubToken.equal(this.value[index]), + this + ) + } + throw new Error(`Could not parse: '${otherToken}'`) + } + + toString(): string { + return `[${this.value.map((t) => `${t}`).join(',')}]` + } + + get calendarRound(): CalendarRound { + const tzolkin: Tzolkin = getTzolkin(_(this.value[0].value), getTzolkinDay(this.value[1].value)) + const haab: Haab = getHaab(_(this.value[2].value), getHaabMonth(this.value[3].value)) + return getCalendarRound(tzolkin, haab) + } + + isPartial(): boolean { + return this.value.some((t) => t instanceof WildcardToken) + } +} diff --git a/src/tokens/layer-1/long-count-token.ts b/src/tokens/layer-1/long-count-token.ts new file mode 100644 index 0000000..f8551fb --- /dev/null +++ b/src/tokens/layer-1/long-count-token.ts @@ -0,0 +1,37 @@ +import {Token} from "../base"; +import NumberToken from "../layer-0/number-token"; +import PeriodToken from "../layer-0/period-token"; +import {IToken} from "../i-token"; +import WildcardToken from "../layer-0/wildcard-token"; +import LongCount from "@drewsonne/maya-dates/lib/lc/long-count"; +import {Wildcard} from "@drewsonne/maya-dates/lib/wildcard"; +import {isNumberToken, isPeriodToken, isWildcardToken} from "../../parsers/layer-1-test"; + +export default class LongCountToken extends Token { + equal(otherToken: LongCountToken): boolean { + return `${otherToken}` === `${this}` + } + + static parse(tokens: IToken[]): LongCountToken { + return new LongCountToken( + tokens.filter((t) => isNumberToken(t) || isPeriodToken(t) || isWildcardToken(t)) + ); + } + + toString(): string { + return this.value.map((t) => `${t}`).join('') + } + + get longCount(): LongCount { + const parts: (number | Wildcard)[] = this.value.filter( + (c) => isNumberToken(c) || isWildcardToken(c) + ).map( + (c) => isNumberToken(c) ? c.value : new Wildcard() + ); + return new LongCount(...parts.reverse()) + } + + isPartial(): boolean { + return this.value.some((t) => isWildcardToken(t)) + } +} diff --git a/src/tokens/layer-2/calendar-round-operation-token.ts b/src/tokens/layer-2/calendar-round-operation-token.ts new file mode 100644 index 0000000..d293829 --- /dev/null +++ b/src/tokens/layer-2/calendar-round-operation-token.ts @@ -0,0 +1,26 @@ +import {Token} from "../base"; +import {IToken} from "../i-token"; +import {isCalendarRoundToken, isOperatorToken} from "../../parsers/layer-2-test"; + + +export default class CalendarRoundOperationToken extends Token { + static parse(operand1: IToken, operator: IToken, operand2: IToken): CalendarRoundOperationToken { + if (isCalendarRoundToken(operand1)) { + if (isOperatorToken(operator)) { + if (isCalendarRoundToken(operand2)) { + return new CalendarRoundOperationToken([operand1, operator, operand2]) + } + } + } + throw new Error(`Could not parse: '${operand1}, ${operator}, ${operand2}'`) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof CalendarRoundOperationToken) { + return this.value[0].equal(otherToken.value[0]) && + this.value[1].equal(otherToken.value[1]) && + this.value[2].equal(otherToken.value[2]) + } + return false; + } +} diff --git a/src/tokens/layer-2/calendar-round-wildcard-operation-token.ts b/src/tokens/layer-2/calendar-round-wildcard-operation-token.ts new file mode 100644 index 0000000..30792f0 --- /dev/null +++ b/src/tokens/layer-2/calendar-round-wildcard-operation-token.ts @@ -0,0 +1,20 @@ +import {Token} from "../base"; +import {IToken} from "../i-token"; +import CalendarRoundToken from "../layer-1/calendar-round-token"; +import {isCalendarRoundWildcardOperationToken} from "../../parsers/layer-2-test"; + +export default class CalendarRoundWildcardOperationToken extends Token { + equal(otherToken: IToken): boolean { + if (isCalendarRoundWildcardOperationToken(otherToken)) { + return otherToken.value.equal(this.value) + } + return false; + } + + static parse(calendarRoundToken: CalendarRoundToken): CalendarRoundWildcardOperationToken { + if (calendarRoundToken.isPartial()) { + return new CalendarRoundWildcardOperationToken(calendarRoundToken) + } + throw new Error(`Could not parse: '${calendarRoundToken}'`) + } +} diff --git a/src/tokens/layer-2/long-count-operation-token.ts b/src/tokens/layer-2/long-count-operation-token.ts new file mode 100644 index 0000000..1d49a51 --- /dev/null +++ b/src/tokens/layer-2/long-count-operation-token.ts @@ -0,0 +1,18 @@ +import {Token} from "../base"; +import {IToken} from "../i-token"; + + +export default class LongCountOperationToken extends Token { + static parse(operand1: IToken, operator: IToken, operand2: IToken): LongCountOperationToken { + return new LongCountOperationToken([operand1, operator, operand2]) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof LongCountOperationToken) { + return this.value[0].equal(otherToken.value[0]) && + this.value[1].equal(otherToken.value[1]) && + this.value[2].equal(otherToken.value[2]) + } + return false; + } +} diff --git a/src/tokens/layer-2/long-count-wildcard-operation-token.ts b/src/tokens/layer-2/long-count-wildcard-operation-token.ts new file mode 100644 index 0000000..5cf691c --- /dev/null +++ b/src/tokens/layer-2/long-count-wildcard-operation-token.ts @@ -0,0 +1,20 @@ +import {Token} from "../base"; +import {IToken} from "../i-token"; +import LongCountToken from "../layer-1/long-count-token"; +import {isLongCountToken} from "../../parsers/layer-2-test"; + +export default class LongCountWildcardOperationToken extends Token { + static parse(token: IToken): LongCountWildcardOperationToken { + if (isLongCountToken(token)) { + return new LongCountWildcardOperationToken(token) + } + throw new Error(`Could not parse: '${token}'`) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof LongCountWildcardOperationToken) { + return otherToken.value.equal(this.value) + } + return false; + } +} diff --git a/src/tokens/layer-3/full-date-token.ts b/src/tokens/layer-3/full-date-token.ts new file mode 100644 index 0000000..3a4415a --- /dev/null +++ b/src/tokens/layer-3/full-date-token.ts @@ -0,0 +1,18 @@ +import {Token} from "../base"; +import CalendarRoundToken from "../layer-1/calendar-round-token"; +import LongCountToken from "../layer-1/long-count-token"; +import {IToken} from "../i-token"; + +export default class FullDateToken extends Token<[CalendarRoundToken, LongCountToken]> { + equal(otherToken: IToken): boolean { + if (otherToken instanceof FullDateToken) { + return otherToken.value[0].equal(this.value[0]) && + otherToken.value[1].equal(this.value[1]) + } + return false; + } + + static parse(former: CalendarRoundToken, latter: LongCountToken): FullDateToken { + return new FullDateToken([former, latter]) + } +} diff --git a/src/tokens/layer-3/full-date-wildcard-operation-token.ts b/src/tokens/layer-3/full-date-wildcard-operation-token.ts new file mode 100644 index 0000000..69a8efe --- /dev/null +++ b/src/tokens/layer-3/full-date-wildcard-operation-token.ts @@ -0,0 +1,21 @@ +import {IToken} from "../i-token"; +import {Token} from "../base"; +import {isCalendarRoundWildcardOperationToken, isLongCountWildcardOperationToken} from "../../parsers/layer-2-test"; + +export default class FullDateWildcardOperationToken extends Token<[IToken, IToken]> { + + static parse(crWildcard: IToken, lcWildcard: IToken): FullDateWildcardOperationToken { + if (isCalendarRoundWildcardOperationToken(crWildcard) || isLongCountWildcardOperationToken(lcWildcard)) { + return new FullDateWildcardOperationToken([crWildcard, lcWildcard]) + } + throw new Error(`Could not parse: '${crWildcard}', '${lcWildcard}'`) + } + + equal(otherToken: IToken): boolean { + if (otherToken instanceof FullDateWildcardOperationToken) { + return this.value[0].equal(otherToken.value[0]) && + this.value[1].equal(otherToken.value[1]) + } + return false; + } +} From 4b2cc45ec6dadd0b5276cb5dcb6e5d59ed2249c9 Mon Sep 17 00:00:00 2001 From: "Drew J. Sonne" Date: Thu, 13 Aug 2020 18:27:35 +0100 Subject: [PATCH 5/8] Bump maya-dates --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4ea2620..391c946 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "typescript": "^3.9.7" }, "dependencies": { - "@drewsonne/maya-dates": "^1.0.19" + "@drewsonne/maya-dates": "^1.0.20" }, "scripts": { "test": "mocha -r ts-node/register 'src/**/*.spec.ts'", From d2dae12a5f7e17873d936d65ee9044cca52c7867 Mon Sep 17 00:00:00 2001 From: "Drew J. Sonne" Date: Thu, 13 Aug 2020 18:28:49 +0100 Subject: [PATCH 6/8] Fix bad package --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c36bc13..ee7cefd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1033,9 +1033,9 @@ } }, "@drewsonne/maya-dates": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/@drewsonne/maya-dates/-/maya-dates-1.0.19.tgz", - "integrity": "sha512-k2FjQm5Gr0D3rlOhoGeYq/vx9MJUumTQWlBXxHBy+jwCQHvTFJ5l+QM0AgVfL2tggS8MLtgdnwq/p17bN4IHHw==", + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@drewsonne/maya-dates/-/maya-dates-1.0.20.tgz", + "integrity": "sha512-dBR9GYuWUf1I1Hxwa0s62K9b8dc/2ODHYaqZsh+ZEIDPwsLkGFxWPMfb966CXv5heExCHSFHiWzEeRI3SIMwkQ==", "requires": { "moonbeams": "^2.0.3", "typescript": "^3.9.7" From 288c8306f47c377ba5b4f0a78dde158eb568dc0a Mon Sep 17 00:00:00 2001 From: "Drew J. Sonne" Date: Sun, 23 Aug 2020 16:32:57 +0100 Subject: [PATCH 7/8] Add Working parsers --- .gitignore | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index eb79dd5..c9a052b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules .idea +lib diff --git a/package.json b/package.json index 51b8c1e..0a6f280 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@drewsonne/maya-calculator-parser", - "version": "1.0.15", + "version": "1.0.1", "description": "Typescript package to parse plaintext calculations and create operators", "main": "src/index.ts", "repository": { From b6bc12bee25609798a71c875f24fb90165deb991 Mon Sep 17 00:00:00 2001 From: "Drew J. Sonne" Date: Sun, 23 Aug 2020 16:38:30 +0100 Subject: [PATCH 8/8] Version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7640fc0..af6e977 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@drewsonne/maya-calculator-parser", - "version": "1.0.1", + "version": "1.0.3", "description": "Typescript package to parse plaintext calculations and create operators", "main": "src/index.ts", "repository": {