From 421cd87b29e47aa782cae7f16d6be911a8959921 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 16:32:03 +0100 Subject: [PATCH 01/28] Update project config and dependencies --- .gitignore | 1 + .yarnrc.yml | 1 + package.json | 32 +- preprocessor.js | 11 - webpack.config.js | 9 +- yarn.lock | 10622 ++++++++++++++++++++++---------------------- 6 files changed, 5268 insertions(+), 5408 deletions(-) create mode 100644 .yarnrc.yml delete mode 100644 preprocessor.js diff --git a/.gitignore b/.gitignore index 0ab0a60..8988a3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .DS_Store .idea +.yarn *.iml lib diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..3186f3f --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/package.json b/package.json index a251016..d1bb1ff 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "bundle": "webpack --mode production && size-limit", "bundle-browsertest": "open ./test/browsertest-lib.html", "clean": "rimraf lib && rimraf lib-umd && rimraf docs && rimraf coverage", - "compile": "tsc", + "compile": "node_modules/.bin/tsc", "build": "yarn clean && yarn lint && yarn compile && yarn test && yarn bundle", "prepublishOnly": "yarn build" }, @@ -38,20 +38,22 @@ "engines": { "node": ">=6.0.0" }, + "packageManager": "yarn@4.1.1", "devDependencies": { - "@size-limit/preset-small-lib": "^7.0.8", - "@types/jest": "^27.4.1", - "gh-pages": "^3.2.3", - "jest": "^27.5.1", - "rimraf": "^3.0.2", - "size-limit": "^7.0.8", - "ts-loader": "^8.2.0", - "tslint": "^5.11.0", - "typedoc": "^0.22.13", - "typescript": "^4.6.2", - "uglifyjs-webpack-plugin": "^2.2.0", - "webpack": "^4.46.0", - "webpack-cli": "^3.3.12" + "@size-limit/preset-small-lib": "^11.1.2", + "@types/jest": "^29.5.12", + "gh-pages": "^6.1.1", + "jest": "^29.7.0", + "rimraf": "^5.0.5", + "size-limit": "^11.1.2", + "terser-webpack-plugin": "^5.3.10", + "ts-jest": "^29.1.2", + "ts-loader": "^9.5.1", + "tslint": "^6.1.3", + "typedoc": "^0.25.12", + "typescript": "^5.4.3", + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" }, "jest": { "moduleFileExtensions": [ @@ -59,7 +61,7 @@ "js" ], "transform": { - "^.+\\.ts$": "/preprocessor.js" + "^.+\\.ts$": "ts-jest" }, "testMatch": [ "**/test/*.ts" diff --git a/preprocessor.js b/preprocessor.js deleted file mode 100644 index 94312ac..0000000 --- a/preprocessor.js +++ /dev/null @@ -1,11 +0,0 @@ -const tsc = require('typescript'); -const tsConfig = require('./tsconfig.json'); - -module.exports = { - process(src, path) { - if (path.endsWith('.ts')) { - return tsc.transpile(src, tsConfig.compilerOptions, path, []); - } - return src; - }, -}; \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 64a42bd..ae0d182 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,8 @@ const path = require('path'); const webpack = require('webpack'); -const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +const TerserPlugin = require("terser-webpack-plugin"); +/** @type {webpack.Configuration} */ module.exports = { entry: { 'sequency': './src/Sequence.ts', @@ -22,12 +23,16 @@ module.exports = { rules: [{ test: /\.ts$/, loader: 'ts-loader', + options: { + transpileOnly: true, + configFile: 'tsconfig.json' + }, exclude: /node_modules/ }] }, optimization: { minimize: true, - minimizer: [new UglifyJsPlugin({ + minimizer: [new TerserPlugin({ include: /\.min\.js$/ })] } diff --git a/yarn.lock b/yarn.lock index 0971cd2..d182ac6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,5380 +1,5242 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.16.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" - integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== - -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.17.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" - integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.2" - "@babel/parser" "^7.17.3" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - -"@babel/generator@^7.17.3", "@babel/generator@^7.7.2": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" - integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.16.7": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0" - integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helpers@^7.17.2": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" - integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" - -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" - integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" - integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3", "@babel/traverse@^7.7.2": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" - integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.3" - "@babel/types" "^7.17.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - 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" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== - dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== - dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" - -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" - -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== - dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" - -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.11" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" - integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== - -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@size-limit/esbuild@7.0.8": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@size-limit/esbuild/-/esbuild-7.0.8.tgz#1dff3b41ab2c2b5b07ec61a124ecb19aa68661d0" - integrity sha512-AzCrxJJThDvHrBNoolebYVgXu46c6HuS3fOxoXr3V0YWNM0qz81z5F3j7RruzboZnls8ZgME4WrH6GM5rB9gtA== - dependencies: - esbuild "^0.14.18" - nanoid "^3.2.0" - -"@size-limit/file@7.0.8": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@size-limit/file/-/file-7.0.8.tgz#05c43fa01bf164c2fba24e13f1695bf7e861e277" - integrity sha512-1KeFQuMXIXAH/iELqIX7x+YNYDFvzIvmxcp9PrdwEoSNL0dXdaDIo9WE/yz8xvOmUcKaLfqbWkL75DM0k91WHQ== - dependencies: - semver "7.3.5" - -"@size-limit/preset-small-lib@^7.0.8": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@size-limit/preset-small-lib/-/preset-small-lib-7.0.8.tgz#e787fd1c5cddd51ff02a7a5bef34cbd13e17c2bf" - integrity sha512-CT8nIYA/c2CSD+X4rAUgwqYccQMahJ6rBnaZxvi3YKFdkXIbuGNXHNjHsYaFksgwG9P4UjG/unyO5L73f3zQBw== - dependencies: - "@size-limit/esbuild" "7.0.8" - "@size-limit/file" "7.0.8" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.18" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" - integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.14.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" - integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== - dependencies: - "@babel/types" "^7.3.0" - -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^27.4.1": - version "27.4.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" - integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== - dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" - -"@types/node@*": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" - integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== - -"@types/prettier@^2.1.5": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" - integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^6.4.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - -ajv-keywords@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.1.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.1" - -ajv@^6.10.2: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async@^2.6.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - -babel-code-frame@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== - dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - dependencies: - pako "~1.0.5" - -browserslist@^4.17.5: - version "4.20.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.0.tgz#35951e3541078c125d36df76056e94738a52ebe9" - integrity sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ== - dependencies: - caniuse-lite "^1.0.30001313" - electron-to-chromium "^1.4.76" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" - -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - -bytes-iec@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes-iec/-/bytes-iec-3.1.1.tgz#94cd36bf95c2c22a82002c247df8772d1d591083" - integrity sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA== - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001313: - version "1.0.30001314" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz#65c7f9fb7e4594fca0a333bec1d8939662377596" - integrity sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw== - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.4.1, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" - integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== - -ci-job-number@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ci-job-number/-/ci-job-number-1.2.2.tgz#f4e5918fcaeeda95b604f214be7d7d4a961fe0c0" - integrity sha512-CLOGsVDrVamzv8sXJGaILUVI6dsuAkouJP/n6t+OxLPeeA4DDby7zn9SB6EUpa1H7oIKoE+rMmkW80zYsFfUjA== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" - dependencies: - color-name "1.1.1" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.12.1: - version "2.16.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" - -commander@^2.18.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - -convert-source-map@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -electron-to-chromium@^1.4.76: - version "1.4.77" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.77.tgz#c26e454cb8721d4ebdae3e276c57cd32e51c32ed" - integrity sha512-fiDxw8mO9Ph1Z0bjX2sFTPpi0J0QkOiwOJF+5Q0J0baNc/F9lLePAvDPlnoxvbUYYMizqrKPeotRRkJ9LtxAew== - -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -email-addresses@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.1.0.tgz#cabf7e085cbdb63008a70319a74e6136188812fb" - integrity sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -esbuild-android-64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.25.tgz#d532d38cb5fe0ae45167ce35f4bbc784c636be40" - integrity sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ== - -esbuild-android-arm64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.25.tgz#9c5bb3366aabfd14a1c726d36978b79441dfcb6e" - integrity sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw== - -esbuild-darwin-64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.25.tgz#05dcdb6d884f427039ffee5e92ff97527e56c26d" - integrity sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA== - -esbuild-darwin-arm64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.25.tgz#28e080da4ea0cfe9498071e7f8060498caee1a95" - integrity sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw== - -esbuild-freebsd-64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.25.tgz#200d3664a3b945bc9fdcba73614b49a11ebd1cfa" - integrity sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ== - -esbuild-freebsd-arm64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.25.tgz#624b08c5da6013bdc312aaa23c4ff409580f5c3c" - integrity sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug== - -esbuild-linux-32@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.25.tgz#0238e597eb0b60aa06c7e98fccbbfd6bb9a0d6c5" - integrity sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw== - -esbuild-linux-64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.25.tgz#8a8b8cf47dfce127c858e71229d9a385a82c62e8" - integrity sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug== - -esbuild-linux-arm64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.25.tgz#7ac94371418a2640ba413bc1700aaedeb2794e52" - integrity sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw== - -esbuild-linux-arm@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.25.tgz#034bd18e9310b9f010c89f90ef7f05706689600b" - integrity sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw== - -esbuild-linux-mips64le@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.25.tgz#05f98a8cf6b578eab6b4e6b0ab094f37530934f4" - integrity sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ== - -esbuild-linux-ppc64le@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.25.tgz#46fd0add8d8535678439d7a9c2876ad20042d952" - integrity sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw== - -esbuild-linux-riscv64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.25.tgz#ea2e986f0f3e5df73c635135dd778051734fc605" - integrity sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w== - -esbuild-linux-s390x@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.25.tgz#efe89486e9a1b1508925048076e3f3a6698aa6a3" - integrity sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ== - -esbuild-netbsd-64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.25.tgz#439fe27d8ee3b5887501ee63988e85f920107db6" - integrity sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA== - -esbuild-openbsd-64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.25.tgz#31ebf616aadf6e60674469f2b92cec92280d9930" - integrity sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A== - -esbuild-sunos-64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.25.tgz#815e4f936d74970292a63ccfd5791fe5e3569f5f" - integrity sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw== - -esbuild-windows-32@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.25.tgz#189e14df2478f2c193c86968ab1fb54e1ceaafd2" - integrity sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA== - -esbuild-windows-64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.25.tgz#3d5fbfdc3856850bb47439299e3b60dd18be111f" - integrity sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA== - -esbuild-windows-arm64@0.14.25: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.25.tgz#8b243cbbad8a86cf98697da9ccb88c05df2ef458" - integrity sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA== - -esbuild@^0.14.18: - version "0.14.25" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.25.tgz#ddb9d47b91ca76abb7d850ce3dfed0bc3dc88d16" - integrity sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q== - optionalDependencies: - esbuild-android-64 "0.14.25" - esbuild-android-arm64 "0.14.25" - esbuild-darwin-64 "0.14.25" - esbuild-darwin-arm64 "0.14.25" - esbuild-freebsd-64 "0.14.25" - esbuild-freebsd-arm64 "0.14.25" - esbuild-linux-32 "0.14.25" - esbuild-linux-64 "0.14.25" - esbuild-linux-arm "0.14.25" - esbuild-linux-arm64 "0.14.25" - esbuild-linux-mips64le "0.14.25" - esbuild-linux-ppc64le "0.14.25" - esbuild-linux-riscv64 "0.14.25" - esbuild-linux-s390x "0.14.25" - esbuild-netbsd-64 "0.14.25" - esbuild-openbsd-64 "0.14.25" - esbuild-sunos-64 "0.14.25" - esbuild-windows-32 "0.14.25" - esbuild-windows-64 "0.14.25" - esbuild-windows-arm64 "0.14.25" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - dependencies: - bser "^2.0.0" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= - -filenamify@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" - integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.1" - trim-repeated "^1.0.0" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -gh-pages@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-3.2.3.tgz#897e5f15e111f42af57d21d430b83e5cdf29472c" - integrity sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg== - dependencies: - async "^2.6.1" - commander "^2.18.0" - email-addresses "^3.0.1" - filenamify "^4.3.0" - find-cache-dir "^3.3.1" - fs-extra "^8.1.0" - globby "^6.1.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - 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@^7.1.3, glob@^7.1.4, glob@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - 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" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@^4.1.15, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -infer-owner@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@^1.3.4, ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -interpret@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== - dependencies: - "@jest/core" "^27.5.1" - import-local "^3.0.2" - jest-cli "^27.5.1" - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.7.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonc-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" - integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - optionalDependencies: - graceful-fs "^4.1.6" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lilconfig@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" - integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash@^4.17.14, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -marked@^4.0.12: - version "4.0.12" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.12.tgz#2262a4e6fd1afd2f13557726238b69a48b982f7d" - integrity sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ== - -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -memory-fs@^0.4.0, memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.0, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@~1.35.0: - version "1.35.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" - -mime-types@^2.1.12: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" - dependencies: - mime-db "~1.35.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nan@^2.12.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - -nanoid@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -nanospinner@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nanospinner/-/nanospinner-1.0.0.tgz#6af6bb0e5f0ddf0004e3426f61765fa0ab6ba010" - integrity sha512-14c2r2QQ9xfTmdbqdF51FKCNvww+0ZON9GeEHur+pBdOufoFvxD4CZQRaYWmFrGH3Nuv7PZ/9Q+wsV+hFSp32g== - dependencies: - picocolors "^1.0.0" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" - -neo-async@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - -p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - dependencies: - p-try "^2.0.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - -pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -pretty-format@^27.0.0, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -public-encrypt@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - dependencies: - safe-buffer "^5.1.0" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.0.0" - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^1.20.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.3.2: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - dependencies: - path-parse "^1.0.5" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^2.5.4: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - dependencies: - aproba "^1.1.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -semver@7.3.5, semver@^7.3.2, semver@^7.3.4: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@^5.3.0, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -serialize-javascript@^1.7.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb" - integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A== - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shiki@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" - integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== - dependencies: - jsonc-parser "^3.0.0" - vscode-oniguruma "^1.6.1" - vscode-textmate "5.2.0" - -signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -size-limit@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-7.0.8.tgz#bf0c656da9e6bc3b8eb5b8a5a634df4634309811" - integrity sha512-3h76c9E0e/nNhYLSR7IBI/bSoXICeo7EYkYjlyVqNIsu7KvN/PQmMbIXeyd2QKIF8iZKhaiZQoXLkGWbyPDtvQ== - dependencies: - bytes-iec "^3.1.1" - chokidar "^3.5.3" - ci-job-number "^1.2.2" - globby "^11.1.0" - lilconfig "^2.0.4" - mkdirp "^1.0.4" - nanospinner "^1.0.0" - picocolors "^1.0.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.12: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-outer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== - dependencies: - escape-string-regexp "^1.0.2" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" - -tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - dependencies: - setimmediate "^1.0.4" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - dependencies: - escape-string-regexp "^1.0.2" - -ts-loader@^8.2.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.3.0.tgz#83360496d6f8004fab35825279132c93412edf33" - integrity sha512-MgGly4I6cStsJy27ViE32UoqxPTN9Xly4anxxVyaIWR+9BGxboV4EyJBGfR3RePV7Ksjj3rHmPZJeIt+7o4Vag== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^4.0.0" - loader-utils "^2.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - -tslib@^1.8.0, tslib@^1.8.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - -tslint@^5.11.0: - version "5.11.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" - dependencies: - babel-code-frame "^6.22.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^3.2.0" - glob "^7.1.1" - js-yaml "^3.7.0" - minimatch "^3.0.4" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.27.2" - -tsutils@^2.27.2: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -typedoc@^0.22.13: - version "0.22.13" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.13.tgz#d061f8f0fb7c9d686e48814f245bddeea4564e66" - integrity sha512-NHNI7Dr6JHa/I3+c62gdRNXBIyX7P33O9TafGLd07ur3MqzcKgwTvpg18EtvCLHJyfeSthAtCLpM7WkStUmDuQ== - dependencies: - glob "^7.2.0" - lunr "^2.3.9" - marked "^4.0.12" - minimatch "^5.0.1" - shiki "^0.10.1" - -typescript@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" - integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== - -uglify-js@^3.6.0: - version "3.15.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.2.tgz#1ed2c976f448063b1f87adb68c741be79959f951" - integrity sha512-peeoTk3hSwYdoc9nrdiEJk+gx1ALCtTjdYuKSXMTDqq7n1W7dHPqWDdSi+BPL0ni2YMeHD7hKUSdbj3TZauY2A== - -uglifyjs-webpack-plugin@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz#e75bc80e7f1937f725954c9b4c5a1e967ea9d0d7" - integrity sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^1.7.0" - source-map "^0.6.1" - uglify-js "^3.6.0" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" - dependencies: - imurmurhash "^0.1.4" - -universalify@^0.1.0, universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - dependencies: - punycode "^2.1.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -v8-compile-cache@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -vscode-oniguruma@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz#aeb9771a2f1dbfc9083c8a7fdd9cccaa3f386607" - integrity sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA== - -vscode-textmate@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" - integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-cli@^3.3.12: - version "3.3.12" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== - dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" - -webpack-sources@^1.4.0, webpack-sources@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.46.0: - version "4.46.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" - integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.5.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which@^1.2.14, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - 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@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/code-frame@npm:7.24.2" + dependencies: + "@babel/highlight": "npm:^7.24.2" + picocolors: "npm:^1.0.0" + checksum: 10c0/d1d4cba89475ab6aab7a88242e1fd73b15ecb9f30c109b69752956434d10a26a52cbd37727c4eca104b6d45227bd1dfce39a6a6f4a14c9b2f07f871e968cf406 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.23.5": + version: 7.24.1 + resolution: "@babel/compat-data@npm:7.24.1" + checksum: 10c0/8a1935450345c326b14ea632174696566ef9b353bd0d6fb682456c0774342eeee7654877ced410f24a731d386fdcbf980b75083fc764964d6f816b65792af2f5 + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": + version: 7.24.3 + resolution: "@babel/core@npm:7.24.3" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.24.2" + "@babel/generator": "npm:^7.24.1" + "@babel/helper-compilation-targets": "npm:^7.23.6" + "@babel/helper-module-transforms": "npm:^7.23.3" + "@babel/helpers": "npm:^7.24.1" + "@babel/parser": "npm:^7.24.1" + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/e6e756b6de27d0312514a005688fa1915c521ad4269a388913eff2120a546538078f8488d6d16e86f851872f263cb45a6bbae08738297afb9382600d2ac342a9 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.24.1, @babel/generator@npm:^7.7.2": + version: 7.24.1 + resolution: "@babel/generator@npm:7.24.1" + dependencies: + "@babel/types": "npm:^7.24.0" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^2.5.1" + checksum: 10c0/f0eea7497657cdf68cfb4b7d181588e1498eefd1f303d73b0d8ca9b21a6db27136a6f5beb8f988b6bdcd4249870826080950450fd310951de42ecf36df274881 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/helper-compilation-targets@npm:7.23.6" + dependencies: + "@babel/compat-data": "npm:^7.23.5" + "@babel/helper-validator-option": "npm:^7.23.5" + browserslist: "npm:^4.22.2" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-environment-visitor@npm:7.22.20" + checksum: 10c0/e762c2d8f5d423af89bd7ae9abe35bd4836d2eb401af868a63bbb63220c513c783e25ef001019418560b3fdc6d9a6fb67e6c0b650bcdeb3a2ac44b5c3d2bdd94 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-function-name@npm:7.23.0" + dependencies: + "@babel/template": "npm:^7.22.15" + "@babel/types": "npm:^7.23.0" + checksum: 10c0/d771dd1f3222b120518176733c52b7cadac1c256ff49b1889dbbe5e3fed81db855b8cc4e40d949c9d3eae0e795e8229c1c8c24c0e83f27cfa6ee3766696c6428 + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-hoist-variables@npm:7.22.5" + dependencies: + "@babel/types": "npm:^7.22.5" + checksum: 10c0/60a3077f756a1cd9f14eb89f0037f487d81ede2b7cfe652ea6869cd4ec4c782b0fb1de01b8494b9a2d2050e3d154d7d5ad3be24806790acfb8cbe2073bf1e208 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.22.15": + version: 7.24.3 + resolution: "@babel/helper-module-imports@npm:7.24.3" + dependencies: + "@babel/types": "npm:^7.24.0" + checksum: 10c0/052c188adcd100f5e8b6ff0c9643ddaabc58b6700d3bbbc26804141ad68375a9f97d9d173658d373d31853019e65f62610239e3295cdd58e573bdcb2fded188d + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" + dependencies: + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-module-imports": "npm:^7.22.15" + "@babel/helper-simple-access": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/helper-validator-identifier": "npm:^7.22.20" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/211e1399d0c4993671e8e5c2b25383f08bee40004ace5404ed4065f0e9258cc85d99c1b82fd456c030ce5cfd4d8f310355b54ef35de9924eabfc3dff1331d946 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.0, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.24.0 + resolution: "@babel/helper-plugin-utils@npm:7.24.0" + checksum: 10c0/90f41bd1b4dfe7226b1d33a4bb745844c5c63e400f9e4e8bf9103a7ceddd7d425d65333b564d9daba3cebd105985764d51b4bd4c95822b97c2e3ac1201a8a5da + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-simple-access@npm:7.22.5" + dependencies: + "@babel/types": "npm:^7.22.5" + checksum: 10c0/f0cf81a30ba3d09a625fd50e5a9069e575c5b6719234e04ee74247057f8104beca89ed03e9217b6e9b0493434cedc18c5ecca4cea6244990836f1f893e140369 + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-split-export-declaration@npm:7.22.6" + dependencies: + "@babel/types": "npm:^7.22.5" + checksum: 10c0/d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.24.1 + resolution: "@babel/helper-string-parser@npm:7.24.1" + checksum: 10c0/2f9bfcf8d2f9f083785df0501dbab92770111ece2f90d120352fda6dd2a7d47db11b807d111e6f32aa1ba6d763fe2dc6603d153068d672a5d0ad33ca802632b2 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: 10c0/dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/helper-validator-option@npm:7.23.5" + checksum: 10c0/af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/helpers@npm:7.24.1" + dependencies: + "@babel/template": "npm:^7.24.0" + "@babel/traverse": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + checksum: 10c0/b3445860ae749fc664682b291f092285e949114e8336784ae29f88eb4c176279b01cc6740005a017a0389ae4b4e928d5bbbc01de7da7e400c972e3d6f792063a + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.24.2": + version: 7.24.2 + resolution: "@babel/highlight@npm:7.24.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/98ce00321daedeed33a4ed9362dc089a70375ff1b3b91228b9f05e6591d387a81a8cba68886e207861b8871efa0bc997ceabdd9c90f6cce3ee1b2f7f941b42db + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/parser@npm:7.24.1" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/d2a8b99aa5f33182b69d5569367403a40e7c027ae3b03a1f81fd8ac9b06ceb85b31f6ee4267fb90726dc2ac99909c6bdaa9cf16c379efab73d8dfe85cee32c50 + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.24.1 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/6cec76fbfe6ca81c9345c2904d8d9a8a0df222f9269f0962ed6eb2eb8f3f10c2f15e993d1ef09dbaf97726bf1792b5851cf5bd9a769f966a19448df6be95d19a + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.24.1 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.24.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/7a81e277dcfe3138847e8e5944e02a42ff3c2e864aea6f33fd9b70d1556d12b0e70f0d56cc1985d353c91bcbf8fe163e6cc17418da21129b7f7f1d8b9ac00c93 + languageName: node + linkType: hard + +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.24.0, @babel/template@npm:^7.3.3": + version: 7.24.0 + resolution: "@babel/template@npm:7.24.0" + dependencies: + "@babel/code-frame": "npm:^7.23.5" + "@babel/parser": "npm:^7.24.0" + "@babel/types": "npm:^7.24.0" + checksum: 10c0/9d3dd8d22fe1c36bc3bdef6118af1f4b030aaf6d7d2619f5da203efa818a2185d717523486c111de8d99a8649ddf4bbf6b2a7a64962d8411cf6a8fa89f010e54 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.24.1": + version: 7.24.1 + resolution: "@babel/traverse@npm:7.24.1" + dependencies: + "@babel/code-frame": "npm:^7.24.1" + "@babel/generator": "npm:^7.24.1" + "@babel/helper-environment-visitor": "npm:^7.22.20" + "@babel/helper-function-name": "npm:^7.23.0" + "@babel/helper-hoist-variables": "npm:^7.22.5" + "@babel/helper-split-export-declaration": "npm:^7.22.6" + "@babel/parser": "npm:^7.24.1" + "@babel/types": "npm:^7.24.0" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/c087b918f6823776537ba246136c70e7ce0719fc05361ebcbfd16f4e6f2f6f1f8f4f9167f1d9b675f27d12074839605189cc9d689de20b89a85e7c140f23daab + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.24.0 + resolution: "@babel/types@npm:7.24.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: 10c0/777a0bb5dbe038ca4c905fdafb1cdb6bdd10fe9d63ce13eca0bd91909363cbad554a53dc1f902004b78c1dcbc742056f877f2c99eeedff647333b1fadf51235d + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:^0.5.0": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/aix-ppc64@npm:0.20.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-arm64@npm:0.20.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-arm@npm:0.20.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/android-x64@npm:0.20.2" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/darwin-arm64@npm:0.20.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/darwin-x64@npm:0.20.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/freebsd-arm64@npm:0.20.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/freebsd-x64@npm:0.20.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-arm64@npm:0.20.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-arm@npm:0.20.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-ia32@npm:0.20.2" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-loong64@npm:0.20.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-mips64el@npm:0.20.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-ppc64@npm:0.20.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-riscv64@npm:0.20.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-s390x@npm:0.20.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/linux-x64@npm:0.20.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/netbsd-x64@npm:0.20.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/openbsd-x64@npm:0.20.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/sunos-x64@npm:0.20.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-arm64@npm:0.20.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-ia32@npm:0.20.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.20.2": + version: 0.20.2 + resolution: "@esbuild/win32-x64@npm:0.20.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 + languageName: node + linkType: hard + +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a + languageName: node + linkType: hard + +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c + languageName: node + linkType: hard + +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b + languageName: node + linkType: hard + +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6 + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.6 + resolution: "@jridgewell/source-map@npm:0.3.6" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 10c0/0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.1 + resolution: "@npmcli/agent@npm:2.2.1" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 10c0/38ee5cbe8f3cde13be916e717bfc54fd1a7605c07af056369ff894e244c221e0b56b08ca5213457477f9bc15bca9e729d51a4788829b5c3cf296b3c996147f76 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e + languageName: node + linkType: hard + +"@sindresorhus/merge-streams@npm:^2.1.0": + version: 2.3.0 + resolution: "@sindresorhus/merge-streams@npm:2.3.0" + checksum: 10c0/69ee906f3125fb2c6bb6ec5cdd84e8827d93b49b3892bce8b62267116cc7e197b5cccf20c160a1d32c26014ecd14470a72a5e3ee37a58f1d6dadc0db1ccf3894 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 + languageName: node + linkType: hard + +"@size-limit/esbuild@npm:11.1.2": + version: 11.1.2 + resolution: "@size-limit/esbuild@npm:11.1.2" + dependencies: + esbuild: "npm:^0.20.2" + nanoid: "npm:^5.0.6" + peerDependencies: + size-limit: 11.1.2 + checksum: 10c0/fc08c201d861d0dd18120c6d67480969992bdb98593b0e39a241080e2c6bfd8d773fd4fb8574cb51eeff9074be6c19400a55f9c275da3f4fa5f0b6c7943539f4 + languageName: node + linkType: hard + +"@size-limit/file@npm:11.1.2": + version: 11.1.2 + resolution: "@size-limit/file@npm:11.1.2" + peerDependencies: + size-limit: 11.1.2 + checksum: 10c0/a21a08e24ceb8aca0521ab916ac9c7c90bd927b39b949c4869ad31027cd55f42ab87920558525bce195f35ac81641bac34ac3bea57e5e5d08b1303a0ec2ad470 + languageName: node + linkType: hard + +"@size-limit/preset-small-lib@npm:^11.1.2": + version: 11.1.2 + resolution: "@size-limit/preset-small-lib@npm:11.1.2" + dependencies: + "@size-limit/esbuild": "npm:11.1.2" + "@size-limit/file": "npm:11.1.2" + size-limit: "npm:11.1.2" + peerDependencies: + size-limit: 11.1.2 + checksum: 10c0/0a1c8d44690b341eafa9816d8b1dc1e31fa0726d404a8b598a525cab5726ce6be875f77e7986b7630203b4376a7e733ecaa13531d90bbf859280f8dd38b78061 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.5 + resolution: "@types/babel__traverse@npm:7.20.5" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10c0/033abcb2f4c084ad33e30c3efaad82161240f351e3c71b6154ed289946b33b363696c0fbd42502b68e4582a87413c418321f40eb1ea863e34fe525641345e05b + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 8.56.6 + resolution: "@types/eslint@npm:8.56.6" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10c0/52124f0868b14f21b4c8c21cb3c6065e0671df3f64c0bb3d37efe12e41b3434f478461f5ba0dabf368cd927ddc9b36d5592e7f61b939463576ab69c3bf8f3b12 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.5": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee + languageName: node + linkType: hard + +"@types/jest@npm:^29.5.12": + version: 29.5.12 + resolution: "@types/jest@npm:29.5.12" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: 10c0/25fc8e4c611fa6c4421e631432e9f0a6865a8cb07c9815ec9ac90d630271cad773b2ee5fe08066f7b95bebd18bb967f8ce05d018ee9ab0430f9dfd1d84665b6f + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 20.11.30 + resolution: "@types/node@npm:20.11.30" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/867cfaf969c6d8850d8d7304e7ab739898a50ecb1395b61ff2335644f5f48d7a46fbc4a14cee967aed65ec134b61a746edae70d1f32f11321ccf29165e3bc4e6 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.32 + resolution: "@types/yargs@npm:17.0.32" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10c0/2095e8aad8a4e66b86147415364266b8d607a3b95b4239623423efd7e29df93ba81bb862784a6e08664f645cc1981b25fd598f532019174cd3e5e1e689e1cccf + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" + dependencies: + "@webassemblyjs/helper-numbers": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + checksum: 10c0/ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 10c0/37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: 10c0/a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: 10c0/0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" + dependencies: + "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 10c0/79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + checksum: 10c0/0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" + dependencies: + "@xtuc/ieee754": "npm:^1.2.0" + checksum: 10c0/59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" + dependencies: + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 10c0/14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/helper-wasm-section": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-opt": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + "@webassemblyjs/wast-printer": "npm:1.12.1" + checksum: 10c0/972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10c0/1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-buffer": "npm:1.12.1" + "@webassemblyjs/wasm-gen": "npm:1.12.1" + "@webassemblyjs/wasm-parser": "npm:1.12.1" + checksum: 10c0/992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" + "@webassemblyjs/ieee754": "npm:1.11.6" + "@webassemblyjs/leb128": "npm:1.11.6" + "@webassemblyjs/utf8": "npm:1.11.6" + checksum: 10c0/e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" + dependencies: + "@webassemblyjs/ast": "npm:1.12.1" + "@xtuc/long": "npm:4.2.2" + checksum: 10c0/39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a + languageName: node + linkType: hard + +"@webpack-cli/configtest@npm:^2.1.1": + version: 2.1.1 + resolution: "@webpack-cli/configtest@npm:2.1.1" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 10c0/a8da1f15702cb289807da99235ed95326ed7dabeb1a36ca59bd3a5dbe6adcc946a9a2767936050fc4d5ed14efab0e5b5a641dfe8e3d862c36caa5791ac12759d + languageName: node + linkType: hard + +"@webpack-cli/info@npm:^2.0.2": + version: 2.0.2 + resolution: "@webpack-cli/info@npm:2.0.2" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 10c0/ca88a35604dc9aedac7c26e8f6793c5039dc1eea2b12a85fbfd669a5f21ecf9cf169d7fd157ea366a62666e3fa05b776306a96742ac61a9868f44fdce6b40f7d + languageName: node + linkType: hard + +"@webpack-cli/serve@npm:^2.0.5": + version: 2.0.5 + resolution: "@webpack-cli/serve@npm:2.0.5" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: 10c0/36079d34971ff99a58b66b13f4184dcdd8617853c48cccdbc3f9ab7ea9e5d4fcf504e873c298ea7aa15e0b51ad2c4aee4d7a70bd7d9364e60f57b0eb93ca15fc + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" + peerDependencies: + acorn: ^8 + checksum: 10c0/3b4a194e128efdc9b86c2b1544f623aba4c1aa70d638f8ab7dc3971a5b4aa4c57bd62f99af6e5325bb5973c55863b4112e708a6f408bad7a138647ca72283afe + languageName: node + linkType: hard + +"acorn@npm:^8.7.1, acorn@npm:^8.8.2": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" + bin: + acorn: bin/acorn + checksum: 10c0/3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: "npm:^4.3.4" + checksum: 10c0/fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 + languageName: node + linkType: hard + +"ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + +"ansi-sequence-parser@npm:^1.1.0": + version: 1.1.1 + resolution: "ansi-sequence-parser@npm:1.1.1" + checksum: 10c0/ab2259ccf69f145ecf1418d4e71524158828f44afdf37c7536677871f4cebaa8b176fcb95de8f94a68129357dddc59586597da25f9d4ebf9968f6ef022bf0b31 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.0" + checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"array-union@npm:^1.0.1": + version: 1.0.2 + resolution: "array-union@npm:1.0.2" + dependencies: + array-uniq: "npm:^1.0.1" + checksum: 10c0/18686767c0cfdae8dc4acf5ac119b0f0eacad82b7fcc0aa62cc41f93c5ad406d494b6a6e53d85e52e8f0349b67a4fec815feeb537e95c02510d747bc9a4157c7 + languageName: node + linkType: hard + +"array-uniq@npm:^1.0.1": + version: 1.0.3 + resolution: "array-uniq@npm:1.0.3" + checksum: 10c0/3acbaf9e6d5faeb1010e2db04ab171b8d265889e46c61762e502979bdc5e55656013726e9a61507de3c82d329a0dc1e8072630a3454b4f2b881cb19ba7fd8aa6 + languageName: node + linkType: hard + +"async@npm:^3.2.4": + version: 3.2.5 + resolution: "async@npm:3.2.5" + checksum: 10c0/1408287b26c6db67d45cb346e34892cee555b8b59e6c68e6f8c3e495cad5ca13b4f218180e871f3c2ca30df4ab52693b66f2f6ff43644760cab0b2198bda79c1 + languageName: node + linkType: hard + +"babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": "npm:^29.7.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.6.3" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" + dependencies: + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.0.1 + resolution: "babel-preset-current-node-syntax@npm:1.0.1" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.8.3" + "@babel/plugin-syntax-import-meta": "npm:^7.8.3" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/5ba39a3a0e6c37d25e56a4fb843be632dac98d54706d8a0933f9bcb1a07987a96d55c2b5a6c11788a74063fb2534fe68c1f1dbb6c93626850c785e0938495627 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: "npm:^7.0.1" + checksum: 10c0/321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + languageName: node + linkType: hard + +"browserslist@npm:^4.21.10, browserslist@npm:^4.22.2": + version: 4.23.0 + resolution: "browserslist@npm:4.23.0" + dependencies: + caniuse-lite: "npm:^1.0.30001587" + electron-to-chromium: "npm:^1.4.668" + node-releases: "npm:^2.0.14" + update-browserslist-db: "npm:^1.0.13" + bin: + browserslist: cli.js + checksum: 10c0/8e9cc154529062128d02a7af4d8adeead83ca1df8cd9ee65a88e2161039f3d68a4d40fea7353cab6bae4c16182dec2fdd9a1cf7dc2a2935498cee1af0e998943 + languageName: node + linkType: hard + +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: "npm:2.x" + checksum: 10c0/80e89aaaed4b68e3374ce936f2eb097456a0dddbf11f75238dbd53140b1e39259f0d248a5089ed456f1158984f22191c3658d54a713982f676709fbe1a6fa5a0 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: 10c0/24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"builtin-modules@npm:^1.1.1": + version: 1.1.1 + resolution: "builtin-modules@npm:1.1.1" + checksum: 10c0/58d72ea7f59db3c2ae854e1058d85b226f75ff7386d0f71d628e25a600383fc6652af218e20ba2361925c605a4144590ceb890dfdca298fdf8f3d040c0591a23 + languageName: node + linkType: hard + +"bytes-iec@npm:^3.1.1": + version: 3.1.1 + resolution: "bytes-iec@npm:3.1.1" + checksum: 10c0/cb553a214d49afe2efb4f9f6f03c0a76dbf2b0db8fe176c1d9943f74b79fb36767938e5f0a60991d870309c96f21e440904dd4f92b54c9c316c88486e6eef025 + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.2 + resolution: "cacache@npm:18.0.2" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 10c0/7992665305cc251a984f4fdbab1449d50e88c635bc43bf2785530c61d239c61b349e5734461baa461caaee65f040ab14e2d58e694f479c0810cffd181ba5eabc + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001587": + version: 1.0.30001600 + resolution: "caniuse-lite@npm:1.0.30001600" + checksum: 10c0/b4f764db5d4f8cb3eb2827a170a20e6b2f4b8c3d80169efcf56bf3d6b8b3e6dd1c740141f0d0b10b2233f49ee8b496e2d1e044a36c54750a106bad2f6477f2db + languageName: node + linkType: hard + +"chalk@npm:^2.3.0, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.1.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e + languageName: node + linkType: hard + +"chokidar@npm:^3.6.0": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: 10c0/080ce2d20c2b9e0f8461a380e9585686caa768b1c834a464470c9dc74cda07f27611c7b727a2cd768a9cecd033297fdec4ce01f1e58b62227882c1059dec321c + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.2.3 + resolution: "cjs-module-lexer@npm:1.2.3" + checksum: 10c0/0de9a9c3fad03a46804c0d38e7b712fb282584a9c7ef1ed44cae22fb71d9bb600309d66a9711ac36a596fd03422f5bb03e021e8f369c12a39fa1786ae531baab + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: "npm:^2.0.4" + kind-of: "npm:^6.0.2" + shallow-clone: "npm:^3.0.0" + checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: "npm:1.1.3" + checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"colorette@npm:^2.0.14": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 + languageName: node + linkType: hard + +"commander@npm:^10.0.1": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3 + languageName: node + linkType: hard + +"commander@npm:^11.0.0": + version: 11.1.0 + resolution: "commander@npm:11.1.0" + checksum: 10c0/13cc6ac875e48780250f723fb81c1c1178d35c5decb1abb1b628b3177af08a8554e76b2c0f29de72d69eef7c864d12613272a71fabef8047922bc622ab75a179 + languageName: node + linkType: hard + +"commander@npm:^2.12.1, commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.1 + resolution: "dedent@npm:1.5.1" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10c0/f8612cd5b00aab58b18bb95572dca08dc2d49720bfa7201a444c3dae430291e8a06d4928614a6ec8764d713927f44bce9c990d3b8238fca2f430990ddc17c070 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.668": + version: 1.4.717 + resolution: "electron-to-chromium@npm:1.4.717" + checksum: 10c0/1de0a9f078211471442010d574634d147491c06f415cc3c178dd378004c4ee5e743cda288973ac01f5204abc6b5bc7bec1d770807b60eb012b49aae4c9570985 + languageName: node + linkType: hard + +"email-addresses@npm:^5.0.0": + version: 5.0.0 + resolution: "email-addresses@npm:5.0.0" + checksum: 10c0/fc8a6f84e378bbe601ce39a3d8d86bc7e4584030ae9eb1938e12943f7fb5207e5fd7ae449cced3bea70968a519ade560d55ca170208c3f1413d7d25d8613a577 + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.16.0": + version: 5.16.0 + resolution: "enhanced-resolve@npm:5.16.0" + dependencies: + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 10c0/dd69669cbb638ccacefd03e04d5e195ee6a99b7f5f8012f86d2df7781834de357923e06064ea621137c4ce0b37cc12b872b4e6d1ac6ab15fe98e7f1dfbbb08c4 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"envinfo@npm:^7.7.3": + version: 7.11.1 + resolution: "envinfo@npm:7.11.1" + bin: + envinfo: dist/cli.js + checksum: 10c0/4550cce03d4d8a7b137d548faaf9c920356474231636cb4a6e74ae75db3b9cb04aa0a052ee391e2363af5db697166c207ba76e106338d758c6126830b3e16d75 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.2.1": + version: 1.5.0 + resolution: "es-module-lexer@npm:1.5.0" + checksum: 10c0/d199853404f3381801eb102befb84a8fc48f93ed86b852c2461c2c4ad4bbbc91128f3d974ff9b8718628260ae3f36e661295ab3e419222868aa31269284e34c9 + languageName: node + linkType: hard + +"esbuild@npm:^0.20.2": + version: 0.20.2 + resolution: "esbuild@npm:0.20.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.20.2" + "@esbuild/android-arm": "npm:0.20.2" + "@esbuild/android-arm64": "npm:0.20.2" + "@esbuild/android-x64": "npm:0.20.2" + "@esbuild/darwin-arm64": "npm:0.20.2" + "@esbuild/darwin-x64": "npm:0.20.2" + "@esbuild/freebsd-arm64": "npm:0.20.2" + "@esbuild/freebsd-x64": "npm:0.20.2" + "@esbuild/linux-arm": "npm:0.20.2" + "@esbuild/linux-arm64": "npm:0.20.2" + "@esbuild/linux-ia32": "npm:0.20.2" + "@esbuild/linux-loong64": "npm:0.20.2" + "@esbuild/linux-mips64el": "npm:0.20.2" + "@esbuild/linux-ppc64": "npm:0.20.2" + "@esbuild/linux-riscv64": "npm:0.20.2" + "@esbuild/linux-s390x": "npm:0.20.2" + "@esbuild/linux-x64": "npm:0.20.2" + "@esbuild/netbsd-x64": "npm:0.20.2" + "@esbuild/openbsd-x64": "npm:0.20.2" + "@esbuild/sunos-x64": "npm:0.20.2" + "@esbuild/win32-arm64": "npm:0.20.2" + "@esbuild/win32-ia32": "npm:0.20.2" + "@esbuild/win32-x64": "npm:0.20.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/66398f9fb2c65e456a3e649747b39af8a001e47963b25e86d9c09d2a48d61aa641b27da0ce5cad63df95ad246105e1d83e7fee0e1e22a0663def73b1c5101112 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 10c0/6b4adafecd0682f3aa1cd1106b8fff30e492c7015b178bc81b2d2f75106dabea6c6d6e8508fc491bd58e597c74abb0e8e2368f943ecb9393d4162e3c2f3cf287 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-glob@npm:^3.3.2": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fastest-levenshtein@npm:^1.0.12": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: 10c0/feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581 + languageName: node + linkType: hard + +"filename-reserved-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "filename-reserved-regex@npm:2.0.0" + checksum: 10c0/453740b7f9fd126e508da555b37e38c1f7ff19f5e9f3d297b2de1beb09854957baddd74c83235e87b16e9ce27a2368798896669edad5a81b5b7bd8cb57c942fc + languageName: node + linkType: hard + +"filenamify@npm:^4.3.0": + version: 4.3.0 + resolution: "filenamify@npm:4.3.0" + dependencies: + filename-reserved-regex: "npm:^2.0.0" + strip-outer: "npm:^1.0.1" + trim-repeated: "npm:^1.0.0" + checksum: 10c0/dcfd2f116d66f78c9dd58bb0f0d9b6529d89c801a9f37a4f86e7adc0acecb6881c7fb7c3231dc9e6754b767edcfdca89cba3a492a58afd2b48479b30d14ccf8f + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + languageName: node + linkType: hard + +"find-cache-dir@npm:^3.3.1": + version: 3.3.2 + resolution: "find-cache-dir@npm:3.3.2" + dependencies: + commondir: "npm:^1.0.1" + make-dir: "npm:^3.0.2" + pkg-dir: "npm:^4.1.0" + checksum: 10c0/92747cda42bff47a0266b06014610981cfbb71f55d60f2c8216bc3108c83d9745507fb0b14ecf6ab71112bed29cd6fb1a137ee7436179ea36e11287e3159e587 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + languageName: node + linkType: hard + +"fs-extra@npm:^11.1.1": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/d77a9a9efe60532d2e790e938c81a02c1b24904ef7a3efb3990b835514465ba720e99a6ea56fd5e2db53b4695319b644d76d5a0e9988a2beef80aa7b1da63398 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"gh-pages@npm:^6.1.1": + version: 6.1.1 + resolution: "gh-pages@npm:6.1.1" + dependencies: + async: "npm:^3.2.4" + commander: "npm:^11.0.0" + email-addresses: "npm:^5.0.0" + filenamify: "npm:^4.3.0" + find-cache-dir: "npm:^3.3.1" + fs-extra: "npm:^11.1.1" + globby: "npm:^6.1.0" + bin: + gh-pages: bin/gh-pages.js + gh-pages-clean: bin/gh-pages-clean.js + checksum: 10c0/1a0c1843862e3d85cdf7a165e92ab504e14b20d1c59398355cb73602041d8a3d509f9c5d80788628048610b751cb32731ed38079691c2b5f9d720664be3f1fa6 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + languageName: node + linkType: hard + +"glob@npm:^7.0.3, glob@npm:^7.1.1, glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globby@npm:^14.0.1": + version: 14.0.1 + resolution: "globby@npm:14.0.1" + dependencies: + "@sindresorhus/merge-streams": "npm:^2.1.0" + fast-glob: "npm:^3.3.2" + ignore: "npm:^5.2.4" + path-type: "npm:^5.0.0" + slash: "npm:^5.1.0" + unicorn-magic: "npm:^0.1.0" + checksum: 10c0/749a6be91cf455c161ebb5c9130df3991cb9fd7568425db850a8279a6cf45acd031c5069395beb7aeb4dd606b64f0d6ff8116c93726178d8e6182fee58c2736d + languageName: node + linkType: hard + +"globby@npm:^6.1.0": + version: 6.1.0 + resolution: "globby@npm:6.1.0" + dependencies: + array-union: "npm:^1.0.1" + glob: "npm:^7.0.3" + object-assign: "npm:^4.0.1" + pify: "npm:^2.0.0" + pinkie-promise: "npm:^2.0.0" + checksum: 10c0/656ad1f0d02c6ef378c07589519ed3ec27fe988ea177195c05b8aff280320f3d67b91fa0baa6f7e49288f9bf1f92fc84f783a79ac3ed66278f3fa082e627ed84 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.4 + resolution: "https-proxy-agent@npm:7.0.4" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 10c0/bc4f7c38da32a5fc622450b6cb49a24ff596f9bd48dcedb52d2da3fa1c1a80e100fb506bd59b326c012f21c863c69b275c23de1a01d0b84db396822fdf25e52b + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ignore@npm:^5.2.4": + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 10c0/703f7f45ffb2a27fb2c5a8db0c32e7dee66b33a225d28e8db4e1be6474795f606686a6e3bcc50e1aa12f2042db4c9d4a7d60af3250511de74620fbed052ea4cd + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/c67ecea72f775fe8684ca3d057e54bdb2ae28c14bf261d2607c269c18ea0da7b730924c06262eca9aed4b8ab31e31d65bc60b50e7296c85908a56e2f7d41ecd2 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 10c0/6f3c4d0aa6ec1b43a8862375588a249e3c917739895cbe67fe12f0a76260ea632af51e8e2431b50fbcd0145356dc28ca147be08dbe6a523739fd55c0f91dc2a5 + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: "npm:^2.0.0" + checksum: 10c0/2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d + languageName: node + linkType: hard + +"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: "npm:^3.0.1" + checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.2 + resolution: "istanbul-lib-instrument@npm:6.0.2" + dependencies: + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10c0/405c6ac037bf8c7ee7495980b0cd5544b2c53078c10534d0c9ceeb92a9ea7dcf8510f58ccfce31336458a8fa6ccef27b570bbb602abaa8c1650f5496a807477c + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" + dependencies: + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b + languageName: node + linkType: hard + +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e + languageName: node + linkType: hard + +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a + languageName: node + linkType: hard + +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 + languageName: node + linkType: hard + +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b + languageName: node + linkType: hard + +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" + dependencies: + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d + languageName: node + linkType: hard + +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 + languageName: node + linkType: hard + +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 + languageName: node + linkType: hard + +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 + languageName: node + linkType: hard + +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 + languageName: node + linkType: hard + +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2 + languageName: node + linkType: hard + +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "npm:*" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b + languageName: node + linkType: hard + +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 + languageName: node + linkType: hard + +"jest@npm:^29.7.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b + languageName: node + linkType: hard + +"jiti@npm:^1.21.0": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" + bin: + jiti: bin/jiti.js + checksum: 10c0/7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.2.0": + version: 3.2.1 + resolution: "jsonc-parser@npm:3.2.1" + checksum: 10c0/ada66dec143d7f9cb0e2d0d29c69e9ce40d20f3a4cb96b0c6efb745025ac7f9ba647d7ac0990d0adfc37a2d2ae084a12009a9c833dbdbeadf648879a99b9df89 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df + languageName: node + linkType: hard + +"lilconfig@npm:^3.1.1": + version: 3.1.1 + resolution: "lilconfig@npm:3.1.1" + checksum: 10c0/311b559794546894e3fe176663427326026c1c644145be9e8041c58e268aa9328799b8dfe7e4dd8c6a4ae305feae95a1c9e007db3569f35b42b6e1bc8274754c + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + languageName: node + linkType: hard + +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + languageName: node + linkType: hard + +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.2.0 + resolution: "lru-cache@npm:10.2.0" + checksum: 10c0/c9847612aa2daaef102d30542a8d6d9b2c2bb36581c1bf0dc3ebf5e5f3352c772a749e604afae2e46873b930a9e9523743faac4e5b937c576ab29196774712ee + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 10c0/77d7dbb4fbd602aac161e2b50887d8eda28c0fa3b799159cee380fbb311f1e614219126ecbbd2c3a9c685f1720a8109b3c1ca85cc893c39b6c9cc6a62a1d8a8b + languageName: node + linkType: hard + +"make-dir@npm:^3.0.2": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: "npm:^6.0.0" + checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 + languageName: node + linkType: hard + +"make-error@npm:1.x": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 10c0/43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: "npm:1.0.5" + checksum: 10c0/b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c + languageName: node + linkType: hard + +"marked@npm:^4.3.0": + version: 4.3.0 + resolution: "marked@npm:4.3.0" + bin: + marked: bin/marked.js + checksum: 10c0/0013463855e31b9c88d8bb2891a611d10ef1dc79f2e3cbff1bf71ba389e04c5971298c886af0be799d7fa9aa4593b086a136062d59f1210b0480b026a8c5dc47 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.0, micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: "npm:^3.0.2" + picomatch: "npm:^2.3.1" + checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.27": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + languageName: node + linkType: hard + +"minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 10c0/6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.3": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: "npm:^1.2.6" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"nanoid@npm:^5.0.6": + version: 5.0.6 + resolution: "nanoid@npm:5.0.6" + bin: + nanoid: bin/nanoid.js + checksum: 10c0/6660f99b7bb3816f04fd9a14126859482e07d1705c02e1a6c1a722545c65186659f6f734eb21329f54e838b6409579bef687e2fb13661b716529dcefc5d86ec6 + languageName: node + linkType: hard + +"nanospinner@npm:^1.1.0": + version: 1.1.0 + resolution: "nanospinner@npm:1.1.0" + dependencies: + picocolors: "npm:^1.0.0" + checksum: 10c0/2f89e48bfb1452b5f3afd8034753bbc45040a6830fec913ec228d7a8a8eab1e2c8193bd41e2203806a1f454907641ffa035b14f3a8462cf374e874eb29fd57f1 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/9cc821111ca244a01fb7f054db7523ab0a0cd837f665267eb962eb87695d71fb1e681f9e21464cc2fd7c05530dc4c81b810bca1a88f7d7186909b74477491a3c + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: 10c0/a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a + languageName: node + linkType: hard + +"node-releases@npm:^2.0.14": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 10c0/199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + +"object-assign@npm:^4.0.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard + +"p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + +"parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: "npm:^9.1.1 || ^10.0.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e + languageName: node + linkType: hard + +"path-type@npm:^5.0.0": + version: 5.0.0 + resolution: "path-type@npm:5.0.0" + checksum: 10c0/e8f4b15111bf483900c75609e5e74e3fcb79f2ddb73e41470028fcd3e4b5162ec65da9907be077ee5012c18801ff7fffb35f9f37a077f3f81d85a0b7d6578efd + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: 10c0/20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"pify@npm:^2.0.0": + version: 2.3.0 + resolution: "pify@npm:2.3.0" + checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc + languageName: node + linkType: hard + +"pinkie-promise@npm:^2.0.0": + version: 2.0.1 + resolution: "pinkie-promise@npm:2.0.1" + dependencies: + pinkie: "npm:^2.0.0" + checksum: 10c0/11b5e5ce2b090c573f8fad7b517cbca1bb9a247587306f05ae71aef6f9b2cd2b923c304aa9663c2409cfde27b367286179f1379bc4ec18a3fbf2bb0d473b160a + languageName: node + linkType: hard + +"pinkie@npm:^2.0.0": + version: 2.0.4 + resolution: "pinkie@npm:2.0.4" + checksum: 10c0/25228b08b5597da42dc384221aa0ce56ee0fbf32965db12ba838e2a9ca0193c2f0609c45551ee077ccd2060bf109137fdb185b00c6d7e0ed7e35006d20fdcbc6 + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 10c0/f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: "npm:^5.1.0" + checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: 10c0/6eb5e4b28028c23e2bfcf73371e72cd4162e4ac7ab445ddae2afe24e347a37d6dc22fae6e1748632cd43c6d4f9b8f86dcf26bf9275e1874f436d129952528ae0 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" + dependencies: + resolve: "npm:^1.20.0" + checksum: 10c0/1a30074124a22abbd5d44d802dac26407fa72a0a95f162aa5504ba8246bc5452f8b1a027b154d9bdbabcd8764920ff9333d934c46a8f17479c8912e92332f3ff + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.2 + resolution: "resolve.exports@npm:2.0.2" + checksum: 10c0/cc4cffdc25447cf34730f388dca5021156ba9302a3bad3d7f168e790dc74b2827dff603f1bc6ad3d299bac269828dca96dd77e036dc9fba6a2a1807c47ab5c98 + languageName: node + linkType: hard + +"resolve@npm:^1.20.0, resolve@npm:^1.3.2": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.3.2#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rimraf@npm:^5.0.5": + version: 5.0.5 + resolution: "rimraf@npm:5.0.5" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/d50dbe724f33835decd88395b25ed35995077c60a50ae78ded06e0185418914e555817aad1b4243edbff2254548c2f6ad6f70cc850040bebb4da9e8cc016f586 + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.1.0": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.8" + ajv: "npm:^6.12.5" + ajv-keywords: "npm:^3.5.2" + checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 + languageName: node + linkType: hard + +"semver@npm:^5.3.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.4": + version: 7.3.5 + resolution: "semver@npm:7.3.5" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 10c0/d450455b2601396dbc7d9f058a6709b1c0b99d74a911f9436c77887600ffcdb5f63d5adffa0c3b8f0092937d8a41cc61c6437bcba375ef4151cb1335ebe4f1f9 + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.6.0 + resolution: "semver@npm:7.6.0" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 10c0/fbfe717094ace0aa8d6332d7ef5ce727259815bd8d8815700853f4faf23aacbd7192522f0dc5af6df52ef4fa85a355ebd2f5d39f554bd028200d6cf481ab9b53 + languageName: node + linkType: hard + +"sequency@workspace:.": + version: 0.0.0-use.local + resolution: "sequency@workspace:." + dependencies: + "@size-limit/preset-small-lib": "npm:^11.1.2" + "@types/jest": "npm:^29.5.12" + gh-pages: "npm:^6.1.1" + jest: "npm:^29.7.0" + rimraf: "npm:^5.0.5" + size-limit: "npm:^11.1.2" + terser-webpack-plugin: "npm:^5.3.10" + ts-jest: "npm:^29.1.2" + ts-loader: "npm:^9.5.1" + tslint: "npm:^6.1.3" + typedoc: "npm:^0.25.12" + typescript: "npm:^5.4.3" + webpack: "npm:^5.91.0" + webpack-cli: "npm:^5.1.4" + languageName: unknown + linkType: soft + +"serialize-javascript@npm:^6.0.1": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: "npm:^2.1.0" + checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: "npm:^6.0.2" + checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"shiki@npm:^0.14.7": + version: 0.14.7 + resolution: "shiki@npm:0.14.7" + dependencies: + ansi-sequence-parser: "npm:^1.1.0" + jsonc-parser: "npm:^3.2.0" + vscode-oniguruma: "npm:^1.7.0" + vscode-textmate: "npm:^8.0.0" + checksum: 10c0/5c7fcbb870d0facccc7ae2f3410a28121f8e0b3f298e4e956de817ad6ab60a4c7e20a9184edfe50a93447addbb88b95b69e6ef88ac16ac6ca3e94c50771a6459 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 + languageName: node + linkType: hard + +"size-limit@npm:11.1.2, size-limit@npm:^11.1.2": + version: 11.1.2 + resolution: "size-limit@npm:11.1.2" + dependencies: + bytes-iec: "npm:^3.1.1" + chokidar: "npm:^3.6.0" + globby: "npm:^14.0.1" + jiti: "npm:^1.21.0" + lilconfig: "npm:^3.1.1" + nanospinner: "npm:^1.1.0" + picocolors: "npm:^1.0.0" + bin: + size-limit: bin.js + checksum: 10c0/5fa72499674c6f693055c30cbc22433f940a5d5b05152c32d0094b19a7a40930ba75da8345c7357e8c72a895e8aee1d8974fb28ce3368329ba83214aa9b5466e + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"slash@npm:^5.1.0": + version: 5.1.0 + resolution: "slash@npm:5.1.0" + checksum: 10c0/eb48b815caf0bdc390d0519d41b9e0556a14380f6799c72ba35caf03544d501d18befdeeef074bc9c052acf69654bc9e0d79d7f1de0866284137a40805299eb3 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: 10c0/a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 + languageName: node + linkType: hard + +"socks@npm:^2.7.1": + version: 2.8.1 + resolution: "socks@npm:2.8.1" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/ac77b515c260473cc7c4452f09b20939e22510ce3ae48385c516d1d5784374d5cc75be3cb18ff66cc985a7f4f2ef8fef84e984c5ec70aad58355ed59241f40a8 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"source-map@npm:^0.7.4": + version: 0.7.4 + resolution: "source-map@npm:0.7.4" + checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"strip-outer@npm:^1.0.1": + version: 1.0.1 + resolution: "strip-outer@npm:1.0.1" + dependencies: + escape-string-regexp: "npm:^1.0.2" + checksum: 10c0/c0f38e6f37563d878a221b1c76f0822f180ec5fc39be5ada30ee637a7d5b59d19418093bad2b4db1e69c40d7a7a7ac50828afce07276cf3d51ac8965cb140dfb + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: "npm:^3.0.0" + checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"tapable@npm:^2.1.1, tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.20" + jest-worker: "npm:^27.4.5" + schema-utils: "npm:^3.1.1" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 10c0/66d1ed3174542560911cf96f4716aeea8d60e7caab212291705d50072b6ba844c7391442541b13c848684044042bea9ec87512b8506528c12854943da05faf91 + languageName: node + linkType: hard + +"terser@npm:^5.26.0": + version: 5.29.2 + resolution: "terser@npm:5.29.2" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/a6f1e26725e3dc99943d7173a3fca8bee21418a3ff39f37053fecd6a988b5341432d535721642807e9c24604aff64410577e9aed3200d9345c89b176b0ba3d65 + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: 10c0/f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"trim-repeated@npm:^1.0.0": + version: 1.0.0 + resolution: "trim-repeated@npm:1.0.0" + dependencies: + escape-string-regexp: "npm:^1.0.2" + checksum: 10c0/89acada0142ed0cdb113615a3e82fdb09e7fdb0e3504ded62762dd935bc27debfcc38edefa497dc7145d8dc8602d40dd9eec891e0ea6c28fa0cc384200b692db + languageName: node + linkType: hard + +"ts-jest@npm:^29.1.2": + version: 29.1.2 + resolution: "ts-jest@npm:29.1.2" + dependencies: + bs-logger: "npm:0.x" + fast-json-stable-stringify: "npm:2.x" + jest-util: "npm:^29.0.0" + json5: "npm:^2.2.3" + lodash.memoize: "npm:4.x" + make-error: "npm:1.x" + semver: "npm:^7.5.3" + yargs-parser: "npm:^21.0.1" + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: 10c0/c2f51f0241f89d127d41392decbcb83b5dfd5e57ab9d50220aa7b7e2f9b3f3b07ccdbba33311284df1c41941879e4ddfad44b15a9d0da4b74bd1b98702b729df + languageName: node + linkType: hard + +"ts-loader@npm:^9.5.1": + version: 9.5.1 + resolution: "ts-loader@npm:9.5.1" + dependencies: + chalk: "npm:^4.1.0" + enhanced-resolve: "npm:^5.0.0" + micromatch: "npm:^4.0.0" + semver: "npm:^7.3.4" + source-map: "npm:^0.7.4" + peerDependencies: + typescript: "*" + webpack: ^5.0.0 + checksum: 10c0/7dc1e3e5d3d032b6ef27836032f02c57077dfbcdf5817cbbc16b7b8609e7ed1d0ec157a03eaac07960161d8ad4a9e030c4d6722fe33540cf6ee75156c7f9c33d + languageName: node + linkType: hard + +"tslib@npm:^1.13.0, tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10c0/69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 + languageName: node + linkType: hard + +"tslint@npm:^6.1.3": + version: 6.1.3 + resolution: "tslint@npm:6.1.3" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + builtin-modules: "npm:^1.1.1" + chalk: "npm:^2.3.0" + commander: "npm:^2.12.1" + diff: "npm:^4.0.1" + glob: "npm:^7.1.1" + js-yaml: "npm:^3.13.1" + minimatch: "npm:^3.0.4" + mkdirp: "npm:^0.5.3" + resolve: "npm:^1.3.2" + semver: "npm:^5.3.0" + tslib: "npm:^1.13.0" + tsutils: "npm:^2.29.0" + peerDependencies: + typescript: ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + bin: + tslint: bin/tslint + checksum: 10c0/04717de06d187ee46ffa99e28af80f1b5a2edbec051e32b43ca681da625a61e94e5eb9ebb638fafe07975fb3536760ffd772f76c57134db723a9ecff6aeac380 + languageName: node + linkType: hard + +"tsutils@npm:^2.29.0": + version: 2.29.0 + resolution: "tsutils@npm:2.29.0" + dependencies: + tslib: "npm:^1.8.1" + peerDependencies: + typescript: ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + checksum: 10c0/e37794513526dbf1cf960414d0a65b956ad319dbc93171bccfe08e3fece1eea35b4e130153f41d917a0f28ecac04f3ca78e9a99c4bddc64a5f225925abc0cf14 + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"typedoc@npm:^0.25.12": + version: 0.25.12 + resolution: "typedoc@npm:0.25.12" + dependencies: + lunr: "npm:^2.3.9" + marked: "npm:^4.3.0" + minimatch: "npm:^9.0.3" + shiki: "npm:^0.14.7" + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x + bin: + typedoc: bin/typedoc + checksum: 10c0/35157a90954ed67243bc1ad430781de381431959c62e24f8a8688c4ebae62c2ee11d404002dfd43a0df3bf96721d94fce928423fe1f91f1ed40c99f29c5276aa + languageName: node + linkType: hard + +"typescript@npm:^5.4.3": + version: 5.4.3 + resolution: "typescript@npm:5.4.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/22443a8760c3668e256c0b34b6b45c359ef6cecc10c42558806177a7d500ab1a7d7aac1f976d712e26989ddf6731d2fbdd3212b7c73290a45127c1c43ba2005a + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.4.3#optional!builtin": + version: 5.4.3 + resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin::version=5.4.3&hash=5adc0c" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6e51f8b7e6ec55b897b9e56b67e864fe8f44e30f4a14357aad5dc0f7432db2f01efc0522df0b6c36d361c51f2dc3dcac5c832efd96a404cfabf884e915d38828 + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.1.0": + version: 0.1.0 + resolution: "unicorn-magic@npm:0.1.0" + checksum: 10c0/e4ed0de05b0a05e735c7d8a2930881e5efcfc3ec897204d5d33e7e6247f4c31eac92e383a15d9a6bccb7319b4271ee4bea946e211bf14951fec6ff2cbbb66a92 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" + dependencies: + escalade: "npm:^3.1.1" + picocolors: "npm:^1.0.0" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/e52b8b521c78ce1e0c775f356cd16a9c22c70d25f3e01180839c407a5dc787fb05a13f67560cbaf316770d26fa99f78f1acd711b1b54a4f35d4820d4ea7136e6 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.2.0 + resolution: "v8-to-istanbul@npm:9.2.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 10c0/e691ba4dd0dea4a884e52c37dbda30cce6f9eeafe9b26721e449429c6bb0f4b6d1e33fabe7711d0f67f7a34c3bfd56c873f7375bba0b1534e6a2843ce99550e5 + languageName: node + linkType: hard + +"vscode-oniguruma@npm:^1.7.0": + version: 1.7.0 + resolution: "vscode-oniguruma@npm:1.7.0" + checksum: 10c0/bef0073c665ddf8c86e51da94529c905856559e9aba97a9882f951acd572da560384775941ab6e7e8db94d9c578b25fefb951e4b73c37e8712e16b0231de2689 + languageName: node + linkType: hard + +"vscode-textmate@npm:^8.0.0": + version: 8.0.0 + resolution: "vscode-textmate@npm:8.0.0" + checksum: 10c0/836f7fe73fc94998a38ca193df48173a2b6eab08b4943d83c8cac9a2a0c3546cfdab4cf1b10b890ec4a4374c5bee03a885ef0e83e7fd2bd618cf00781c017c04 + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: "npm:1.0.12" + checksum: 10c0/a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e + languageName: node + linkType: hard + +"watchpack@npm:^2.4.1": + version: 2.4.1 + resolution: "watchpack@npm:2.4.1" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/c694de0a61004e587a8a0fdc9cfec20ee692c52032d9ab2c2e99969a37fdab9e6e1bd3164ed506f9a13f7c83e65563d563e0d6b87358470cdb7309b83db78683 + languageName: node + linkType: hard + +"webpack-cli@npm:^5.1.4": + version: 5.1.4 + resolution: "webpack-cli@npm:5.1.4" + dependencies: + "@discoveryjs/json-ext": "npm:^0.5.0" + "@webpack-cli/configtest": "npm:^2.1.1" + "@webpack-cli/info": "npm:^2.0.2" + "@webpack-cli/serve": "npm:^2.0.5" + colorette: "npm:^2.0.14" + commander: "npm:^10.0.1" + cross-spawn: "npm:^7.0.3" + envinfo: "npm:^7.7.3" + fastest-levenshtein: "npm:^1.0.12" + import-local: "npm:^3.0.2" + interpret: "npm:^3.1.1" + rechoir: "npm:^0.8.0" + webpack-merge: "npm:^5.7.3" + peerDependencies: + webpack: 5.x.x + peerDependenciesMeta: + "@webpack-cli/generators": + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + bin: + webpack-cli: bin/cli.js + checksum: 10c0/4266909ae5e2e662c8790ac286e965b2c7fd5a4a2f07f48e28576234c9a5f631847ccddc18e1b3281c7b4be04a7ff4717d2636033a322dde13ac995fd0d9de10 + languageName: node + linkType: hard + +"webpack-merge@npm:^5.7.3": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" + dependencies: + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.0" + checksum: 10c0/b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b + languageName: node + linkType: hard + +"webpack-sources@npm:^3.2.3": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e + languageName: node + linkType: hard + +"webpack@npm:^5.91.0": + version: 5.91.0 + resolution: "webpack@npm:5.91.0" + dependencies: + "@types/eslint-scope": "npm:^3.7.3" + "@types/estree": "npm:^1.0.5" + "@webassemblyjs/ast": "npm:^1.12.1" + "@webassemblyjs/wasm-edit": "npm:^1.12.1" + "@webassemblyjs/wasm-parser": "npm:^1.12.1" + acorn: "npm:^8.7.1" + acorn-import-assertions: "npm:^1.9.0" + browserslist: "npm:^4.21.10" + chrome-trace-event: "npm:^1.0.2" + enhanced-resolve: "npm:^5.16.0" + es-module-lexer: "npm:^1.2.1" + eslint-scope: "npm:5.1.1" + events: "npm:^3.2.0" + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.2.11" + json-parse-even-better-errors: "npm:^2.3.1" + loader-runner: "npm:^4.2.0" + mime-types: "npm:^2.1.27" + neo-async: "npm:^2.6.2" + schema-utils: "npm:^3.2.0" + tapable: "npm:^2.1.1" + terser-webpack-plugin: "npm:^5.3.10" + watchpack: "npm:^2.4.1" + webpack-sources: "npm:^3.2.3" + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 10c0/74a3e0ea1c9a492accf035317f31769ffeaaab415811524b9f17bc7bf7012c5b6e1a9860df5ca6903f3ae2618727b801eb47d9351a2595dfffb25941d368b88c + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"wildcard@npm:^2.0.0": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.3.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard From ecf5410467c0ad9786b1fb6be1a708f0dbf5e098 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 16:32:43 +0100 Subject: [PATCH 02/28] Update target to es2015 and use strict mode --- tsconfig.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 1e50381..cee5b2e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,14 @@ { "compilerOptions": { "module": "commonjs", - "target": "es5", - "lib": ["es2015"], + "target": "es2015", "outDir": "lib", "declaration": true, "sourceMap": true, "skipLibCheck": true, "removeComments": false, - "strictNullChecks": true, - "noImplicitReturns": true, - "noImplicitUseStrict": true, - "noImplicitThis": true, - "noImplicitAny": true + "strict": true, + "noImplicitReturns": true }, "include": [ "src" From f21cecb09d0723cbada18f16ec7edaf8e7a88809 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 16:34:02 +0100 Subject: [PATCH 03/28] Add AsyncSequence and update related code --- src/AsyncSequence.ts | 103 ++++++++ src/Comparator.ts | 100 +++++++- src/ComparatorFactory.ts | 45 +++- src/GeneratorIterator.ts | 2 +- src/GeneratorSeedIterator.ts | 4 +- src/Sequence.ts | 239 ++++++------------ src/createComparatorFactory.ts | 100 -------- src/filterNotNull.ts | 14 - src/internal.ts | 35 +++ src/merge.ts | 39 --- src/operators/async/all.ts | 20 ++ src/operators/async/any.ts | 23 ++ src/operators/async/asIterable.ts | 19 ++ src/operators/async/associate.ts | 21 ++ src/operators/async/associateBy.ts | 58 +++++ src/operators/async/average.ts | 22 ++ src/operators/async/chunk.ts | 30 +++ src/operators/async/contains.ts | 20 ++ src/operators/async/count.ts | 20 ++ src/operators/async/distinct.ts | 33 +++ src/operators/async/distinctBy.ts | 37 +++ src/operators/async/drop.ts | 17 ++ src/operators/async/dropWhile.ts | 36 +++ src/operators/async/elementAt.ts | 23 ++ src/operators/async/elementAtOrElse.ts | 24 ++ src/operators/async/elementAtOrNull.ts | 23 ++ src/operators/async/filter.ts | 30 +++ src/operators/async/filterHolistically.ts | 49 ++++ src/operators/async/filterIndexed.ts | 17 ++ src/operators/async/filterNot.ts | 15 ++ src/operators/async/filterNotNull.ts | 14 + src/operators/async/first.ts | 23 ++ src/operators/async/firstOrNull.ts | 31 +++ src/operators/async/flatMap.ts | 39 +++ src/operators/async/flatten.ts | 20 ++ src/operators/async/fold.ts | 22 ++ src/operators/async/foldIndexed.ts | 25 ++ src/operators/async/forEach.ts | 16 ++ src/operators/async/forEachIndexed.ts | 16 ++ src/operators/async/groupBy.ts | 25 ++ src/operators/async/indexOf.ts | 22 ++ src/operators/async/indexOfFirst.ts | 23 ++ src/operators/async/indexOfLast.ts | 24 ++ src/operators/async/joinToString.ts | 77 ++++++ src/operators/async/last.ts | 28 ++ src/operators/async/lastOrNull.ts | 32 +++ src/operators/async/map.ts | 28 ++ src/operators/async/mapIndexed.ts | 16 ++ src/operators/async/mapNotNull.ts | 21 ++ src/operators/async/max.ts | 20 ++ src/operators/async/maxBy.ts | 25 ++ src/operators/async/maxWith.ts | 22 ++ src/operators/async/merge.ts | 93 +++++++ src/operators/async/min.ts | 20 ++ src/operators/async/minBy.ts | 25 ++ src/operators/async/minWith.ts | 22 ++ src/operators/async/minus.ts | 22 ++ src/operators/async/none.ts | 24 ++ src/operators/async/onEach.ts | 18 ++ src/operators/async/partition.ts | 25 ++ src/operators/async/plus.ts | 58 +++++ src/operators/async/reduce.ts | 26 ++ src/operators/async/reduceIndexed.ts | 28 ++ src/operators/async/reverse.ts | 16 ++ src/operators/async/single.ts | 27 ++ src/operators/async/singleOrNull.ts | 27 ++ src/operators/async/sorted.ts | 58 +++++ src/operators/async/sortedBy.ts | 16 ++ src/operators/async/sortedByDescending.ts | 16 ++ src/operators/async/sortedDescending.ts | 14 + src/operators/async/sortedWith.ts | 15 ++ src/operators/async/sum.ts | 18 ++ src/operators/async/sumBy.ts | 19 ++ src/operators/async/take.ts | 18 ++ src/operators/async/takeWhile.ts | 31 +++ src/operators/async/toArray.ts | 31 +++ src/operators/async/toMap.ts | 23 ++ src/operators/async/toSet.ts | 20 ++ src/operators/async/unzip.ts | 22 ++ src/operators/async/withIndex.ts | 37 +++ src/operators/async/zip.ts | 34 +++ src/{ => operators/sync}/all.ts | 2 +- src/{ => operators/sync}/any.ts | 2 +- src/{ => operators/sync}/asIterable.ts | 2 +- src/{ => operators/sync}/associate.ts | 2 +- src/{ => operators/sync}/associateBy.ts | 13 +- src/{ => operators/sync}/average.ts | 2 +- src/{ => operators/sync}/chunk.ts | 8 +- src/{ => operators/sync}/contains.ts | 2 +- src/{ => operators/sync}/count.ts | 14 +- src/{ => operators/sync}/distinct.ts | 4 +- src/{ => operators/sync}/distinctBy.ts | 4 +- src/{ => operators/sync}/drop.ts | 2 +- src/{ => operators/sync}/dropWhile.ts | 7 +- src/{ => operators/sync}/elementAt.ts | 2 +- src/{ => operators/sync}/elementAtOrElse.ts | 4 +- src/{ => operators/sync}/elementAtOrNull.ts | 4 +- src/{ => operators/sync}/filter.ts | 6 +- src/operators/sync/filterHolistically.ts | 49 ++++ src/{ => operators/sync}/filterIndexed.ts | 2 +- src/{ => operators/sync}/filterNot.ts | 2 +- src/operators/sync/filterNotNull.ts | 14 + src/{ => operators/sync}/first.ts | 2 +- src/{ => operators/sync}/firstOrNull.ts | 2 +- src/{ => operators/sync}/flatMap.ts | 4 +- src/{ => operators/sync}/flatten.ts | 2 +- src/{ => operators/sync}/fold.ts | 2 +- src/{ => operators/sync}/foldIndexed.ts | 2 +- src/{ => operators/sync}/forEach.ts | 4 +- src/{ => operators/sync}/forEachIndexed.ts | 2 +- src/{ => operators/sync}/groupBy.ts | 8 +- src/{ => operators/sync}/indexOf.ts | 2 +- src/{ => operators/sync}/indexOfFirst.ts | 2 +- src/{ => operators/sync}/indexOfLast.ts | 2 +- src/{ => operators/sync}/joinToString.ts | 6 +- src/{ => operators/sync}/last.ts | 2 +- src/{ => operators/sync}/lastOrNull.ts | 2 +- src/{ => operators/sync}/map.ts | 6 +- src/{ => operators/sync}/mapIndexed.ts | 2 +- src/{ => operators/sync}/mapNotNull.ts | 2 +- src/{ => operators/sync}/max.ts | 4 +- src/{ => operators/sync}/maxBy.ts | 4 +- src/{ => operators/sync}/maxWith.ts | 5 +- src/operators/sync/merge.ts | 93 +++++++ src/{ => operators/sync}/min.ts | 4 +- src/{ => operators/sync}/minBy.ts | 4 +- src/{ => operators/sync}/minWith.ts | 4 +- src/{ => operators/sync}/minus.ts | 11 +- src/{ => operators/sync}/none.ts | 2 +- src/{ => operators/sync}/onEach.ts | 2 +- src/{ => operators/sync}/partition.ts | 12 +- src/{ => operators/sync}/plus.ts | 10 +- src/{ => operators/sync}/reduce.ts | 2 +- src/{ => operators/sync}/reduceIndexed.ts | 2 +- src/{ => operators/sync}/reverse.ts | 2 +- src/{ => operators/sync}/single.ts | 2 +- src/{ => operators/sync}/singleOrNull.ts | 4 +- src/operators/sync/sorted.ts | 58 +++++ src/{ => operators/sync}/sortedBy.ts | 2 +- .../sync}/sortedByDescending.ts | 2 +- src/{ => operators/sync}/sortedDescending.ts | 2 +- src/{ => operators/sync}/sortedWith.ts | 2 +- src/{ => operators/sync}/sum.ts | 2 +- src/{ => operators/sync}/sumBy.ts | 2 +- src/{ => operators/sync}/take.ts | 2 +- src/{ => operators/sync}/takeWhile.ts | 7 +- src/{ => operators/sync}/toArray.ts | 16 +- src/{ => operators/sync}/toMap.ts | 2 +- src/{ => operators/sync}/toSet.ts | 2 +- src/{ => operators/sync}/unzip.ts | 10 +- src/{ => operators/sync}/withIndex.ts | 6 +- src/{ => operators/sync}/zip.ts | 4 +- src/sequency.ts | 105 ++++++++ src/sorted.ts | 30 --- 154 files changed, 2706 insertions(+), 506 deletions(-) create mode 100644 src/AsyncSequence.ts delete mode 100644 src/createComparatorFactory.ts delete mode 100644 src/filterNotNull.ts create mode 100644 src/internal.ts delete mode 100644 src/merge.ts create mode 100644 src/operators/async/all.ts create mode 100644 src/operators/async/any.ts create mode 100644 src/operators/async/asIterable.ts create mode 100644 src/operators/async/associate.ts create mode 100644 src/operators/async/associateBy.ts create mode 100644 src/operators/async/average.ts create mode 100644 src/operators/async/chunk.ts create mode 100644 src/operators/async/contains.ts create mode 100644 src/operators/async/count.ts create mode 100644 src/operators/async/distinct.ts create mode 100644 src/operators/async/distinctBy.ts create mode 100644 src/operators/async/drop.ts create mode 100644 src/operators/async/dropWhile.ts create mode 100644 src/operators/async/elementAt.ts create mode 100644 src/operators/async/elementAtOrElse.ts create mode 100644 src/operators/async/elementAtOrNull.ts create mode 100644 src/operators/async/filter.ts create mode 100644 src/operators/async/filterHolistically.ts create mode 100644 src/operators/async/filterIndexed.ts create mode 100644 src/operators/async/filterNot.ts create mode 100644 src/operators/async/filterNotNull.ts create mode 100644 src/operators/async/first.ts create mode 100644 src/operators/async/firstOrNull.ts create mode 100644 src/operators/async/flatMap.ts create mode 100644 src/operators/async/flatten.ts create mode 100644 src/operators/async/fold.ts create mode 100644 src/operators/async/foldIndexed.ts create mode 100644 src/operators/async/forEach.ts create mode 100644 src/operators/async/forEachIndexed.ts create mode 100644 src/operators/async/groupBy.ts create mode 100644 src/operators/async/indexOf.ts create mode 100644 src/operators/async/indexOfFirst.ts create mode 100644 src/operators/async/indexOfLast.ts create mode 100644 src/operators/async/joinToString.ts create mode 100644 src/operators/async/last.ts create mode 100644 src/operators/async/lastOrNull.ts create mode 100644 src/operators/async/map.ts create mode 100644 src/operators/async/mapIndexed.ts create mode 100644 src/operators/async/mapNotNull.ts create mode 100644 src/operators/async/max.ts create mode 100644 src/operators/async/maxBy.ts create mode 100644 src/operators/async/maxWith.ts create mode 100644 src/operators/async/merge.ts create mode 100644 src/operators/async/min.ts create mode 100644 src/operators/async/minBy.ts create mode 100644 src/operators/async/minWith.ts create mode 100644 src/operators/async/minus.ts create mode 100644 src/operators/async/none.ts create mode 100644 src/operators/async/onEach.ts create mode 100644 src/operators/async/partition.ts create mode 100644 src/operators/async/plus.ts create mode 100644 src/operators/async/reduce.ts create mode 100644 src/operators/async/reduceIndexed.ts create mode 100644 src/operators/async/reverse.ts create mode 100644 src/operators/async/single.ts create mode 100644 src/operators/async/singleOrNull.ts create mode 100644 src/operators/async/sorted.ts create mode 100644 src/operators/async/sortedBy.ts create mode 100644 src/operators/async/sortedByDescending.ts create mode 100644 src/operators/async/sortedDescending.ts create mode 100644 src/operators/async/sortedWith.ts create mode 100644 src/operators/async/sum.ts create mode 100644 src/operators/async/sumBy.ts create mode 100644 src/operators/async/take.ts create mode 100644 src/operators/async/takeWhile.ts create mode 100644 src/operators/async/toArray.ts create mode 100644 src/operators/async/toMap.ts create mode 100644 src/operators/async/toSet.ts create mode 100644 src/operators/async/unzip.ts create mode 100644 src/operators/async/withIndex.ts create mode 100644 src/operators/async/zip.ts rename src/{ => operators/sync}/all.ts (91%) rename src/{ => operators/sync}/any.ts (93%) rename src/{ => operators/sync}/asIterable.ts (89%) rename src/{ => operators/sync}/associate.ts (93%) rename src/{ => operators/sync}/associateBy.ts (79%) rename src/{ => operators/sync}/average.ts (92%) rename src/{ => operators/sync}/chunk.ts (80%) rename src/{ => operators/sync}/contains.ts (91%) rename src/{ => operators/sync}/count.ts (50%) rename src/{ => operators/sync}/distinct.ts (88%) rename src/{ => operators/sync}/distinctBy.ts (90%) rename src/{ => operators/sync}/drop.ts (89%) rename src/{ => operators/sync}/dropWhile.ts (83%) rename src/{ => operators/sync}/elementAt.ts (93%) rename src/{ => operators/sync}/elementAtOrElse.ts (87%) rename src/{ => operators/sync}/elementAtOrNull.ts (88%) rename src/{ => operators/sync}/filter.ts (83%) create mode 100644 src/operators/sync/filterHolistically.ts rename src/{ => operators/sync}/filterIndexed.ts (92%) rename src/{ => operators/sync}/filterNot.ts (90%) create mode 100644 src/operators/sync/filterNotNull.ts rename src/{ => operators/sync}/first.ts (93%) rename src/{ => operators/sync}/firstOrNull.ts (95%) rename src/{ => operators/sync}/flatMap.ts (91%) rename src/{ => operators/sync}/flatten.ts (86%) rename src/{ => operators/sync}/fold.ts (94%) rename src/{ => operators/sync}/foldIndexed.ts (95%) rename src/{ => operators/sync}/forEach.ts (80%) rename src/{ => operators/sync}/forEachIndexed.ts (91%) rename src/{ => operators/sync}/groupBy.ts (82%) rename src/{ => operators/sync}/indexOf.ts (92%) rename src/{ => operators/sync}/indexOfFirst.ts (93%) rename src/{ => operators/sync}/indexOfLast.ts (93%) rename src/{ => operators/sync}/joinToString.ts (94%) rename src/{ => operators/sync}/last.ts (94%) rename src/{ => operators/sync}/lastOrNull.ts (95%) rename src/{ => operators/sync}/map.ts (87%) rename src/{ => operators/sync}/mapIndexed.ts (91%) rename src/{ => operators/sync}/mapNotNull.ts (89%) rename src/{ => operators/sync}/max.ts (86%) rename src/{ => operators/sync}/maxBy.ts (91%) rename src/{ => operators/sync}/maxWith.ts (82%) create mode 100644 src/operators/sync/merge.ts rename src/{ => operators/sync}/min.ts (86%) rename src/{ => operators/sync}/minBy.ts (91%) rename src/{ => operators/sync}/minWith.ts (88%) rename src/{ => operators/sync}/minus.ts (52%) rename src/{ => operators/sync}/none.ts (93%) rename src/{ => operators/sync}/onEach.ts (90%) rename src/{ => operators/sync}/partition.ts (69%) rename src/{ => operators/sync}/plus.ts (84%) rename src/{ => operators/sync}/reduce.ts (95%) rename src/{ => operators/sync}/reduceIndexed.ts (96%) rename src/{ => operators/sync}/reverse.ts (88%) rename src/{ => operators/sync}/single.ts (95%) rename src/{ => operators/sync}/singleOrNull.ts (91%) create mode 100644 src/operators/sync/sorted.ts rename src/{ => operators/sync}/sortedBy.ts (90%) rename src/{ => operators/sync}/sortedByDescending.ts (91%) rename src/{ => operators/sync}/sortedDescending.ts (87%) rename src/{ => operators/sync}/sortedWith.ts (90%) rename src/{ => operators/sync}/sum.ts (89%) rename src/{ => operators/sync}/sumBy.ts (91%) rename src/{ => operators/sync}/take.ts (90%) rename src/{ => operators/sync}/takeWhile.ts (80%) rename src/{ => operators/sync}/toArray.ts (63%) rename src/{ => operators/sync}/toMap.ts (94%) rename src/{ => operators/sync}/toSet.ts (92%) rename src/{ => operators/sync}/unzip.ts (68%) rename src/{ => operators/sync}/withIndex.ts (83%) rename src/{ => operators/sync}/zip.ts (89%) create mode 100644 src/sequency.ts delete mode 100644 src/sorted.ts diff --git a/src/AsyncSequence.ts b/src/AsyncSequence.ts new file mode 100644 index 0000000..ab35918 --- /dev/null +++ b/src/AsyncSequence.ts @@ -0,0 +1,103 @@ +import {applyMixins} from "./internal"; +import {All as AllOp} from "./operators/async/all"; +import {Any as AnyOp} from "./operators/async/any"; +import {AsIterable as AsIterableOp} from "./operators/async/asIterable"; +import {Associate as AssociateOp} from "./operators/async/associate"; +import {AssociateBy as AssociateByOp} from "./operators/async/associateBy"; +import {Average as AverageOp} from "./operators/async/average"; +import {Chunk as ChunkOp} from "./operators/async/chunk"; +import {Contains as ContainsOp} from "./operators/async/contains"; +import {Count as CountOp} from "./operators/async/count"; +import {Distinct as DistinctOp} from "./operators/async/distinct"; +import {DistinctBy as DistinctByOp} from "./operators/async/distinctBy"; +import {Drop as DropOp} from "./operators/async/drop"; +import {DropWhile as DropWhileOp} from "./operators/async/dropWhile"; +import {ElementAt as ElementAtOp} from "./operators/async/elementAt"; +import {ElementAtOrElse as ElementAtOrElseOp} from "./operators/async/elementAtOrElse"; +import {ElementAtOrNull as ElementAtOrNullOp} from "./operators/async/elementAtOrNull"; +import {Filter as FilterOp} from "./operators/async/filter"; +import {FilterHolistically as FilterHolisticallyOp} from "./operators/async/filterHolistically"; +import {FilterIndexed as FilterIndexedOp} from "./operators/async/filterIndexed"; +import {FilterNot as FilterNotOp} from "./operators/async/filterNot"; +import {FilterNotNull as FilterNotNullOp} from "./operators/async/filterNotNull"; +import {First as FirstOp} from "./operators/async/first"; +import {FirstOrNull as FirstOrNullOp} from "./operators/async/firstOrNull"; +import {FlatMap as FlatMapOp} from "./operators/async/flatMap"; +import {Flatten as FlattenOp} from "./operators/async/flatten"; +import {Fold as FoldOp} from "./operators/async/fold"; +import {FoldIndexed as FoldIndexedOp} from "./operators/async/foldIndexed"; +import {ForEach as ForEachOp} from "./operators/async/forEach"; +import {ForEachIndexed as ForEachIndexedOp} from "./operators/async/forEachIndexed"; +import {GroupBy as GroupByOp} from "./operators/async/groupBy"; +import {IndexOf as IndexOfOp} from "./operators/async/indexOf"; +import {IndexOfFirst as IndexOfFirstOp} from "./operators/async/indexOfFirst"; +import {IndexOfLast as IndexOfLastOp} from "./operators/async/indexOfLast"; +import {JoinToString as JoinToStringOp} from "./operators/async/joinToString"; +import {Last as LastOp} from "./operators/async/last"; +import {LastOrNull as LastOrNullOp} from "./operators/async/lastOrNull"; +import {Map as MapOp} from "./operators/async/map"; +import {MapIndexed as MapIndexedOp} from "./operators/async/mapIndexed"; +import {MapNotNull as MapNotNullOp} from "./operators/async/mapNotNull"; +import {Max as MaxOp} from "./operators/async/max"; +import {MaxBy as MaxByOp} from "./operators/async/maxBy"; +import {MaxWith as MaxWithOp} from "./operators/async/maxWith"; +import {Merge as MergeOp} from "./operators/async/merge"; +import {Min as MinOp} from "./operators/async/min"; +import {MinBy as MinByOp} from "./operators/async/minBy"; +import {Minus as MinusOp} from "./operators/async/minus"; +import {MinWith as MinWithOp} from "./operators/async/minWith"; +import {None as NoneOp} from "./operators/async/none"; +import {OnEach as OnEachOp} from "./operators/async/onEach"; +import {Partition as PartitionOp} from "./operators/async/partition"; +import {Plus as PlusOp} from "./operators/async/plus"; +import {Reduce as ReduceOp} from "./operators/async/reduce"; +import {ReduceIndexed as ReduceIndexedOp} from "./operators/async/reduceIndexed"; +import {Reverse as ReverseOp} from "./operators/async/reverse"; +import {Single as SingleOp} from "./operators/async/single"; +import {SingleOrNull as SingleOrNullOp} from "./operators/async/singleOrNull"; +import {Sorted as SortedOp} from "./operators/async/sorted"; +import {SortedBy as SortedByOp} from "./operators/async/sortedBy"; +import {SortedByDescending as SortedByDescendingOp} from "./operators/async/sortedByDescending"; +import {SortedDescending as SortedDescendingOp} from "./operators/async/sortedDescending"; +import {SortedWith as SortedWithOp} from "./operators/async/sortedWith"; +import {Sum as SumOp} from "./operators/async/sum"; +import {SumBy as SumByOp} from "./operators/async/sumBy"; +import {Take as TakeOp} from "./operators/async/take"; +import {TakeWhile as TakeWhileOp} from "./operators/async/takeWhile"; +import {ToArray as ToArrayOp} from "./operators/async/toArray"; +import {ToMap as ToMapOp} from "./operators/async/toMap"; +import {ToSet as ToSetOp} from "./operators/async/toSet"; +import {Unzip as UnzipOp} from "./operators/async/unzip"; +import {WithIndex as WithIndexOp} from "./operators/async/withIndex"; +import {Zip as ZipOp} from "./operators/async/zip"; + +/** + * A Sequence provides a fluent functional API consisting + * of various intermediate and terminal operations for processing the iterated data. + * The operations are evaluated lazily to avoid examining all the input data + * when it's not necessary. Sequences can be iterated only once. + */ +export interface AsyncSequence extends AsyncSequenceOperators { + readonly iterator: AsyncIterator; +} + +/** + * @hidden + */ +export interface AsyncSequenceOperators extends AllOp, AnyOp, AsIterableOp, AssociateOp, AssociateByOp, AverageOp, ChunkOp, ContainsOp, CountOp, DistinctOp, DistinctByOp, DropOp, DropWhileOp, + ElementAtOp, ElementAtOrElseOp, ElementAtOrNullOp, FilterOp, FilterHolisticallyOp, FilterIndexedOp, FilterNotOp, FilterNotNullOp, FirstOp, FirstOrNullOp, FlatMapOp, FlattenOp, FoldOp, + FoldIndexedOp, ForEachOp, ForEachIndexedOp, GroupByOp, IndexOfOp, IndexOfFirstOp, IndexOfLastOp, JoinToStringOp, LastOp, LastOrNullOp, MapOp, MapIndexedOp, MapNotNullOp, MaxOp, MaxByOp, + MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, SortedByOp, + SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp { +} + +export class AsyncSequenceImpl { + constructor(readonly iterator: AsyncIterator) { + } +} + +applyMixins(AsyncSequenceImpl, [AllOp, AnyOp, AsIterableOp, AssociateOp, AssociateByOp, AverageOp, ChunkOp, ContainsOp, CountOp, DistinctOp, DistinctByOp, DropOp, DropWhileOp, + ElementAtOp, ElementAtOrElseOp, ElementAtOrNullOp, FilterOp, FilterHolisticallyOp, FilterIndexedOp, FilterNotOp, FilterNotNullOp, FirstOp, FirstOrNullOp, FlatMapOp, FlattenOp, FoldOp, + FoldIndexedOp, ForEachOp, ForEachIndexedOp, GroupByOp, IndexOfOp, IndexOfFirstOp, IndexOfLastOp, JoinToStringOp, LastOp, LastOrNullOp, MapOp, MapIndexedOp, MapNotNullOp, MaxOp, MaxByOp, + MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, SortedByOp, + SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp]); \ No newline at end of file diff --git a/src/Comparator.ts b/src/Comparator.ts index 5f84a58..513ed8f 100644 --- a/src/Comparator.ts +++ b/src/Comparator.ts @@ -1,37 +1,56 @@ +import {asSelector} from "./internal"; + /** * A Comparator defines a compare function enriched with methods to compose multiple * comparators in order to form complex comparison behavior. A compare function returns * negative numbers if the first value is lower than the second value, positive numbers * if the first value is larger than the second value and zero if both values are equal. */ -interface Comparator { - (a: T, b: T): number; +export default class Comparator { + constructor(readonly compare: (a: T, b: T) => number) { + } /** * Reverses the order of the current comparator. * * @returns {Comparator} */ - reversed(): Comparator; + reversed(): Comparator { + return new Comparator( + (a: T, b: T) => this.compare(a, b) * -1 + ); + } /** * Composes the current comparator with the given comparison function such * that the latter is applied for every equal values of the former comparator. * - * @param {(a: T, b: T) => number} comparison + * @param {(a: T, b: T) => number} nextComparison * @returns {Comparator} */ - then(comparison: (a: T, b: T) => number): Comparator; + then(nextComparison: (a: T, b: T) => number): Comparator { + return new Comparator( + (a: T, b: T) => { + const result = this.compare(a, b); + return result !== 0 + ? result + : nextComparison(a, b); + } + ); + } /** * Composes the current comparator with the given comparison function such * that the latter is applied for every equal values of the current comparator * in reverse (descending) order. * - * @param {(a: T, b: T) => number} comparison + * @param {(a: T, b: T) => number} nextComparison * @returns {Comparator} */ - thenDescending(comparison: (a: T, b: T) => number): Comparator; + thenDescending(nextComparison: (a: T, b: T) => number): Comparator { + return this.then(nextComparison) + .reversed(); + } /** * Composes the current comparator with a comparator which compares the properties @@ -50,7 +69,11 @@ interface Comparator { * @param {keyof T} key * @returns {Comparator} */ - thenBy(key: keyof T): Comparator; + thenBy(key: keyof NonNullable): Comparator; + + thenBy(keyOrSelector: ((value: T) => any) | keyof NonNullable): Comparator { + return this.then((a: T, b: T) => Comparator.naturalCompare(a, b, keyOrSelector)); + } /** * Composes the current comparator with a comparator which compares the properties @@ -70,7 +93,62 @@ interface Comparator { * @param {keyof T} key * @returns {Comparator} */ - thenByDescending(key: keyof T): Comparator; -} + thenByDescending(key: keyof NonNullable): Comparator; + + thenByDescending(keyOrSelector: ((value: T) => any) | keyof NonNullable): Comparator { + return this.then((a: T, b: T) => Comparator.naturalCompare(b, a, keyOrSelector)); + } + + static naturalCompare(a: T, b: T, keyOrSelector?: ((item: T) => any) | keyof NonNullable): number { + if (a == null && b == null) { + if (a === undefined && b === undefined) { + return 0; + } + if (a === undefined) { + return 1; + } + if (b === undefined) { + return -1; + } + return 0; + } + if (a == null) { + return 1; + } + if (b == null) { + return -1; + } + + if (keyOrSelector != null) { + const selector = asSelector(keyOrSelector); + const valA = selector(a); + const valB = selector(b); + + return Comparator.naturalCompare(valA, valB); + } else { + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + return 0; + } + } + + static naturalOrder(): Comparator { + return new Comparator(Comparator.naturalCompare); + } + + static reverseOrder(): Comparator { + return new Comparator(Comparator.naturalCompare).reversed(); + } + + static nullsLast(): Comparator { + return new Comparator((a: T, b: T) => a === null ? 1 : b === null ? -1 : 0); + } -export default Comparator; \ No newline at end of file + static nullsFirst(): Comparator { + return new Comparator((a: T, b: T) => a === null ? -1 : b === null ? 1 : 0); + } +} \ No newline at end of file diff --git a/src/ComparatorFactory.ts b/src/ComparatorFactory.ts index 2e983cf..fc262a2 100644 --- a/src/ComparatorFactory.ts +++ b/src/ComparatorFactory.ts @@ -1,9 +1,12 @@ +import {asSelector} from "./internal"; import Comparator from "./Comparator"; /** * Defines various methods for constructing comparators. */ -interface ComparatorFactory { +export default class ComparatorFactory { + constructor() { + } /** * Constructs a new comparator where values are ordered by the given @@ -12,7 +15,9 @@ interface ComparatorFactory { * @param {(a: T, b: T) => number} comparison * @returns {Comparator} */ - compare(comparison: (a: T, b: T) => number): Comparator; + compare(comparison: (a: T, b: T) => number): Comparator { + return new Comparator(comparison); + } /** * Constructs a new comparator where values are ordered by the natural ascending order @@ -30,7 +35,13 @@ interface ComparatorFactory { * @param {keyof T} key * @returns {Comparator} */ - compareBy(key: keyof T): Comparator; + compareBy(key: keyof NonNullable): Comparator; + + compareBy(keyOrSelector: ((item: T) => any) | keyof NonNullable): Comparator { + return new Comparator( + (a: T, b: T) => Comparator.naturalCompare(a, b, keyOrSelector) + ); + } /** * Constructs a new comparator where values are ordered by the natural descending order @@ -48,35 +59,47 @@ interface ComparatorFactory { * @param {keyof T} key * @returns {Comparator} */ - compareByDescending(key: keyof T): Comparator; + compareByDescending(key: keyof NonNullable): Comparator; + + compareByDescending(keyOrSelector: ((item: T) => any) | keyof NonNullable): Comparator { + return new Comparator( + (a: T, b: T) => Comparator.naturalCompare(b, a, keyOrSelector) + ); + } /** * Constructs a new comparator where values are ordered naturally. * * @returns {Comparator} */ - naturalOrder(): Comparator; + naturalOrder(): Comparator { + return Comparator.naturalOrder(); + } /** * Constructs a new comparator where values are ordered in reverse natural order. * * @returns {Comparator} */ - reverseOrder(): Comparator; + reverseOrder(): Comparator { + return Comparator.reverseOrder(); + } /** * Constructs a new comparator where null values are ordered at the beginning. * * @returns {Comparator} */ - nullsFirst(): Comparator; + nullsFirst(): Comparator { + return Comparator.nullsFirst(); + } /** * Constructs a new comparator where null values are ordered at the end. * * @returns {Comparator} */ - nullsLast(): Comparator; -} - -export default ComparatorFactory; \ No newline at end of file + nullsLast(): Comparator { + return Comparator.nullsLast(); + } +} \ No newline at end of file diff --git a/src/GeneratorIterator.ts b/src/GeneratorIterator.ts index 6edd19a..0dc00ff 100644 --- a/src/GeneratorIterator.ts +++ b/src/GeneratorIterator.ts @@ -2,7 +2,7 @@ export default class GeneratorIterator implements Iterator { constructor(private readonly nextFunction: () => T | null | undefined) { } - next(value?: any): IteratorResult { + next(value?: unknown): IteratorResult { const nextItem = this.nextFunction(); return { done: nextItem == null, diff --git a/src/GeneratorSeedIterator.ts b/src/GeneratorSeedIterator.ts index d435bf9..45026ac 100644 --- a/src/GeneratorSeedIterator.ts +++ b/src/GeneratorSeedIterator.ts @@ -1,5 +1,5 @@ export default class GeneratorSeedIterator implements Iterator { - private prevItem: T; + private prevItem: T | null = null; constructor(private readonly seed: T, private readonly nextFunction: (value: T) => T | null | undefined) { @@ -12,7 +12,7 @@ export default class GeneratorSeedIterator implements Iterator { } const nextItem = this.nextFunction(this.prevItem); if (nextItem == null) { - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } this.prevItem = nextItem; return { diff --git a/src/Sequence.ts b/src/Sequence.ts index 76eb3c3..830cc9b 100644 --- a/src/Sequence.ts +++ b/src/Sequence.ts @@ -1,75 +1,75 @@ -import {All} from "./all"; -import {Any} from "./any"; -import {AsIterable} from "./asIterable"; -import {Associate} from "./associate"; -import {AssociateBy} from "./associateBy"; -import {Average} from "./average"; -import {Chunk} from "./chunk"; -import {Contains} from "./contains"; -import {Count} from "./count"; -import {Distinct} from "./distinct"; -import {DistinctBy} from "./distinctBy"; -import {Drop} from "./drop"; -import {DropWhile} from "./dropWhile"; -import {ElementAt} from "./elementAt"; -import {ElementAtOrElse} from "./elementAtOrElse"; -import {ElementAtOrNull} from "./elementAtOrNull"; -import {Filter} from "./filter"; -import {FilterIndexed} from "./filterIndexed"; -import {FilterNot} from "./filterNot"; -import {FilterNotNull} from "./filterNotNull"; -import {First} from "./first"; -import {FirstOrNull} from "./firstOrNull"; -import {FlatMap} from "./flatMap"; -import {Flatten} from "./flatten"; -import {Fold} from "./fold"; -import {FoldIndexed} from "./foldIndexed"; -import {ForEach} from "./forEach"; -import {ForEachIndexed} from "./forEachIndexed"; -import {GroupBy} from "./groupBy"; -import {IndexOf} from "./indexOf"; -import {IndexOfFirst} from "./indexOfFirst"; -import {IndexOfLast} from "./indexOfLast"; -import {JoinToString} from "./joinToString"; -import {Last} from "./last"; -import {LastOrNull} from "./lastOrNull"; -import {Map} from "./map"; -import {MapIndexed} from "./mapIndexed"; -import {MapNotNull} from "./mapNotNull"; -import {Max} from "./max"; -import {MaxBy} from "./maxBy"; -import {MaxWith} from "./maxWith"; -import {Merge} from "./merge"; -import {Min} from "./min"; -import {MinBy} from "./minBy"; -import {Minus} from "./minus"; -import {MinWith} from "./minWith"; -import {None} from "./none"; -import {OnEach} from "./onEach"; -import {Partition} from "./partition"; -import {Plus} from "./plus"; -import {Reduce} from "./reduce"; -import {ReduceIndexed} from "./reduceIndexed"; -import {Reverse} from "./reverse"; -import {Single} from "./single"; -import {SingleOrNull} from "./singleOrNull"; -import {Sorted} from "./sorted"; -import {SortedBy} from "./sortedBy"; -import {SortedByDescending} from "./sortedByDescending"; -import {SortedDescending} from "./sortedDescending"; -import {SortedWith} from "./sortedWith"; -import {Sum} from "./sum"; -import {SumBy} from "./sumBy"; -import {Take} from "./take"; -import {TakeWhile} from "./takeWhile"; -import {ToArray} from "./toArray"; -import {ToMap} from "./toMap"; -import {ToSet} from "./toSet"; -import {Unzip} from "./unzip"; -import {WithIndex} from "./withIndex"; -import {Zip} from "./zip"; -import GeneratorIterator from "./GeneratorIterator"; -import GeneratorSeedIterator from "./GeneratorSeedIterator"; +import {applyMixins} from "./internal"; +import {All as AllOp} from "./operators/sync/all"; +import {Any as AnyOp} from "./operators/sync/any"; +import {AsIterable as AsIterableOp} from "./operators/sync/asIterable"; +import {Associate as AssociateOp} from "./operators/sync/associate"; +import {AssociateBy as AssociateByOp} from "./operators/sync/associateBy"; +import {Average as AverageOp} from "./operators/sync/average"; +import {Chunk as ChunkOp} from "./operators/sync/chunk"; +import {Contains as ContainsOp} from "./operators/sync/contains"; +import {Count as CountOp} from "./operators/sync/count"; +import {Distinct as DistinctOp} from "./operators/sync/distinct"; +import {DistinctBy as DistinctByOp} from "./operators/sync/distinctBy"; +import {Drop as DropOp} from "./operators/sync/drop"; +import {DropWhile as DropWhileOp} from "./operators/sync/dropWhile"; +import {ElementAt as ElementAtOp} from "./operators/sync/elementAt"; +import {ElementAtOrElse as ElementAtOrElseOp} from "./operators/sync/elementAtOrElse"; +import {ElementAtOrNull as ElementAtOrNullOp} from "./operators/sync/elementAtOrNull"; +import {Filter as FilterOp} from "./operators/sync/filter"; +import {FilterHolistically as FilterHolisticallyOp} from "./operators/sync/filterHolistically"; +import {FilterIndexed as FilterIndexedOp} from "./operators/sync/filterIndexed"; +import {FilterNot as FilterNotOp} from "./operators/sync/filterNot"; +import {FilterNotNull as FilterNotNullOp} from "./operators/sync/filterNotNull"; +import {First as FirstOp} from "./operators/sync/first"; +import {FirstOrNull as FirstOrNullOp} from "./operators/sync/firstOrNull"; +import {FlatMap as FlatMapOp} from "./operators/sync/flatMap"; +import {Flatten as FlattenOp} from "./operators/sync/flatten"; +import {Fold as FoldOp} from "./operators/sync/fold"; +import {FoldIndexed as FoldIndexedOp} from "./operators/sync/foldIndexed"; +import {ForEach as ForEachOp} from "./operators/sync/forEach"; +import {ForEachIndexed as ForEachIndexedOp} from "./operators/sync/forEachIndexed"; +import {GroupBy as GroupByOp} from "./operators/sync/groupBy"; +import {IndexOf as IndexOfOp} from "./operators/sync/indexOf"; +import {IndexOfFirst as IndexOfFirstOp} from "./operators/sync/indexOfFirst"; +import {IndexOfLast as IndexOfLastOp} from "./operators/sync/indexOfLast"; +import {JoinToString as JoinToStringOp} from "./operators/sync/joinToString"; +import {Last as LastOp} from "./operators/sync/last"; +import {LastOrNull as LastOrNullOp} from "./operators/sync/lastOrNull"; +import {Map as MapOp} from "./operators/sync/map"; +import {MapIndexed as MapIndexedOp} from "./operators/sync/mapIndexed"; +import {MapNotNull as MapNotNullOp} from "./operators/sync/mapNotNull"; +import {Max as MaxOp} from "./operators/sync/max"; +import {MaxBy as MaxByOp} from "./operators/sync/maxBy"; +import {MaxWith as MaxWithOp} from "./operators/sync/maxWith"; +import {Merge as MergeOp} from "./operators/sync/merge"; +import {Min as MinOp} from "./operators/sync/min"; +import {MinBy as MinByOp} from "./operators/sync/minBy"; +import {Minus as MinusOp} from "./operators/sync/minus"; +import {MinWith as MinWithOp} from "./operators/sync/minWith"; +import {None as NoneOp} from "./operators/sync/none"; +import {OnEach as OnEachOp} from "./operators/sync/onEach"; +import {Partition as PartitionOp} from "./operators/sync/partition"; +import {Plus as PlusOp} from "./operators/sync/plus"; +import {Reduce as ReduceOp} from "./operators/sync/reduce"; +import {ReduceIndexed as ReduceIndexedOp} from "./operators/sync/reduceIndexed"; +import {Reverse as ReverseOp} from "./operators/sync/reverse"; +import {Single as SingleOp} from "./operators/sync/single"; +import {SingleOrNull as SingleOrNullOp} from "./operators/sync/singleOrNull"; +import {Sorted as SortedOp} from "./operators/sync/sorted"; +import {SortedBy as SortedByOp} from "./operators/sync/sortedBy"; +import {SortedByDescending as SortedByDescendingOp} from "./operators/sync/sortedByDescending"; +import {SortedDescending as SortedDescendingOp} from "./operators/sync/sortedDescending"; +import {SortedWith as SortedWithOp} from "./operators/sync/sortedWith"; +import {Sum as SumOp} from "./operators/sync/sum"; +import {SumBy as SumByOp} from "./operators/sync/sumBy"; +import {Take as TakeOp} from "./operators/sync/take"; +import {TakeWhile as TakeWhileOp} from "./operators/sync/takeWhile"; +import {ToArray as ToArrayOp} from "./operators/sync/toArray"; +import {ToMap as ToMapOp} from "./operators/sync/toMap"; +import {ToSet as ToSetOp} from "./operators/sync/toSet"; +import {Unzip as UnzipOp} from "./operators/sync/unzip"; +import {WithIndex as WithIndexOp} from "./operators/sync/withIndex"; +import {Zip as ZipOp} from "./operators/sync/zip"; /** * A Sequence provides a fluent functional API consisting @@ -81,96 +81,23 @@ export interface Sequence extends SequenceOperators { readonly iterator: Iterator; } -export default Sequence; - /** * @hidden */ -export interface SequenceOperators extends All, Any, AsIterable, Associate, AssociateBy, Average, Chunk, Contains, Count, Distinct, DistinctBy, Drop, - DropWhile, ElementAt, ElementAtOrElse, ElementAtOrNull, Filter, FilterIndexed, FilterNot, FilterNotNull, First, FirstOrNull, FlatMap, Flatten, Fold, FoldIndexed, - ForEach, ForEachIndexed, GroupBy, IndexOf, IndexOfFirst, IndexOfLast, JoinToString, Last, LastOrNull, Map, MapIndexed, MapNotNull, Max, MaxBy, MaxWith, Merge, Min, MinBy, - Minus, MinWith, None, OnEach, Partition, Plus, Reduce, ReduceIndexed, Reverse, Single, SingleOrNull, Sorted, SortedBy, SortedByDescending, SortedDescending, SortedWith, - Sum, SumBy, Take, TakeWhile, ToArray, ToMap, ToSet, Unzip, WithIndex, Zip { +export interface SequenceOperators extends AllOp, AnyOp, AsIterableOp, AssociateOp, AssociateByOp, AverageOp, ChunkOp, ContainsOp, CountOp, DistinctOp, DistinctByOp, DropOp, DropWhileOp, + ElementAtOp, ElementAtOrElseOp, ElementAtOrNullOp, FilterOp, FilterHolisticallyOp, FilterIndexedOp, FilterNotOp, FilterNotNullOp, FirstOp, FirstOrNullOp, FlatMapOp, FlattenOp, FoldOp, + FoldIndexedOp, ForEachOp, ForEachIndexedOp, GroupByOp, IndexOfOp, IndexOfFirstOp, IndexOfLastOp, JoinToStringOp, LastOp, LastOrNullOp, MapOp, MapIndexedOp, MapNotNullOp, MaxOp, MaxByOp, + MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, SortedByOp, + SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp { } -class SequenceImpl { +export class SequenceImpl { constructor(readonly iterator: Iterator) { } } -applyMixins(SequenceImpl, [All, Any, AsIterable, Associate, AssociateBy, Average, Chunk, Contains, Count, Distinct, DistinctBy, Drop, - DropWhile, ElementAt, ElementAtOrElse, ElementAtOrNull, Filter, FilterIndexed, FilterNot, FilterNotNull, First, FirstOrNull, FlatMap, Flatten, Fold, FoldIndexed, - ForEach, ForEachIndexed, GroupBy, IndexOf, IndexOfFirst, IndexOfLast, JoinToString, Last, LastOrNull, Map, MapIndexed, MapNotNull, Max, MaxBy, MaxWith, Merge, Min, MinBy, - Minus, MinWith, None, OnEach, Partition, Plus, Reduce, ReduceIndexed, Reverse, Single, SingleOrNull, Sorted, SortedBy, SortedByDescending, SortedDescending, SortedWith, - Sum, SumBy, Take, TakeWhile, ToArray, ToMap, ToSet, Unzip, WithIndex, Zip]); - -function applyMixins(derivedCtor: any, baseCtors: any[]) { - baseCtors.forEach(baseCtor => { - Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => { - derivedCtor.prototype[name] = baseCtor.prototype[name]; - }); - }); -} - -export function sequenceOf(...args: Array): Sequence { - return asSequence(args); -} - -export function emptySequence(): Sequence { - return asSequence([]); -} - -export function asSequence(iterable: Iterable): Sequence { - if (iterable === null) { - throw new Error("Cannot create sequence for input: null"); - } - if (iterable === undefined) { - throw new Error("Cannot create sequence for input: undefined"); - } - if (iterable[Symbol.iterator] == null) { - throw new Error("Cannot create sequence for non-iterable input: " + iterable); - } - const iterator = iterable[Symbol.iterator](); - return createSequence(iterator); -} - -export function createSequence(iterator: Iterator): Sequence { - return new SequenceImpl(iterator) as any; -} - -export function isSequence(object: any): object is Sequence { - return object instanceof SequenceImpl; -} - -export function extendSequence(mixin: { new(): any }) { - applyMixins(SequenceImpl, [mixin]); -} - -export function generateSequence(nextFunction: () => T | null | undefined): Sequence; -export function generateSequence(seedFunction: () => T | null | undefined, nextFunction: (item: T) => T | null | undefined): Sequence; -export function generateSequence(seed: T | null | undefined, nextFunction: (item: T) => T | null | undefined): Sequence; -export function generateSequence(a: any, b?: any): Sequence { - if (typeof a === "function" && b == null) { - return createSequence(new GeneratorIterator(a)); - } - const seed = typeof a === "function" ? a() : a; - return seed != null - ? createSequence(new GeneratorSeedIterator(seed, b)) - : emptySequence(); -} - -export function range(start: number, endInclusive: number, step: number = 1): Sequence { - if (start > endInclusive) { - throw new Error(`start [${start}] must be lower then endInclusive [${endInclusive}]`); - } - let current = start; - return generateSequence(() => { - try { - return current <= endInclusive - ? current - : undefined; - } finally { - current += step; - } - }); -} +applyMixins(SequenceImpl, [AllOp, AnyOp, AsIterableOp, AssociateOp, AssociateByOp, AverageOp, ChunkOp, ContainsOp, CountOp, DistinctOp, DistinctByOp, DropOp, DropWhileOp, + ElementAtOp, ElementAtOrElseOp, ElementAtOrNullOp, FilterOp, FilterHolisticallyOp, FilterIndexedOp, FilterNotOp, FilterNotNullOp, FirstOp, FirstOrNullOp, FlatMapOp, FlattenOp, FoldOp, + FoldIndexedOp, ForEachOp, ForEachIndexedOp, GroupByOp, IndexOfOp, IndexOfFirstOp, IndexOfLastOp, JoinToStringOp, LastOp, LastOrNullOp, MapOp, MapIndexedOp, MapNotNullOp, MaxOp, MaxByOp, + MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, SortedByOp, + SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp]); \ No newline at end of file diff --git a/src/createComparatorFactory.ts b/src/createComparatorFactory.ts deleted file mode 100644 index 75ec057..0000000 --- a/src/createComparatorFactory.ts +++ /dev/null @@ -1,100 +0,0 @@ -import ComparatorFactory from "./ComparatorFactory"; -import Comparator from "./Comparator"; - -function compare(comparison: (a: T, b: T) => number): Comparator { - return Object.assign(comparison, { - reversed(): Comparator { - return compare( - (a: T, b: T) => comparison(a, b) * -1 - ); - }, - then(nextComparison: (a: T, b: T) => number): Comparator { - return compare( - (a: T, b: T) => { - const result = comparison(a, b); - return result !== 0 - ? result - : nextComparison(a, b); - } - ); - }, - thenDescending(nextComparison: (a: T, b: T) => number): Comparator { - return this.then( - compare(nextComparison) - .reversed() - ); - }, - thenBy(keyOrSelector: any): Comparator { - const selector = asSelector(keyOrSelector); - return this.then( - (a: T, b: T) => naturalCompare(selector(a), selector(b)) - ); - }, - thenByDescending(keyOrSelector: any): Comparator { - const selector = asSelector(keyOrSelector); - return this.then( - compare( - (a: T, b: T) => naturalCompare(selector(a), selector(b)) - ).reversed() - ); - } - }); -} - -function compareBy(keyOrSelector: any): Comparator { - const selector = asSelector(keyOrSelector); - return compare( - (a: T, b: T) => naturalCompare(selector(a), selector(b)) - ); -} - -function compareByDescending(keyOrSelector: any): Comparator { - const selector = asSelector(keyOrSelector); - return compare( - (a: T, b: T) => naturalCompare(selector(b), selector(a)) - ); -} - -function asSelector(keyOrSelector: (item: T) => any | string): (item: T) => any { - return typeof keyOrSelector === "function" - ? keyOrSelector - : (item: T) => (item as any)[keyOrSelector as string]; -} - -function naturalCompare(a: T, b: T): number { - return a < b ? -1 : a > b ? 1 : 0; -} - -function naturalOrder(): Comparator { - return compare(naturalCompare); -} - -function reverseOrder(): Comparator { - return compare(naturalCompare).reversed(); -} - -function nullsLast(): Comparator { - return compare( - (a: T, b: T) => a === null ? 1 : b === null ? -1 : 0 - ); -} - -function nullsFirst(): Comparator { - return compare( - (a: T, b: T) => a === null ? -1 : b === null ? 1 : 0 - ); -} - -function createComparatorFactory(): ComparatorFactory { - return { - compare, - compareBy, - compareByDescending, - naturalOrder, - reverseOrder, - nullsFirst, - nullsLast - }; -} - -export default createComparatorFactory; \ No newline at end of file diff --git a/src/filterNotNull.ts b/src/filterNotNull.ts deleted file mode 100644 index 71e8735..0000000 --- a/src/filterNotNull.ts +++ /dev/null @@ -1,14 +0,0 @@ -import Sequence from "./Sequence"; - -export class FilterNotNull { - - /** - * Returns a new sequence consisting of all non-null elements. - * - * @returns {Sequence} - */ - filterNotNull(this: Sequence): Sequence { - return this.filter(it => it !== null) as Sequence; - } - -} \ No newline at end of file diff --git a/src/internal.ts b/src/internal.ts new file mode 100644 index 0000000..7fe717c --- /dev/null +++ b/src/internal.ts @@ -0,0 +1,35 @@ +export function asAsyncIterable(iterable: Iterable): AsyncIterable { + return (async function* () { + for (const item of iterable) { + yield await item; + } + })(); +} + +export function asAsyncIterator(iterator: Iterator): AsyncIterator { + return { + async next(value?: any) { + return iterator.next(value); + } + }; +} + +export function asAsyncSelector(keyOrSelector: ((item: T) => Promise | K) | keyof NonNullable): (item: T) => Promise | K { + return typeof keyOrSelector === "function" + ? keyOrSelector + : (item: T) => item?.[keyOrSelector] as K; +} + +export function asSelector(keyOrSelector: ((item: T) => K) | keyof NonNullable): (item: T) => K { + return typeof keyOrSelector === "function" + ? keyOrSelector + : (item: T) => item?.[keyOrSelector] as K; +} + +export function applyMixins(derivedCtor: any, baseCtors: any[]) { + baseCtors.forEach(baseCtor => { + Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => { + derivedCtor.prototype[name] = baseCtor.prototype[name]; + }); + }); +} \ No newline at end of file diff --git a/src/merge.ts b/src/merge.ts deleted file mode 100644 index 1b1564d..0000000 --- a/src/merge.ts +++ /dev/null @@ -1,39 +0,0 @@ -import Sequence, {asSequence, isSequence} from "./Sequence"; - -export class Merge { - - /** - * Merges the elements of both sequences into a new sequence. Each element of this sequence is eventually replaced with - * an element of the other sequence by comparing results of the given `selector` function. If no value is found in the other - * sequence the element is retained. New elements of the other sequence are appended to the end of the new sequence or - * prepended to the start of the new sequence, if `prependNewValues` is set to `true`. This operation is not lazy evaluated. - * - * @param {Sequence} other - * @param {(value: T) => S} selector - * @param prependNewValues - * @returns {Sequence} - */ - merge(this: Sequence, other: Sequence | Iterable, selector: (value: T) => S, prependNewValues: boolean = false): Sequence { - let mergeValues = isSequence(other) - ? other.toArray() - : asSequence(other).toArray(); - const leftValues = this.toArray(); - const result = leftValues.map(left => { - const selected = selector(left); - const right = asSequence(mergeValues) - .find(it => selector(it) === selected); - if (right != null) { - mergeValues = mergeValues.filter(it => it !== right); - return right; - } else { - return left; - } - }); - if (prependNewValues) { - return asSequence([...mergeValues, ...result]); - } else { - return asSequence([...result, ...mergeValues]); - } - } - -} \ No newline at end of file diff --git a/src/operators/async/all.ts b/src/operators/async/all.ts new file mode 100644 index 0000000..0d57703 --- /dev/null +++ b/src/operators/async/all.ts @@ -0,0 +1,20 @@ +import {AsyncSequence} from "../../sequency"; + +export class All { + + /** + * Returns `true` if all elements match the given `predicate`. + * + * @param {(T) => Promise | boolean} predicate + * @returns {boolean} + */ + async all(this: AsyncSequence, predicate: (item: T) => Promise | boolean): Promise { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (!await predicate(item.value)) { + return false; + } + } + return true; + } + +} \ No newline at end of file diff --git a/src/operators/async/any.ts b/src/operators/async/any.ts new file mode 100644 index 0000000..773168f --- /dev/null +++ b/src/operators/async/any.ts @@ -0,0 +1,23 @@ +import {AsyncSequence} from "../../sequency"; + +export class Any { + + /** + * Returns `true` if at least one element match the given `predicate`. + * + * @param {(T) => Promise | boolean} predicate + * @returns {boolean} + */ + async any(this: AsyncSequence, predicate?: (item: T) => Promise | boolean): Promise { + if (predicate == null) { + return !(await this.iterator.next()).done; + } + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (await predicate(item.value)) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/src/operators/async/asIterable.ts b/src/operators/async/asIterable.ts new file mode 100644 index 0000000..941c7bb --- /dev/null +++ b/src/operators/async/asIterable.ts @@ -0,0 +1,19 @@ +import {AsyncSequence} from "../../sequency"; + +export class AsIterable { + + /** + * Returns an iterable representation of the sequence. + * + * @returns {Iterable} + */ + asIterable(this: AsyncSequence): AsyncIterable { + const iterator = this.iterator; + return { + [Symbol.asyncIterator](): AsyncIterator { + return iterator; + } + }; + } + +} \ No newline at end of file diff --git a/src/operators/async/associate.ts b/src/operators/async/associate.ts new file mode 100644 index 0000000..b6023e8 --- /dev/null +++ b/src/operators/async/associate.ts @@ -0,0 +1,21 @@ +import {AsyncSequence} from "../../sequency"; + +export class Associate { + + /** + * Transforms each element into a key-value pair and returns the results as map. In case of + * duplicate keys the last key-value pair overrides the other. + * + * @param {(value: T) => Promise<[K, V]> | [K, V]} transform + * @returns {Promise>} + */ + async associate(this: AsyncSequence, transform: (value: T) => Promise<[K, V]> | [K, V]): Promise> { + const result = new Map(); + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const pair = await transform(item.value); + result.set(pair[0], pair[1]); + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/associateBy.ts b/src/operators/async/associateBy.ts new file mode 100644 index 0000000..455f338 --- /dev/null +++ b/src/operators/async/associateBy.ts @@ -0,0 +1,58 @@ +import {asAsyncSelector} from "../../internal"; +import {AsyncSequence} from "../../sequency"; + +export class AssociateBy { + + /** + * Returns a map consisting of the elements mapped by the given `keySelector`. + * + * @param {(value: T) => Promise | K} keySelector + * @returns {Promise>} + */ + async associateBy(keySelector: (value: T) => Promise | K): Promise>; + + /** + * Returns a map consisting of the elements indexed by the given `key`. + * + * @param {K} key + * @returns {Map} + */ + async associateBy>(key: K): Promise[K], T>>; + + /** + * Returns a map consisting of the elements mapped by the given `keySelector`. The value + * is transformed into another value by the `valueTransformer`. + * + * @param {(value: T) => Promise | K} keySelector + * @param {(value: T) => Promise | V} valueTransformer + * @returns {Map} + */ + async associateBy(keySelector: (value: T) => Promise | K, valueTransformer: (value: T) => Promise | V): Promise>; + + /** + * Returns a map consisting of the elements indexed by the given `key`. The value + * is transformed into another value by the `valueTransformer`. + * + * @param {K} key + * @param {(value: T) => Promise | V} valueTransformer + * @returns {Map} + */ + async associateBy, V>(key: K, valueTransformer: (value: T) => Promise | V): Promise[K], V>>; + + async associateBy(this: AsyncSequence, + keyOrSelector: ((value: T) => Promise | K) | keyof NonNullable, + valueTransform?: (value: T) => V): Promise> { + const selector = asAsyncSelector(keyOrSelector); + const result = new Map(); + const transform = valueTransform != null + ? valueTransform + : (value: T) => value; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const key = await selector(item.value); + const value = await transform(item.value); + result.set(key, value); + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/average.ts b/src/operators/async/average.ts new file mode 100644 index 0000000..d9a6d30 --- /dev/null +++ b/src/operators/async/average.ts @@ -0,0 +1,22 @@ +import {AsyncSequence} from "../../sequency"; + +export class Average { + + /** + * Returns the average of all numbers of the sequence or `NaN` if the sequence is empty. + * + * @returns {Promise} + */ + async average(this: AsyncSequence): Promise { + let sum = 0; + let count = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + sum += item.value; + count++; + } + return count === 0 + ? Number.NaN + : sum / count; + } + +} \ No newline at end of file diff --git a/src/operators/async/chunk.ts b/src/operators/async/chunk.ts new file mode 100644 index 0000000..4d45bc4 --- /dev/null +++ b/src/operators/async/chunk.ts @@ -0,0 +1,30 @@ +import {AsyncSequence} from "../../sequency"; + +export class Chunk { + + /** + * Splits the elements of the sequence into arrays which length is determined by + * the given `chunkSize` and returns all chunks as array. + * + * @param {number} chunkSize + * @returns {Promise} + */ + async chunk(this: AsyncSequence, chunkSize: number): Promise { + if (chunkSize < 1) { + throw new Error("chunkSize must be > 0 but is " + chunkSize); + } + const result: T[][] = []; + let index = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const chunkIndex = Math.floor(index / chunkSize); + if (result[chunkIndex] == null) { + result[chunkIndex] = [item.value]; + } else { + result[chunkIndex].push(item.value); + } + index++; + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/contains.ts b/src/operators/async/contains.ts new file mode 100644 index 0000000..4945409 --- /dev/null +++ b/src/operators/async/contains.ts @@ -0,0 +1,20 @@ +import {AsyncSequence} from "../../sequency"; + +export class Contains { + + /** + * Returns `true` if the sequence contains the given `element`. + * + * @param {T} element + * @returns {Promise} + */ + async contains(this: AsyncSequence, element: T): Promise { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (element === item.value) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/src/operators/async/count.ts b/src/operators/async/count.ts new file mode 100644 index 0000000..71c76c8 --- /dev/null +++ b/src/operators/async/count.ts @@ -0,0 +1,20 @@ +import {AsyncSequence} from "../../sequency"; + +export class Count { + + /** + * Returns the number of elements of this sequence. If `predicate` is present, returns + * the number of elements matching the given `predicate`. + * + * @param {(T) => Promise | boolean} predicate + * @returns {Promise} + */ + async count(this: AsyncSequence, predicate?: (item: T) => Promise | boolean): Promise { + if (predicate == null) { + return this.fold(0, (acc, _item) => acc + 1); + } else { + return this.fold(0, async (acc, item) => await predicate(item) ? acc + 1 : acc); + } + } + +} \ No newline at end of file diff --git a/src/operators/async/distinct.ts b/src/operators/async/distinct.ts new file mode 100644 index 0000000..a346157 --- /dev/null +++ b/src/operators/async/distinct.ts @@ -0,0 +1,33 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class DistinctIterator implements AsyncIterator { + private set: Set = new Set(); + + constructor(private readonly iterator: AsyncIterator) { + } + + async next(value?: any): Promise> { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const sizeBeforeAdd = this.set.size; + this.set.add(item.value); + if (this.set.size > sizeBeforeAdd) { + return {done: false, value: item.value}; + } + } + this.set.clear(); + return {done: true, value: undefined}; + } +} + +export class Distinct { + + /** + * Returns a new sequence which discards all duplicate elements. + * + * @returns {AsyncSequence} + */ + distinct(this: AsyncSequence): AsyncSequence { + return createAsyncSequence(new DistinctIterator(this.iterator)); + } + +} diff --git a/src/operators/async/distinctBy.ts b/src/operators/async/distinctBy.ts new file mode 100644 index 0000000..5931840 --- /dev/null +++ b/src/operators/async/distinctBy.ts @@ -0,0 +1,37 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class DistinctByIterator implements AsyncIterator { + private set: Set = new Set(); + + constructor(private readonly iterator: AsyncIterator, + private readonly selector: (item: T) => Promise | K) { + } + + async next(value?: any): Promise> { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const key = await this.selector(item.value); + const sizeBeforeAdd = this.set.size; + this.set.add(key); + if (this.set.size > sizeBeforeAdd) { + return {done: false, value: item.value}; + } + } + this.set.clear(); + return {done: true, value: undefined}; + } +} + +export class DistinctBy { + + /** + * Returns a new sequence which discards all elements with duplicate items determined + * by the given `selector`. + * + * @param {(item: T) => Promise | K} selector + * @returns {AsyncSequence} + */ + distinctBy(this: AsyncSequence, selector: (item: T) => Promise | K): AsyncSequence { + return createAsyncSequence(new DistinctByIterator(this.iterator, selector)); + } + +} diff --git a/src/operators/async/drop.ts b/src/operators/async/drop.ts new file mode 100644 index 0000000..68a6bdd --- /dev/null +++ b/src/operators/async/drop.ts @@ -0,0 +1,17 @@ +import {AsyncSequence} from "../../sequency"; + +export class Drop { + + /** + * Returns a new sequence which discards the first `n` elements; + * + * @param {number} n + * @returns {AsyncSequence} + */ + drop(this: AsyncSequence, n: number): AsyncSequence { + return this.withIndex() + .dropWhile(it => it.index < n) + .map(it => it.value); + } + +} \ No newline at end of file diff --git a/src/operators/async/dropWhile.ts b/src/operators/async/dropWhile.ts new file mode 100644 index 0000000..cba7667 --- /dev/null +++ b/src/operators/async/dropWhile.ts @@ -0,0 +1,36 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class DropWhileIterator implements AsyncIterator { + private dropping = true; + + constructor(private readonly iterator: AsyncIterator, + private readonly predicate: (item: T) => Promise | boolean) { + } + + async next(value?: any): Promise> { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (!this.dropping) { + return {done: false, value: item.value}; + } + if (!await this.predicate(item.value)) { + this.dropping = false; + return {done: false, value: item.value}; + } + } + return {done: true, value: undefined}; + } +} + +export class DropWhile { + + /** + * Drops all elements of the sequence as long as the given `predicate` evaluates to true. + * + * @param {(item: T) => Promise | boolean} predicate + * @returns {AsyncSequence} + */ + dropWhile(this: AsyncSequence, predicate: (item: T) => Promise | boolean): AsyncSequence { + return createAsyncSequence(new DropWhileIterator(this.iterator, predicate)); + } + +} \ No newline at end of file diff --git a/src/operators/async/elementAt.ts b/src/operators/async/elementAt.ts new file mode 100644 index 0000000..2dad7af --- /dev/null +++ b/src/operators/async/elementAt.ts @@ -0,0 +1,23 @@ +import {AsyncSequence} from "../../sequency"; + +export class ElementAt { + + /** + * Returns the element at position `index` (zero-based) or throws an error if `index` + * is out of bounds. + * + * @param {number} index + * @returns {Promise} + */ + async elementAt(this: AsyncSequence, index: number): Promise { + let i = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (i === index) { + return item.value; + } + i++; + } + throw new Error("Index out of bounds: " + index); + } + +} \ No newline at end of file diff --git a/src/operators/async/elementAtOrElse.ts b/src/operators/async/elementAtOrElse.ts new file mode 100644 index 0000000..c21b792 --- /dev/null +++ b/src/operators/async/elementAtOrElse.ts @@ -0,0 +1,24 @@ +import {AsyncSequence} from "../../sequency"; + +export class ElementAtOrElse { + + /** + * Returns the element at position `index` (zero-based). If `index` is out of bounds returns + * the result of the given `defaultValue` function. + * + * @param {number} index + * @param {(index: number) => Promise | T} defaultValue + * @returns {Promise} + */ + async elementAtOrElse(this: AsyncSequence, index: number, defaultValue: (index: number) => Promise | T): Promise { + let i = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (i === index) { + return item.value; + } + i++; + } + return await defaultValue(index); + } + +} \ No newline at end of file diff --git a/src/operators/async/elementAtOrNull.ts b/src/operators/async/elementAtOrNull.ts new file mode 100644 index 0000000..c9d3d14 --- /dev/null +++ b/src/operators/async/elementAtOrNull.ts @@ -0,0 +1,23 @@ +import {AsyncSequence} from "../../sequency"; + +export class ElementAtOrNull { + + /** + * Returns the element at position `index` (zero-based) or `null` if `index` + * is out of bounds. + * + * @param {number} index + * @returns {Promise} + */ + async elementAtOrNull(this: AsyncSequence, index: number): Promise { + let i = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (i === index) { + return item.value; + } + i++; + } + return null; + } + +} \ No newline at end of file diff --git a/src/operators/async/filter.ts b/src/operators/async/filter.ts new file mode 100644 index 0000000..853ee7c --- /dev/null +++ b/src/operators/async/filter.ts @@ -0,0 +1,30 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class FilterIterator implements AsyncIterator { + constructor(private readonly predicate: (item: T) => Promise | boolean, + private readonly iterator: AsyncIterator) { + } + + async next(value?: any): Promise> { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (await this.predicate(item.value)) { + return {done: false, value: item.value}; + } + } + return {done: true, value: undefined}; + } +} + +export class Filter { + + /** + * Returns a new sequence consisting of all elements that match the given `predicate`. + * + * @param {(item: T) => Promise | boolean} predicate + * @returns {AsyncSequence} + */ + filter(this: AsyncSequence, predicate: (item: T) => Promise | boolean): AsyncSequence { + return createAsyncSequence(new FilterIterator(predicate, this.iterator)); + } + +} \ No newline at end of file diff --git a/src/operators/async/filterHolistically.ts b/src/operators/async/filterHolistically.ts new file mode 100644 index 0000000..5016db9 --- /dev/null +++ b/src/operators/async/filterHolistically.ts @@ -0,0 +1,49 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class FilterIterator implements AsyncIterator { + private readonly data: T[] = []; + /** Iterator to initialize data with */ + private iterator: AsyncIterator | null = null; + /** Current data index */ + private index: number = 0; + + constructor(iterator: AsyncIterator, private readonly predicate: (item: T, index: number, array: Readonly) => Promise | boolean) { + this.iterator = iterator; + } + + private async init() { + if (this.iterator != null) { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (!item.done) { + this.data.push(item.value); + } + } + Object.freeze(this.data); + this.iterator = null; + } + } + + async next(value?: any): Promise> { + await this.init(); + for (let item = this.data[this.index++]; this.index < this.data.length; item = this.data[this.index++]) { + if (await this.predicate(item, this.index, this.data)) { + return {done: false, value: item}; + } + } + return {done: true, value: undefined}; + } +} + +export class FilterHolistically { + + /** + * Returns a new sequence consisting of all elements that match the given `predicate`. + * + * @param {(value: T, index: number, array: T[]) => Promise | boolean} predicate + * @returns {AsyncSequence} + */ + filterHolistically(this: AsyncSequence, predicate: (item: T, index: number, array: Readonly) => Promise | boolean): AsyncSequence { + return createAsyncSequence(new FilterIterator(this.iterator, predicate)); + } + +} \ No newline at end of file diff --git a/src/operators/async/filterIndexed.ts b/src/operators/async/filterIndexed.ts new file mode 100644 index 0000000..99a7f8d --- /dev/null +++ b/src/operators/async/filterIndexed.ts @@ -0,0 +1,17 @@ +import {AsyncSequence} from "../../sequency"; + +export class FilterIndexed { + + /** + * Returns a new sequence consisting of all elements that match the given `predicate`. + * + * @param {(index: number, value: T) => Promise | boolean} predicate + * @returns {AsyncSequence} + */ + filterIndexed(this: AsyncSequence, predicate: (index: number, value: T) => Promise | boolean): AsyncSequence { + return this.withIndex() + .filter(async it => await predicate(it.index, it.value)) + .map(it => it.value); + } + +} \ No newline at end of file diff --git a/src/operators/async/filterNot.ts b/src/operators/async/filterNot.ts new file mode 100644 index 0000000..039dd13 --- /dev/null +++ b/src/operators/async/filterNot.ts @@ -0,0 +1,15 @@ +import {AsyncSequence} from "../../sequency"; + +export class FilterNot { + + /** + * Returns a new sequence consisting of all elements that don't match the given `predicate`. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {AsyncSequence} + */ + filterNot(this: AsyncSequence, predicate: (value: T) => Promise | boolean): AsyncSequence { + return this.filter(async (value: T) => !await predicate(value)); + } + +} \ No newline at end of file diff --git a/src/operators/async/filterNotNull.ts b/src/operators/async/filterNotNull.ts new file mode 100644 index 0000000..f358990 --- /dev/null +++ b/src/operators/async/filterNotNull.ts @@ -0,0 +1,14 @@ +import {AsyncSequence} from "../../sequency"; + +export class FilterNotNull { + + /** + * Returns a new sequence consisting of all non-null elements. + * + * @returns {AsyncSequence} + */ + filterNotNull(this: AsyncSequence): AsyncSequence> { + return this.filter(it => it != null) as AsyncSequence>; + } + +} \ No newline at end of file diff --git a/src/operators/async/first.ts b/src/operators/async/first.ts new file mode 100644 index 0000000..045081a --- /dev/null +++ b/src/operators/async/first.ts @@ -0,0 +1,23 @@ +import {AsyncSequence} from "../../sequency"; + +export class First { + + /** + * Returns the first element of the sequence or the first element matching `predicate` if present, otherwise throws + * an error. + * + * @param {(T) => Promise | boolean} predicate + * @returns {Promise} + */ + async first(this: AsyncSequence, predicate?: (item: T) => Promise | boolean): Promise { + if (predicate != null) { + return await this.filter(predicate).first(); + } + const item = await this.iterator.next(); + if (item.done) { + throw new Error("No such element"); + } + return item.value; + } + +} \ No newline at end of file diff --git a/src/operators/async/firstOrNull.ts b/src/operators/async/firstOrNull.ts new file mode 100644 index 0000000..6b5d51b --- /dev/null +++ b/src/operators/async/firstOrNull.ts @@ -0,0 +1,31 @@ +import {AsyncSequence} from "../../sequency"; + +export class FirstOrNull { + + /** + * Returns the first element of the sequence or the first element matching `predicate` if present, otherwise returns `null`. + * + * @param {(T) => Promise | boolean} predicate + * @returns {Promise} + */ + async firstOrNull(this: AsyncSequence, predicate?: (item: T) => Promise | boolean): Promise { + if (predicate != null) { + return this.filter(predicate).firstOrNull(); + } + const item = await this.iterator.next(); + return item.done + ? null + : item.value; + } + + /** + * Returns the first element of the sequence or the first element matching `predicate` if present, otherwise returns `null`. + * + * @param {(T) => Promise | boolean} predicate + * @returns {Promise} + */ + async find(this: AsyncSequence, predicate?: (item: T) => Promise | boolean): Promise { + return this.firstOrNull(predicate); + } + +} \ No newline at end of file diff --git a/src/operators/async/flatMap.ts b/src/operators/async/flatMap.ts new file mode 100644 index 0000000..8bcbb41 --- /dev/null +++ b/src/operators/async/flatMap.ts @@ -0,0 +1,39 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class FlatMapIterator implements AsyncIterator { + private current: AsyncIterator | undefined; + + constructor(private readonly transform: (item: S) => Promise> | AsyncSequence, + private readonly iterator: AsyncIterator) { + } + + async next(value?: any): Promise> { + if (this.current != null) { + const item = await this.current.next(); + if (!item.done) { + return item; + } + } + const next = await this.iterator.next(); + if (!next.done) { + const sequence = await this.transform(next.value); + this.current = sequence.iterator; + return this.next(); + } + return {done: true, value: undefined}; + } +} + +export class FlatMap { + + /** + * Transforms each element into a sequence of items and returns a flat single sequence of all those items. + * + * @param {(value: S) => Promise> | AsyncSequence} transform + * @returns {AsyncSequence} + */ + flatMap(this: AsyncSequence, transform: (value: S) => Promise> | AsyncSequence): AsyncSequence { + return createAsyncSequence(new FlatMapIterator(transform, this.iterator)); + } + +} \ No newline at end of file diff --git a/src/operators/async/flatten.ts b/src/operators/async/flatten.ts new file mode 100644 index 0000000..e718c60 --- /dev/null +++ b/src/operators/async/flatten.ts @@ -0,0 +1,20 @@ +import {asAsyncSequence, isAsyncSequence, AsyncSequence} from "../../sequency"; + +export class Flatten { + + /** + * Returns a single flat sequence of all the items from all sequences or iterables. + * + * @returns {AsyncSequence} + */ + flatten(this: AsyncSequence | AsyncIterable>): AsyncSequence { + return this.flatMap(it => { + if (isAsyncSequence(it)) { + return it; + } else { + return asAsyncSequence(it); + } + }); + } + +} \ No newline at end of file diff --git a/src/operators/async/fold.ts b/src/operators/async/fold.ts new file mode 100644 index 0000000..0d3f4c3 --- /dev/null +++ b/src/operators/async/fold.ts @@ -0,0 +1,22 @@ +import {AsyncSequence} from "../../sequency"; + +export class Fold { + + /** + * Accumulates all elements of the sequence into a single result by applying the given `operation` starting with + * the `initial` value. The result of the last operation will be passed as accumulated value to the getNext invocation + * of the operation until all elements of the sequence are processed. + * + * @param {R} initial + * @param {(acc: R, element: T) => Promise | R} operation + * @returns {Promise} + */ + async fold(this: AsyncSequence, initial: R, operation: (acc: R, element: T) => Promise | R): Promise { + let result = initial; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result = await operation(result, item.value); + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/foldIndexed.ts b/src/operators/async/foldIndexed.ts new file mode 100644 index 0000000..e4d5094 --- /dev/null +++ b/src/operators/async/foldIndexed.ts @@ -0,0 +1,25 @@ +import {AsyncSequence} from "../../sequency"; + +export class FoldIndexed { + + /** + * Accumulates all elements of the sequence into a single result by applying the given `operation` starting with + * the `initial` value. The result of the last operation will be passed as accumulated value to the getNext invocation + * of the operation as well as the `index` of the current element (zero-based) until all elements of the sequence + * are processed. + * + * @param {R} initial + * @param {(index: number, acc: R, element: T) => Promise | R} operation + * @returns {Promise} + */ + async foldIndexed(this: AsyncSequence, initial: R, operation: (index: number, acc: R, element: T) => Promise | R): Promise { + let result = initial; + let index = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result = await operation(index, result, item.value); + index++; + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/forEach.ts b/src/operators/async/forEach.ts new file mode 100644 index 0000000..28382d6 --- /dev/null +++ b/src/operators/async/forEach.ts @@ -0,0 +1,16 @@ +import {AsyncSequence} from "../../sequency"; + +export class ForEach { + + /** + * Performs the given `action` (side-effect) for each element of the sequence. + * + * @param {(item: T) => Promise | void} action + */ + async forEach(this: AsyncSequence, action: (item: T) => Promise | void) { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + await action(item.value); + } + } + +} \ No newline at end of file diff --git a/src/operators/async/forEachIndexed.ts b/src/operators/async/forEachIndexed.ts new file mode 100644 index 0000000..eca430c --- /dev/null +++ b/src/operators/async/forEachIndexed.ts @@ -0,0 +1,16 @@ +import {AsyncSequence} from "../../sequency"; + +export class ForEachIndexed { + + /** + * Performs the given `action` (side-effect) for each element of the sequence and passes the `index` of the current + * element (zero-based). + * + * @param {(index: number, value: T) => Promise | void} action + */ + async forEachIndexed(this: AsyncSequence, action: (index: number, value: T) => Promise | void) { + this.withIndex() + .forEach(async it => await action(it.index, it.value)); + } + +} \ No newline at end of file diff --git a/src/operators/async/groupBy.ts b/src/operators/async/groupBy.ts new file mode 100644 index 0000000..e5972ac --- /dev/null +++ b/src/operators/async/groupBy.ts @@ -0,0 +1,25 @@ +import {AsyncSequence} from "../../sequency"; + +export class GroupBy { + + /** + * Groups all elements of the sequence into a map. Keys are determined by the given `keySelector` function. + * + * @param {(value: T) => Promise | K} keySelector + * @returns {Promise>} + */ + async groupBy(this: AsyncSequence, keySelector: (value: T) => Promise | K): Promise> { + const result = new Map(); + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const key = await keySelector(item.value); + const array = result.get(key); + if (array == null) { + result.set(key, [item.value]); + } else { + array.push(item.value); + } + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/indexOf.ts b/src/operators/async/indexOf.ts new file mode 100644 index 0000000..5d3a2fd --- /dev/null +++ b/src/operators/async/indexOf.ts @@ -0,0 +1,22 @@ +import {AsyncSequence} from "../../sequency"; + +export class IndexOf { + + /** + * Returns the zero-based index of the given `element` or -1 if the sequence does not contain the element. + * + * @param {T} element + * @returns {Promise} + */ + async indexOf(this: AsyncSequence, element: T): Promise { + let index = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (element === item.value) { + return index; + } + index++; + } + return -1; + } + +} \ No newline at end of file diff --git a/src/operators/async/indexOfFirst.ts b/src/operators/async/indexOfFirst.ts new file mode 100644 index 0000000..e2b8c7f --- /dev/null +++ b/src/operators/async/indexOfFirst.ts @@ -0,0 +1,23 @@ +import {AsyncSequence} from "../../sequency"; + +export class IndexOfFirst { + + /** + * Returns the zero-based index of the first element matching the given `predicate` or -1 if no element matches + * the predicate. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise} + */ + async indexOfFirst(this: AsyncSequence, predicate: (value: T) => Promise | boolean): Promise { + let index = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (await predicate(item.value)) { + return index; + } + index++; + } + return -1; + } + +} diff --git a/src/operators/async/indexOfLast.ts b/src/operators/async/indexOfLast.ts new file mode 100644 index 0000000..073cd30 --- /dev/null +++ b/src/operators/async/indexOfLast.ts @@ -0,0 +1,24 @@ +import {AsyncSequence} from "../../sequency"; + +export class IndexOfLast { + + /** + * Returns the zero-based index of the last element matching the given `predicate` or -1 if no element matches + * the predicate. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise} + */ + async indexOfLast(this: AsyncSequence, predicate: (value: T) => Promise | boolean): Promise { + let index = 0; + let result = -1; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (await predicate(item.value)) { + result = index; + } + index++; + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/joinToString.ts b/src/operators/async/joinToString.ts new file mode 100644 index 0000000..f45b189 --- /dev/null +++ b/src/operators/async/joinToString.ts @@ -0,0 +1,77 @@ +import {AsyncSequence} from "../../sequency"; + +export default interface JoinConfig { + value?: string; + separator?: string; + prefix?: string; + postfix?: string; + limit?: number; + truncated?: string; + transform?: (value: T) => Promise | string; +} + +const defaults = { + value: "", + separator: ", ", + prefix: "", + postfix: "", + limit: -1, + truncated: "...", + transform: undefined +} satisfies JoinConfig; + +export class JoinToString { + + /** + * Joins all elements of the sequence into a string with the given configuration. + * + * @param {JoinConfig} config + * @returns {Promise} + */ + async joinToString(this: AsyncSequence, config: JoinConfig = defaults): Promise { + const { + value = defaults.value, + separator = defaults.separator, + prefix = defaults.prefix, + postfix = defaults.postfix, + limit = defaults.limit, + truncated = defaults.truncated, + transform = defaults.transform + } = config; + + let result = `${value}${prefix}`; + let count = 0; + + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + count++; + if (count > 1) { + result += separator; + } + if (limit < 0 || count <= limit) { + result += transform != null + ? await transform(item.value) + : String(item.value); + } else { + break; + } + } + + if (limit >= 0 && count > limit) { + result += truncated; + } + + result += postfix; + return result; + } + + /** + * Joins all elements of the sequence into a string with the given configuration. + * + * @param {JoinConfig} config + * @returns {Promise} + */ + async joinTo(this: AsyncSequence, config: JoinConfig = defaults): Promise { + return this.joinToString(config); + } + +} \ No newline at end of file diff --git a/src/operators/async/last.ts b/src/operators/async/last.ts new file mode 100644 index 0000000..690a059 --- /dev/null +++ b/src/operators/async/last.ts @@ -0,0 +1,28 @@ +import {AsyncSequence} from "../../sequency"; + +export class Last { + + /** + * Returns the last element of the sequence or the last element matching `predicate` if present, otherwise throws + * an error. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise} + */ + async last(this: AsyncSequence, predicate?: (value: T) => Promise | boolean): Promise { + if (predicate != null) { + return this.filter(predicate).last(); + } + let result: T; + let empty = true; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result = item.value; + empty = false; + } + if (empty) { + throw new Error("No such element"); + } + return result!; + } + +} \ No newline at end of file diff --git a/src/operators/async/lastOrNull.ts b/src/operators/async/lastOrNull.ts new file mode 100644 index 0000000..b6bde0e --- /dev/null +++ b/src/operators/async/lastOrNull.ts @@ -0,0 +1,32 @@ +import {AsyncSequence} from "../../sequency"; + +export class LastOrNull { + + /** + * Returns the last element of the sequence or the last element matching `predicate` if present, otherwise returns `null`. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise} + */ + async lastOrNull(this: AsyncSequence, predicate?: (value: T) => Promise | boolean): Promise { + if (predicate != null) { + return this.filter(predicate).lastOrNull(); + } + let result: T | null = null; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result = item.value; + } + return result; + } + + /** + * Returns the last element of the sequence or the last element matching `predicate` if present, otherwise returns `null`. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise} + */ + async findLast(this: AsyncSequence, predicate?: (value: T) => Promise | boolean): Promise { + return this.lastOrNull(predicate); + } + +} \ No newline at end of file diff --git a/src/operators/async/map.ts b/src/operators/async/map.ts new file mode 100644 index 0000000..0160e93 --- /dev/null +++ b/src/operators/async/map.ts @@ -0,0 +1,28 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class MapIterator implements AsyncIterator { + constructor(private readonly transform: (item: S) => Promise | T, + private readonly iterator: AsyncIterator) { + } + + async next(value?: any): Promise> { + const item = await this.iterator.next(); + return item.done + ? {done: true, value: undefined} + : {done: false, value: await this.transform(item.value)}; + } +} + +export class Map { + + /** + * Transforms each element into another value by applying the given `transform` function and returns a new sequence. + * + * @param {(S) => Promise | T} transform + * @returns {AsyncSequence} + */ + map(this: AsyncSequence, transform: (element: S) => Promise | T): AsyncSequence { + return createAsyncSequence(new MapIterator(transform, this.iterator)); + } + +} \ No newline at end of file diff --git a/src/operators/async/mapIndexed.ts b/src/operators/async/mapIndexed.ts new file mode 100644 index 0000000..fc95825 --- /dev/null +++ b/src/operators/async/mapIndexed.ts @@ -0,0 +1,16 @@ +import {AsyncSequence} from "../../sequency"; + +export class MapIndexed { + + /** + * Transforms each element into another value by applying the given `transform` function and returns a new sequence. + * + * @param {(index: number, value: T) => Promise | R} transform + * @returns {AsyncSequence} + */ + mapIndexed(this: AsyncSequence, transform: (index: number, value: T) => Promise | R): AsyncSequence { + return this.withIndex() + .map(it => transform(it.index, it.value)); + } + +} \ No newline at end of file diff --git a/src/operators/async/mapNotNull.ts b/src/operators/async/mapNotNull.ts new file mode 100644 index 0000000..3d380c6 --- /dev/null +++ b/src/operators/async/mapNotNull.ts @@ -0,0 +1,21 @@ +import {emptyAsyncSequence, asyncSequenceOf, AsyncSequence} from "../../sequency"; + +export class MapNotNull { + + /** + * Transforms each element into another value by applying the given `transform` function and returns a new sequence. + * Transformations into `null` values are discarded. + * + * @param {(value: T) => R | null} transform + * @returns {AsyncSequence} + */ + mapNotNull(this: AsyncSequence, transform: (value: T) => Promise | R | null): AsyncSequence { + return this.flatMap(async (value: T) => { + const item = await transform(value); + return item !== null + ? asyncSequenceOf(item) + : emptyAsyncSequence(); + }); + } + +} \ No newline at end of file diff --git a/src/operators/async/max.ts b/src/operators/async/max.ts new file mode 100644 index 0000000..41faa59 --- /dev/null +++ b/src/operators/async/max.ts @@ -0,0 +1,20 @@ +import {AsyncSequence} from "../../sequency"; + +export class Max { + + /** + * Returns the maximum element of the sequence or `null` if sequence is empty. + * + * @returns {Promise} + */ + async max(this: AsyncSequence): Promise { + let result: T | null = null; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (result == null || item.value > result) { + result = item.value; + } + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/maxBy.ts b/src/operators/async/maxBy.ts new file mode 100644 index 0000000..a48cf70 --- /dev/null +++ b/src/operators/async/maxBy.ts @@ -0,0 +1,25 @@ +import {AsyncSequence} from "../../sequency"; + +export class MaxBy { + + /** + * Returns the maximum element by comparing the results of the given `selector` function + * for each element of the sequence or `null` if the sequence is empty. + * + * @param {(value: T) => Promise | R} selector + * @returns {Promise} + */ + async maxBy(this: AsyncSequence, selector: (value: T) => Promise | R): Promise { + let max: T | null = null; + let maxSelected: R | null = null; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const value = await selector(item.value); + if (maxSelected == null || value > maxSelected) { + maxSelected = value; + max = item.value; + } + } + return max; + } + +} \ No newline at end of file diff --git a/src/operators/async/maxWith.ts b/src/operators/async/maxWith.ts new file mode 100644 index 0000000..85dcdfa --- /dev/null +++ b/src/operators/async/maxWith.ts @@ -0,0 +1,22 @@ +import {AsyncSequence} from "../../sequency"; + +export class MaxWith { + + /** + * Returns the maximum element of the sequence by evaluating the given `compare` + * function or `null` if sequence is empty. + * + * @param {(a: T, b: T) => Promise | number} compare + * @returns {Promise} + */ + async maxWith(this: AsyncSequence, compare: (a: T, b: T) => Promise | number): Promise { + let max: T | null = null; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (max == null || await compare(item.value, max) > 0) { + max = item.value; + } + } + return max; + } + +} \ No newline at end of file diff --git a/src/operators/async/merge.ts b/src/operators/async/merge.ts new file mode 100644 index 0000000..2c97179 --- /dev/null +++ b/src/operators/async/merge.ts @@ -0,0 +1,93 @@ +import {asyncSequenceOf, createAsyncSequence, isAsyncSequence, AsyncSequence} from "../../sequency"; + +class MergeIterator implements AsyncIterator { + private firstData: T[] = []; + private secondData: T[] = []; + /** Iterator to initialize data with */ + private firstIterator: AsyncIterator | null = null; + /** Iterator to initialize data with */ + private secondIterator: AsyncIterator | null = null; + /** First data index */ + private firstIndex: number = 0; + /** Second data index */ + private secondIndex: number = 0; + + constructor(firstIterator: AsyncIterator, + secondIterator: AsyncIterator, + private readonly selector: (value: T) => Promise | S, + private readonly prependNewValues: boolean) { + this.firstIterator = firstIterator; + this.secondIterator = secondIterator; + } + + private async init() { + if (this.firstIterator != null && this.secondIterator != null) { + // Init first data (self) + for (let item = await this.firstIterator.next(); !item.done; item = await this.firstIterator.next()) { + if (!item.done) { + this.firstData.push(item.value); + } + } + this.firstIterator = null; + // Init second data (other) + for (let item = await this.secondIterator.next(); !item.done; item = await this.secondIterator.next()) { + if (!item.done) { + this.secondData.push(item.value); + } + } + this.secondIterator = null; + + // Replace values with those from second data if selector result of both (first and second) match, otherwise retain values from first data + this.firstData = await asyncSequenceOf(...this.firstData) + .map(async left => { + const selected = await this.selector(left); + const right = await asyncSequenceOf(...this.secondData) + .find(async it => await this.selector(it) === selected); + if (right != null) { + this.secondData = this.secondData.filter(it => it !== right); + return right; + } else { + return left; + } + }) + .toArray(); + + // First data now contains merged values and second data the remaining ones, swap them if new values should be prepended + if (this.prependNewValues) { + const tmp = this.firstData; + this.firstData = this.secondData; + this.secondData = tmp; + } + } + } + + async next(value?: any): Promise> { + await this.init(); + if (this.firstIndex < this.firstData.length) { + return {done: false, value: this.firstData[this.firstIndex++]}; + } + if (this.secondIndex < this.secondData.length) { + return {done: false, value: this.secondData[this.secondIndex++]}; + } + return {done: true, value: undefined}; + } +} + +export class Merge { + + /** + * Merges the elements of both sequences into a new sequence. Each element of this sequence is eventually replaced with + * an element of the other sequence by comparing results of the given `selector` function. If no value is found in the other + * sequence the element is retained. New elements of the other sequence are appended to the end of the new sequence or + * prepended to the start of the new sequence, if `prependNewValues` is set to `true`. This operation is not lazy evaluated. + * + * @param {AsyncSequence} other + * @param {(value: T) => Promise | S} selector + * @param prependNewValues + * @returns {AsyncSequence} + */ + merge(this: AsyncSequence, other: AsyncSequence | AsyncIterable, selector: (value: T) => Promise | S, prependNewValues: boolean = false): AsyncSequence { + return createAsyncSequence(new MergeIterator(this.iterator, isAsyncSequence(other) ? other.iterator : other[Symbol.asyncIterator](), selector, prependNewValues)); + } + +} \ No newline at end of file diff --git a/src/operators/async/min.ts b/src/operators/async/min.ts new file mode 100644 index 0000000..b9510f4 --- /dev/null +++ b/src/operators/async/min.ts @@ -0,0 +1,20 @@ +import {AsyncSequence} from "../../sequency"; + +export class Min { + + /** + * Returns the minimum element of the sequence or `null` if sequence is empty. + * + * @returns {Promise} + */ + async min(this: AsyncSequence): Promise { + let result: T | null = null; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (result == null || item.value < result) { + result = item.value; + } + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/minBy.ts b/src/operators/async/minBy.ts new file mode 100644 index 0000000..ba310e3 --- /dev/null +++ b/src/operators/async/minBy.ts @@ -0,0 +1,25 @@ +import {AsyncSequence} from "../../sequency"; + +export class MinBy { + + /** + * Returns the minimum element by comparing the results of the given `selector` function + * for each element of the sequence or `null` if the sequence is empty. + * + * @param {(value: T) => Promise | R} selector + * @returns {Promise} + */ + async minBy(this: AsyncSequence, selector: (value: T) => Promise | R): Promise { + let min: T | null = null; + let minSelected: R | null = null; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const value = await selector(item.value); + if (minSelected == null || value < minSelected) { + minSelected = value; + min = item.value; + } + } + return min; + } + +} \ No newline at end of file diff --git a/src/operators/async/minWith.ts b/src/operators/async/minWith.ts new file mode 100644 index 0000000..c35e81f --- /dev/null +++ b/src/operators/async/minWith.ts @@ -0,0 +1,22 @@ +import {AsyncSequence} from "../../sequency"; + +export class MinWith { + + /** + * Returns the minimum element of the sequence by evaluating the given `compare` + * function or `null` if sequence is empty. + * + * @param {(a: T, b: T) => Promise | number} compare + * @returns {Promise} + */ + async minWith(this: AsyncSequence, compare: (a: T, b: T) => Promise | number): Promise { + let min: T | null = null; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (min == null || await compare(item.value, min) < 0) { + min = item.value; + } + } + return min; + } + +} \ No newline at end of file diff --git a/src/operators/async/minus.ts b/src/operators/async/minus.ts new file mode 100644 index 0000000..69bbc33 --- /dev/null +++ b/src/operators/async/minus.ts @@ -0,0 +1,22 @@ +import {isAsyncSequence, AsyncSequence} from "../../sequency"; + +export class Minus { + + /** + * Removes the given `data` and returns a new sequence. Data can either be a single element, an array of elements + * or a sequence of elements. + * + * @param {AsyncSequence | T[] | T} data + * @returns {AsyncSequence} + */ + minus(this: AsyncSequence, data: T | AsyncSequence | T[]): AsyncSequence { + if (isAsyncSequence(data)) { + return this.filter(async (it) => !await data.contains(it)); + } else if (data instanceof Array) { + return this.filter(it => !data.includes(it)); + } else { + return this.filter(it => it !== data); + } + } + +} \ No newline at end of file diff --git a/src/operators/async/none.ts b/src/operators/async/none.ts new file mode 100644 index 0000000..7567d36 --- /dev/null +++ b/src/operators/async/none.ts @@ -0,0 +1,24 @@ +import {AsyncSequence} from "../../sequency"; + +export class None { + + /** + * Returns `true` if no element match the given `predicate` or if the sequence is empty + * if no predicate is present. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise} + */ + async none(this: AsyncSequence, predicate?: (value: T) => Promise | boolean): Promise { + if (predicate == null) { + return (await this.iterator.next())?.done ?? false; + } + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (await predicate(item.value)) { + return false; + } + } + return true; + } + +} diff --git a/src/operators/async/onEach.ts b/src/operators/async/onEach.ts new file mode 100644 index 0000000..0d660d3 --- /dev/null +++ b/src/operators/async/onEach.ts @@ -0,0 +1,18 @@ +import {AsyncSequence} from "../../sequency"; + +export class OnEach { + + /** + * Performs the given `action` for each element and returns the sequence. + * + * @param {(value: T) => Promise | void} action + * @returns {AsyncSequence} + */ + onEach(this: AsyncSequence, action: (value: T) => Promise | void): AsyncSequence { + return this.map(async it => { + await action(it); + return it; + }); + } + +} \ No newline at end of file diff --git a/src/operators/async/partition.ts b/src/operators/async/partition.ts new file mode 100644 index 0000000..9cf1104 --- /dev/null +++ b/src/operators/async/partition.ts @@ -0,0 +1,25 @@ +import {AsyncSequence} from "../../sequency"; + +export class Partition { + + /** + * Evaluates the given `predicate` for each element of the sequence and assorts each element into one of two lists + * according to the result of the predicate. Returns both lists as an object. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise<{true: T[]; false: T[]}>} + */ + async partition(this: AsyncSequence, predicate: (value: T) => Promise | boolean): Promise<{true: T[], false: T[]}> { + const arrayTrue: T[] = []; + const arrayFalse: T[] = []; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (await predicate(item.value)) { + arrayTrue.push(item.value); + } else { + arrayFalse.push(item.value); + } + } + return {true: arrayTrue, false: arrayFalse}; + } + +} \ No newline at end of file diff --git a/src/operators/async/plus.ts b/src/operators/async/plus.ts new file mode 100644 index 0000000..db92fe7 --- /dev/null +++ b/src/operators/async/plus.ts @@ -0,0 +1,58 @@ +import {asAsyncIterable} from "../../internal"; +import {createAsyncSequence, isAsyncSequence, AsyncSequence} from "../../sequency"; + +class AppendIterator implements AsyncIterator { + constructor(private readonly first: AsyncIterator, + private readonly second: AsyncIterator) { + } + + async next(value?: any): Promise> { + const item1 = await this.first.next(); + if (!item1.done) { + return {done: false, value: item1.value}; + } + const item2 = await this.second.next(); + if (!item2.done) { + return {done: false, value: item2.value}; + } + return {done: true, value: undefined}; + } +} + +export class Plus { + + /** + * Appends the given `element` to the end of the sequence and returns a new sequence. + * + * @param {T} element + * @returns {AsyncSequence} + */ + plus(this: AsyncSequence, element: T): AsyncSequence; + + /** + * Appends the given array to the end of the sequence and returns a new sequence. + * + * @param {T[]} other + * @returns {AsyncSequence} + */ + plus(this: AsyncSequence, other: T[]): AsyncSequence; + + /** + * Appends the given sequence to the end of the sequence and returns a new sequence. + * + * @param {AsyncSequence} other + * @returns {AsyncSequence} + */ + plus(this: AsyncSequence, other: AsyncSequence): AsyncSequence; + + plus(this: AsyncSequence, data: T | AsyncSequence | T[]): AsyncSequence { + if (isAsyncSequence(data)) { + return createAsyncSequence(new AppendIterator(this.iterator, data.iterator)); + } else if (data instanceof Array) { + return createAsyncSequence(new AppendIterator(this.iterator, asAsyncIterable(data)[Symbol.asyncIterator]())); + } else { + return createAsyncSequence(new AppendIterator(this.iterator, asAsyncIterable([data])[Symbol.asyncIterator]())); + } + } + +} \ No newline at end of file diff --git a/src/operators/async/reduce.ts b/src/operators/async/reduce.ts new file mode 100644 index 0000000..5481f35 --- /dev/null +++ b/src/operators/async/reduce.ts @@ -0,0 +1,26 @@ +import {AsyncSequence} from "../../sequency"; + +export class Reduce { + + /** + * Reduces the whole sequence to a single value by invoking `operation` with each element + * from left to right. For every invocation of the operation `acc` is the result of the last + * invocation. For the first invocation of the operation `acc` is the first element of the + * sequence. + * + * @param {(acc: S, value: T) => Promise | S} operation + * @returns {Promise} + */ + async reduce(this: AsyncSequence, operation: (acc: S, value: T) => Promise | S): Promise { + const first = await this.iterator.next(); + if (first.done) { + throw new Error("Cannot reduce empty sequence"); + } + let result: S = first.value; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result = await operation(result, item.value); + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/reduceIndexed.ts b/src/operators/async/reduceIndexed.ts new file mode 100644 index 0000000..7cb203c --- /dev/null +++ b/src/operators/async/reduceIndexed.ts @@ -0,0 +1,28 @@ +import {AsyncSequence} from "../../sequency"; + +export class ReduceIndexed { + + /** + * Reduces the whole sequence to a single value by invoking `operation` with each element + * from left to right. For every invocation of the operation `acc` is the result of the last + * invocation. For the first invocation of the operation `acc` is the first element of the + * sequence. In addition the `index` of the current element is also passed to the operation. + * + * @param {(index: number, acc: S, element: T) => Promise | S} operation + * @returns {Promise} + */ + async reduceIndexed(this: AsyncSequence, operation: (index: number, acc: S, element: T) => Promise | S): Promise { + const first = await this.iterator.next(); + if (first.done) { + throw new Error("Cannot reduce empty sequence"); + } + let index = 1; + let result: S = first.value; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result = await operation(index, result, item.value); + index++; + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/reverse.ts b/src/operators/async/reverse.ts new file mode 100644 index 0000000..14f0a4f --- /dev/null +++ b/src/operators/async/reverse.ts @@ -0,0 +1,16 @@ +import {AsyncSequence} from "../../sequency"; + +export class Reverse { + + /** + * Returns a new sequence with all elements of the sequence in reverse order. + * + * @returns {AsyncSequence} + */ + reverse(this: AsyncSequence): AsyncSequence { + return this.withIndex() + .sortedByDescending(it => it.index) + .map(it => it.value); + } + +} \ No newline at end of file diff --git a/src/operators/async/single.ts b/src/operators/async/single.ts new file mode 100644 index 0000000..6b7b492 --- /dev/null +++ b/src/operators/async/single.ts @@ -0,0 +1,27 @@ +import {AsyncSequence} from "../../sequency"; + +export class Single { + + /** + * Returns the single element of the sequence or throws error if the sequence has more than + * one element or none at all. If a `predicate` is passed returns the single element matching + * the predicate or throws an error if more or less than one element match the predicate. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise} + */ + async single(this: AsyncSequence, predicate?: (value: T) => Promise | boolean): Promise { + if (predicate != null) { + return this.filter(predicate).single(); + } + const first = await this.iterator.next(); + if (first.done) { + throw new Error("No such element"); + } + if (!(await this.iterator.next()).done) { + throw new Error("Expect single element"); + } + return first.value; + } + +} \ No newline at end of file diff --git a/src/operators/async/singleOrNull.ts b/src/operators/async/singleOrNull.ts new file mode 100644 index 0000000..07bef3c --- /dev/null +++ b/src/operators/async/singleOrNull.ts @@ -0,0 +1,27 @@ +import {AsyncSequence} from "../../sequency"; + +export class SingleOrNull { + + /** + * Returns the single element of the sequence or `null` if the sequence has more than + * one element or none at all. If a `predicate` is passed returns the single element matching + * the predicate or `null` if more or less than one element match the predicate. + * + * @param {(value: T) => Promise | boolean} predicate + * @returns {Promise} + */ + async singleOrNull(this: AsyncSequence, predicate?: (value: T) => Promise | boolean): Promise { + if (predicate != null) { + return this.filter(predicate).singleOrNull(); + } + const first = await this.iterator.next(); + if (first.done) { + return null; + } + if (!(await this.iterator.next()).done) { + return null; + } + return first.value; + } + +} \ No newline at end of file diff --git a/src/operators/async/sorted.ts b/src/operators/async/sorted.ts new file mode 100644 index 0000000..e7dd3ec --- /dev/null +++ b/src/operators/async/sorted.ts @@ -0,0 +1,58 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; +import ComparatorFactory from "../../ComparatorFactory"; +import Comparator from "../../Comparator"; + +class SortIterator implements AsyncIterator { + private readonly factory: ComparatorFactory = new ComparatorFactory(); + private readonly comparator: Comparator | null; + private readonly data: T[] = []; + /** Iterator to initialize data with */ + private iterator: AsyncIterator | null = null; + /** Current data index */ + private index: number = 0; + + constructor(iterator: AsyncIterator, composeComparator?: (factory: ComparatorFactory) => Comparator) { + this.comparator = composeComparator?.(this.factory) ?? null; + this.iterator = iterator; + } + + private async init() { + if (this.iterator != null) { + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + if (!item.done) { + this.data.push(item.value); + } + } + if (this.comparator != null) { + this.data.sort(this.comparator.compare); + } else { + this.data.sort(); + } + Object.freeze(this.data); + this.iterator = null; + } + } + + async next(value?: any): Promise> { + await this.init(); + if (this.index < this.data.length) { + return {done: false, value: this.data[this.index++]}; + } + return {done: true, value: undefined}; + } +} + +export class Sorted { + + /** + * Returns a new sequence with all elements sorted by the comparator specified by the given `composeComparator` function + * or in natural order if no arguments are given. + * + * @param {(factory: ComparatorFactory) => Comparator} composeComparator + * @returns {AsyncSequence} + */ + sorted(this: AsyncSequence, composeComparator?: (factory: ComparatorFactory) => Comparator): AsyncSequence { + return createAsyncSequence(new SortIterator(this.iterator, composeComparator)); + } + +} \ No newline at end of file diff --git a/src/operators/async/sortedBy.ts b/src/operators/async/sortedBy.ts new file mode 100644 index 0000000..de1a81d --- /dev/null +++ b/src/operators/async/sortedBy.ts @@ -0,0 +1,16 @@ +import {AsyncSequence} from "../../sequency"; + +export class SortedBy { + + /** + * Returns a new sequence with all elements sorted ascending by the value specified + * by the given `selector` function. + * + * @param {(value: T) => Promise | R} selector + * @returns {AsyncSequence} + */ + sortedBy(this: AsyncSequence, selector: (value: T) => Promise | R): AsyncSequence { + return this.sorted(it => it.compareBy(selector)); + } + +} \ No newline at end of file diff --git a/src/operators/async/sortedByDescending.ts b/src/operators/async/sortedByDescending.ts new file mode 100644 index 0000000..cf923cf --- /dev/null +++ b/src/operators/async/sortedByDescending.ts @@ -0,0 +1,16 @@ +import {AsyncSequence} from "../../sequency"; + +export class SortedByDescending { + + /** + * Returns a new sequence with all elements sorted descending by the value specified + * by the given `selector` function. + * + * @param {(value: T) => Promise | R} selector + * @returns {AsyncSequence} + */ + sortedByDescending(this: AsyncSequence, selector: (value: T) => Promise | R): AsyncSequence { + return this.sorted(it => it.compareByDescending(selector)); + } + +} \ No newline at end of file diff --git a/src/operators/async/sortedDescending.ts b/src/operators/async/sortedDescending.ts new file mode 100644 index 0000000..012b47c --- /dev/null +++ b/src/operators/async/sortedDescending.ts @@ -0,0 +1,14 @@ +import {AsyncSequence} from "../../sequency"; + +export class SortedDescending { + + /** + * Returns a new sequence with all elements sorted in reverse (descending) natural order. + * + * @returns {AsyncSequence} + */ + sortedDescending(this: AsyncSequence): AsyncSequence { + return this.sorted(it => it.reverseOrder()); + } + +} \ No newline at end of file diff --git a/src/operators/async/sortedWith.ts b/src/operators/async/sortedWith.ts new file mode 100644 index 0000000..2186ee4 --- /dev/null +++ b/src/operators/async/sortedWith.ts @@ -0,0 +1,15 @@ +import {AsyncSequence} from "../../sequency"; + +export class SortedWith { + + /** + * Returns a new sequence with all elements sorted be the given `compare` function. + * + * @param {(a: T, b: T) => number} comparison + * @returns {AsyncSequence} + */ + sortedWith(this: AsyncSequence, comparison: (a: T, b: T) => number): AsyncSequence { + return this.sorted(it => it.compare(comparison)); + } + +} \ No newline at end of file diff --git a/src/operators/async/sum.ts b/src/operators/async/sum.ts new file mode 100644 index 0000000..1db37c9 --- /dev/null +++ b/src/operators/async/sum.ts @@ -0,0 +1,18 @@ +import {AsyncSequence} from "../../sequency"; + +export class Sum { + + /** + * Returns the sum of all numbers. + * + * @returns {Promise} + */ + async sum(this: AsyncSequence): Promise { + let result = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result += item.value; + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/sumBy.ts b/src/operators/async/sumBy.ts new file mode 100644 index 0000000..7368aab --- /dev/null +++ b/src/operators/async/sumBy.ts @@ -0,0 +1,19 @@ +import {AsyncSequence} from "../../sequency"; + +export class SumBy { + + /** + * Returns the sum of all numbers specified by the given `selector` function. + * + * @param {(value: T) => Promise | number} selector + * @returns {Promise} + */ + async sumBy(this: AsyncSequence, selector: (value: T) => Promise | number): Promise { + let result = 0; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result += await selector(item.value); + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/take.ts b/src/operators/async/take.ts new file mode 100644 index 0000000..280bc98 --- /dev/null +++ b/src/operators/async/take.ts @@ -0,0 +1,18 @@ +import {AsyncSequence} from "../../sequency"; + +export class Take { + + /** + * Returns a new sequence consisting of the first `n` elements. All other elements + * are discarded. + * + * @param {number} n + * @returns {AsyncSequence} + */ + take(this: AsyncSequence, n: number): AsyncSequence { + return this.withIndex() + .takeWhile(it => it.index < n) + .map(it => it.value); + } + +} \ No newline at end of file diff --git a/src/operators/async/takeWhile.ts b/src/operators/async/takeWhile.ts new file mode 100644 index 0000000..7110765 --- /dev/null +++ b/src/operators/async/takeWhile.ts @@ -0,0 +1,31 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class TakeWhileIterator implements AsyncIterator { + constructor(private readonly iterator: AsyncIterator, + private readonly predicate: (item: T) => Promise | boolean) { + } + + async next(value?: any): Promise> { + const item = await this.iterator.next(); + if (!item.done) { + if (await this.predicate(item.value)) { + return {done: false, value: item.value}; + } + } + return {done: true, value: undefined}; + } +} + +export class TakeWhile { + + /** + * Takes all elements of the sequence as long as the given `predicate` evaluates to true. + * + * @param {(item: T) => Promise | boolean} predicate + * @returns {AsyncSequence} + */ + takeWhile(this: AsyncSequence, predicate: (item: T) => Promise | boolean): AsyncSequence { + return createAsyncSequence(new TakeWhileIterator(this.iterator, predicate)); + } + +} \ No newline at end of file diff --git a/src/operators/async/toArray.ts b/src/operators/async/toArray.ts new file mode 100644 index 0000000..f64490b --- /dev/null +++ b/src/operators/async/toArray.ts @@ -0,0 +1,31 @@ +import {AsyncSequence} from "../../sequency"; + +export class ToArray { + + /** + * Returns all elements of the sequence as array. If an `array` is passed + * the elements are appended to the end of the array. + * + * @param {T[]} array + * @returns {Promise} + */ + async toArray(this: AsyncSequence, array?: T[]): Promise { + const result: T[] = array || []; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result.push(item.value); + } + return result; + } + + /** + * Returns all elements of the sequence as array. If an `array` is passed + * the elements are appended to the end of the array. + * + * @param {T[]} array + * @returns {Promise} + */ + async toList(this: AsyncSequence, array?: T[]): Promise { + return this.toArray(array); + } + +} \ No newline at end of file diff --git a/src/operators/async/toMap.ts b/src/operators/async/toMap.ts new file mode 100644 index 0000000..653dcc1 --- /dev/null +++ b/src/operators/async/toMap.ts @@ -0,0 +1,23 @@ +import {AsyncSequence} from "../../sequency"; + +export class ToMap { + + /** + * Returns a map consisting of each key-value pair. If a `map` is passed + * the pairs are set on this map. Duplicate keys override each other. + * + * @param {Map} map + * @returns {Promise>} + */ + async toMap(this: AsyncSequence<[K, V]>, map?: Map): Promise> { + const result = map || new Map(); + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const pair = item.value; + const key = pair[0]; + const value = pair[1]; + result.set(key, value); + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/toSet.ts b/src/operators/async/toSet.ts new file mode 100644 index 0000000..571db72 --- /dev/null +++ b/src/operators/async/toSet.ts @@ -0,0 +1,20 @@ +import {AsyncSequence} from "../../sequency"; + +export class ToSet { + + /** + * Returns all elements of the sequence as set. If a `set` is passed + * the elements are added to this set. + * + * @param {Set} set + * @returns {Promise>} + */ + async toSet(this: AsyncSequence, set?: Set): Promise> { + const result = set || new Set(); + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + result.add(item.value); + } + return result; + } + +} \ No newline at end of file diff --git a/src/operators/async/unzip.ts b/src/operators/async/unzip.ts new file mode 100644 index 0000000..4fc0cd7 --- /dev/null +++ b/src/operators/async/unzip.ts @@ -0,0 +1,22 @@ +import {AsyncSequence} from "../../sequency"; + +export class Unzip { + + /** + * Returns a pair of arrays where the first array contains all first values + * and the second array all second values from each input pair of the sequence. + * + * @returns {Promise<[T[], S[]]>} + */ + async unzip(this: AsyncSequence<[T, S]>): Promise<[T[], S[]]> { + const array1: T[] = []; + const array2: S[] = []; + for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { + const [first, second] = item.value; + array1.push(first); + array2.push(second); + } + return [array1, array2]; + } + +} \ No newline at end of file diff --git a/src/operators/async/withIndex.ts b/src/operators/async/withIndex.ts new file mode 100644 index 0000000..353ffba --- /dev/null +++ b/src/operators/async/withIndex.ts @@ -0,0 +1,37 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; +import IndexedValue from "../../IndexedValue"; + +class IndexIterator implements AsyncIterator> { + private index = -1; + + constructor(private readonly iterator: AsyncIterator) { + } + + async next(value?: any): Promise>> { + const item = await this.iterator.next(); + if (item.done) { + return {done: true, value: undefined}; + } + this.index++; + return { + done: false, + value: { + index: this.index, + value: item.value + } + }; + } +} + +export class WithIndex { + + /** + * Returns a new sequence consisting of indexed values for all original elements. + * + * @returns {AsyncSequence>} + */ + withIndex(this: AsyncSequence): AsyncSequence> { + return createAsyncSequence(new IndexIterator(this.iterator)); + } + +} \ No newline at end of file diff --git a/src/operators/async/zip.ts b/src/operators/async/zip.ts new file mode 100644 index 0000000..1f2ea69 --- /dev/null +++ b/src/operators/async/zip.ts @@ -0,0 +1,34 @@ +import {createAsyncSequence, AsyncSequence} from "../../sequency"; + +class ZipIterator implements AsyncIterator<[T, S]> { + constructor(private readonly iterator1: AsyncIterator, + private readonly iterator2: AsyncIterator) { + } + + async next(value?: any): Promise> { + const item1 = await this.iterator1.next(); + const item2 = await this.iterator2.next(); + if (item1.done || item2.done) { + return {done: true, value: undefined}; + } else { + return {done: false, value: [item1.value, item2.value]}; + } + } + +} + +export class Zip { + + /** + * Returns a new sequence consisting of pairs built the elements of both sequences + * with the same index. The resulting sequence has the length of the shortest input + * sequence. All other elements are discarded. + * + * @param {AsyncSequence} other + * @returns {AsyncSequence<[T , S]>} + */ + zip(this: AsyncSequence, other: AsyncSequence): AsyncSequence<[T, S]> { + return createAsyncSequence(new ZipIterator(this.iterator, other.iterator)); + } + +} \ No newline at end of file diff --git a/src/all.ts b/src/operators/sync/all.ts similarity index 91% rename from src/all.ts rename to src/operators/sync/all.ts index 2a14f2b..827a273 100644 --- a/src/all.ts +++ b/src/operators/sync/all.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class All { diff --git a/src/any.ts b/src/operators/sync/any.ts similarity index 93% rename from src/any.ts rename to src/operators/sync/any.ts index 23a0edf..2c3ea9c 100644 --- a/src/any.ts +++ b/src/operators/sync/any.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Any { diff --git a/src/asIterable.ts b/src/operators/sync/asIterable.ts similarity index 89% rename from src/asIterable.ts rename to src/operators/sync/asIterable.ts index 9482a4b..a9cb3cb 100644 --- a/src/asIterable.ts +++ b/src/operators/sync/asIterable.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class AsIterable { diff --git a/src/associate.ts b/src/operators/sync/associate.ts similarity index 93% rename from src/associate.ts rename to src/operators/sync/associate.ts index 33e15e2..e28e007 100644 --- a/src/associate.ts +++ b/src/operators/sync/associate.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Associate { diff --git a/src/associateBy.ts b/src/operators/sync/associateBy.ts similarity index 79% rename from src/associateBy.ts rename to src/operators/sync/associateBy.ts index 0f7625a..d5cc04f 100644 --- a/src/associateBy.ts +++ b/src/operators/sync/associateBy.ts @@ -1,4 +1,5 @@ -import Sequence from "./Sequence"; +import {asSelector} from "../../internal"; +import {Sequence} from "../../sequency"; export class AssociateBy { @@ -16,7 +17,7 @@ export class AssociateBy { * @param {K} key * @returns {Map} */ - associateBy(key: K): Map; + associateBy>(key: K): Map[K], T>; /** * Returns a map consisting of the elements mapped by the given `keySelector`. The value @@ -36,14 +37,12 @@ export class AssociateBy { * @param {(value: T) => V} valueTransformer * @returns {Map} */ - associateBy(key: K, valueTransformer: (value: T) => V): Map; + associateBy, V>(key: K, valueTransformer: (value: T) => V): Map[K], V>; associateBy(this: Sequence, - keyOrSelector: any, + keyOrSelector: ((value: T) => K) | keyof NonNullable, valueTransform?: (value: T) => V): Map { - const selector = typeof keyOrSelector === "function" - ? keyOrSelector - : (value: T) => value[keyOrSelector as keyof T]; + const selector = asSelector(keyOrSelector); const result = new Map(); const transform = valueTransform != null ? valueTransform diff --git a/src/average.ts b/src/operators/sync/average.ts similarity index 92% rename from src/average.ts rename to src/operators/sync/average.ts index 8242f47..9401c05 100644 --- a/src/average.ts +++ b/src/operators/sync/average.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Average { diff --git a/src/chunk.ts b/src/operators/sync/chunk.ts similarity index 80% rename from src/chunk.ts rename to src/operators/sync/chunk.ts index 824c2c6..89543b9 100644 --- a/src/chunk.ts +++ b/src/operators/sync/chunk.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Chunk { @@ -7,13 +7,13 @@ export class Chunk { * the given `chunkSize` and returns all chunks as array. * * @param {number} chunkSize - * @returns {Array>} + * @returns {T[][]} */ - chunk(this: Sequence, chunkSize: number): Array> { + chunk(this: Sequence, chunkSize: number): T[][] { if (chunkSize < 1) { throw new Error("chunkSize must be > 0 but is " + chunkSize); } - const result: Array> = []; + const result: T[][] = []; let index = 0; for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { const chunkIndex = Math.floor(index / chunkSize); diff --git a/src/contains.ts b/src/operators/sync/contains.ts similarity index 91% rename from src/contains.ts rename to src/operators/sync/contains.ts index 421ec95..f7d3728 100644 --- a/src/contains.ts +++ b/src/operators/sync/contains.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Contains { diff --git a/src/count.ts b/src/operators/sync/count.ts similarity index 50% rename from src/count.ts rename to src/operators/sync/count.ts index d3d80b4..a498ce0 100644 --- a/src/count.ts +++ b/src/operators/sync/count.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Count { @@ -10,19 +10,11 @@ export class Count { * @returns {number} */ count(this: Sequence, predicate?: (item: T) => boolean): number { - let num = 0; if (predicate == null) { - for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { - num++; - } + return this.fold(0, (acc, _item) => acc + 1); } else { - for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { - if (predicate(item.value)) { - num++; - } - } + return this.fold(0, (acc, item) => predicate(item) ? acc + 1 : acc); } - return num; } } \ No newline at end of file diff --git a/src/distinct.ts b/src/operators/sync/distinct.ts similarity index 88% rename from src/distinct.ts rename to src/operators/sync/distinct.ts index df8ea49..a0b582d 100644 --- a/src/distinct.ts +++ b/src/operators/sync/distinct.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence} from "./Sequence"; +import {createSequence, Sequence} from "../../sequency"; class DistinctIterator implements Iterator { private set: Set = new Set(); @@ -15,7 +15,7 @@ class DistinctIterator implements Iterator { } } this.set.clear(); - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } } diff --git a/src/distinctBy.ts b/src/operators/sync/distinctBy.ts similarity index 90% rename from src/distinctBy.ts rename to src/operators/sync/distinctBy.ts index beacb24..176bcd0 100644 --- a/src/distinctBy.ts +++ b/src/operators/sync/distinctBy.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence} from "./Sequence"; +import {createSequence, Sequence} from "../../sequency"; class DistinctByIterator implements Iterator { private set: Set = new Set(); @@ -17,7 +17,7 @@ class DistinctByIterator implements Iterator { } } this.set.clear(); - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } } diff --git a/src/drop.ts b/src/operators/sync/drop.ts similarity index 89% rename from src/drop.ts rename to src/operators/sync/drop.ts index b2bc82b..39e3458 100644 --- a/src/drop.ts +++ b/src/operators/sync/drop.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Drop { diff --git a/src/dropWhile.ts b/src/operators/sync/dropWhile.ts similarity index 83% rename from src/dropWhile.ts rename to src/operators/sync/dropWhile.ts index da800e6..9f821be 100644 --- a/src/dropWhile.ts +++ b/src/operators/sync/dropWhile.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence} from "./Sequence"; +import {createSequence, Sequence} from "../../sequency"; class DropWhileIterator implements Iterator { private dropping = true; @@ -12,13 +12,12 @@ class DropWhileIterator implements Iterator { if (!this.dropping) { return {done: false, value: item.value}; } - const result = this.predicate(item.value); - if (!result) { + if (!this.predicate(item.value)) { this.dropping = false; return {done: false, value: item.value}; } } - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } } diff --git a/src/elementAt.ts b/src/operators/sync/elementAt.ts similarity index 93% rename from src/elementAt.ts rename to src/operators/sync/elementAt.ts index c859bca..020b8f5 100644 --- a/src/elementAt.ts +++ b/src/operators/sync/elementAt.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ElementAt { diff --git a/src/elementAtOrElse.ts b/src/operators/sync/elementAtOrElse.ts similarity index 87% rename from src/elementAtOrElse.ts rename to src/operators/sync/elementAtOrElse.ts index f7f3641..9c18c8a 100644 --- a/src/elementAtOrElse.ts +++ b/src/operators/sync/elementAtOrElse.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ElementAtOrElse { @@ -7,7 +7,7 @@ export class ElementAtOrElse { * the result of the given `defaultValue` function. * * @param {number} index - * @param defaultValue + * @param {(index: number) => T} defaultValue * @returns {T} */ elementAtOrElse(this: Sequence, index: number, defaultValue: (index: number) => T): T { diff --git a/src/elementAtOrNull.ts b/src/operators/sync/elementAtOrNull.ts similarity index 88% rename from src/elementAtOrNull.ts rename to src/operators/sync/elementAtOrNull.ts index 2a8eac0..678b246 100644 --- a/src/elementAtOrNull.ts +++ b/src/operators/sync/elementAtOrNull.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ElementAtOrNull { @@ -7,7 +7,7 @@ export class ElementAtOrNull { * is out of bounds. * * @param {number} index - * @returns {T} + * @returns {T | null} */ elementAtOrNull(this: Sequence, index: number): T | null { let i = 0; diff --git a/src/filter.ts b/src/operators/sync/filter.ts similarity index 83% rename from src/filter.ts rename to src/operators/sync/filter.ts index 5d1bbc0..899c117 100644 --- a/src/filter.ts +++ b/src/operators/sync/filter.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence} from "./Sequence"; +import {createSequence, Sequence} from "../../sequency"; class FilterIterator implements Iterator { constructor(private readonly predicate: (item: T) => boolean, @@ -11,7 +11,7 @@ class FilterIterator implements Iterator { return {done: false, value: item.value}; } } - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } } @@ -20,7 +20,7 @@ export class Filter { /** * Returns a new sequence consisting of all elements that match the given `predicate`. * - * @param {(T) => boolean} predicate + * @param {(item: T) => boolean} predicate * @returns {Sequence} */ filter(this: Sequence, predicate: (item: T) => boolean): Sequence { diff --git a/src/operators/sync/filterHolistically.ts b/src/operators/sync/filterHolistically.ts new file mode 100644 index 0000000..48e04ca --- /dev/null +++ b/src/operators/sync/filterHolistically.ts @@ -0,0 +1,49 @@ +import {createSequence, Sequence} from "../../sequency"; + +class FilterIterator implements Iterator { + private readonly data: T[] = []; + /** Iterator to initialize data with */ + private iterator: Iterator | null = null; + /** Current data index */ + private index: number = 0; + + constructor(iterator: Iterator, private readonly predicate: (item: T, index: number, array: Readonly) => boolean) { + this.iterator = iterator; + } + + private init() { + if (this.iterator != null) { + for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { + if (!item.done) { + this.data.push(item.value); + } + } + Object.freeze(this.data); + this.iterator = null; + } + } + + next(value?: any): IteratorResult { + this.init(); + for (let item = this.data[this.index++]; this.index < this.data.length; item = this.data[this.index++]) { + if (this.predicate(item, this.index, this.data)) { + return {done: false, value: item}; + } + } + return {done: true, value: undefined}; + } +} + +export class FilterHolistically { + + /** + * Returns a new sequence consisting of all elements that match the given `predicate`. + * + * @param {(value: T, index: number, array: T[]) => boolean} predicate + * @returns {Sequence} + */ + filterHolistically(this: Sequence, predicate: (item: T, index: number, array: Readonly) => boolean): Sequence { + return createSequence(new FilterIterator(this.iterator, predicate)); + } + +} \ No newline at end of file diff --git a/src/filterIndexed.ts b/src/operators/sync/filterIndexed.ts similarity index 92% rename from src/filterIndexed.ts rename to src/operators/sync/filterIndexed.ts index 30b97a3..ad66cc1 100644 --- a/src/filterIndexed.ts +++ b/src/operators/sync/filterIndexed.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class FilterIndexed { diff --git a/src/filterNot.ts b/src/operators/sync/filterNot.ts similarity index 90% rename from src/filterNot.ts rename to src/operators/sync/filterNot.ts index 87bf57d..7499e2d 100644 --- a/src/filterNot.ts +++ b/src/operators/sync/filterNot.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class FilterNot { diff --git a/src/operators/sync/filterNotNull.ts b/src/operators/sync/filterNotNull.ts new file mode 100644 index 0000000..f835e49 --- /dev/null +++ b/src/operators/sync/filterNotNull.ts @@ -0,0 +1,14 @@ +import {Sequence} from "../../sequency"; + +export class FilterNotNull { + + /** + * Returns a new sequence consisting of all non-null elements. + * + * @returns {Sequence} + */ + filterNotNull(this: Sequence): Sequence> { + return this.filter(it => it != null) as Sequence>; + } + +} \ No newline at end of file diff --git a/src/first.ts b/src/operators/sync/first.ts similarity index 93% rename from src/first.ts rename to src/operators/sync/first.ts index b426856..d547459 100644 --- a/src/first.ts +++ b/src/operators/sync/first.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class First { diff --git a/src/firstOrNull.ts b/src/operators/sync/firstOrNull.ts similarity index 95% rename from src/firstOrNull.ts rename to src/operators/sync/firstOrNull.ts index 137d561..2249865 100644 --- a/src/firstOrNull.ts +++ b/src/operators/sync/firstOrNull.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class FirstOrNull { diff --git a/src/flatMap.ts b/src/operators/sync/flatMap.ts similarity index 91% rename from src/flatMap.ts rename to src/operators/sync/flatMap.ts index 98109d4..f047016 100644 --- a/src/flatMap.ts +++ b/src/operators/sync/flatMap.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence} from "./Sequence"; +import {createSequence, Sequence} from "../../sequency"; class FlatMapIterator implements Iterator { private current: Iterator | undefined; @@ -20,7 +20,7 @@ class FlatMapIterator implements Iterator { this.current = sequence.iterator; return this.next(); } - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } } diff --git a/src/flatten.ts b/src/operators/sync/flatten.ts similarity index 86% rename from src/flatten.ts rename to src/operators/sync/flatten.ts index 9754b2f..5c8d123 100644 --- a/src/flatten.ts +++ b/src/operators/sync/flatten.ts @@ -1,4 +1,4 @@ -import Sequence, {asSequence, isSequence} from "./Sequence"; +import {asSequence, isSequence, Sequence} from "../../sequency"; export class Flatten { diff --git a/src/fold.ts b/src/operators/sync/fold.ts similarity index 94% rename from src/fold.ts rename to src/operators/sync/fold.ts index ed8dfe3..4ee65e4 100644 --- a/src/fold.ts +++ b/src/operators/sync/fold.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Fold { diff --git a/src/foldIndexed.ts b/src/operators/sync/foldIndexed.ts similarity index 95% rename from src/foldIndexed.ts rename to src/operators/sync/foldIndexed.ts index f23275c..f040a2a 100644 --- a/src/foldIndexed.ts +++ b/src/operators/sync/foldIndexed.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class FoldIndexed { diff --git a/src/forEach.ts b/src/operators/sync/forEach.ts similarity index 80% rename from src/forEach.ts rename to src/operators/sync/forEach.ts index 8120d6a..5f3ff8f 100644 --- a/src/forEach.ts +++ b/src/operators/sync/forEach.ts @@ -1,11 +1,11 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ForEach { /** * Performs the given `action` (side-effect) for each element of the sequence. * - * @param {(T) => void} action + * @param {(item: T) => void} action */ forEach(this: Sequence, action: (item: T) => void) { for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { diff --git a/src/forEachIndexed.ts b/src/operators/sync/forEachIndexed.ts similarity index 91% rename from src/forEachIndexed.ts rename to src/operators/sync/forEachIndexed.ts index 920746a..5410340 100644 --- a/src/forEachIndexed.ts +++ b/src/operators/sync/forEachIndexed.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ForEachIndexed { diff --git a/src/groupBy.ts b/src/operators/sync/groupBy.ts similarity index 82% rename from src/groupBy.ts rename to src/operators/sync/groupBy.ts index 924a97e..141a506 100644 --- a/src/groupBy.ts +++ b/src/operators/sync/groupBy.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class GroupBy { @@ -6,10 +6,10 @@ export class GroupBy { * Groups all elements of the sequence into a map. Keys are determined by the given `keySelector` function. * * @param {(value: T) => K} keySelector - * @returns {Map>} + * @returns {Map} */ - groupBy(this: Sequence, keySelector: (value: T) => K): Map> { - const result = new Map>(); + groupBy(this: Sequence, keySelector: (value: T) => K): Map { + const result = new Map(); for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { const key = keySelector(item.value); const array = result.get(key); diff --git a/src/indexOf.ts b/src/operators/sync/indexOf.ts similarity index 92% rename from src/indexOf.ts rename to src/operators/sync/indexOf.ts index 7a215f3..83f28ad 100644 --- a/src/indexOf.ts +++ b/src/operators/sync/indexOf.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class IndexOf { diff --git a/src/indexOfFirst.ts b/src/operators/sync/indexOfFirst.ts similarity index 93% rename from src/indexOfFirst.ts rename to src/operators/sync/indexOfFirst.ts index ab90f14..cf2b195 100644 --- a/src/indexOfFirst.ts +++ b/src/operators/sync/indexOfFirst.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class IndexOfFirst { diff --git a/src/indexOfLast.ts b/src/operators/sync/indexOfLast.ts similarity index 93% rename from src/indexOfLast.ts rename to src/operators/sync/indexOfLast.ts index 54e6a4e..4ba8414 100644 --- a/src/indexOfLast.ts +++ b/src/operators/sync/indexOfLast.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class IndexOfLast { diff --git a/src/joinToString.ts b/src/operators/sync/joinToString.ts similarity index 94% rename from src/joinToString.ts rename to src/operators/sync/joinToString.ts index 7eb5736..f2fa9dd 100644 --- a/src/joinToString.ts +++ b/src/operators/sync/joinToString.ts @@ -1,6 +1,6 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; -export interface JoinConfig { +export default interface JoinConfig { value?: string; separator?: string; prefix?: string; @@ -18,7 +18,7 @@ const defaults = { limit: -1, truncated: "...", transform: undefined -}; +} satisfies JoinConfig; export class JoinToString { diff --git a/src/last.ts b/src/operators/sync/last.ts similarity index 94% rename from src/last.ts rename to src/operators/sync/last.ts index 92033c2..27cccec 100644 --- a/src/last.ts +++ b/src/operators/sync/last.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Last { diff --git a/src/lastOrNull.ts b/src/operators/sync/lastOrNull.ts similarity index 95% rename from src/lastOrNull.ts rename to src/operators/sync/lastOrNull.ts index 645bf27..a58fa10 100644 --- a/src/lastOrNull.ts +++ b/src/operators/sync/lastOrNull.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class LastOrNull { diff --git a/src/map.ts b/src/operators/sync/map.ts similarity index 87% rename from src/map.ts rename to src/operators/sync/map.ts index 84b00b0..d203163 100644 --- a/src/map.ts +++ b/src/operators/sync/map.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence} from "./Sequence"; +import {createSequence, Sequence} from "../../sequency"; class MapIterator implements Iterator { constructor(private readonly transform: (item: S) => T, @@ -8,7 +8,7 @@ class MapIterator implements Iterator { next(value?: any): IteratorResult { const item = this.iterator.next(); return item.done - ? {done: true, value: undefined as any} + ? {done: true, value: undefined} : {done: false, value: this.transform(item.value)}; } } @@ -25,4 +25,4 @@ export class Map { return createSequence(new MapIterator(transform, this.iterator)); } -} +} \ No newline at end of file diff --git a/src/mapIndexed.ts b/src/operators/sync/mapIndexed.ts similarity index 91% rename from src/mapIndexed.ts rename to src/operators/sync/mapIndexed.ts index 9cede3b..8d4783c 100644 --- a/src/mapIndexed.ts +++ b/src/operators/sync/mapIndexed.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class MapIndexed { diff --git a/src/mapNotNull.ts b/src/operators/sync/mapNotNull.ts similarity index 89% rename from src/mapNotNull.ts rename to src/operators/sync/mapNotNull.ts index cfd27ce..7b247d1 100644 --- a/src/mapNotNull.ts +++ b/src/operators/sync/mapNotNull.ts @@ -1,4 +1,4 @@ -import Sequence, {emptySequence, sequenceOf} from "./Sequence"; +import {emptySequence, sequenceOf, Sequence} from "../../sequency"; export class MapNotNull { diff --git a/src/max.ts b/src/operators/sync/max.ts similarity index 86% rename from src/max.ts rename to src/operators/sync/max.ts index 286f7c0..2b33d05 100644 --- a/src/max.ts +++ b/src/operators/sync/max.ts @@ -1,11 +1,11 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Max { /** * Returns the maximum element of the sequence or `null` if sequence is empty. * - * @returns {T} + * @returns {T | null} */ max(this: Sequence): T | null { let result: T | null = null; diff --git a/src/maxBy.ts b/src/operators/sync/maxBy.ts similarity index 91% rename from src/maxBy.ts rename to src/operators/sync/maxBy.ts index 11b6f32..ad76928 100644 --- a/src/maxBy.ts +++ b/src/operators/sync/maxBy.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class MaxBy { @@ -7,7 +7,7 @@ export class MaxBy { * for each element of the sequence or `null` if the sequence is empty. * * @param {(value: T) => R} selector - * @returns {T} + * @returns {T | null} */ maxBy(this: Sequence, selector: (value: T) => R): T | null { let max: T | null = null; diff --git a/src/maxWith.ts b/src/operators/sync/maxWith.ts similarity index 82% rename from src/maxWith.ts rename to src/operators/sync/maxWith.ts index 5d1c9be..6a5f964 100644 --- a/src/maxWith.ts +++ b/src/operators/sync/maxWith.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class MaxWith { @@ -6,7 +6,8 @@ export class MaxWith { * Returns the maximum element of the sequence by evaluating the given `compare` * function or `null` if sequence is empty. * - * @returns {T} + * @param {(a: T, b: T) => number} compare + * @returns {T | null} */ maxWith(this: Sequence, compare: (a: T, b: T) => number): T | null { let max: T | null = null; diff --git a/src/operators/sync/merge.ts b/src/operators/sync/merge.ts new file mode 100644 index 0000000..aec854b --- /dev/null +++ b/src/operators/sync/merge.ts @@ -0,0 +1,93 @@ +import {createSequence, isSequence, sequenceOf, Sequence} from "../../sequency"; + +class MergeIterator implements Iterator { + private firstData: T[] = []; + private secondData: T[] = []; + /** Iterator to initialize data with */ + private firstIterator: Iterator | null = null; + /** Iterator to initialize data with */ + private secondIterator: Iterator | null = null; + /** First data index */ + private firstIndex: number = 0; + /** Second data index */ + private secondIndex: number = 0; + + constructor(firstIterator: Iterator, + secondIterator: Iterator, + private readonly selector: (value: T) => S, + private readonly prependNewValues: boolean) { + this.firstIterator = firstIterator; + this.secondIterator = secondIterator; + } + + private init() { + if (this.firstIterator != null && this.secondIterator != null) { + // Init first data (self) + for (let item = this.firstIterator.next(); !item.done; item = this.firstIterator.next()) { + if (!item.done) { + this.firstData.push(item.value); + } + } + this.firstIterator = null; + // Init second data (other) + for (let item = this.secondIterator.next(); !item.done; item = this.secondIterator.next()) { + if (!item.done) { + this.secondData.push(item.value); + } + } + this.secondIterator = null; + + // Replace values with those from second data if selector result of both (first and second) match, otherwise retain values from first data + this.firstData = sequenceOf(...this.firstData) + .map(left => { + const selected = this.selector(left); + const right = sequenceOf(...this.secondData) + .find(it => this.selector(it) === selected); + if (right != null) { + this.secondData = this.secondData.filter(it => it !== right); + return right; + } else { + return left; + } + }) + .toArray(); + + // First data now contains merged values and second data the remaining ones, swap them if new values should be prepended + if (this.prependNewValues) { + const tmp = this.firstData; + this.firstData = this.secondData; + this.secondData = tmp; + } + } + } + + next(value?: any): IteratorResult { + this.init(); + if (this.firstIndex < this.firstData.length) { + return {done: false, value: this.firstData[this.firstIndex++]}; + } + if (this.secondIndex < this.secondData.length) { + return {done: false, value: this.secondData[this.secondIndex++]}; + } + return {done: true, value: undefined}; + } +} + +export class Merge { + + /** + * Merges the elements of both sequences into a new sequence. Each element of this sequence is eventually replaced with + * an element of the other sequence by comparing results of the given `selector` function. If no value is found in the other + * sequence the element is retained. New elements of the other sequence are appended to the end of the new sequence or + * prepended to the start of the new sequence, if `prependNewValues` is set to `true`. This operation is not lazy evaluated. + * + * @param {Sequence} other + * @param {(value: T) => S} selector + * @param prependNewValues + * @returns {Sequence} + */ + merge(this: Sequence, other: Sequence | Iterable, selector: (value: T) => S, prependNewValues: boolean = false): Sequence { + return createSequence(new MergeIterator(this.iterator, isSequence(other) ? other.iterator : other[Symbol.iterator](), selector, prependNewValues)); + } + +} \ No newline at end of file diff --git a/src/min.ts b/src/operators/sync/min.ts similarity index 86% rename from src/min.ts rename to src/operators/sync/min.ts index 30d9be3..4ae9db4 100644 --- a/src/min.ts +++ b/src/operators/sync/min.ts @@ -1,11 +1,11 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Min { /** * Returns the minimum element of the sequence or `null` if sequence is empty. * - * @returns {T} + * @returns {T | null} */ min(this: Sequence): T | null { let result: T | null = null; diff --git a/src/minBy.ts b/src/operators/sync/minBy.ts similarity index 91% rename from src/minBy.ts rename to src/operators/sync/minBy.ts index fc06aca..bad5c2e 100644 --- a/src/minBy.ts +++ b/src/operators/sync/minBy.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class MinBy { @@ -7,7 +7,7 @@ export class MinBy { * for each element of the sequence or `null` if the sequence is empty. * * @param {(value: T) => R} selector - * @returns {T} + * @returns {T | null} */ minBy(this: Sequence, selector: (value: T) => R): T | null { let min: T | null = null; diff --git a/src/minWith.ts b/src/operators/sync/minWith.ts similarity index 88% rename from src/minWith.ts rename to src/operators/sync/minWith.ts index e74748d..9ccf5f3 100644 --- a/src/minWith.ts +++ b/src/operators/sync/minWith.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class MinWith { @@ -6,7 +6,7 @@ export class MinWith { * Returns the minimum element of the sequence by evaluating the given `compare` * function or `null` if sequence is empty. * - * @returns {T} + * @returns {T | null} */ minWith(this: Sequence, compare: (a: T, b: T) => number): T | null { let min: T | null = null; diff --git a/src/minus.ts b/src/operators/sync/minus.ts similarity index 52% rename from src/minus.ts rename to src/operators/sync/minus.ts index 9fefebe..faef380 100644 --- a/src/minus.ts +++ b/src/operators/sync/minus.ts @@ -1,4 +1,4 @@ -import Sequence, {isSequence} from "./Sequence"; +import {isSequence, Sequence} from "../../sequency"; export class Minus { @@ -6,15 +6,14 @@ export class Minus { * Removes the given `data` and returns a new sequence. Data can either be a single element, an array of elements * or a sequence of elements. * - * @param {Sequence | Array | T} data + * @param {Sequence | T[] | T} data * @returns {Sequence} */ - minus(this: Sequence, data: T | Sequence | Array): Sequence { + minus(this: Sequence, data: T | Sequence | T[]): Sequence { if (isSequence(data)) { - const array: Array = data.toArray(); - return this.filter(it => array.indexOf(it) < 0); + return this.filter((it) => !data.contains(it)); } else if (data instanceof Array) { - return this.filter(it => data.indexOf(it) < 0); + return this.filter(it => !data.includes(it)); } else { return this.filter(it => it !== data); } diff --git a/src/none.ts b/src/operators/sync/none.ts similarity index 93% rename from src/none.ts rename to src/operators/sync/none.ts index 3950b15..035319e 100644 --- a/src/none.ts +++ b/src/operators/sync/none.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class None { diff --git a/src/onEach.ts b/src/operators/sync/onEach.ts similarity index 90% rename from src/onEach.ts rename to src/operators/sync/onEach.ts index 3fc3645..9e1978b 100644 --- a/src/onEach.ts +++ b/src/operators/sync/onEach.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class OnEach { diff --git a/src/partition.ts b/src/operators/sync/partition.ts similarity index 69% rename from src/partition.ts rename to src/operators/sync/partition.ts index 45bd067..818f765 100644 --- a/src/partition.ts +++ b/src/operators/sync/partition.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Partition { @@ -7,11 +7,11 @@ export class Partition { * according to the result of the predicate. Returns both lists as an object. * * @param {(value: T) => boolean} predicate - * @returns {{true: Array; false: Array}} + * @returns {{true: T[]; false: T[]}} */ - partition(this: Sequence, predicate: (value: T) => boolean): { "true": Array, "false": Array } { - const arrayTrue: Array = []; - const arrayFalse: Array = []; + partition(this: Sequence, predicate: (value: T) => boolean): {true: T[], false: T[]} { + const arrayTrue: T[] = []; + const arrayFalse: T[] = []; for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { if (predicate(item.value)) { arrayTrue.push(item.value); @@ -19,7 +19,7 @@ export class Partition { arrayFalse.push(item.value); } } - return { "true": arrayTrue, "false": arrayFalse }; + return {true: arrayTrue, false: arrayFalse}; } } \ No newline at end of file diff --git a/src/plus.ts b/src/operators/sync/plus.ts similarity index 84% rename from src/plus.ts rename to src/operators/sync/plus.ts index 29a5649..7af671c 100644 --- a/src/plus.ts +++ b/src/operators/sync/plus.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence, isSequence} from "./Sequence"; +import {createSequence, isSequence, Sequence} from "../../sequency"; class AppendIterator implements Iterator { constructor(private readonly first: Iterator, @@ -14,7 +14,7 @@ class AppendIterator implements Iterator { if (!item2.done) { return {done: false, value: item2.value}; } - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } } @@ -31,10 +31,10 @@ export class Plus { /** * Appends the given array to the end of the sequence and returns a new sequence. * - * @param {Array} other + * @param {T[]} other * @returns {Sequence} */ - plus(this: Sequence, other: Array): Sequence; + plus(this: Sequence, other: T[]): Sequence; /** * Appends the given sequence to the end of the sequence and returns a new sequence. @@ -44,7 +44,7 @@ export class Plus { */ plus(this: Sequence, other: Sequence): Sequence; - plus(this: Sequence, data: T | Sequence | Array): Sequence { + plus(this: Sequence, data: T | Sequence | T[]): Sequence { if (isSequence(data)) { return createSequence(new AppendIterator(this.iterator, data.iterator)); } else if (data instanceof Array) { diff --git a/src/reduce.ts b/src/operators/sync/reduce.ts similarity index 95% rename from src/reduce.ts rename to src/operators/sync/reduce.ts index b79cd1f..e1f970a 100644 --- a/src/reduce.ts +++ b/src/operators/sync/reduce.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Reduce { diff --git a/src/reduceIndexed.ts b/src/operators/sync/reduceIndexed.ts similarity index 96% rename from src/reduceIndexed.ts rename to src/operators/sync/reduceIndexed.ts index f523875..e480506 100644 --- a/src/reduceIndexed.ts +++ b/src/operators/sync/reduceIndexed.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ReduceIndexed { diff --git a/src/reverse.ts b/src/operators/sync/reverse.ts similarity index 88% rename from src/reverse.ts rename to src/operators/sync/reverse.ts index d2633cf..21c8e9e 100644 --- a/src/reverse.ts +++ b/src/operators/sync/reverse.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Reverse { diff --git a/src/single.ts b/src/operators/sync/single.ts similarity index 95% rename from src/single.ts rename to src/operators/sync/single.ts index dfebbd0..f93e066 100644 --- a/src/single.ts +++ b/src/operators/sync/single.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Single { diff --git a/src/singleOrNull.ts b/src/operators/sync/singleOrNull.ts similarity index 91% rename from src/singleOrNull.ts rename to src/operators/sync/singleOrNull.ts index 90ff541..99000e6 100644 --- a/src/singleOrNull.ts +++ b/src/operators/sync/singleOrNull.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class SingleOrNull { @@ -8,7 +8,7 @@ export class SingleOrNull { * the predicate or `null` if more or less than one element match the predicate. * * @param {(value: T) => boolean} predicate - * @returns {T} + * @returns {T | null} */ singleOrNull(this: Sequence, predicate?: (value: T) => boolean): T | null { if (predicate != null) { diff --git a/src/operators/sync/sorted.ts b/src/operators/sync/sorted.ts new file mode 100644 index 0000000..80fd18a --- /dev/null +++ b/src/operators/sync/sorted.ts @@ -0,0 +1,58 @@ +import {createSequence, Sequence} from "../../sequency"; +import ComparatorFactory from "../../ComparatorFactory"; +import Comparator from "../../Comparator"; + +class SortIterator implements Iterator { + private readonly factory: ComparatorFactory = new ComparatorFactory(); + private readonly comparator: Comparator | null; + private readonly data: T[] = []; + /** Iterator to initialize data with */ + private iterator: Iterator | null = null; + /** Current data index */ + private index: number = 0; + + constructor(iterator: Iterator, composeComparator?: (factory: ComparatorFactory) => Comparator) { + this.comparator = composeComparator?.(this.factory) ?? null; + this.iterator = iterator; + } + + private async init() { + if (this.iterator != null) { + for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { + if (!item.done) { + this.data.push(item.value); + } + } + if (this.comparator != null) { + this.data.sort(this.comparator.compare); + } else { + this.data.sort(); + } + Object.freeze(this.data); + this.iterator = null; + } + } + + next(value?: any): IteratorResult { + this.init(); + if (this.index < this.data.length) { + return {done: false, value: this.data[this.index++]}; + } + return {done: true, value: undefined}; + } +} + +export class Sorted { + + /** + * Returns a new sequence with all elements sorted by the comparator specified by the given `composeComparator` function + * or in natural order if no arguments are given. + * + * @param {(factory: ComparatorFactory) => Comparator} composeComparator + * @returns {Sequence} + */ + sorted(this: Sequence, composeComparator?: (factory: ComparatorFactory) => Comparator): Sequence { + return createSequence(new SortIterator(this.iterator, composeComparator)); + } + +} \ No newline at end of file diff --git a/src/sortedBy.ts b/src/operators/sync/sortedBy.ts similarity index 90% rename from src/sortedBy.ts rename to src/operators/sync/sortedBy.ts index 26412a2..a8b093f 100644 --- a/src/sortedBy.ts +++ b/src/operators/sync/sortedBy.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class SortedBy { diff --git a/src/sortedByDescending.ts b/src/operators/sync/sortedByDescending.ts similarity index 91% rename from src/sortedByDescending.ts rename to src/operators/sync/sortedByDescending.ts index 1a03761..098a1d2 100644 --- a/src/sortedByDescending.ts +++ b/src/operators/sync/sortedByDescending.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class SortedByDescending { diff --git a/src/sortedDescending.ts b/src/operators/sync/sortedDescending.ts similarity index 87% rename from src/sortedDescending.ts rename to src/operators/sync/sortedDescending.ts index 104d22f..0b773f3 100644 --- a/src/sortedDescending.ts +++ b/src/operators/sync/sortedDescending.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class SortedDescending { diff --git a/src/sortedWith.ts b/src/operators/sync/sortedWith.ts similarity index 90% rename from src/sortedWith.ts rename to src/operators/sync/sortedWith.ts index 34a74a6..ecb4626 100644 --- a/src/sortedWith.ts +++ b/src/operators/sync/sortedWith.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class SortedWith { diff --git a/src/sum.ts b/src/operators/sync/sum.ts similarity index 89% rename from src/sum.ts rename to src/operators/sync/sum.ts index e87ac51..727463f 100644 --- a/src/sum.ts +++ b/src/operators/sync/sum.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Sum { diff --git a/src/sumBy.ts b/src/operators/sync/sumBy.ts similarity index 91% rename from src/sumBy.ts rename to src/operators/sync/sumBy.ts index a53f919..59641b7 100644 --- a/src/sumBy.ts +++ b/src/operators/sync/sumBy.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class SumBy { diff --git a/src/take.ts b/src/operators/sync/take.ts similarity index 90% rename from src/take.ts rename to src/operators/sync/take.ts index 06fc68c..8d76d97 100644 --- a/src/take.ts +++ b/src/operators/sync/take.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Take { diff --git a/src/takeWhile.ts b/src/operators/sync/takeWhile.ts similarity index 80% rename from src/takeWhile.ts rename to src/operators/sync/takeWhile.ts index 6f7dc9c..41b7441 100644 --- a/src/takeWhile.ts +++ b/src/operators/sync/takeWhile.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence} from "./Sequence"; +import {createSequence, Sequence} from "../../sequency"; class TakeWhileIterator implements Iterator { constructor(private readonly iterator: Iterator, @@ -8,12 +8,11 @@ class TakeWhileIterator implements Iterator { next(value?: any): IteratorResult { const item = this.iterator.next(); if (!item.done) { - const result = this.predicate(item.value); - if (result) { + if (this.predicate(item.value)) { return {done: false, value: item.value}; } } - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } } diff --git a/src/toArray.ts b/src/operators/sync/toArray.ts similarity index 63% rename from src/toArray.ts rename to src/operators/sync/toArray.ts index 72e9a33..abe29b6 100644 --- a/src/toArray.ts +++ b/src/operators/sync/toArray.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ToArray { @@ -6,11 +6,11 @@ export class ToArray { * Returns all elements of the sequence as array. If an `array` is passed * the elements are appended to the end of the array. * - * @param {Array} array - * @returns {Array} + * @param {T[]} array + * @returns {T[]} */ - toArray(this: Sequence, array?: Array): Array { - const result: Array = array || []; + toArray(this: Sequence, array?: T[]): T[] { + const result: T[] = array || []; for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { result.push(item.value); } @@ -21,10 +21,10 @@ export class ToArray { * Returns all elements of the sequence as array. If an `array` is passed * the elements are appended to the end of the array. * - * @param {Array} array - * @returns {Array} + * @param {T[]} array + * @returns {T[]} */ - toList(this: Sequence, array?: Array): Array { + toList(this: Sequence, array?: T[]): T[] { return this.toArray(array); } diff --git a/src/toMap.ts b/src/operators/sync/toMap.ts similarity index 94% rename from src/toMap.ts rename to src/operators/sync/toMap.ts index 077aa2a..8daa288 100644 --- a/src/toMap.ts +++ b/src/operators/sync/toMap.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ToMap { diff --git a/src/toSet.ts b/src/operators/sync/toSet.ts similarity index 92% rename from src/toSet.ts rename to src/operators/sync/toSet.ts index 85b10c2..4905deb 100644 --- a/src/toSet.ts +++ b/src/operators/sync/toSet.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class ToSet { diff --git a/src/unzip.ts b/src/operators/sync/unzip.ts similarity index 68% rename from src/unzip.ts rename to src/operators/sync/unzip.ts index ef709b1..df9b414 100644 --- a/src/unzip.ts +++ b/src/operators/sync/unzip.ts @@ -1,4 +1,4 @@ -import Sequence from "./Sequence"; +import {Sequence} from "../../sequency"; export class Unzip { @@ -6,11 +6,11 @@ export class Unzip { * Returns a pair of arrays where the first array contains all first values * and the second array all second values from each input pair of the sequence. * - * @returns {[Array , Array]} + * @returns {[T[], S[]]} */ - unzip(this: Sequence<[T, S]>): [Array, Array] { - const array1: Array = []; - const array2: Array = []; + unzip(this: Sequence<[T, S]>): [T[], S[]] { + const array1: T[] = []; + const array2: S[] = []; for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { const [first, second] = item.value; array1.push(first); diff --git a/src/withIndex.ts b/src/operators/sync/withIndex.ts similarity index 83% rename from src/withIndex.ts rename to src/operators/sync/withIndex.ts index 97ed92b..2cf26da 100644 --- a/src/withIndex.ts +++ b/src/operators/sync/withIndex.ts @@ -1,5 +1,5 @@ -import Sequence, {createSequence} from "./Sequence"; -import IndexedValue from "./IndexedValue"; +import {createSequence, Sequence} from "../../sequency"; +import IndexedValue from "../../IndexedValue"; class IndexIterator implements Iterator> { private index = -1; @@ -10,7 +10,7 @@ class IndexIterator implements Iterator> { next(value?: any): IteratorResult> { const item = this.iterator.next(); if (item.done) { - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } this.index++; return { diff --git a/src/zip.ts b/src/operators/sync/zip.ts similarity index 89% rename from src/zip.ts rename to src/operators/sync/zip.ts index 184209a..6ff41e9 100644 --- a/src/zip.ts +++ b/src/operators/sync/zip.ts @@ -1,4 +1,4 @@ -import Sequence, {createSequence} from "./Sequence"; +import {createSequence, Sequence} from "../../sequency"; class ZipIterator implements Iterator<[T, S]> { constructor(private readonly iterator1: Iterator, @@ -9,7 +9,7 @@ class ZipIterator implements Iterator<[T, S]> { const item1 = this.iterator1.next(); const item2 = this.iterator2.next(); if (item1.done || item2.done) { - return {done: true, value: undefined as any}; + return {done: true, value: undefined}; } else { return {done: false, value: [item1.value, item2.value]}; } diff --git a/src/sequency.ts b/src/sequency.ts new file mode 100644 index 0000000..0249806 --- /dev/null +++ b/src/sequency.ts @@ -0,0 +1,105 @@ +import {applyMixins, asAsyncIterator} from "./internal"; +import {AsyncSequence, AsyncSequenceImpl} from "./AsyncSequence"; +import GeneratorIterator from "./GeneratorIterator"; +import GeneratorSeedIterator from "./GeneratorSeedIterator"; +import {Sequence, SequenceImpl} from "./Sequence"; + +export {Sequence, Sequence as default} from "./Sequence"; +export {AsyncSequence} from "./AsyncSequence"; + +export function sequenceOf(...args: T[]): Sequence { + return asSequence(args); +} + +export function asyncSequenceOf(...args: T[]): AsyncSequence { + return asAsyncSequence(args); +} + +export function emptySequence(): Sequence { + return sequenceOf(); +} + +export function emptyAsyncSequence(): AsyncSequence { + return asyncSequenceOf(); +} + +export function asSequence(iterable: Iterable): Sequence { + if (iterable == null) { + throw new Error("Cannot create sequence for non-existing input: " + iterable); + } + if (iterable[Symbol.iterator] == null) { + throw new Error("Cannot create sequence for non-iterable input: " + iterable); + } + const iterator = iterable[Symbol.iterator](); + return createSequence(iterator); +} + +export function asAsyncSequence(iterable: Iterable | AsyncIterable): AsyncSequence { + if (iterable == null) { + throw new Error("Cannot create sequence for non-existing input: " + iterable); + } + + if((iterable as Iterable)[Symbol.iterator] != null) { + const iterator = (iterable as Iterable)[Symbol.iterator](); + return createAsyncSequence(asAsyncIterator(iterator)); + } + if ((iterable as AsyncIterable)[Symbol.asyncIterator] != null) { + const iterator = (iterable as AsyncIterable)[Symbol.asyncIterator](); + return createAsyncSequence(iterator); + } + + throw new Error("Cannot create sequence for non-iterable input: " + iterable); +} + +export function createSequence(iterator: Iterator): Sequence { + return new SequenceImpl(iterator) as Sequence; +} + +export function createAsyncSequence(iterator: AsyncIterator): AsyncSequence { + return new AsyncSequenceImpl(iterator) as AsyncSequence; +} + +export function isSequence(object: unknown): object is Sequence { + return object instanceof SequenceImpl; +} + +export function isAsyncSequence(object: unknown): object is AsyncSequence { + return object instanceof AsyncSequenceImpl; +} + +export function extendSequence(mixin: { new(): any }) { + applyMixins(SequenceImpl, [mixin]); +} + +export function extendAsyncSequence(mixin: { new(): any }) { + applyMixins(AsyncSequenceImpl, [mixin]); +} + +export function generateSequence(nextFunction: () => T | null | undefined): Sequence; +export function generateSequence(seedFunction: () => T | null | undefined, nextFunction: (item: T) => T | null | undefined): Sequence; +export function generateSequence(seed: T | null | undefined, nextFunction: (item: T) => T | null | undefined): Sequence; +export function generateSequence(a: any, b?: any): Sequence { + if (typeof a === "function" && b == null) { + return createSequence(new GeneratorIterator(a)); + } + const seed = typeof a === "function" ? a() : a; + return seed != null + ? createSequence(new GeneratorSeedIterator(seed, b)) + : emptySequence(); +} + +export function range(start: number, endInclusive: number, step: number = 1): Sequence { + if (start > endInclusive) { + throw new Error(`start [${start}] must be lower then endInclusive [${endInclusive}]`); + } + let current = start; + return generateSequence(() => { + try { + return current <= endInclusive + ? current + : undefined; + } finally { + current += step; + } + }); +} \ No newline at end of file diff --git a/src/sorted.ts b/src/sorted.ts deleted file mode 100644 index 4f1e93e..0000000 --- a/src/sorted.ts +++ /dev/null @@ -1,30 +0,0 @@ -import Sequence, {createSequence} from "./Sequence"; -import ComparatorFactory from "./ComparatorFactory"; -import Comparator from "./Comparator"; -import createComparatorFactory from "./createComparatorFactory"; - -export class Sorted { - - /** - * Returns a new sequence with all elements sorted by the comparator specified by the given `composeComparator` function - * or in natural order if no arguments are given. - * - * @returns {Sequence} - */ - sorted(this: Sequence, composeComparator?: (factory: ComparatorFactory) => Comparator): Sequence { - const result: Array = []; - for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { - result.push(item.value); - } - if (composeComparator == null) { - result.sort(); - } else { - const factory: ComparatorFactory = createComparatorFactory(); - const comparator = composeComparator(factory); - result.sort(comparator); - } - const iterator = result[Symbol.iterator](); - return createSequence(iterator); - } - -} \ No newline at end of file From 5424f512f950dae8c51dca399e8a5f53c92228ac Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 16:34:20 +0100 Subject: [PATCH 04/28] Update existing unit tests --- test/all.test.ts | 2 +- test/any.test.ts | 2 +- test/asIterable.test.ts | 2 +- test/asSequence.test.ts | 43 +++++++---------- test/associate.test.ts | 23 ++++++--- test/associateBy.test.ts | 57 ++++++++++++++-------- test/average.test.ts | 2 +- test/chunk.test.ts | 44 +++++++---------- test/contains.test.ts | 2 +- test/count.test.ts | 4 +- test/distinct.test.ts | 8 ++-- test/distinctBy.test.ts | 12 +++-- test/drop.test.ts | 21 ++++---- test/dropWhile.test.ts | 15 +++--- test/elementAt.test.ts | 7 ++- test/elementAtOrElse.test.ts | 6 ++- test/elementAtOrNull.test.ts | 6 ++- test/emptySequence.test.ts | 3 +- test/examples.test.ts | 10 ++-- test/extendSequence.test.ts | 5 +- test/filter.test.ts | 6 +-- test/filterIndexed.test.ts | 8 ++-- test/filterNot.test.ts | 7 ++- test/filterNotNull.test.ts | 9 ++-- test/find.test.ts | 5 +- test/findLast.test.ts | 5 +- test/first.test.ts | 5 +- test/firstOrNull.test.ts | 5 +- test/flatMap.test.ts | 10 +--- test/flatten.test.ts | 20 ++------ test/fold.test.ts | 6 ++- test/foldIndexed.test.ts | 6 ++- test/forEach.test.ts | 9 ++-- test/forEachIndexed.test.ts | 9 ++-- test/generateSequence.test.ts | 46 +++++++----------- test/groupBy.test.ts | 24 +++++----- test/indexOf.test.ts | 4 +- test/indexOfFirst.test.ts | 3 +- test/indexOfLast.test.ts | 3 +- test/joinTo.test.ts | 3 +- test/joinToString.test.ts | 7 ++- test/last.test.ts | 5 +- test/lastOrNull.test.ts | 5 +- test/map.test.ts | 7 +-- test/mapIndexed.test.ts | 7 +-- test/mapNotNull.test.ts | 8 ++-- test/max.test.ts | 4 +- test/maxBy.test.ts | 4 +- test/maxWith.test.ts | 6 ++- test/merge.test.ts | 6 ++- test/min.test.ts | 4 +- test/minBy.test.ts | 6 ++- test/minWith.test.ts | 6 ++- test/minus.test.ts | 23 ++++----- test/none.test.ts | 6 ++- test/onEach.test.ts | 10 ++-- test/partition.test.ts | 13 ++--- test/plus.test.ts | 31 ++++-------- test/range.test.ts | 22 ++++++--- test/reduce.test.ts | 4 +- test/reduceIndexed.test.ts | 3 +- test/reverse.test.ts | 8 ++-- test/sequenceOf.test.ts | 6 +-- test/single.test.ts | 5 +- test/singleOrNull.test.ts | 8 +++- test/sorted.test.ts | 85 +++++++++++++++++++++------------ test/sortedBy.test.ts | 8 +--- test/sortedByDescending.test.ts | 8 +--- test/sortedDescending.test.ts | 18 ++----- test/sortedWith.test.ts | 10 ++-- test/sum.test.ts | 3 +- test/sumBy.test.ts | 3 +- test/take.test.ts | 16 +++---- test/takeWhile.test.ts | 14 +++--- test/toArray.test.ts | 17 +++---- test/toList.test.ts | 17 +++---- test/toMap.test.ts | 31 +++++++----- test/toSet.test.ts | 15 ++---- test/undefinedAndNull.test.ts | 5 +- test/unzip.test.ts | 13 ++--- test/zip.test.ts | 19 +++++--- 81 files changed, 489 insertions(+), 474 deletions(-) diff --git a/test/all.test.ts b/test/all.test.ts index 0bd26ce..3911479 100644 --- a/test/all.test.ts +++ b/test/all.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("all", () => { it("should return false", () => { diff --git a/test/any.test.ts b/test/any.test.ts index bb04e45..1161c8f 100644 --- a/test/any.test.ts +++ b/test/any.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("any", () => { it("should return false", () => { diff --git a/test/asIterable.test.ts b/test/asIterable.test.ts index f894d96..a0f3093 100644 --- a/test/asIterable.test.ts +++ b/test/asIterable.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("asIterable", () => { it("should return an iterable object conforming to the iterator-protocol", () => { diff --git a/test/asSequence.test.ts b/test/asSequence.test.ts index c0a9eb7..f625ab4 100644 --- a/test/asSequence.test.ts +++ b/test/asSequence.test.ts @@ -1,4 +1,4 @@ -import {asSequence} from "../src/Sequence"; +import {asSequence} from "../src/sequency"; describe("asSequence", () => { it("should create sequence from array", () => { @@ -7,9 +7,7 @@ describe("asSequence", () => { .map(it => `num ${it}`) .toArray(); - expect(array.length).toBe(2); - expect(array[0]).toBe("num 2"); - expect(array[1]).toBe("num 3"); + expect(array).toEqual(["num 2", "num 3"]); }); it("should create sequence from object keys", () => { @@ -17,10 +15,7 @@ describe("asSequence", () => { const array = asSequence(keys) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe("a"); - expect(array[1]).toBe("b"); - expect(array[2]).toBe("c"); + expect(array).toEqual(["a", "b", "c"]); }); it("should create sequence from object values", () => { @@ -28,20 +23,14 @@ describe("asSequence", () => { const array = asSequence(values) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); + expect(array).toEqual([1, 2, 3]); }); it("should create sequence from set", () => { const array = asSequence(new Set([1, 2, 3])) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); + expect(array).toEqual([1, 2, 3]); }); it("should create sequence from map", () => { @@ -53,27 +42,29 @@ describe("asSequence", () => { const array = asSequence(map) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toEqual(["a", 1]); - expect(array[1]).toEqual(["b", 2]); - expect(array[2]).toEqual(["c", 3]); + expect(array) + .toEqual([ + ["a", 1], + ["b", 2], + ["c", 3] + ]); }); it("should throw understandable error message if input is undefined", () => { expect( - () => asSequence(undefined as Array).toArray() - ).toThrowError("Cannot create sequence for input: undefined"); + () => asSequence(undefined as unknown as number[]).toArray() + ).toThrow("Cannot create sequence for non-existing input: undefined"); }); it("should throw understandable error message if input is null", () => { expect( - () => asSequence(null as Array).toArray() - ).toThrowError("Cannot create sequence for input: null"); + () => asSequence(null as unknown as number[]).toArray() + ).toThrow("Cannot create sequence for non-existing input: null"); }); it("should throw understandable error message if input is not iterable", () => { expect( - () => asSequence({} as Array).toArray() - ).toThrowError("Cannot create sequence for non-iterable input: [object Object]"); + () => asSequence({} as unknown as number[]).toArray() + ).toThrow("Cannot create sequence for non-iterable input: [object Object]"); }); }); \ No newline at end of file diff --git a/test/associate.test.ts b/test/associate.test.ts index 4e082c7..37071d4 100644 --- a/test/associate.test.ts +++ b/test/associate.test.ts @@ -1,20 +1,29 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("associate", () => { it("should associate map", () => { const map = sequenceOf(1, 2, 3) .associate(it => ([`key_${it}`, it])); expect(map.size).toBe(3); - expect(map.get("key_1")).toBe(1); - expect(map.get("key_2")).toBe(2); - expect(map.get("key_3")).toBe(3); + + expect(map).toEqual( + new Map([ + ["key_1", 1], + ["key_2", 2], + ["key_3", 3] + ]) + ); }); it("latest entries should win in case of duplicates", () => { const map = sequenceOf({k: 1, v: 1}, {k: 1, v: 11}, {k: 1, v: 111}, {k: 2, v: 222}) .associate(it => ([it.k, it.v])); - expect(map.size).toBe(2); - expect(map.get(1)).toBe(111); - expect(map.get(2)).toBe(222); + + expect(map).toEqual( + new Map([ + [1, 111], + [2, 222] + ]) + ); }); }); \ No newline at end of file diff --git a/test/associateBy.test.ts b/test/associateBy.test.ts index ec2c6bf..d6cb754 100644 --- a/test/associateBy.test.ts +++ b/test/associateBy.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("associateBy", () => { it("should associate map by keySelector", () => { @@ -9,10 +9,13 @@ describe("associateBy", () => { const map = sequenceOf(a, b, c) .associateBy(it => it.k); - expect(map.size).toBe(3); - expect(map.get(1)).toBe(a); - expect(map.get(2)).toBe(b); - expect(map.get(3)).toBe(c); + expect(map).toEqual( + new Map([ + [1, a], + [2, b], + [3, c] + ]) + ) }); it("should associate map by key", () => { @@ -23,10 +26,13 @@ describe("associateBy", () => { const map = sequenceOf(a, b, c) .associateBy("k"); - expect(map.size).toBe(3); - expect(map.get(1)).toBe(a); - expect(map.get(2)).toBe(b); - expect(map.get(3)).toBe(c); + expect(map).toEqual( + new Map([ + [1, a], + [2, b], + [3, c] + ]) + ) }); it("should associate map by keySelector and valueTransformer", () => { @@ -40,10 +46,13 @@ describe("associateBy", () => { it => it.v ); - expect(map.size).toBe(3); - expect(map.get(1)).toBe(11); - expect(map.get(2)).toBe(22); - expect(map.get(3)).toBe(33); + expect(map).toEqual( + new Map([ + [1, 11], + [2, 22], + [3, 33] + ]) + ) }); it("should associate map by key and valueTransformer", () => { @@ -57,10 +66,13 @@ describe("associateBy", () => { it => it.v ); - expect(map.size).toBe(3); - expect(map.get(1)).toBe(11); - expect(map.get(2)).toBe(22); - expect(map.get(3)).toBe(33); + expect(map).toEqual( + new Map([ + [1, 11], + [2, 22], + [3, 33] + ]) + ) }); it("latest entries should win in case of duplicates", () => { @@ -75,9 +87,12 @@ describe("associateBy", () => { it => it.v ); - expect(map.size).toBe(3); - expect(map.get(1)).toBe(11); - expect(map.get(2)).toBe(222); - expect(map.get(3)).toBe(33); + expect(map).toEqual( + new Map([ + [1, 11], + [2, 222], + [3, 33] + ]) + ) }); }); \ No newline at end of file diff --git a/test/average.test.ts b/test/average.test.ts index fed4076..b276e92 100644 --- a/test/average.test.ts +++ b/test/average.test.ts @@ -1,4 +1,4 @@ -import Sequence, {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf, Sequence} from "../src/sequency"; describe("average", () => { it("should calculate average", () => { diff --git a/test/chunk.test.ts b/test/chunk.test.ts index e977d26..9bf953d 100644 --- a/test/chunk.test.ts +++ b/test/chunk.test.ts @@ -1,51 +1,43 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("chunk", () => { it("should return list of chunks", () => { const chunks = sequenceOf(1, 2, 3, 4, 5) .chunk(2); - expect(chunks.length).toBe(3); - expect(chunks[0].length).toBe(2); - expect(chunks[0][0]).toBe(1); - expect(chunks[0][1]).toBe(2); - - expect(chunks[1].length).toBe(2); - expect(chunks[1][0]).toBe(3); - expect(chunks[1][1]).toBe(4); - - expect(chunks[2].length).toBe(1); - expect(chunks[2][0]).toBe(5); + expect(chunks).toEqual([ + [1, 2], + [3, 4], + [5] + ]); }); it("should return single chunk", () => { const chunks = sequenceOf(1, 2, 3) .chunk(5); - expect(chunks.length).toBe(1); - expect(chunks[0].length).toBe(3); - expect(chunks[0][0]).toBe(1); - expect(chunks[0][1]).toBe(2); - expect(chunks[0][2]).toBe(3); + + expect(chunks).toEqual([ + [1, 2, 3] + ]); }); it("should return one-size chunks", () => { const chunks = sequenceOf(1, 2, 3) .chunk(1); - expect(chunks.length).toBe(3); - expect(chunks[0].length).toBe(1); - expect(chunks[0][0]).toBe(1); - expect(chunks[1].length).toBe(1); - expect(chunks[1][0]).toBe(2); - expect(chunks[2].length).toBe(1); - expect(chunks[2][0]).toBe(3); + + expect(chunks).toEqual([ + [1], + [2], + [3] + ]); }); it("should throw", () => { expect( () => sequenceOf(1, 2, 3).chunk(0) - ).toThrow(); + ).toThrow("chunkSize must be > 0 but is 0"); expect( () => sequenceOf(1, 2, 3).chunk(-1) - ).toThrow(); + ).toThrow("chunkSize must be > 0 but is -1"); }); }); \ No newline at end of file diff --git a/test/contains.test.ts b/test/contains.test.ts index ae42d64..66d6ae0 100644 --- a/test/contains.test.ts +++ b/test/contains.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("contains", () => { it("should contain element", () => { diff --git a/test/count.test.ts b/test/count.test.ts index 563aae3..561cca9 100644 --- a/test/count.test.ts +++ b/test/count.test.ts @@ -1,7 +1,6 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("count", () => { - it("should count results", () => { const num = sequenceOf(1, 2, 3).count(); expect(num).toBe(3); @@ -12,5 +11,4 @@ describe("count", () => { .count(it => it > 1); expect(num).toBe(2); }); - }); \ No newline at end of file diff --git a/test/distinct.test.ts b/test/distinct.test.ts index 7524d23..36975de 100644 --- a/test/distinct.test.ts +++ b/test/distinct.test.ts @@ -1,14 +1,12 @@ -import {range, sequenceOf} from "../src/Sequence"; +import {range, sequenceOf} from "../src/sequency"; describe("distinct", () => { it("should dismiss duplicate items", () => { const result = sequenceOf(1, 1, 2, 3) .distinct() .toArray(); - expect(result.length).toBe(3); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); - expect(result[2]).toBe(3); + + expect(result).toEqual([1, 2, 3]); }); it.skip("distinct performance test", () => { diff --git a/test/distinctBy.test.ts b/test/distinctBy.test.ts index 171b3ef..f53ac80 100644 --- a/test/distinctBy.test.ts +++ b/test/distinctBy.test.ts @@ -1,13 +1,15 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("distinctBy", () => { it("should dismiss items with duplicate selections", () => { const result = sequenceOf({a: 1}, {a: 2}, {a: 1}, {a: 3}) .distinctBy(it => it.a) .toArray(); - expect(result.length).toBe(3); - expect(result[0].a).toBe(1); - expect(result[1].a).toBe(2); - expect(result[2].a).toBe(3); + + expect(result).toEqual([ + {a: 1}, + {a: 2}, + {a: 3} + ]); }); }); \ No newline at end of file diff --git a/test/drop.test.ts b/test/drop.test.ts index 9ed8a50..b6d6702 100644 --- a/test/drop.test.ts +++ b/test/drop.test.ts @@ -1,19 +1,19 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("drop", () => { it("should drop 2 items", () => { const result = sequenceOf(1, 2, 3, 4) .drop(2) .toArray(); - expect(result.length).toBe(2); - expect(result[0]).toBe(3); - expect(result[1]).toBe(4); + + expect(result).toEqual([3, 4]); }); it("should drop all items", () => { const result = sequenceOf(1, 2, 3, 4) .drop(4) .toArray(); + expect(result.length).toBe(0); }); @@ -21,6 +21,7 @@ describe("drop", () => { const result = sequenceOf(1, 2, 3, 4) .drop(10) .toArray(); + expect(result.length).toBe(0); }); @@ -28,19 +29,15 @@ describe("drop", () => { const result = sequenceOf(1, 2, 3) .drop(0) .toArray(); - expect(result.length).toBe(3); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); - expect(result[2]).toBe(3); + + expect(result).toEqual([1, 2, 3]); }); it("should drop nothing for n < 0", () => { const result = sequenceOf(1, 2, 3) .drop(-10) .toArray(); - expect(result.length).toBe(3); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); - expect(result[2]).toBe(3); + + expect(result).toEqual([1, 2, 3]); }); }); \ No newline at end of file diff --git a/test/dropWhile.test.ts b/test/dropWhile.test.ts index 65236d4..98dcb0e 100644 --- a/test/dropWhile.test.ts +++ b/test/dropWhile.test.ts @@ -1,30 +1,27 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("dropWhile", () => { it("should drop elements until predicate evaluates to false", () => { const result = sequenceOf(1, 2, 3, 2, 1) .dropWhile(it => it < 3) .toArray(); - expect(result.length).toBe(3); - expect(result[0]).toBe(3); - expect(result[1]).toBe(2); - expect(result[2]).toBe(1); + + expect(result).toEqual([3, 2, 1]); }); it("should drop no elements", () => { const result = sequenceOf(1, 2, 3) .dropWhile(it => it > 3) .toArray(); - expect(result.length).toBe(3); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); - expect(result[2]).toBe(3); + + expect(result).toEqual([1, 2, 3]); }); it("should drop all elements", () => { const result = sequenceOf(1, 2, 3) .dropWhile(it => it > 0) .toArray(); + expect(result.length).toBe(0); }); }); \ No newline at end of file diff --git a/test/elementAt.test.ts b/test/elementAt.test.ts index 80a6d28..5678e70 100644 --- a/test/elementAt.test.ts +++ b/test/elementAt.test.ts @@ -1,27 +1,30 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("elementAt", () => { it("should return element at first index", () => { const item = sequenceOf(1, 2, 3) .elementAt(0); + expect(item).toBe(1); }); it("should return element at middle index", () => { const item = sequenceOf(1, 2, 3) .elementAt(1); + expect(item).toBe(2); }); it("should return element at last index", () => { const item = sequenceOf(1, 2, 3) .elementAt(2); + expect(item).toBe(3); }); it("should throw error when index out of bounds", () => { expect( () => sequenceOf(1, 2, 3).elementAt(3) - ).toThrow(); + ).toThrow("Index out of bounds: 3"); }); }); \ No newline at end of file diff --git a/test/elementAtOrElse.test.ts b/test/elementAtOrElse.test.ts index efe6c65..cdce436 100644 --- a/test/elementAtOrElse.test.ts +++ b/test/elementAtOrElse.test.ts @@ -1,27 +1,31 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("elementAtOrElse", () => { it("should return element at first index", () => { const item = sequenceOf(1, 2, 3) .elementAtOrElse(0, () => -1); + expect(item).toBe(1); }); it("should return element at middle index", () => { const item = sequenceOf(1, 2, 3) .elementAtOrElse(1, () => -1); + expect(item).toBe(2); }); it("should return element at last index", () => { const item = sequenceOf(1, 2, 3) .elementAtOrElse(2, () => -1); + expect(item).toBe(3); }); it("should return default value when index out of bounds", () => { const item = sequenceOf(1, 2, 3) .elementAtOrElse(3, () => 1234); + expect(item).toBe(1234); }); }); \ No newline at end of file diff --git a/test/elementAtOrNull.test.ts b/test/elementAtOrNull.test.ts index eda6bc0..799733d 100644 --- a/test/elementAtOrNull.test.ts +++ b/test/elementAtOrNull.test.ts @@ -1,27 +1,31 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("elementAtOrNull", () => { it("should return element at first index", () => { const item = sequenceOf(1, 2, 3) .elementAtOrNull(0); + expect(item).toBe(1); }); it("should return element at middle index", () => { const item = sequenceOf(1, 2, 3) .elementAtOrNull(1); + expect(item).toBe(2); }); it("should return element at last index", () => { const item = sequenceOf(1, 2, 3) .elementAtOrNull(2); + expect(item).toBe(3); }); it("should return null when index out of bounds", () => { const item = sequenceOf(1, 2, 3) .elementAtOrNull(3); + expect(item).toBeNull(); }); }); \ No newline at end of file diff --git a/test/emptySequence.test.ts b/test/emptySequence.test.ts index 8a59ead..7346efa 100644 --- a/test/emptySequence.test.ts +++ b/test/emptySequence.test.ts @@ -1,8 +1,9 @@ -import {emptySequence} from "../src/Sequence"; +import {emptySequence} from "../src/sequency"; describe("emptySequence", () => { it("should return empty array", () => { const result = emptySequence().toArray(); + expect(result.length).toBe(0); }); }); \ No newline at end of file diff --git a/test/examples.test.ts b/test/examples.test.ts index 6b5790d..551997d 100644 --- a/test/examples.test.ts +++ b/test/examples.test.ts @@ -1,11 +1,11 @@ -import {asSequence, generateSequence, sequenceOf} from "../src/Sequence"; +import {asSequence, generateSequence, sequenceOf} from "../src/sequency"; describe("examples", () => { - it("should be beer-o-clock", () => { const result = sequenceOf("🍻", "🍻") - .flatMap(it => sequenceOf("🍺", "🍺")) + .flatMap(_it => sequenceOf("🍺", "🍺")) .toArray(); + expect(result).toEqual(["🍺", "🍺", "🍺", "🍺"]); }); @@ -15,12 +15,14 @@ describe("examples", () => { .map(([a, _]) => a) .take(10) .toArray(); + expect(nums).toEqual([0, 1, 1, 2, 3, 5, 8, 13, 21, 34]); }); it("should iterate over chars of the given string", () => { const result = asSequence("abc") .toArray(); + expect(result).toEqual(["a", "b", "c"]); }); @@ -35,7 +37,7 @@ describe("examples", () => { const result = asSequence(generator()) .take(3) .toArray(); + expect(result).toEqual([0, 1, 2]); }); - }); \ No newline at end of file diff --git a/test/extendSequence.test.ts b/test/extendSequence.test.ts index 0c8cdd4..eade5f7 100644 --- a/test/extendSequence.test.ts +++ b/test/extendSequence.test.ts @@ -1,4 +1,4 @@ -import Sequence, {extendSequence, sequenceOf} from "../src/Sequence"; +import {extendSequence, sequenceOf, Sequence} from "../src/sequency"; class GreetAll { greetAll(this: Sequence): string { @@ -7,7 +7,7 @@ class GreetAll { } } -declare module "../src/Sequence" { +declare module "../src/sequency" { export default interface Sequence extends GreetAll { } } @@ -17,6 +17,7 @@ describe("extendSequence", () => { extendSequence(GreetAll); const names = sequenceOf("John", "Bob", "Steve"); const greetings = names.greetAll(); + expect(greetings).toBe("Hello John, Bob, Steve !"); }); }); diff --git a/test/filter.test.ts b/test/filter.test.ts index 7f63c95..2990efb 100644 --- a/test/filter.test.ts +++ b/test/filter.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("filter", () => { it("should filter elements", () => { @@ -6,8 +6,6 @@ describe("filter", () => { .filter(it => it > 1) .toArray(); - expect(array.length).toBe(2); - expect(array[0]).toBe(2); - expect(array[1]).toBe(3); + expect(array).toEqual([2, 3]); }); }); \ No newline at end of file diff --git a/test/filterIndexed.test.ts b/test/filterIndexed.test.ts index ee568b0..a96784a 100644 --- a/test/filterIndexed.test.ts +++ b/test/filterIndexed.test.ts @@ -1,13 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("filterIndexed", () => { it("should filter elements by index", () => { const array = sequenceOf(1, 2, 3) - .filterIndexed((index, value) => index < 2) + .filterIndexed((index, _value) => index < 2) .toArray(); - expect(array.length).toBe(2); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); + expect(array).toEqual([1, 2]); }); }); \ No newline at end of file diff --git a/test/filterNot.test.ts b/test/filterNot.test.ts index 61bb11f..e51ca45 100644 --- a/test/filterNot.test.ts +++ b/test/filterNot.test.ts @@ -1,12 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("filterNot", () => { it("should filter elements", () => { const result = sequenceOf(1, 2, 3) .filterNot(it => it > 2) .toArray(); - expect(result.length).toBe(2); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); + + expect(result).toEqual([1, 2]); }); }); \ No newline at end of file diff --git a/test/filterNotNull.test.ts b/test/filterNotNull.test.ts index 24c68ca..ef6621e 100644 --- a/test/filterNotNull.test.ts +++ b/test/filterNotNull.test.ts @@ -1,14 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("filterNotNull", () => { it("should skip null elements", () => { - const array = sequenceOf(1, null, 2, null, 3) + const array: number[] = sequenceOf(1, null, 2, null, 3) .filterNotNull() .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); + expect(array).toEqual([1, 2, 3]); }); }); \ No newline at end of file diff --git a/test/find.test.ts b/test/find.test.ts index de42fa1..19374a4 100644 --- a/test/find.test.ts +++ b/test/find.test.ts @@ -1,10 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("find", () => { it("should return first element of sequence", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 2) .find(); + expect(result).toBe(3); }); @@ -12,12 +13,14 @@ describe("find", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 3) .find(); + expect(result).toBeNull(); }); it("should return first element matching predicate", () => { const result = sequenceOf(1, 2, 3) .find(it => it > 2); + expect(result).toBe(3); }); }); \ No newline at end of file diff --git a/test/findLast.test.ts b/test/findLast.test.ts index a84059f..de8e126 100644 --- a/test/findLast.test.ts +++ b/test/findLast.test.ts @@ -1,9 +1,10 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("findLast", () => { it("should return last element of sequence", () => { const result = sequenceOf(1, 2, 3) .findLast(); + expect(result).toBe(3); }); @@ -11,12 +12,14 @@ describe("findLast", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 3) .findLast(); + expect(result).toBeNull(); }); it("should return last element matching predicate", () => { const result = sequenceOf(1, 2, 3) .findLast(it => it > 1); + expect(result).toBe(3); }); }); \ No newline at end of file diff --git a/test/first.test.ts b/test/first.test.ts index fca8d39..928c097 100644 --- a/test/first.test.ts +++ b/test/first.test.ts @@ -1,10 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("first", () => { it("should return first element of sequence", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 2) .first(); + expect(result).toBe(3); }); @@ -19,12 +20,14 @@ describe("first", () => { it("should return first element matching predicate", () => { const result = sequenceOf(1, 2, 3) .first(it => it > 2); + expect(result).toBe(3); }); it("should return null if the first element is null", () => { const result = sequenceOf(null) .first(); + expect(result).toBeNull(); }); }); \ No newline at end of file diff --git a/test/firstOrNull.test.ts b/test/firstOrNull.test.ts index dde6bbd..0581394 100644 --- a/test/firstOrNull.test.ts +++ b/test/firstOrNull.test.ts @@ -1,10 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("firstOrNull", () => { it("should return first element of sequence", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 2) .firstOrNull(); + expect(result).toBe(3); }); @@ -12,12 +13,14 @@ describe("firstOrNull", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 3) .firstOrNull(); + expect(result).toBeNull(); }); it("should return first element matching predicate", () => { const result = sequenceOf(1, 2, 3) .firstOrNull(it => it > 2); + expect(result).toBe(3); }); }); \ No newline at end of file diff --git a/test/flatMap.test.ts b/test/flatMap.test.ts index 05baf13..ecbb3b5 100644 --- a/test/flatMap.test.ts +++ b/test/flatMap.test.ts @@ -1,4 +1,4 @@ -import {asSequence, sequenceOf} from "../src/Sequence"; +import {asSequence, sequenceOf} from "../src/sequency"; describe("flatMap", () => { it("should flatten element arrays", () => { @@ -6,12 +6,6 @@ describe("flatMap", () => { .flatMap(it => asSequence(it)) .toArray(); - expect(array.length).toBe(6); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); - expect(array[4]).toBe(5); - expect(array[5]).toBe(6); + expect(array).toEqual([1, 2, 3, 4, 5, 6]); }); }); \ No newline at end of file diff --git a/test/flatten.test.ts b/test/flatten.test.ts index faf9d09..aeb29d5 100644 --- a/test/flatten.test.ts +++ b/test/flatten.test.ts @@ -1,29 +1,19 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("flatten", () => { it("should flatten sequence of sequences", () => { const array = sequenceOf(sequenceOf(1, 2), sequenceOf(3, 4), sequenceOf(5, 6)) .flatten() .toArray(); - expect(array.length).toBe(6); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); - expect(array[4]).toBe(5); - expect(array[5]).toBe(6); + + expect(array).toEqual([1, 2, 3, 4, 5, 6]); }); it("should flatten sequence of arrays", () => { const array = sequenceOf([1, 2], [3, 4], [5, 6]) .flatten() .toArray(); - expect(array.length).toBe(6); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); - expect(array[4]).toBe(5); - expect(array[5]).toBe(6); + + expect(array).toEqual([1, 2, 3, 4, 5, 6]); }); }); \ No newline at end of file diff --git a/test/fold.test.ts b/test/fold.test.ts index 1873145..2efe3a7 100644 --- a/test/fold.test.ts +++ b/test/fold.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("fold", () => { it("should 23 + sum of all numbers", () => { const result = sequenceOf(1, 2, 3) .fold(23, (acc: number, value: number) => acc + value); + expect(result).toBe(29); }); it("should return initial value on empty sequence", () => { - const result = emptySequence() + const result = emptySequence() .fold(23, (acc: number, value: number) => acc + value); + expect(result).toBe(23); }); }); \ No newline at end of file diff --git a/test/foldIndexed.test.ts b/test/foldIndexed.test.ts index edb1f26..e1596e0 100644 --- a/test/foldIndexed.test.ts +++ b/test/foldIndexed.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("foldIndexed", () => { it("should 23 + sum of all numbers and indices", () => { const result = sequenceOf(1, 2, 3) .foldIndexed(23, (index: number, acc: number, element: number) => acc + element + index); + expect(result).toBe(32); }); it("should return initial value on empty sequence", () => { - const result = emptySequence() + const result = emptySequence() .foldIndexed(23, (index: number, acc: number, element: number) => acc + element + index); + expect(result).toBe(23); }); }); \ No newline at end of file diff --git a/test/forEach.test.ts b/test/forEach.test.ts index 2fb9f81..fb82d18 100644 --- a/test/forEach.test.ts +++ b/test/forEach.test.ts @@ -1,12 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("forEach", () => { it("should call action for each element", () => { - const array: Array = []; + const array: number[] = []; sequenceOf(1, 2, 3) .forEach(it => array.push(it)); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); + + expect(array).toEqual([1, 2, 3]); }); }); \ No newline at end of file diff --git a/test/forEachIndexed.test.ts b/test/forEachIndexed.test.ts index ac5a91b..993715d 100644 --- a/test/forEachIndexed.test.ts +++ b/test/forEachIndexed.test.ts @@ -1,12 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("forEach", () => { it("should call action for each element", () => { - const array = []; + const array: string[] = []; sequenceOf(1, 2, 3) .forEachIndexed((index, value) => array.push(`${index}: ${value}`)); - expect(array[0]).toBe("0: 1"); - expect(array[1]).toBe("1: 2"); - expect(array[2]).toBe("2: 3"); + + expect(array).toEqual(["0: 1", "1: 2", "2: 3"]); }); }); \ No newline at end of file diff --git a/test/generateSequence.test.ts b/test/generateSequence.test.ts index 66123c1..295a011 100644 --- a/test/generateSequence.test.ts +++ b/test/generateSequence.test.ts @@ -1,4 +1,4 @@ -import {generateSequence} from "../src/Sequence"; +import {generateSequence} from "../src/sequency"; describe("generateSequence", () => { it("should generate sequence", () => { @@ -6,12 +6,8 @@ describe("generateSequence", () => { const result = generateSequence(() => count++) .take(5) .toArray(); - expect(result.length).toBe(5); - expect(result[0]).toBe(0); - expect(result[1]).toBe(1); - expect(result[2]).toBe(2); - expect(result[3]).toBe(3); - expect(result[4]).toBe(4); + + expect(result).toEqual([0, 1, 2, 3, 4]); }); it("should generate sequence with drop and take", () => { @@ -20,35 +16,29 @@ describe("generateSequence", () => { .drop(5) .take(5) .toArray(); - expect(result.length).toBe(5); - expect(result[0]).toBe(5); - expect(result[1]).toBe(6); - expect(result[2]).toBe(7); - expect(result[3]).toBe(8); - expect(result[4]).toBe(9); + + expect(result).toEqual([5, 6, 7, 8, 9]); }); it("should generate sequence with seed", () => { const result = generateSequence(10, value => value + 1) .takeWhile(it => it < 15) .toArray(); - expect(result.length).toBe(5); - expect(result[0]).toBe(10); - expect(result[1]).toBe(11); - expect(result[2]).toBe(12); - expect(result[3]).toBe(13); - expect(result[4]).toBe(14); + + expect(result).toEqual([10, 11, 12, 13, 14]); }); it("should generate empty sequence with seed of null", () => { - const result = generateSequence(null as number, a => a) + const result = generateSequence(null as unknown as number, a => a) .count(); + expect(result).toBe(0); }); it("should generate empty sequence with seed of undefined", () => { - const result = generateSequence(undefined as number, a => a) + const result = generateSequence(undefined as unknown as number, a => a) .count(); + expect(result).toBe(0); }); @@ -56,23 +46,21 @@ describe("generateSequence", () => { const result = generateSequence(() => 10, value => value + 1) .takeWhile(it => it < 15) .toArray(); - expect(result.length).toBe(5); - expect(result[0]).toBe(10); - expect(result[1]).toBe(11); - expect(result[2]).toBe(12); - expect(result[3]).toBe(13); - expect(result[4]).toBe(14); + + expect(result).toEqual([10, 11, 12, 13, 14]); }); it("should generate empty sequence with seedFunction result of null", () => { - const result = generateSequence(() => null as number, a => a) + const result = generateSequence(() => null as unknown as number, a => a) .count(); + expect(result).toBe(0); }); it("should generate empty sequence with seedFunction result of undefined", () => { - const result = generateSequence(() => undefined as number, a => a) + const result = generateSequence(() => undefined as unknown as number, a => a) .count(); + expect(result).toBe(0); }); }); \ No newline at end of file diff --git a/test/groupBy.test.ts b/test/groupBy.test.ts index 59dedb4..ab439f9 100644 --- a/test/groupBy.test.ts +++ b/test/groupBy.test.ts @@ -1,19 +1,21 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("groupBy", () => { it("should group by keySelector", () => { - const a = {k: 1, v: 11}; - const b = {k: 2, v: 22}; - const c = {k: 3, v: 33}; - const d = {k: 2, v: 222}; + const a = {k: 1, v: 11} as const; + const b = {k: 2, v: 22} as const; + const c = {k: 3, v: 33} as const; + const d = {k: 2, v: 222} as const; - const map = sequenceOf(a, b, c, d) + const map = sequenceOf<{k: (typeof a)["k"] | (typeof b)["k"] | (typeof c)["k"] | (typeof d)["k"], v: number}>(a, b, c, d) .groupBy(it => it.k); - expect(map.size).toBe(3); - expect(map.get(1)[0]).toBe(a); - expect(map.get(2)[0]).toBe(b); - expect(map.get(2)[1]).toBe(d); - expect(map.get(3)[0]).toBe(c); + expect(map).toEqual( + new Map([ + [1, [a]], + [2, [b, d]], + [3, [c]] + ]) + ); }); }); \ No newline at end of file diff --git a/test/indexOf.test.ts b/test/indexOf.test.ts index 72bab96..7fe2582 100644 --- a/test/indexOf.test.ts +++ b/test/indexOf.test.ts @@ -1,15 +1,17 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("indexOf", () => { it("should return index of element", () => { const index = sequenceOf(1, 2, 3) .indexOf(3); + expect(index).toBe(2); }); it("should return -1 if element not found", () => { const index = sequenceOf(1, 2, 3) .indexOf(4); + expect(index).toBe(-1); }); }); \ No newline at end of file diff --git a/test/indexOfFirst.test.ts b/test/indexOfFirst.test.ts index 5733b19..d5770ce 100644 --- a/test/indexOfFirst.test.ts +++ b/test/indexOfFirst.test.ts @@ -1,9 +1,10 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("indexOfFirst", () => { it("should return index of first element matching given predicate", () => { const index = sequenceOf(1, 2, 2, 3) .indexOfFirst(it => it > 1); + expect(index).toBe(1); }); }); \ No newline at end of file diff --git a/test/indexOfLast.test.ts b/test/indexOfLast.test.ts index 21f735d..9aad2e4 100644 --- a/test/indexOfLast.test.ts +++ b/test/indexOfLast.test.ts @@ -1,9 +1,10 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("indexOfLast", () => { it("should return index of last element matching given predicate", () => { const index = sequenceOf(1, 2, 2, 1) .indexOfLast(it => it > 1); + expect(index).toBe(2); }); }); \ No newline at end of file diff --git a/test/joinTo.test.ts b/test/joinTo.test.ts index d31999a..fd71828 100644 --- a/test/joinTo.test.ts +++ b/test/joinTo.test.ts @@ -1,9 +1,10 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("joinTo", () => { it("should join to given string", () => { const result = sequenceOf(1, 2, 3) .joinTo({value: "List: ", prefix: "[ ", postfix: " ]"}); + expect(result).toBe("List: [ 1, 2, 3 ]"); }); }); \ No newline at end of file diff --git a/test/joinToString.test.ts b/test/joinToString.test.ts index 1711b54..cf1afd8 100644 --- a/test/joinToString.test.ts +++ b/test/joinToString.test.ts @@ -1,33 +1,38 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("joinToString", () => { it("should join to string using default config", () => { const result = sequenceOf(1, 2, 3) .joinToString(); + expect(result).toBe("1, 2, 3"); }); it("should join to string using different separator", () => { const result = sequenceOf(1, 2, 3) .joinToString({separator: " | "}); + expect(result).toBe("1 | 2 | 3"); }); it("should join to string using different prefix and postfix", () => { const result = sequenceOf(1, 2, 3) .joinToString({prefix: "[ ", postfix: " ]"}); + expect(result).toBe("[ 1, 2, 3 ]"); }); it("should join to string using transform function", () => { const result = sequenceOf(1, 2, 3) .joinToString({transform: num => `a${num}`}); + expect(result).toBe("a1, a2, a3"); }); it("should join to string limiting number of items joined", () => { const result = sequenceOf(1, 2, 3, 4, 5) .joinToString({limit: 3}); + expect(result).toBe("1, 2, 3, ..."); }); }); \ No newline at end of file diff --git a/test/last.test.ts b/test/last.test.ts index f6fe2b3..313a98d 100644 --- a/test/last.test.ts +++ b/test/last.test.ts @@ -1,10 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("last", () => { it("should return last element of sequence", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 1) .last(); + expect(result).toBe(3); }); @@ -19,12 +20,14 @@ describe("last", () => { it("should return last element matching predicate", () => { const result = sequenceOf(1, 2, 3) .last(it => it > 1); + expect(result).toBe(3); }); it("should return null if the last element is null", () => { const result = sequenceOf(1, 2, null) .last(); + expect(result).toBeNull(); }); }); \ No newline at end of file diff --git a/test/lastOrNull.test.ts b/test/lastOrNull.test.ts index 7bdbb44..37a972b 100644 --- a/test/lastOrNull.test.ts +++ b/test/lastOrNull.test.ts @@ -1,9 +1,10 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("lastOrNull", () => { it("should return last element of sequence", () => { const result = sequenceOf(1, 2, 3) .lastOrNull(); + expect(result).toBe(3); }); @@ -11,12 +12,14 @@ describe("lastOrNull", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 3) .lastOrNull(); + expect(result).toBeNull(); }); it("should return last element matching predicate", () => { const result = sequenceOf(1, 2, 3) .lastOrNull(it => it > 1); + expect(result).toBe(3); }); }); \ No newline at end of file diff --git a/test/map.test.ts b/test/map.test.ts index aca0314..5b43394 100644 --- a/test/map.test.ts +++ b/test/map.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("map", () => { it("should map numbers to strings", () => { @@ -6,9 +6,6 @@ describe("map", () => { .map(it => `num ${it}`) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe("num 1"); - expect(array[1]).toBe("num 2"); - expect(array[2]).toBe("num 3"); + expect(array).toEqual(["num 1", "num 2", "num 3"]); }); }); \ No newline at end of file diff --git a/test/mapIndexed.test.ts b/test/mapIndexed.test.ts index 594e3f9..b07c53d 100644 --- a/test/mapIndexed.test.ts +++ b/test/mapIndexed.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("mapIndexed", () => { it("should map elements by index and value", () => { @@ -6,9 +6,6 @@ describe("mapIndexed", () => { .mapIndexed((index, value) => `${index}: ${value}`) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe("0: 1"); - expect(array[1]).toBe("1: 2"); - expect(array[2]).toBe("2: 3"); + expect(array).toEqual(["0: 1", "1: 2", "2: 3"]); }); }); \ No newline at end of file diff --git a/test/mapNotNull.test.ts b/test/mapNotNull.test.ts index 8dfa65d..fbb0714 100644 --- a/test/mapNotNull.test.ts +++ b/test/mapNotNull.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("mapNotNull", () => { it("should map to non-null items", () => { @@ -7,12 +7,10 @@ describe("mapNotNull", () => { const a3 = {a: null}; const a4 = {a: 4}; - const array = sequenceOf(a1, a2, a3, a4) + const array = sequenceOf<{a: number | null}>(a1, a2, a3, a4) .mapNotNull(it => it.a) .toArray(); - expect(array.length).toBe(2); - expect(array[0]).toBe(1); - expect(array[1]).toBe(4); + expect(array).toEqual([1, 4]); }); }); \ No newline at end of file diff --git a/test/max.test.ts b/test/max.test.ts index 415a118..70304a1 100644 --- a/test/max.test.ts +++ b/test/max.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("max", () => { it("should return max element", () => { const num = sequenceOf(1, 3, 2, 6, 3) .max(); + expect(num).toBe(6); }); it("should return null on empty sequence", () => { const num = emptySequence() .max(); + expect(num).toBeNull(); }); }); \ No newline at end of file diff --git a/test/maxBy.test.ts b/test/maxBy.test.ts index 7d9980a..bc4aa84 100644 --- a/test/maxBy.test.ts +++ b/test/maxBy.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("maxBy", () => { it("should return max element by selector", () => { const num = sequenceOf({a: 1}, {a: 3}, {a: 2}) .maxBy(it => it.a); + expect(num).toEqual({a: 3}); }); it("should return null on empty sequence", () => { const num = emptySequence() .maxBy(() => void(0)); + expect(num).toBeNull(); }); }); \ No newline at end of file diff --git a/test/maxWith.test.ts b/test/maxWith.test.ts index 701c738..092df43 100644 --- a/test/maxWith.test.ts +++ b/test/maxWith.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("maxWith", () => { it("should return max element by comparator", () => { const num = sequenceOf({a: 1}, {a: 3}, {a: 2}) .maxWith((o1, o2) => o1.a > o2.a ? 1 : (o1.a < o2.a ? -1 : 0)); + expect(num).toEqual({a: 3}); }); it("should return null on empty sequence", () => { const num = emptySequence() - .maxWith(() => void(0)); + .maxWith(() => 0); + expect(num).toBeNull(); }); }); \ No newline at end of file diff --git a/test/merge.test.ts b/test/merge.test.ts index c62da42..2d3856e 100644 --- a/test/merge.test.ts +++ b/test/merge.test.ts @@ -1,10 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("merge", () => { it("should merge both sequences", () => { const result = sequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) .merge(sequenceOf({id: 2, val: "bb"}), it => it.id) .toArray(); + expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); }); @@ -12,6 +13,7 @@ describe("merge", () => { const result = sequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) .merge([{id: 2, val: "bb"}], it => it.id) .toArray(); + expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); }); @@ -19,6 +21,7 @@ describe("merge", () => { const result = sequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) .merge(sequenceOf({id: 2, val: "bb"}, {id: 4, val: "d"}), it => it.id) .toArray(); + expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}, {id: 4, val: "d"}]); }); @@ -26,6 +29,7 @@ describe("merge", () => { const result = sequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) .merge(sequenceOf({id: 2, val: "bb"}, {id: 4, val: "d"}), it => it.id, true) .toArray(); + expect(result).toEqual([{id: 4, val: "d"}, {id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); }); }); \ No newline at end of file diff --git a/test/min.test.ts b/test/min.test.ts index 896a1ff..2e84b1d 100644 --- a/test/min.test.ts +++ b/test/min.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("min", () => { it("should return min element", () => { const num = sequenceOf(3, 1, 2, 6, 3) .min(); + expect(num).toBe(1); }); it("should return null on empty sequence", () => { const num = emptySequence() .min(); + expect(num).toBeNull(); }); }); \ No newline at end of file diff --git a/test/minBy.test.ts b/test/minBy.test.ts index e1d8cf5..26d4ab4 100644 --- a/test/minBy.test.ts +++ b/test/minBy.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("minBy", () => { it("should return min element by selector", () => { const num = sequenceOf({a: 1}, {a: 3}, {a: 2}) .minBy(it => it.a); + expect(num).toEqual({a: 1}); }); it("should return null on empty sequence", () => { const num = emptySequence() - .minBy(() => void(0)); + .minBy(() => 0); + expect(num).toBeNull(); }); }); \ No newline at end of file diff --git a/test/minWith.test.ts b/test/minWith.test.ts index 05af31b..a85d7fe 100644 --- a/test/minWith.test.ts +++ b/test/minWith.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("minWith", () => { it("should return min element by comparator", () => { const num = sequenceOf({a: 1}, {a: 3}, {a: 2}) .minWith((o1, o2) => o1.a > o2.a ? 1 : (o1.a < o2.a ? -1 : 0)); + expect(num).toEqual({a: 1}); }); it("should return null on empty sequence", () => { const num = emptySequence() - .maxWith(() => void(0)); + .maxWith(() => 0); + expect(num).toBeNull(); }); }); \ No newline at end of file diff --git a/test/minus.test.ts b/test/minus.test.ts index 6210362..319c34c 100644 --- a/test/minus.test.ts +++ b/test/minus.test.ts @@ -1,40 +1,35 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("minus", () => { it("should remove element", () => { const array = sequenceOf(1, 2, 3) .minus(1) .toArray(); - expect(array.length).toBe(2); - expect(array[0]).toBe(2); - expect(array[1]).toBe(3); + + expect(array).toEqual([2, 3]); }); it("should remove array", () => { const array = sequenceOf(1, 2, 3, 4, 5) .minus([2, 4]) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe(1); - expect(array[1]).toBe(3); - expect(array[2]).toBe(5); + + expect(array).toEqual([1, 3, 5]); }); it("should append sequence", () => { const array = sequenceOf(1, 2, 3) .minus(sequenceOf(1, 2)) .toArray(); - expect(array.length).toBe(1); - expect(array[0]).toBe(3); + + expect(array).toEqual([3]); }); it("should append empty sequence", () => { const array = sequenceOf(1, 2, 3) .minus(emptySequence()) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); + + expect(array).toEqual([1, 2, 3]); }); }); \ No newline at end of file diff --git a/test/none.test.ts b/test/none.test.ts index c2f02ec..9a19fc4 100644 --- a/test/none.test.ts +++ b/test/none.test.ts @@ -1,10 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("none", () => { it("should return false", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 1) .none(); + expect(result).toBe(false); }); @@ -12,18 +13,21 @@ describe("none", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 3) .none(); + expect(result).toBe(true); }); it("should evaluate predicate and return false", () => { const result = sequenceOf(1, 2, 3) .none(it => it > 1); + expect(result).toBe(false); }); it("should evaluate predicate and return true", () => { const result = sequenceOf(1, 2, 3) .none(it => it > 3); + expect(result).toBe(true); }); }); \ No newline at end of file diff --git a/test/onEach.test.ts b/test/onEach.test.ts index 7b002db..e9913ef 100644 --- a/test/onEach.test.ts +++ b/test/onEach.test.ts @@ -1,13 +1,13 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("onEach", () => { it("should call action for each element", () => { - const array = []; + const array: number[] = []; const result = sequenceOf(1, 2, 3) .onEach(it => array.push(it)) .toArray(); - expect(array[0]).toBe(result[0]); - expect(array[1]).toBe(result[1]); - expect(array[2]).toBe(result[2]); + + expect(array).toEqual([1, 2, 3]); + expect(result).toEqual(array); }); }); \ No newline at end of file diff --git a/test/partition.test.ts b/test/partition.test.ts index f5058b7..9a6e0ad 100644 --- a/test/partition.test.ts +++ b/test/partition.test.ts @@ -1,16 +1,13 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("partition", () => { it("should partition based on the given predicate", () => { const result = sequenceOf(1, 2, 3, 4) .partition(it => it % 2 === 1); - expect(result.true.length).toBe(2); - expect(result.true[0]).toBe(1); - expect(result.true[1]).toBe(3); - - expect(result.false.length).toBe(2); - expect(result.false[0]).toBe(2); - expect(result.false[1]).toBe(4); + expect(result).toHaveProperty("true"); + expect(result).toHaveProperty("false"); + expect(result.true).toEqual([1, 3]); + expect(result.false).toEqual([2, 4]); }); }); \ No newline at end of file diff --git a/test/plus.test.ts b/test/plus.test.ts index 05c3fb1..a986270 100644 --- a/test/plus.test.ts +++ b/test/plus.test.ts @@ -1,48 +1,35 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("plus", () => { it("should append element", () => { const array = sequenceOf(1, 2, 3) .plus(4) .toArray(); - expect(array.length).toBe(4); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); + + expect(array).toEqual([1, 2, 3, 4]); }); it("should append array", () => { const array = sequenceOf(1, 2, 3) .plus([4, 5]) .toArray(); - expect(array.length).toBe(5); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); - expect(array[4]).toBe(5); + + expect(array).toEqual([1, 2, 3, 4, 5]); }); it("should append sequence", () => { const array = sequenceOf(1, 2, 3) .plus(sequenceOf(4, 5)) .toArray(); - expect(array.length).toBe(5); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); - expect(array[4]).toBe(5); + + expect(array).toEqual([1, 2, 3, 4, 5]); }); it("should append empty sequence", () => { const array = sequenceOf(1, 2, 3) .plus(emptySequence()) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); + + expect(array).toEqual([1, 2, 3]); }); }); \ No newline at end of file diff --git a/test/range.test.ts b/test/range.test.ts index 4b2403e..8420985 100644 --- a/test/range.test.ts +++ b/test/range.test.ts @@ -1,27 +1,37 @@ -import {range} from "../src/Sequence"; +import {range} from "../src/sequency"; describe("range", () => { it("should create range of numbers with step = 1", () => { - const numbers = range(0, 5).toArray(); + const numbers = range(0, 5) + .toArray(); + expect(numbers).toEqual([0, 1, 2, 3, 4, 5]); }); it("should create range of numbers with step = .5", () => { - const numbers = range(0, 4, .5).toArray(); + const numbers = range(0, 4, .5) + .toArray(); + expect(numbers).toEqual([0, .5, 1, 1.5, 2, 2.5, 3, 3.5, 4.0]); }); it("should include one element", () => { - const numbers = range(0, 0).toArray(); + const numbers = range(0, 0) + .toArray(); + expect(numbers).toEqual([0]); }); it("should include two element", () => { - const numbers = range(0, 1).toArray(); + const numbers = range(0, 1) + .toArray(); + expect(numbers).toEqual([0, 1]); }); it("should throw on invalid boundaries", () => { - expect(() => range(1, 0)).toThrow(); + expect( + () => range(1, 0) + ).toThrow(); }); }); diff --git a/test/reduce.test.ts b/test/reduce.test.ts index 0406a83..1cd813a 100644 --- a/test/reduce.test.ts +++ b/test/reduce.test.ts @@ -1,15 +1,17 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("reduce", () => { it("should sum all numbers", () => { const result = sequenceOf(1, 2, 3) .reduce((acc: number, value: number) => acc + value); + expect(result).toBe(6); }); it("should concat all strings", () => { const result = sequenceOf("a", "b", "c") .reduce((acc: string, value: string) => `${acc}, ${value}`); + expect(result).toBe("a, b, c"); }); }); \ No newline at end of file diff --git a/test/reduceIndexed.test.ts b/test/reduceIndexed.test.ts index 53cf09e..ba8766a 100644 --- a/test/reduceIndexed.test.ts +++ b/test/reduceIndexed.test.ts @@ -1,9 +1,10 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("reduceIndexed", () => { it("should sum all numbers + indices", () => { const result = sequenceOf(1, 2, 3) .reduceIndexed((index: number, acc: number, value: number) => acc + value + index); + expect(result).toBe(9); }); }); \ No newline at end of file diff --git a/test/reverse.test.ts b/test/reverse.test.ts index 4588d50..2043a81 100644 --- a/test/reverse.test.ts +++ b/test/reverse.test.ts @@ -1,13 +1,11 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("reverse", () => { it("should reverse order", () => { const array = sequenceOf(1, 2, 3) .reverse() .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toBe(3); - expect(array[1]).toBe(2); - expect(array[2]).toBe(1); + + expect(array).toEqual([3, 2, 1]); }); }); \ No newline at end of file diff --git a/test/sequenceOf.test.ts b/test/sequenceOf.test.ts index 49e9fe9..f5c4839 100644 --- a/test/sequenceOf.test.ts +++ b/test/sequenceOf.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("sequenceOf", () => { it("filter-map-toArray", () => { @@ -7,8 +7,6 @@ describe("sequenceOf", () => { .map(it => `num ${it}`) .toArray(); - expect(array.length).toBe(2); - expect(array[0]).toBe("num 2"); - expect(array[1]).toBe("num 3"); + expect(array).toEqual(["num 2", "num 3"]); }); }); \ No newline at end of file diff --git a/test/single.test.ts b/test/single.test.ts index c35cba2..bcad089 100644 --- a/test/single.test.ts +++ b/test/single.test.ts @@ -1,10 +1,10 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; -import single from "../src/single"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("single", () => { it("should return single element", () => { const result = sequenceOf(23) .single(); + expect(result).toBe(23); }); @@ -23,6 +23,7 @@ describe("single", () => { it("should evaluate predicate and return single element", () => { const result = sequenceOf(1, 2, 3) .single(it => it > 2); + expect(result).toBe(3); }); diff --git a/test/singleOrNull.test.ts b/test/singleOrNull.test.ts index 0cd3947..fd6abb9 100644 --- a/test/singleOrNull.test.ts +++ b/test/singleOrNull.test.ts @@ -1,39 +1,45 @@ -import {emptySequence, sequenceOf} from "../src/Sequence"; +import {emptySequence, sequenceOf} from "../src/sequency"; describe("singleOrNull", () => { it("should return single element", () => { const result = sequenceOf(23) .singleOrNull(); + expect(result).toBe(23); }); it("should return null with more than one element", () => { const result = sequenceOf(1, 2) .singleOrNull(); + expect(result).toBeNull(); }); it("should return null with zero elements", () => { const result = emptySequence() .singleOrNull(); + expect(result).toBeNull(); }); it("should evaluate predicate and return single element", () => { const result = sequenceOf(1, 2, 3) .singleOrNull(it => it > 2); + expect(result).toBe(3); }); it("should evaluate predicate and return null with more than one element", () => { const result = sequenceOf(1, 2, 3) .singleOrNull(it => it > 1); + expect(result).toBeNull(); }); it("should evaluate predicate and return null with zero elements", () => { const result = sequenceOf(1, 2, 3) .singleOrNull(it => it > 3); + expect(result).toBeNull(); }); }); \ No newline at end of file diff --git a/test/sorted.test.ts b/test/sorted.test.ts index 693e40f..dbafe94 100644 --- a/test/sorted.test.ts +++ b/test/sorted.test.ts @@ -1,34 +1,27 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("sorted", () => { it("should sort numbers ascending", () => { const array = sequenceOf(1, 4, 3, 5, 2) .sorted() .toArray(); - expect(array.length).toBe(5); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); - expect(array[4]).toBe(5); + + expect(array).toEqual([1, 2, 3, 4, 5]); }); it("should sort strings ascending", () => { const array = sequenceOf("1", "4", "3", "5", "2") .sorted() .toArray(); - expect(array.length).toBe(5); - expect(array[0]).toBe("1"); - expect(array[1]).toBe("2"); - expect(array[2]).toBe("3"); - expect(array[3]).toBe("4"); - expect(array[4]).toBe("5"); + + expect(array).toEqual(["1", "2", "3", "4", "5"]); }); it("should sort numbers by natural order", () => { const array = sequenceOf(1, 4, 3, 5, 2) .sorted(it => it.naturalOrder()) .toArray(); + expect(array).toEqual([1, 2, 3, 4, 5]); }); @@ -37,6 +30,7 @@ describe("sorted", () => { .sorted(it => it.naturalOrder() .reversed()) .toArray(); + expect(array).toEqual([5, 4, 3, 2, 1]); }); @@ -44,21 +38,24 @@ describe("sorted", () => { const array = sequenceOf(1, 4, 3, 5, 2) .sorted(it => it.reverseOrder()) .toArray(); + expect(array).toEqual([5, 4, 3, 2, 1]); }); it("should sort by given compareFn", () => { - const fn = (a, b) => a < b ? 1 : a > b ? -1 : 0; + const fn = (a: number, b: number) => a < b ? 1 : a > b ? -1 : 0; const array = sequenceOf(1, 4, 3, 5, 2) .sorted(it => it.compare(fn)) .toArray(); + expect(array).toEqual([5, 4, 3, 2, 1]); }); - it("should sort by comparing the given property", () => { + it("should sort by comparing the selected property", () => { const array = sequenceOf({x: 2}, {x: 1}, {x: 3}) .sorted(it => it.compareBy(it => it.x)) .toArray(); + expect(array).toEqual([{x: 1}, {x: 2}, {x: 3}]); }); @@ -66,21 +63,24 @@ describe("sorted", () => { const array = sequenceOf({x: 2}, {x: 1}, {x: 3}) .sorted(it => it.compareBy("x")) .toArray(); + expect(array).toEqual([{x: 1}, {x: 2}, {x: 3}]); }); - it("should sort by comparing the given property in reversed order", () => { + it("should sort by comparing the selected property in reversed order", () => { const array = sequenceOf({x: 2}, {x: 1}, {x: 3}) .sorted(it => it.compareBy(it => it.x) .reversed()) .toArray(); + expect(array).toEqual([{x: 3}, {x: 2}, {x: 1}]); }); - it("should sort by comparing the given property descending", () => { + it("should sort by comparing the selected property descending", () => { const array = sequenceOf({x: 2}, {x: 1}, {x: 3}) .sorted(it => it.compareByDescending(it => it.x)) .toArray(); + expect(array).toEqual([{x: 3}, {x: 2}, {x: 1}]); }); @@ -88,18 +88,17 @@ describe("sorted", () => { const array = sequenceOf({x: 2}, {x: 1}, {x: 3}) .sorted(it => it.compareByDescending("x")) .toArray(); + expect(array).toEqual([{x: 3}, {x: 2}, {x: 1}]); }); - it("should sort by comparing the given property then other property", () => { + it("should sort by comparing the selected property then other property", () => { const array = sequenceOf({x: 2, y: 2}, {x: 1, y: 2}, {x: 1, y: 1}) .sorted(it => it.compareBy(it => it.x) .thenBy(it => it.y)) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toEqual({x: 1, y: 1}); - expect(array[1]).toEqual({x: 1, y: 2}); - expect(array[2]).toEqual({x: 2, y: 2}); + + expect(array).toEqual([{x: 1, y: 1}, {x: 1, y: 2}, {x: 2, y: 2}]); }); it("should sort by comparing the given key then other key", () => { @@ -107,25 +106,50 @@ describe("sorted", () => { .sorted(it => it.compareBy("x") .thenBy("y")) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toEqual({x: 1, y: 1}); - expect(array[1]).toEqual({x: 1, y: 2}); - expect(array[2]).toEqual({x: 2, y: 2}); + + expect(array).toEqual([{x: 1, y: 1}, {x: 1, y: 2}, {x: 2, y: 2}]); + }); + + it("should sort by comparing the selected property then other property with nulls last", () => { + const array = sequenceOf({x: 2, y: 2}, undefined, null, {x: 1, y: 2}, {x: null, y: undefined}, {x: 1, y: 1}) + .sorted(it => it.compareBy(it => it?.x) + .thenBy(it => it?.y)) + .toArray(); + + expect(array).toEqual([{x: 1, y: 1}, {x: 1, y: 2}, {x: 2, y: 2}, {x: null, y: undefined}, null, undefined]); + }); + + it("should sort by comparing the given key then other key with nulls last", () => { + const array = sequenceOf({x: 2, y: 2}, undefined, null, {x: 1, y: 2}, {x: null, y: undefined}, {x: 1, y: 1}) + .sorted(it => it.compareBy("x") + .thenBy("y")) + .toArray(); + + expect(array).toEqual([{x: 1, y: 1}, {x: 1, y: 2}, {x: 2, y: 2}, {x: null, y: undefined}, null, undefined]); + }); + + it("should order nulls first", () => { + const array = sequenceOf({x: 2}, null, {x: 1}, {x: 3}, null) + .sorted(it => it.nullsFirst()) + .toArray(); + + expect(array).toEqual([null, null, {x: 2}, {x: 1}, {x: 3}]); }); it("should order nulls last", () => { const array = sequenceOf({x: 2}, null, {x: 1}, {x: 3}, null) - .sorted(it => it.nullsLast() - .thenBy(it => it.x)) + .sorted(it => it.nullsLast()) .toArray(); - expect(array).toEqual([{x: 1}, {x: 2}, {x: 3}, null, null]); + + expect(array).toEqual([{x: 2}, {x: 1}, {x: 3}, null, null]); }); it("should order nulls first then by descending selected property", () => { const array = sequenceOf({x: 2}, null, {x: 1}, {x: 3}, null) .sorted(it => it.nullsFirst() - .thenByDescending(it => it.x)) + .thenByDescending(it => it?.x)) .toArray(); + expect(array).toEqual([null, null, {x: 3}, {x: 2}, {x: 1}]); }); @@ -134,6 +158,7 @@ describe("sorted", () => { .sorted(it => it.nullsFirst() .thenByDescending("x")) .toArray(); + expect(array).toEqual([null, null, {x: 3}, {x: 2}, {x: 1}]); }); }); \ No newline at end of file diff --git a/test/sortedBy.test.ts b/test/sortedBy.test.ts index fc1b426..9ff49d9 100644 --- a/test/sortedBy.test.ts +++ b/test/sortedBy.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("sortedBy", () => { it("should sort by the given key ascending", () => { @@ -11,10 +11,6 @@ describe("sortedBy", () => { .sortedBy(it => it.a) .toArray(); - expect(array.length).toBe(4); - expect(array[0]).toBe(a1); - expect(array[1]).toBe(a3); - expect(array[2]).toBe(a4); - expect(array[3]).toBe(a23); + expect(array).toEqual([a1, a3, a4, a23]); }); }); \ No newline at end of file diff --git a/test/sortedByDescending.test.ts b/test/sortedByDescending.test.ts index 27fc2d8..bfa6edd 100644 --- a/test/sortedByDescending.test.ts +++ b/test/sortedByDescending.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("sortedBy", () => { it("should sort by the given key descending", () => { @@ -11,10 +11,6 @@ describe("sortedBy", () => { .sortedByDescending(it => it.a) .toArray(); - expect(array.length).toBe(4); - expect(array[0]).toBe(a23); - expect(array[1]).toBe(a4); - expect(array[2]).toBe(a3); - expect(array[3]).toBe(a1); + expect(array).toEqual([a23, a4, a3, a1]); }); }); \ No newline at end of file diff --git a/test/sortedDescending.test.ts b/test/sortedDescending.test.ts index 6e2bbde..910b2d4 100644 --- a/test/sortedDescending.test.ts +++ b/test/sortedDescending.test.ts @@ -1,27 +1,19 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("sorted", () => { it("should sort numbers descending", () => { const array = sequenceOf(1, 4, 3, 5, 2) .sortedDescending() .toArray(); - expect(array.length).toBe(5); - expect(array[0]).toBe(5); - expect(array[1]).toBe(4); - expect(array[2]).toBe(3); - expect(array[3]).toBe(2); - expect(array[4]).toBe(1); + + expect(array).toEqual([5, 4, 3, 2, 1]); }); it("should sort strings descending", () => { const array = sequenceOf("1", "4", "3", "5", "2") .sortedDescending() .toArray(); - expect(array.length).toBe(5); - expect(array[0]).toBe("5"); - expect(array[1]).toBe("4"); - expect(array[2]).toBe("3"); - expect(array[3]).toBe("2"); - expect(array[4]).toBe("1"); + + expect(array).toEqual(["5", "4", "3", "2", "1"]); }); }); \ No newline at end of file diff --git a/test/sortedWith.test.ts b/test/sortedWith.test.ts index c0d3d26..dd823ad 100644 --- a/test/sortedWith.test.ts +++ b/test/sortedWith.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("sortedWith", () => { it("should sort numbers by given comparator", () => { @@ -13,11 +13,7 @@ describe("sortedWith", () => { return 0; }) .toArray(); - expect(array.length).toBe(5); - expect(array[0]).toBe(5); - expect(array[1]).toBe(4); - expect(array[2]).toBe(3); - expect(array[3]).toBe(2); - expect(array[4]).toBe(1); + + expect(array).toEqual([5, 4, 3, 2, 1]); }); }); \ No newline at end of file diff --git a/test/sum.test.ts b/test/sum.test.ts index 81bb2af..612689e 100644 --- a/test/sum.test.ts +++ b/test/sum.test.ts @@ -1,9 +1,10 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("sum", () => { it("should sum all numbers", () => { const result = sequenceOf(1, 2, 3) .sum(); + expect(result).toBe(6); }); }); \ No newline at end of file diff --git a/test/sumBy.test.ts b/test/sumBy.test.ts index b4a82d5..c9ed3a7 100644 --- a/test/sumBy.test.ts +++ b/test/sumBy.test.ts @@ -1,9 +1,10 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("sumBy", () => { it("should sum all selected numbers", () => { const result = sequenceOf({a: 2}, {a: 4}, {a: 6}) .sumBy(it => it.a); + expect(result).toBe(12); }); }); \ No newline at end of file diff --git a/test/take.test.ts b/test/take.test.ts index e0b3946..bc9e5a0 100644 --- a/test/take.test.ts +++ b/test/take.test.ts @@ -1,19 +1,19 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("take", () => { it("should take first 2 items", () => { const result = sequenceOf(1, 2, 3, 4) .take(2) .toArray(); - expect(result.length).toBe(2); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); + + expect(result).toEqual([1, 2]); }); it("should take no items", () => { const result = sequenceOf(1, 2, 3, 4) .take(0) .toArray(); + expect(result.length).toBe(0); }); @@ -21,17 +21,15 @@ describe("take", () => { const result = sequenceOf(1, 2, 3, 4) .take(10) .toArray(); - expect(result.length).toBe(4); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); - expect(result[2]).toBe(3); - expect(result[3]).toBe(4); + + expect(result).toEqual([1, 2, 3, 4]); }); it("should take nothing for n < 0", () => { const result = sequenceOf(1, 2, 3) .take(-10) .toArray(); + expect(result.length).toBe(0); }); }); \ No newline at end of file diff --git a/test/takeWhile.test.ts b/test/takeWhile.test.ts index c047cbf..34d31e8 100644 --- a/test/takeWhile.test.ts +++ b/test/takeWhile.test.ts @@ -1,19 +1,19 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("takeWhile", () => { it("should take elements until predicate evaluates to false", () => { const result = sequenceOf(1, 2, 3, 2, 1) .takeWhile(it => it < 3) .toArray(); - expect(result.length).toBe(2); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); + + expect(result).toEqual([1, 2]); }); it("should take no elements", () => { const result = sequenceOf(1, 2, 3) .takeWhile(it => it > 3) .toArray(); + expect(result.length).toBe(0); }); @@ -21,9 +21,7 @@ describe("takeWhile", () => { const result = sequenceOf(1, 2, 3) .takeWhile(it => it > 0) .toArray(); - expect(result.length).toBe(3); - expect(result[0]).toBe(1); - expect(result[1]).toBe(2); - expect(result[2]).toBe(3); + + expect(result).toEqual([1, 2, 3]); }); }); \ No newline at end of file diff --git a/test/toArray.test.ts b/test/toArray.test.ts index b2bd140..1b8e565 100644 --- a/test/toArray.test.ts +++ b/test/toArray.test.ts @@ -1,26 +1,21 @@ -import {asSequence, sequenceOf} from "../src/Sequence"; +import {asSequence, sequenceOf} from "../src/sequency"; describe("toArray", () => { it("should return new array", () => { const input = [1, 2, 3]; const array = asSequence(input) .toArray(); - expect(input).not.toBe(array); - expect(array.length).toBe(3); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); + + expect(array).not.toBe(input); + expect(array).toEqual(input); }); it("should append items to passed array", () => { const array = [1]; const result = sequenceOf(2, 3, 4) .toArray(array); + expect(result).toBe(array); - expect(array.length).toBe(4); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); + expect(result).toEqual([1, 2, 3, 4]); }); }); diff --git a/test/toList.test.ts b/test/toList.test.ts index b5e7236..2997ed6 100644 --- a/test/toList.test.ts +++ b/test/toList.test.ts @@ -1,26 +1,21 @@ -import {asSequence, sequenceOf} from "../src/Sequence"; +import {asSequence, sequenceOf} from "../src/sequency"; describe("toList", () => { it("should return new array", () => { const input = [1, 2, 3]; const array = asSequence(input) .toList(); - expect(input).not.toBe(array); - expect(array.length).toBe(3); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); + + expect(array).not.toBe(input); + expect(array).toEqual(input); }); it("should append items to passed array", () => { const array = [1]; const result = sequenceOf(2, 3, 4) .toList(array); + expect(result).toBe(array); - expect(array.length).toBe(4); - expect(array[0]).toBe(1); - expect(array[1]).toBe(2); - expect(array[2]).toBe(3); - expect(array[3]).toBe(4); + expect(result).toEqual([1, 2, 3, 4]); }); }); diff --git a/test/toMap.test.ts b/test/toMap.test.ts index 42e7106..8ee3f3a 100644 --- a/test/toMap.test.ts +++ b/test/toMap.test.ts @@ -1,17 +1,21 @@ -import {asSequence} from "../src/Sequence"; +import {asSequence} from "../src/sequency"; describe("toMap", () => { it("should return items as new map", () => { const key1 = {k: 1}; const key2 = {k: 2}; const key3 = {k: 3}; - const array: Array<[object, string]> = [[key1, "a"], [key2, "b"], [key3, "c"]]; + const array: [object, string][] = [[key1, "a"], [key2, "b"], [key3, "c"]]; const map = asSequence(array) .toMap(); - expect(map.size).toBe(3); - expect(map.get(key1)).toBe("a"); - expect(map.get(key2)).toBe("b"); - expect(map.get(key3)).toBe("c"); + + expect(map).toEqual( + new Map([ + [key1, "a"], + [key2, "b"], + [key3, "c"] + ]) + ); }); it("should append items to passed map", () => { @@ -23,14 +27,17 @@ describe("toMap", () => { const existingMap = new Map(); existingMap.set(key0, "_"); - const array: Array<[object, string]> = [[key1, "a"], [key2, "b"], [key3, "c"]]; + const array: [object, string][] = [[key1, "a"], [key2, "b"], [key3, "c"]]; const result = asSequence(array) .toMap(existingMap); - expect(result.size).toBe(4); - expect(result.get(key0)).toBe("_"); - expect(result.get(key1)).toBe("a"); - expect(result.get(key2)).toBe("b"); - expect(result.get(key3)).toBe("c"); + expect(result).toEqual( + new Map([ + [key0, "_"], + [key1, "a"], + [key2, "b"], + [key3, "c"] + ]) + ); }); }); \ No newline at end of file diff --git a/test/toSet.test.ts b/test/toSet.test.ts index 575fa4a..a55fd10 100644 --- a/test/toSet.test.ts +++ b/test/toSet.test.ts @@ -1,24 +1,19 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("toSet", () => { it("should return new set of distinct items", () => { const result = sequenceOf(1, 2, 2, 3, 3, 3) .toSet(); - expect(result.size).toBe(3); - expect(result.has(1)).toBe(true); - expect(result.has(2)).toBe(true); - expect(result.has(3)).toBe(true); + + expect(result).toEqual(new Set([1, 2, 3])); }); it("should add distinct items to existing set", () => { const existingSet = new Set([4]); const result = sequenceOf(1, 2, 2, 3, 3, 3) .toSet(existingSet); + expect(result).toBe(existingSet); - expect(result.size).toBe(4); - expect(result.has(1)).toBe(true); - expect(result.has(2)).toBe(true); - expect(result.has(3)).toBe(true); - expect(result.has(4)).toBe(true); + expect(result).toEqual(new Set([1, 2, 3, 4])); }); }); \ No newline at end of file diff --git a/test/undefinedAndNull.test.ts b/test/undefinedAndNull.test.ts index e5fce95..7b91624 100644 --- a/test/undefinedAndNull.test.ts +++ b/test/undefinedAndNull.test.ts @@ -1,15 +1,17 @@ -import {asSequence, sequenceOf} from "../src/Sequence"; +import {asSequence, sequenceOf} from "../src/sequency"; describe("undefinedAndNull", () => { it("should pass null values", () => { const result = sequenceOf(1, 2, null, 3, null, null, null, 4) .toList(); + expect(result).toEqual([1, 2, null, 3, null, null, null, 4]); }); it("should pass undefined values", () => { const result = sequenceOf(1, 2, undefined, 3, undefined, undefined, undefined, 4) .toList(); + expect(result).toEqual([1, 2, undefined, 3, undefined, undefined, undefined, 4]); }); @@ -18,6 +20,7 @@ describe("undefinedAndNull", () => { .filter(it => it == null || it % 2 === 1) .map(it => String(it)) .toList(); + expect(result).toEqual(["1", "null", "null", "3", "undefined", "undefined"]); }); }); \ No newline at end of file diff --git a/test/unzip.test.ts b/test/unzip.test.ts index 3166156..e57d98f 100644 --- a/test/unzip.test.ts +++ b/test/unzip.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("unzip", () => { it("should unzip items", () => { @@ -6,14 +6,7 @@ describe("unzip", () => { .zip(sequenceOf(1, 2, 3)) .unzip(); - expect(first.length).toBe(3); - expect(first[0]).toBe("a"); - expect(first[1]).toBe("b"); - expect(first[2]).toBe("c"); - - expect(second.length).toBe(3); - expect(second[0]).toBe(1); - expect(second[1]).toBe(2); - expect(second[2]).toBe(3); + expect(first).toEqual(["a", "b", "c"]); + expect(second).toEqual([1, 2, 3]); }); }); \ No newline at end of file diff --git a/test/zip.test.ts b/test/zip.test.ts index cd481d0..385f459 100644 --- a/test/zip.test.ts +++ b/test/zip.test.ts @@ -1,20 +1,27 @@ -import {sequenceOf} from "../src/Sequence"; +import {sequenceOf} from "../src/sequency"; describe("zip", () => { it("should combine items from both sequences into pairs", () => { const array = sequenceOf("a", "b", "c") .zip(sequenceOf(1, 2, 3)) .toArray(); - expect(array.length).toBe(3); - expect(array[0]).toEqual(["a", 1]); - expect(array[1]).toEqual(["b", 2]); - expect(array[2]).toEqual(["c", 3]); + + expect(array).toEqual([ + ["a", 1], + ["b", 2], + ["c", 3] + ]); }); it("should discard elements if length of sequences is different", () => { const array = sequenceOf(1, 2, 3) .zip(sequenceOf(1, 2, 3, 4, 5, 6, 7)) .toArray(); - expect(array.length).toBe(3); + + expect(array).toEqual([ + [1, 1], + [2, 2], + [3, 3] + ]); }); }); \ No newline at end of file From 8ad71fe05dce1a8f91ddd05107d155ab4d2803e4 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 16:39:54 +0100 Subject: [PATCH 05/28] Reorganize existing unit tests Preparation for unit tests regarding AsyncSequence --- package.json | 2 +- test/{ => operators/sync}/all.test.ts | 2 +- test/{ => operators/sync}/any.test.ts | 2 +- test/{ => operators/sync}/asIterable.test.ts | 2 +- test/{ => operators/sync}/associate.test.ts | 2 +- test/{ => operators/sync}/associateBy.test.ts | 12 ++++++------ test/{ => operators/sync}/average.test.ts | 2 +- test/{ => operators/sync}/chunk.test.ts | 2 +- test/{ => operators/sync}/contains.test.ts | 2 +- test/{ => operators/sync}/count.test.ts | 2 +- test/{ => operators/sync}/distinct.test.ts | 2 +- test/{ => operators/sync}/distinctBy.test.ts | 2 +- test/{ => operators/sync}/drop.test.ts | 2 +- test/{ => operators/sync}/dropWhile.test.ts | 2 +- test/{ => operators/sync}/elementAt.test.ts | 2 +- test/{ => operators/sync}/elementAtOrElse.test.ts | 2 +- test/{ => operators/sync}/elementAtOrNull.test.ts | 2 +- test/{ => operators/sync}/filter.test.ts | 2 +- test/{ => operators/sync}/filterIndexed.test.ts | 2 +- test/{ => operators/sync}/filterNot.test.ts | 2 +- test/{ => operators/sync}/filterNotNull.test.ts | 2 +- test/{ => operators/sync}/find.test.ts | 2 +- test/{ => operators/sync}/findLast.test.ts | 2 +- test/{ => operators/sync}/first.test.ts | 2 +- test/{ => operators/sync}/firstOrNull.test.ts | 2 +- test/{ => operators/sync}/flatMap.test.ts | 2 +- test/{ => operators/sync}/flatten.test.ts | 2 +- test/{ => operators/sync}/fold.test.ts | 2 +- test/{ => operators/sync}/foldIndexed.test.ts | 2 +- test/{ => operators/sync}/forEach.test.ts | 2 +- test/{ => operators/sync}/forEachIndexed.test.ts | 2 +- test/{ => operators/sync}/groupBy.test.ts | 2 +- test/{ => operators/sync}/indexOf.test.ts | 2 +- test/{ => operators/sync}/indexOfFirst.test.ts | 2 +- test/{ => operators/sync}/indexOfLast.test.ts | 2 +- test/{ => operators/sync}/joinTo.test.ts | 2 +- test/{ => operators/sync}/joinToString.test.ts | 2 +- test/{ => operators/sync}/last.test.ts | 2 +- test/{ => operators/sync}/lastOrNull.test.ts | 2 +- test/{ => operators/sync}/map.test.ts | 2 +- test/{ => operators/sync}/mapIndexed.test.ts | 2 +- test/{ => operators/sync}/mapNotNull.test.ts | 2 +- test/{ => operators/sync}/max.test.ts | 2 +- test/{ => operators/sync}/maxBy.test.ts | 2 +- test/{ => operators/sync}/maxWith.test.ts | 2 +- test/{ => operators/sync}/merge.test.ts | 2 +- test/{ => operators/sync}/min.test.ts | 2 +- test/{ => operators/sync}/minBy.test.ts | 2 +- test/{ => operators/sync}/minWith.test.ts | 2 +- test/{ => operators/sync}/minus.test.ts | 2 +- test/{ => operators/sync}/none.test.ts | 2 +- test/{ => operators/sync}/onEach.test.ts | 2 +- test/{ => operators/sync}/partition.test.ts | 2 +- test/{ => operators/sync}/plus.test.ts | 2 +- test/{ => operators/sync}/reduce.test.ts | 2 +- test/{ => operators/sync}/reduceIndexed.test.ts | 2 +- test/{ => operators/sync}/reverse.test.ts | 2 +- test/{ => operators/sync}/single.test.ts | 2 +- test/{ => operators/sync}/singleOrNull.test.ts | 2 +- test/{ => operators/sync}/sorted.test.ts | 2 +- test/{ => operators/sync}/sortedBy.test.ts | 2 +- test/{ => operators/sync}/sortedByDescending.test.ts | 2 +- test/{ => operators/sync}/sortedDescending.test.ts | 2 +- test/{ => operators/sync}/sortedWith.test.ts | 2 +- test/{ => operators/sync}/sum.test.ts | 2 +- test/{ => operators/sync}/sumBy.test.ts | 2 +- test/{ => operators/sync}/take.test.ts | 2 +- test/{ => operators/sync}/takeWhile.test.ts | 2 +- test/{ => operators/sync}/toArray.test.ts | 2 +- test/{ => operators/sync}/toList.test.ts | 2 +- test/{ => operators/sync}/toMap.test.ts | 2 +- test/{ => operators/sync}/toSet.test.ts | 2 +- test/{ => operators/sync}/unzip.test.ts | 2 +- test/{ => operators/sync}/zip.test.ts | 2 +- 74 files changed, 79 insertions(+), 79 deletions(-) rename test/{ => operators/sync}/all.test.ts (87%) rename test/{ => operators/sync}/any.test.ts (93%) rename test/{ => operators/sync}/asIterable.test.ts (90%) rename test/{ => operators/sync}/associate.test.ts (93%) rename test/{ => operators/sync}/associateBy.test.ts (95%) rename test/{ => operators/sync}/average.test.ts (83%) rename test/{ => operators/sync}/chunk.test.ts (94%) rename test/{ => operators/sync}/contains.test.ts (87%) rename test/{ => operators/sync}/count.test.ts (86%) rename test/{ => operators/sync}/distinct.test.ts (90%) rename test/{ => operators/sync}/distinctBy.test.ts (87%) rename test/{ => operators/sync}/drop.test.ts (95%) rename test/{ => operators/sync}/dropWhile.test.ts (93%) rename test/{ => operators/sync}/elementAt.test.ts (93%) rename test/{ => operators/sync}/elementAtOrElse.test.ts (93%) rename test/{ => operators/sync}/elementAtOrNull.test.ts (93%) rename test/{ => operators/sync}/filter.test.ts (81%) rename test/{ => operators/sync}/filterIndexed.test.ts (83%) rename test/{ => operators/sync}/filterNot.test.ts (82%) rename test/{ => operators/sync}/filterNotNull.test.ts (83%) rename test/{ => operators/sync}/find.test.ts (92%) rename test/{ => operators/sync}/findLast.test.ts (92%) rename test/{ => operators/sync}/first.test.ts (94%) rename test/{ => operators/sync}/firstOrNull.test.ts (92%) rename test/{ => operators/sync}/flatMap.test.ts (80%) rename test/{ => operators/sync}/flatten.test.ts (90%) rename test/{ => operators/sync}/fold.test.ts (87%) rename test/{ => operators/sync}/foldIndexed.test.ts (89%) rename test/{ => operators/sync}/forEach.test.ts (83%) rename test/{ => operators/sync}/forEachIndexed.test.ts (85%) rename test/{ => operators/sync}/groupBy.test.ts (92%) rename test/{ => operators/sync}/indexOf.test.ts (87%) rename test/{ => operators/sync}/indexOfFirst.test.ts (82%) rename test/{ => operators/sync}/indexOfLast.test.ts (82%) rename test/{ => operators/sync}/joinTo.test.ts (83%) rename test/{ => operators/sync}/joinToString.test.ts (95%) rename test/{ => operators/sync}/last.test.ts (94%) rename test/{ => operators/sync}/lastOrNull.test.ts (92%) rename test/{ => operators/sync}/map.test.ts (83%) rename test/{ => operators/sync}/mapIndexed.test.ts (85%) rename test/{ => operators/sync}/mapNotNull.test.ts (88%) rename test/{ => operators/sync}/max.test.ts (83%) rename test/{ => operators/sync}/maxBy.test.ts (85%) rename test/{ => operators/sync}/maxWith.test.ts (86%) rename test/{ => operators/sync}/merge.test.ts (96%) rename test/{ => operators/sync}/min.test.ts (83%) rename test/{ => operators/sync}/minBy.test.ts (85%) rename test/{ => operators/sync}/minWith.test.ts (86%) rename test/{ => operators/sync}/minus.test.ts (92%) rename test/{ => operators/sync}/none.test.ts (93%) rename test/{ => operators/sync}/onEach.test.ts (86%) rename test/{ => operators/sync}/partition.test.ts (88%) rename test/{ => operators/sync}/plus.test.ts (92%) rename test/{ => operators/sync}/reduce.test.ts (89%) rename test/{ => operators/sync}/reduceIndexed.test.ts (84%) rename test/{ => operators/sync}/reverse.test.ts (80%) rename test/{ => operators/sync}/single.test.ts (94%) rename test/{ => operators/sync}/singleOrNull.test.ts (94%) rename test/{ => operators/sync}/sorted.test.ts (99%) rename test/{ => operators/sync}/sortedBy.test.ts (88%) rename test/{ => operators/sync}/sortedByDescending.test.ts (88%) rename test/{ => operators/sync}/sortedDescending.test.ts (90%) rename test/{ => operators/sync}/sortedWith.test.ts (90%) rename test/{ => operators/sync}/sum.test.ts (77%) rename test/{ => operators/sync}/sumBy.test.ts (80%) rename test/{ => operators/sync}/take.test.ts (94%) rename test/{ => operators/sync}/takeWhile.test.ts (92%) rename test/{ => operators/sync}/toArray.test.ts (89%) rename test/{ => operators/sync}/toList.test.ts (88%) rename test/{ => operators/sync}/toMap.test.ts (95%) rename test/{ => operators/sync}/toSet.test.ts (91%) rename test/{ => operators/sync}/unzip.test.ts (85%) rename test/{ => operators/sync}/zip.test.ts (92%) diff --git a/package.json b/package.json index d1bb1ff..71b65a1 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "^.+\\.ts$": "ts-jest" }, "testMatch": [ - "**/test/*.ts" + "**/test/**/*.ts" ], "testURL": "http://localhost/" }, diff --git a/test/all.test.ts b/test/operators/sync/all.test.ts similarity index 87% rename from test/all.test.ts rename to test/operators/sync/all.test.ts index 3911479..c840608 100644 --- a/test/all.test.ts +++ b/test/operators/sync/all.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("all", () => { it("should return false", () => { diff --git a/test/any.test.ts b/test/operators/sync/any.test.ts similarity index 93% rename from test/any.test.ts rename to test/operators/sync/any.test.ts index 1161c8f..c3babed 100644 --- a/test/any.test.ts +++ b/test/operators/sync/any.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("any", () => { it("should return false", () => { diff --git a/test/asIterable.test.ts b/test/operators/sync/asIterable.test.ts similarity index 90% rename from test/asIterable.test.ts rename to test/operators/sync/asIterable.test.ts index a0f3093..57b738e 100644 --- a/test/asIterable.test.ts +++ b/test/operators/sync/asIterable.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("asIterable", () => { it("should return an iterable object conforming to the iterator-protocol", () => { diff --git a/test/associate.test.ts b/test/operators/sync/associate.test.ts similarity index 93% rename from test/associate.test.ts rename to test/operators/sync/associate.test.ts index 37071d4..94e395e 100644 --- a/test/associate.test.ts +++ b/test/operators/sync/associate.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("associate", () => { it("should associate map", () => { diff --git a/test/associateBy.test.ts b/test/operators/sync/associateBy.test.ts similarity index 95% rename from test/associateBy.test.ts rename to test/operators/sync/associateBy.test.ts index d6cb754..1ed0622 100644 --- a/test/associateBy.test.ts +++ b/test/operators/sync/associateBy.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("associateBy", () => { it("should associate map by keySelector", () => { @@ -15,7 +15,7 @@ describe("associateBy", () => { [2, b], [3, c] ]) - ) + ); }); it("should associate map by key", () => { @@ -32,7 +32,7 @@ describe("associateBy", () => { [2, b], [3, c] ]) - ) + ); }); it("should associate map by keySelector and valueTransformer", () => { @@ -52,7 +52,7 @@ describe("associateBy", () => { [2, 22], [3, 33] ]) - ) + ); }); it("should associate map by key and valueTransformer", () => { @@ -72,7 +72,7 @@ describe("associateBy", () => { [2, 22], [3, 33] ]) - ) + ); }); it("latest entries should win in case of duplicates", () => { @@ -93,6 +93,6 @@ describe("associateBy", () => { [2, 222], [3, 33] ]) - ) + ); }); }); \ No newline at end of file diff --git a/test/average.test.ts b/test/operators/sync/average.test.ts similarity index 83% rename from test/average.test.ts rename to test/operators/sync/average.test.ts index b276e92..8eb2498 100644 --- a/test/average.test.ts +++ b/test/operators/sync/average.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf, Sequence} from "../src/sequency"; +import {emptySequence, sequenceOf, Sequence} from "../../../src/sequency"; describe("average", () => { it("should calculate average", () => { diff --git a/test/chunk.test.ts b/test/operators/sync/chunk.test.ts similarity index 94% rename from test/chunk.test.ts rename to test/operators/sync/chunk.test.ts index 9bf953d..4f179ed 100644 --- a/test/chunk.test.ts +++ b/test/operators/sync/chunk.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("chunk", () => { it("should return list of chunks", () => { diff --git a/test/contains.test.ts b/test/operators/sync/contains.test.ts similarity index 87% rename from test/contains.test.ts rename to test/operators/sync/contains.test.ts index 66d6ae0..0cf2384 100644 --- a/test/contains.test.ts +++ b/test/operators/sync/contains.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("contains", () => { it("should contain element", () => { diff --git a/test/count.test.ts b/test/operators/sync/count.test.ts similarity index 86% rename from test/count.test.ts rename to test/operators/sync/count.test.ts index 561cca9..6a1a604 100644 --- a/test/count.test.ts +++ b/test/operators/sync/count.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("count", () => { it("should count results", () => { diff --git a/test/distinct.test.ts b/test/operators/sync/distinct.test.ts similarity index 90% rename from test/distinct.test.ts rename to test/operators/sync/distinct.test.ts index 36975de..4327ac2 100644 --- a/test/distinct.test.ts +++ b/test/operators/sync/distinct.test.ts @@ -1,4 +1,4 @@ -import {range, sequenceOf} from "../src/sequency"; +import {range, sequenceOf} from "../../../src/sequency"; describe("distinct", () => { it("should dismiss duplicate items", () => { diff --git a/test/distinctBy.test.ts b/test/operators/sync/distinctBy.test.ts similarity index 87% rename from test/distinctBy.test.ts rename to test/operators/sync/distinctBy.test.ts index f53ac80..dc4549b 100644 --- a/test/distinctBy.test.ts +++ b/test/operators/sync/distinctBy.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("distinctBy", () => { it("should dismiss items with duplicate selections", () => { diff --git a/test/drop.test.ts b/test/operators/sync/drop.test.ts similarity index 95% rename from test/drop.test.ts rename to test/operators/sync/drop.test.ts index b6d6702..9a11ca6 100644 --- a/test/drop.test.ts +++ b/test/operators/sync/drop.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("drop", () => { it("should drop 2 items", () => { diff --git a/test/dropWhile.test.ts b/test/operators/sync/dropWhile.test.ts similarity index 93% rename from test/dropWhile.test.ts rename to test/operators/sync/dropWhile.test.ts index 98dcb0e..e31bd63 100644 --- a/test/dropWhile.test.ts +++ b/test/operators/sync/dropWhile.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("dropWhile", () => { it("should drop elements until predicate evaluates to false", () => { diff --git a/test/elementAt.test.ts b/test/operators/sync/elementAt.test.ts similarity index 93% rename from test/elementAt.test.ts rename to test/operators/sync/elementAt.test.ts index 5678e70..660b024 100644 --- a/test/elementAt.test.ts +++ b/test/operators/sync/elementAt.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("elementAt", () => { it("should return element at first index", () => { diff --git a/test/elementAtOrElse.test.ts b/test/operators/sync/elementAtOrElse.test.ts similarity index 93% rename from test/elementAtOrElse.test.ts rename to test/operators/sync/elementAtOrElse.test.ts index cdce436..109eed1 100644 --- a/test/elementAtOrElse.test.ts +++ b/test/operators/sync/elementAtOrElse.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("elementAtOrElse", () => { it("should return element at first index", () => { diff --git a/test/elementAtOrNull.test.ts b/test/operators/sync/elementAtOrNull.test.ts similarity index 93% rename from test/elementAtOrNull.test.ts rename to test/operators/sync/elementAtOrNull.test.ts index 799733d..27b042c 100644 --- a/test/elementAtOrNull.test.ts +++ b/test/operators/sync/elementAtOrNull.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("elementAtOrNull", () => { it("should return element at first index", () => { diff --git a/test/filter.test.ts b/test/operators/sync/filter.test.ts similarity index 81% rename from test/filter.test.ts rename to test/operators/sync/filter.test.ts index 2990efb..b9cd9c6 100644 --- a/test/filter.test.ts +++ b/test/operators/sync/filter.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("filter", () => { it("should filter elements", () => { diff --git a/test/filterIndexed.test.ts b/test/operators/sync/filterIndexed.test.ts similarity index 83% rename from test/filterIndexed.test.ts rename to test/operators/sync/filterIndexed.test.ts index a96784a..ded6b8f 100644 --- a/test/filterIndexed.test.ts +++ b/test/operators/sync/filterIndexed.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("filterIndexed", () => { it("should filter elements by index", () => { diff --git a/test/filterNot.test.ts b/test/operators/sync/filterNot.test.ts similarity index 82% rename from test/filterNot.test.ts rename to test/operators/sync/filterNot.test.ts index e51ca45..bafafcd 100644 --- a/test/filterNot.test.ts +++ b/test/operators/sync/filterNot.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("filterNot", () => { it("should filter elements", () => { diff --git a/test/filterNotNull.test.ts b/test/operators/sync/filterNotNull.test.ts similarity index 83% rename from test/filterNotNull.test.ts rename to test/operators/sync/filterNotNull.test.ts index ef6621e..73180e2 100644 --- a/test/filterNotNull.test.ts +++ b/test/operators/sync/filterNotNull.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("filterNotNull", () => { it("should skip null elements", () => { diff --git a/test/find.test.ts b/test/operators/sync/find.test.ts similarity index 92% rename from test/find.test.ts rename to test/operators/sync/find.test.ts index 19374a4..8ddb5c9 100644 --- a/test/find.test.ts +++ b/test/operators/sync/find.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("find", () => { it("should return first element of sequence", () => { diff --git a/test/findLast.test.ts b/test/operators/sync/findLast.test.ts similarity index 92% rename from test/findLast.test.ts rename to test/operators/sync/findLast.test.ts index de8e126..45b256b 100644 --- a/test/findLast.test.ts +++ b/test/operators/sync/findLast.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("findLast", () => { it("should return last element of sequence", () => { diff --git a/test/first.test.ts b/test/operators/sync/first.test.ts similarity index 94% rename from test/first.test.ts rename to test/operators/sync/first.test.ts index 928c097..2b34496 100644 --- a/test/first.test.ts +++ b/test/operators/sync/first.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("first", () => { it("should return first element of sequence", () => { diff --git a/test/firstOrNull.test.ts b/test/operators/sync/firstOrNull.test.ts similarity index 92% rename from test/firstOrNull.test.ts rename to test/operators/sync/firstOrNull.test.ts index 0581394..e62781b 100644 --- a/test/firstOrNull.test.ts +++ b/test/operators/sync/firstOrNull.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("firstOrNull", () => { it("should return first element of sequence", () => { diff --git a/test/flatMap.test.ts b/test/operators/sync/flatMap.test.ts similarity index 80% rename from test/flatMap.test.ts rename to test/operators/sync/flatMap.test.ts index ecbb3b5..5620b1b 100644 --- a/test/flatMap.test.ts +++ b/test/operators/sync/flatMap.test.ts @@ -1,4 +1,4 @@ -import {asSequence, sequenceOf} from "../src/sequency"; +import {asSequence, sequenceOf} from "../../../src/sequency"; describe("flatMap", () => { it("should flatten element arrays", () => { diff --git a/test/flatten.test.ts b/test/operators/sync/flatten.test.ts similarity index 90% rename from test/flatten.test.ts rename to test/operators/sync/flatten.test.ts index aeb29d5..394f9db 100644 --- a/test/flatten.test.ts +++ b/test/operators/sync/flatten.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("flatten", () => { it("should flatten sequence of sequences", () => { diff --git a/test/fold.test.ts b/test/operators/sync/fold.test.ts similarity index 87% rename from test/fold.test.ts rename to test/operators/sync/fold.test.ts index 2efe3a7..962adc8 100644 --- a/test/fold.test.ts +++ b/test/operators/sync/fold.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("fold", () => { it("should 23 + sum of all numbers", () => { diff --git a/test/foldIndexed.test.ts b/test/operators/sync/foldIndexed.test.ts similarity index 89% rename from test/foldIndexed.test.ts rename to test/operators/sync/foldIndexed.test.ts index e1596e0..75c7fd7 100644 --- a/test/foldIndexed.test.ts +++ b/test/operators/sync/foldIndexed.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("foldIndexed", () => { it("should 23 + sum of all numbers and indices", () => { diff --git a/test/forEach.test.ts b/test/operators/sync/forEach.test.ts similarity index 83% rename from test/forEach.test.ts rename to test/operators/sync/forEach.test.ts index fb82d18..a543dcb 100644 --- a/test/forEach.test.ts +++ b/test/operators/sync/forEach.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("forEach", () => { it("should call action for each element", () => { diff --git a/test/forEachIndexed.test.ts b/test/operators/sync/forEachIndexed.test.ts similarity index 85% rename from test/forEachIndexed.test.ts rename to test/operators/sync/forEachIndexed.test.ts index 993715d..e6d63a3 100644 --- a/test/forEachIndexed.test.ts +++ b/test/operators/sync/forEachIndexed.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("forEach", () => { it("should call action for each element", () => { diff --git a/test/groupBy.test.ts b/test/operators/sync/groupBy.test.ts similarity index 92% rename from test/groupBy.test.ts rename to test/operators/sync/groupBy.test.ts index ab439f9..2e9fbec 100644 --- a/test/groupBy.test.ts +++ b/test/operators/sync/groupBy.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("groupBy", () => { it("should group by keySelector", () => { diff --git a/test/indexOf.test.ts b/test/operators/sync/indexOf.test.ts similarity index 87% rename from test/indexOf.test.ts rename to test/operators/sync/indexOf.test.ts index 7fe2582..c48454a 100644 --- a/test/indexOf.test.ts +++ b/test/operators/sync/indexOf.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("indexOf", () => { it("should return index of element", () => { diff --git a/test/indexOfFirst.test.ts b/test/operators/sync/indexOfFirst.test.ts similarity index 82% rename from test/indexOfFirst.test.ts rename to test/operators/sync/indexOfFirst.test.ts index d5770ce..d570fc5 100644 --- a/test/indexOfFirst.test.ts +++ b/test/operators/sync/indexOfFirst.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("indexOfFirst", () => { it("should return index of first element matching given predicate", () => { diff --git a/test/indexOfLast.test.ts b/test/operators/sync/indexOfLast.test.ts similarity index 82% rename from test/indexOfLast.test.ts rename to test/operators/sync/indexOfLast.test.ts index 9aad2e4..1adab5f 100644 --- a/test/indexOfLast.test.ts +++ b/test/operators/sync/indexOfLast.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("indexOfLast", () => { it("should return index of last element matching given predicate", () => { diff --git a/test/joinTo.test.ts b/test/operators/sync/joinTo.test.ts similarity index 83% rename from test/joinTo.test.ts rename to test/operators/sync/joinTo.test.ts index fd71828..6fbd3be 100644 --- a/test/joinTo.test.ts +++ b/test/operators/sync/joinTo.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("joinTo", () => { it("should join to given string", () => { diff --git a/test/joinToString.test.ts b/test/operators/sync/joinToString.test.ts similarity index 95% rename from test/joinToString.test.ts rename to test/operators/sync/joinToString.test.ts index cf1afd8..4f2eaee 100644 --- a/test/joinToString.test.ts +++ b/test/operators/sync/joinToString.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("joinToString", () => { it("should join to string using default config", () => { diff --git a/test/last.test.ts b/test/operators/sync/last.test.ts similarity index 94% rename from test/last.test.ts rename to test/operators/sync/last.test.ts index 313a98d..fde07f8 100644 --- a/test/last.test.ts +++ b/test/operators/sync/last.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("last", () => { it("should return last element of sequence", () => { diff --git a/test/lastOrNull.test.ts b/test/operators/sync/lastOrNull.test.ts similarity index 92% rename from test/lastOrNull.test.ts rename to test/operators/sync/lastOrNull.test.ts index 37a972b..1caa1c2 100644 --- a/test/lastOrNull.test.ts +++ b/test/operators/sync/lastOrNull.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("lastOrNull", () => { it("should return last element of sequence", () => { diff --git a/test/map.test.ts b/test/operators/sync/map.test.ts similarity index 83% rename from test/map.test.ts rename to test/operators/sync/map.test.ts index 5b43394..200cd02 100644 --- a/test/map.test.ts +++ b/test/operators/sync/map.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("map", () => { it("should map numbers to strings", () => { diff --git a/test/mapIndexed.test.ts b/test/operators/sync/mapIndexed.test.ts similarity index 85% rename from test/mapIndexed.test.ts rename to test/operators/sync/mapIndexed.test.ts index b07c53d..0dd16a9 100644 --- a/test/mapIndexed.test.ts +++ b/test/operators/sync/mapIndexed.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("mapIndexed", () => { it("should map elements by index and value", () => { diff --git a/test/mapNotNull.test.ts b/test/operators/sync/mapNotNull.test.ts similarity index 88% rename from test/mapNotNull.test.ts rename to test/operators/sync/mapNotNull.test.ts index fbb0714..197e3c0 100644 --- a/test/mapNotNull.test.ts +++ b/test/operators/sync/mapNotNull.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("mapNotNull", () => { it("should map to non-null items", () => { diff --git a/test/max.test.ts b/test/operators/sync/max.test.ts similarity index 83% rename from test/max.test.ts rename to test/operators/sync/max.test.ts index 70304a1..9f23c26 100644 --- a/test/max.test.ts +++ b/test/operators/sync/max.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("max", () => { it("should return max element", () => { diff --git a/test/maxBy.test.ts b/test/operators/sync/maxBy.test.ts similarity index 85% rename from test/maxBy.test.ts rename to test/operators/sync/maxBy.test.ts index bc4aa84..5a4e3e8 100644 --- a/test/maxBy.test.ts +++ b/test/operators/sync/maxBy.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("maxBy", () => { it("should return max element by selector", () => { diff --git a/test/maxWith.test.ts b/test/operators/sync/maxWith.test.ts similarity index 86% rename from test/maxWith.test.ts rename to test/operators/sync/maxWith.test.ts index 092df43..90382c1 100644 --- a/test/maxWith.test.ts +++ b/test/operators/sync/maxWith.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("maxWith", () => { it("should return max element by comparator", () => { diff --git a/test/merge.test.ts b/test/operators/sync/merge.test.ts similarity index 96% rename from test/merge.test.ts rename to test/operators/sync/merge.test.ts index 2d3856e..9a71e6f 100644 --- a/test/merge.test.ts +++ b/test/operators/sync/merge.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("merge", () => { it("should merge both sequences", () => { diff --git a/test/min.test.ts b/test/operators/sync/min.test.ts similarity index 83% rename from test/min.test.ts rename to test/operators/sync/min.test.ts index 2e84b1d..31b2531 100644 --- a/test/min.test.ts +++ b/test/operators/sync/min.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("min", () => { it("should return min element", () => { diff --git a/test/minBy.test.ts b/test/operators/sync/minBy.test.ts similarity index 85% rename from test/minBy.test.ts rename to test/operators/sync/minBy.test.ts index 26d4ab4..7123f49 100644 --- a/test/minBy.test.ts +++ b/test/operators/sync/minBy.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("minBy", () => { it("should return min element by selector", () => { diff --git a/test/minWith.test.ts b/test/operators/sync/minWith.test.ts similarity index 86% rename from test/minWith.test.ts rename to test/operators/sync/minWith.test.ts index a85d7fe..8aaaec9 100644 --- a/test/minWith.test.ts +++ b/test/operators/sync/minWith.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("minWith", () => { it("should return min element by comparator", () => { diff --git a/test/minus.test.ts b/test/operators/sync/minus.test.ts similarity index 92% rename from test/minus.test.ts rename to test/operators/sync/minus.test.ts index 319c34c..4fe6982 100644 --- a/test/minus.test.ts +++ b/test/operators/sync/minus.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("minus", () => { it("should remove element", () => { diff --git a/test/none.test.ts b/test/operators/sync/none.test.ts similarity index 93% rename from test/none.test.ts rename to test/operators/sync/none.test.ts index 9a19fc4..f642f75 100644 --- a/test/none.test.ts +++ b/test/operators/sync/none.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("none", () => { it("should return false", () => { diff --git a/test/onEach.test.ts b/test/operators/sync/onEach.test.ts similarity index 86% rename from test/onEach.test.ts rename to test/operators/sync/onEach.test.ts index e9913ef..b88a3a6 100644 --- a/test/onEach.test.ts +++ b/test/operators/sync/onEach.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("onEach", () => { it("should call action for each element", () => { diff --git a/test/partition.test.ts b/test/operators/sync/partition.test.ts similarity index 88% rename from test/partition.test.ts rename to test/operators/sync/partition.test.ts index 9a6e0ad..46fd051 100644 --- a/test/partition.test.ts +++ b/test/operators/sync/partition.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("partition", () => { it("should partition based on the given predicate", () => { diff --git a/test/plus.test.ts b/test/operators/sync/plus.test.ts similarity index 92% rename from test/plus.test.ts rename to test/operators/sync/plus.test.ts index a986270..dfa6843 100644 --- a/test/plus.test.ts +++ b/test/operators/sync/plus.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("plus", () => { it("should append element", () => { diff --git a/test/reduce.test.ts b/test/operators/sync/reduce.test.ts similarity index 89% rename from test/reduce.test.ts rename to test/operators/sync/reduce.test.ts index 1cd813a..3d1b25f 100644 --- a/test/reduce.test.ts +++ b/test/operators/sync/reduce.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("reduce", () => { it("should sum all numbers", () => { diff --git a/test/reduceIndexed.test.ts b/test/operators/sync/reduceIndexed.test.ts similarity index 84% rename from test/reduceIndexed.test.ts rename to test/operators/sync/reduceIndexed.test.ts index ba8766a..acd8d62 100644 --- a/test/reduceIndexed.test.ts +++ b/test/operators/sync/reduceIndexed.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("reduceIndexed", () => { it("should sum all numbers + indices", () => { diff --git a/test/reverse.test.ts b/test/operators/sync/reverse.test.ts similarity index 80% rename from test/reverse.test.ts rename to test/operators/sync/reverse.test.ts index 2043a81..e64126d 100644 --- a/test/reverse.test.ts +++ b/test/operators/sync/reverse.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("reverse", () => { it("should reverse order", () => { diff --git a/test/single.test.ts b/test/operators/sync/single.test.ts similarity index 94% rename from test/single.test.ts rename to test/operators/sync/single.test.ts index bcad089..613d2a6 100644 --- a/test/single.test.ts +++ b/test/operators/sync/single.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("single", () => { it("should return single element", () => { diff --git a/test/singleOrNull.test.ts b/test/operators/sync/singleOrNull.test.ts similarity index 94% rename from test/singleOrNull.test.ts rename to test/operators/sync/singleOrNull.test.ts index fd6abb9..d8fe9c7 100644 --- a/test/singleOrNull.test.ts +++ b/test/operators/sync/singleOrNull.test.ts @@ -1,4 +1,4 @@ -import {emptySequence, sequenceOf} from "../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("singleOrNull", () => { it("should return single element", () => { diff --git a/test/sorted.test.ts b/test/operators/sync/sorted.test.ts similarity index 99% rename from test/sorted.test.ts rename to test/operators/sync/sorted.test.ts index dbafe94..e51711d 100644 --- a/test/sorted.test.ts +++ b/test/operators/sync/sorted.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("sorted", () => { it("should sort numbers ascending", () => { diff --git a/test/sortedBy.test.ts b/test/operators/sync/sortedBy.test.ts similarity index 88% rename from test/sortedBy.test.ts rename to test/operators/sync/sortedBy.test.ts index 9ff49d9..3d44b08 100644 --- a/test/sortedBy.test.ts +++ b/test/operators/sync/sortedBy.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("sortedBy", () => { it("should sort by the given key ascending", () => { diff --git a/test/sortedByDescending.test.ts b/test/operators/sync/sortedByDescending.test.ts similarity index 88% rename from test/sortedByDescending.test.ts rename to test/operators/sync/sortedByDescending.test.ts index bfa6edd..feef60d 100644 --- a/test/sortedByDescending.test.ts +++ b/test/operators/sync/sortedByDescending.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("sortedBy", () => { it("should sort by the given key descending", () => { diff --git a/test/sortedDescending.test.ts b/test/operators/sync/sortedDescending.test.ts similarity index 90% rename from test/sortedDescending.test.ts rename to test/operators/sync/sortedDescending.test.ts index 910b2d4..166865d 100644 --- a/test/sortedDescending.test.ts +++ b/test/operators/sync/sortedDescending.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("sorted", () => { it("should sort numbers descending", () => { diff --git a/test/sortedWith.test.ts b/test/operators/sync/sortedWith.test.ts similarity index 90% rename from test/sortedWith.test.ts rename to test/operators/sync/sortedWith.test.ts index dd823ad..8e9c3fc 100644 --- a/test/sortedWith.test.ts +++ b/test/operators/sync/sortedWith.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("sortedWith", () => { it("should sort numbers by given comparator", () => { diff --git a/test/sum.test.ts b/test/operators/sync/sum.test.ts similarity index 77% rename from test/sum.test.ts rename to test/operators/sync/sum.test.ts index 612689e..68f7aa7 100644 --- a/test/sum.test.ts +++ b/test/operators/sync/sum.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("sum", () => { it("should sum all numbers", () => { diff --git a/test/sumBy.test.ts b/test/operators/sync/sumBy.test.ts similarity index 80% rename from test/sumBy.test.ts rename to test/operators/sync/sumBy.test.ts index c9ed3a7..c9b1a3b 100644 --- a/test/sumBy.test.ts +++ b/test/operators/sync/sumBy.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("sumBy", () => { it("should sum all selected numbers", () => { diff --git a/test/take.test.ts b/test/operators/sync/take.test.ts similarity index 94% rename from test/take.test.ts rename to test/operators/sync/take.test.ts index bc9e5a0..c6fc451 100644 --- a/test/take.test.ts +++ b/test/operators/sync/take.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("take", () => { it("should take first 2 items", () => { diff --git a/test/takeWhile.test.ts b/test/operators/sync/takeWhile.test.ts similarity index 92% rename from test/takeWhile.test.ts rename to test/operators/sync/takeWhile.test.ts index 34d31e8..347af41 100644 --- a/test/takeWhile.test.ts +++ b/test/operators/sync/takeWhile.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("takeWhile", () => { it("should take elements until predicate evaluates to false", () => { diff --git a/test/toArray.test.ts b/test/operators/sync/toArray.test.ts similarity index 89% rename from test/toArray.test.ts rename to test/operators/sync/toArray.test.ts index 1b8e565..74ff08d 100644 --- a/test/toArray.test.ts +++ b/test/operators/sync/toArray.test.ts @@ -1,4 +1,4 @@ -import {asSequence, sequenceOf} from "../src/sequency"; +import {asSequence, sequenceOf} from "../../../src/sequency"; describe("toArray", () => { it("should return new array", () => { diff --git a/test/toList.test.ts b/test/operators/sync/toList.test.ts similarity index 88% rename from test/toList.test.ts rename to test/operators/sync/toList.test.ts index 2997ed6..2219c1c 100644 --- a/test/toList.test.ts +++ b/test/operators/sync/toList.test.ts @@ -1,4 +1,4 @@ -import {asSequence, sequenceOf} from "../src/sequency"; +import {asSequence, sequenceOf} from "../../../src/sequency"; describe("toList", () => { it("should return new array", () => { diff --git a/test/toMap.test.ts b/test/operators/sync/toMap.test.ts similarity index 95% rename from test/toMap.test.ts rename to test/operators/sync/toMap.test.ts index 8ee3f3a..c3564a0 100644 --- a/test/toMap.test.ts +++ b/test/operators/sync/toMap.test.ts @@ -1,4 +1,4 @@ -import {asSequence} from "../src/sequency"; +import {asSequence} from "../../../src/sequency"; describe("toMap", () => { it("should return items as new map", () => { diff --git a/test/toSet.test.ts b/test/operators/sync/toSet.test.ts similarity index 91% rename from test/toSet.test.ts rename to test/operators/sync/toSet.test.ts index a55fd10..70fe104 100644 --- a/test/toSet.test.ts +++ b/test/operators/sync/toSet.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("toSet", () => { it("should return new set of distinct items", () => { diff --git a/test/unzip.test.ts b/test/operators/sync/unzip.test.ts similarity index 85% rename from test/unzip.test.ts rename to test/operators/sync/unzip.test.ts index e57d98f..048b325 100644 --- a/test/unzip.test.ts +++ b/test/operators/sync/unzip.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("unzip", () => { it("should unzip items", () => { diff --git a/test/zip.test.ts b/test/operators/sync/zip.test.ts similarity index 92% rename from test/zip.test.ts rename to test/operators/sync/zip.test.ts index 385f459..0e248c5 100644 --- a/test/zip.test.ts +++ b/test/operators/sync/zip.test.ts @@ -1,4 +1,4 @@ -import {sequenceOf} from "../src/sequency"; +import {sequenceOf} from "../../../src/sequency"; describe("zip", () => { it("should combine items from both sequences into pairs", () => { From 64189553f208f41548d556a266293ebe4629ce01 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 16:43:44 +0100 Subject: [PATCH 06/28] Update docs entrypoint --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 71b65a1..3a53cef 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "coverage": "rimraf coverage && jest --coverage", "travis": "yarn lint && yarn test", "lint": "node_modules/.bin/tslint -c tslint.json 'src/**/*.ts' 'test/**/*.ts'", - "docs": "rimraf docs && typedoc --name Sequency --readme APIDOC.md -out docs --hideGenerator src/Sequence.ts", + "docs": "rimraf docs && typedoc --name Sequency --readme APIDOC.md -out docs --hideGenerator src/sequency.ts", "docs-publish": "yarn docs && touch docs/.nojekyll && gh-pages -d docs -t", "bundle": "webpack --mode production && size-limit", "bundle-browsertest": "open ./test/browsertest-lib.html", From dcc58ccd6679ae10f9612a1d4c43f8c40d7905c8 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 22:14:00 +0100 Subject: [PATCH 07/28] Update existing unit tests --- test/asSequence.test.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/asSequence.test.ts b/test/asSequence.test.ts index f625ab4..5837aa0 100644 --- a/test/asSequence.test.ts +++ b/test/asSequence.test.ts @@ -11,7 +11,7 @@ describe("asSequence", () => { }); it("should create sequence from object keys", () => { - const keys = (Object as any).keys({"a": 1, "b": 2, "c": 3}); + const keys = Object.keys({"a": 1, "b": 2, "c": 3}); const array = asSequence(keys) .toArray(); @@ -19,7 +19,7 @@ describe("asSequence", () => { }); it("should create sequence from object values", () => { - const values = (Object as any).values({"a": 1, "b": 2, "c": 3}); + const values = Object.values({"a": 1, "b": 2, "c": 3}); const array = asSequence(values) .toArray(); @@ -27,14 +27,19 @@ describe("asSequence", () => { }); it("should create sequence from set", () => { - const array = asSequence(new Set([1, 2, 3])) + const set = new Set(); + set.add(1); + set.add(2); + set.add(3); + + const array = asSequence(set) .toArray(); expect(array).toEqual([1, 2, 3]); }); it("should create sequence from map", () => { - const map = new Map(); + const map = new Map(); map.set("a", 1); map.set("b", 2); map.set("c", 3); From e90f17dce5c812e7698971115fc32965650b637e Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 22:14:23 +0100 Subject: [PATCH 08/28] Use Reflect api when applying mixins --- src/internal.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/internal.ts b/src/internal.ts index 7fe717c..7c78ff8 100644 --- a/src/internal.ts +++ b/src/internal.ts @@ -26,10 +26,13 @@ export function asSelector(keyOrSelector: ((item: T) => K) | k : (item: T) => item?.[keyOrSelector] as K; } -export function applyMixins(derivedCtor: any, baseCtors: any[]) { +export function applyMixins(derivedCtor: ({new(...args: any[]): any}), baseCtors: ({new(...args: any[]): any})[]) { baseCtors.forEach(baseCtor => { Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => { - derivedCtor.prototype[name] = baseCtor.prototype[name]; + const descriptor = Reflect.getOwnPropertyDescriptor(baseCtor.prototype, name); + if (descriptor != null) { + Reflect.defineProperty(derivedCtor.prototype, name, descriptor); + } }); }); } \ No newline at end of file From 9d0ecc01dc8a8e44dba762138d32110183efc8da Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Thu, 28 Mar 2024 22:14:57 +0100 Subject: [PATCH 09/28] Add JSDoc to creation functions --- src/sequency.ts | 172 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 163 insertions(+), 9 deletions(-) diff --git a/src/sequency.ts b/src/sequency.ts index 0249806..4d7b4ee 100644 --- a/src/sequency.ts +++ b/src/sequency.ts @@ -7,22 +7,67 @@ import {Sequence, SequenceImpl} from "./Sequence"; export {Sequence, Sequence as default} from "./Sequence"; export {AsyncSequence} from "./AsyncSequence"; +/** + * Create sequence of multiple arguments of an array of arguments + * @param {...T} args Arguments + * @returns Sequence + * @example + * let seq1 = sequenceOf(1, 2, 3); // Sequence + * let seq2 = sequenceOf([1, 2, 3]); // Sequence + */ export function sequenceOf(...args: T[]): Sequence { return asSequence(args); } +/** + * Create async sequence of multiple arguments of an array of arguments + * @param {...T} args Arguments + * @returns AsyncSequence + * @example + * asyncSequenceOf(1, 2, 3); // Sequence + * asyncSequenceOf([1, 2, 3]); // Sequence + */ export function asyncSequenceOf(...args: T[]): AsyncSequence { return asAsyncSequence(args); } +/** + * Create empty sequence + * @returns Sequence + */ export function emptySequence(): Sequence { return sequenceOf(); } +/** + * Create empty async sequence + * @returns AsyncSequence + */ export function emptyAsyncSequence(): AsyncSequence { return asyncSequenceOf(); } +/** + * Create sequence for iterable object / generator + * @param {Iterable} iterable Iterable object / generator + * @returns Sequence + * @example + * // Sequence => 1, 2, 3 + * asSequence([1, 2, 3]); + * // Sequence => 1, 2, 3 + * asSequence(new Set([1, 2, 3])); + * // Sequence<[string, number]> => ["a", 1], ["b", 2], ["c", 3] + * asSequence(new Map([["a", 1], ["b", 2], ["c", 3]])); + * // Sequence => "a", "b", "c" + * asSequence("abc"); + * // Sequence => 0, 1, 2, 3, ... + * asSequence((function* () { + * let i = 0; + * while (true) { + * yield i++; + * } + * })()); + */ export function asSequence(iterable: Iterable): Sequence { if (iterable == null) { throw new Error("Cannot create sequence for non-existing input: " + iterable); @@ -34,6 +79,27 @@ export function asSequence(iterable: Iterable): Sequence { return createSequence(iterator); } +/** + * Create async sequence for iterable object / generator + * @param {Iterable | AsyncIterable} iterable Iterable object / generator + * @returns AsyncSequence + * @example + * // Sequence => 1, 2, 3 + * asAsyncSequence([1, 2, 3]); + * // Sequence => 1, 2, 3 + * asAsyncSequence(new Set([1, 2, 3])); + * // Sequence<[string, number]> => ["a", 1], ["b", 2], ["c", 3] + * asAsyncSequence(new Map([["a", 1], ["b", 2], ["c", 3]])); + * // Sequence => "a", "b", "c" + * asAsyncSequence("abc"); + * // Sequence => 0, 1, 2, 3, ... + * asAsyncSequence((async function* () { + * let i = 0; + * while (true) { + * yield i++; + * } + * })()); + */ export function asAsyncSequence(iterable: Iterable | AsyncIterable): AsyncSequence { if (iterable == null) { throw new Error("Cannot create sequence for non-existing input: " + iterable); @@ -51,43 +117,131 @@ export function asAsyncSequence(iterable: Iterable | AsyncIterable): As throw new Error("Cannot create sequence for non-iterable input: " + iterable); } +/** + * Create sequence for iterator + * @param {Iterator} iterator Iterator + * @returns Sequence + * @example + * createSequence({ + * next(value) { + * return {done: true, value: null}; + * } + * }); + */ export function createSequence(iterator: Iterator): Sequence { return new SequenceImpl(iterator) as Sequence; } +/** + * Create async sequence for async iterator + * @param {AsyncIterator} iterator AsyncIterator + * @returns AsyncSequence + * @example + * createAsyncSequence({ + * async next(value) { + * return {done: true, value: null}; + * } + * }); + */ export function createAsyncSequence(iterator: AsyncIterator): AsyncSequence { return new AsyncSequenceImpl(iterator) as AsyncSequence; } +/** + * Check if an object is a sequence + * @param {unknown} object Object of interest + * @returns Whether it is or not + */ export function isSequence(object: unknown): object is Sequence { return object instanceof SequenceImpl; } +/** + * Check if an object is an async sequence + * @param {unknown} object Object of interest + * @returns Whether it is or not + */ export function isAsyncSequence(object: unknown): object is AsyncSequence { return object instanceof AsyncSequenceImpl; } -export function extendSequence(mixin: { new(): any }) { +/** + * Extend the basic sequence implementation + * @param {{new(): any}} mixin Mixin operators + */ +export function extendSequence(mixin: {new(): any}) { applyMixins(SequenceImpl, [mixin]); } -export function extendAsyncSequence(mixin: { new(): any }) { +/** + * Extend the basic async sequence implementation + * @param {{new(): any}} mixin Mixin operators + */ +export function extendAsyncSequence(mixin: {new(): any}) { applyMixins(AsyncSequenceImpl, [mixin]); } +/** + * Generate a sequence + * @param nextFunction Function to generate next value with (null/undefined to end sequence) + * @example + * // Sequence => 0, 1, ..., 8, 9 + * let i = 0; + * generateSequence(() => count < 10 ? count++ : null); + */ export function generateSequence(nextFunction: () => T | null | undefined): Sequence; +/** + * Generate a sequence + * @param seedFunction Function to generate initial value with (seed) + * @param nextFunction Function to generate next value with (null/undefined to end sequence) + * @example + * // Sequence => 0, 1, ..., 8, 9 + * generateSequence(() => 0, value => value < 10 ? value + 1 : null); + */ export function generateSequence(seedFunction: () => T | null | undefined, nextFunction: (item: T) => T | null | undefined): Sequence; +/** + * Generate a sequence + * @param seed Initial value (seed) + * @param nextFunction Function to generate next value with (null/undefined to end sequence) + * @example + * // Sequence => 0, 1, ..., 8, 9 + * generateSequence(0, value => value < 10 ? value + 1 : null); + */ export function generateSequence(seed: T | null | undefined, nextFunction: (item: T) => T | null | undefined): Sequence; -export function generateSequence(a: any, b?: any): Sequence { - if (typeof a === "function" && b == null) { - return createSequence(new GeneratorIterator(a)); +/** + * Generate a sequence + * @param a seed/seedFunction/nextFunction + * @param b nextFunction + * @returns Sequence + */ +export function generateSequence(a: (() => T | null | undefined) | T | null | undefined, b?: (item: T) => T | null | undefined): Sequence { + // seed/seedFunction + nextFunction + if (typeof b === "function") { + const seed = typeof a === "function" ? (a as () => T | null | undefined)() : a; + return seed != null + ? createSequence(new GeneratorSeedIterator(seed, b)) // seed + nextFunction + : emptySequence(); // Missing seed + // nextFunction + } else if (typeof a === "function") { + return createSequence(new GeneratorIterator(a as () => T | null | undefined)); + // Missing nextFunction + } else { + return emptySequence(); } - const seed = typeof a === "function" ? a() : a; - return seed != null - ? createSequence(new GeneratorSeedIterator(seed, b)) - : emptySequence(); } +/** + * Generate sequence from range + * @param start Range start + * @param endInclusive Range end (inclusive) + * @param step Step size + * @returns Sequence + * @example + * // Sequence => 0, 1, 2, 3, 4 + * range(0, 4); + * // Sequence => 0, 0.5, 1, ..., 3.5, 4 + * range(0, 4, 0.5); + */ export function range(start: number, endInclusive: number, step: number = 1): Sequence { if (start > endInclusive) { throw new Error(`start [${start}] must be lower then endInclusive [${endInclusive}]`); From b703cce823c02fd645bb9edbd95a566a3035b535 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:13:19 +0100 Subject: [PATCH 10/28] Fix compatibility with regular iterables --- src/operators/async/flatten.ts | 2 +- src/operators/async/merge.ts | 14 ++++++++++++-- src/operators/sync/merge.ts | 7 ++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/operators/async/flatten.ts b/src/operators/async/flatten.ts index e718c60..e7fe829 100644 --- a/src/operators/async/flatten.ts +++ b/src/operators/async/flatten.ts @@ -7,7 +7,7 @@ export class Flatten { * * @returns {AsyncSequence} */ - flatten(this: AsyncSequence | AsyncIterable>): AsyncSequence { + flatten(this: AsyncSequence | AsyncIterable | Iterable>): AsyncSequence { return this.flatMap(it => { if (isAsyncSequence(it)) { return it; diff --git a/src/operators/async/merge.ts b/src/operators/async/merge.ts index 2c97179..b870a9f 100644 --- a/src/operators/async/merge.ts +++ b/src/operators/async/merge.ts @@ -1,3 +1,4 @@ +import {asAsyncIterator} from "../../internal"; import {asyncSequenceOf, createAsyncSequence, isAsyncSequence, AsyncSequence} from "../../sequency"; class MergeIterator implements AsyncIterator { @@ -86,8 +87,17 @@ export class Merge { * @param prependNewValues * @returns {AsyncSequence} */ - merge(this: AsyncSequence, other: AsyncSequence | AsyncIterable, selector: (value: T) => Promise | S, prependNewValues: boolean = false): AsyncSequence { - return createAsyncSequence(new MergeIterator(this.iterator, isAsyncSequence(other) ? other.iterator : other[Symbol.asyncIterator](), selector, prependNewValues)); + merge(this: AsyncSequence, other: AsyncSequence | AsyncIterable | Iterable, selector: (value: T) => Promise | S, prependNewValues: boolean = false): AsyncSequence { + return createAsyncSequence(new MergeIterator( + this.iterator, + isAsyncSequence(other) + ? other.iterator + : (other as AsyncIterable)[Symbol.asyncIterator] + ? (other as AsyncIterable)[Symbol.asyncIterator]() + : asAsyncIterator((other as Iterable)[Symbol.iterator]()), + selector, + prependNewValues + )); } } \ No newline at end of file diff --git a/src/operators/sync/merge.ts b/src/operators/sync/merge.ts index aec854b..478ed17 100644 --- a/src/operators/sync/merge.ts +++ b/src/operators/sync/merge.ts @@ -87,7 +87,12 @@ export class Merge { * @returns {Sequence} */ merge(this: Sequence, other: Sequence | Iterable, selector: (value: T) => S, prependNewValues: boolean = false): Sequence { - return createSequence(new MergeIterator(this.iterator, isSequence(other) ? other.iterator : other[Symbol.iterator](), selector, prependNewValues)); + return createSequence(new MergeIterator( + this.iterator, + isSequence(other) ? other.iterator : other[Symbol.iterator](), + selector, + prependNewValues + )); } } \ No newline at end of file From abf5f259d447d9d1179380af2123c4418ebee2cc Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:13:58 +0100 Subject: [PATCH 11/28] Remove irregular promise support --- src/operators/async/contains.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/operators/async/contains.ts b/src/operators/async/contains.ts index 4945409..462b330 100644 --- a/src/operators/async/contains.ts +++ b/src/operators/async/contains.ts @@ -5,12 +5,13 @@ export class Contains { /** * Returns `true` if the sequence contains the given `element`. * - * @param {T} element + * @param {Promise | T} element * @returns {Promise} */ - async contains(this: AsyncSequence, element: T): Promise { + async contains(this: AsyncSequence, element: Promise | T): Promise { + const elem = await element; for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { - if (element === item.value) { + if (elem === item.value) { return true; } } From b75ab0b0bb73edb1bad75d3449dbb6d284830c25 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:14:51 +0100 Subject: [PATCH 12/28] Replace redundant code --- src/operators/async/elementAtOrNull.ts | 9 +-------- src/operators/async/indexOf.ts | 9 +-------- src/operators/sync/elementAtOrNull.ts | 9 +-------- src/operators/sync/indexOf.ts | 9 +-------- 4 files changed, 4 insertions(+), 32 deletions(-) diff --git a/src/operators/async/elementAtOrNull.ts b/src/operators/async/elementAtOrNull.ts index c9d3d14..29350ed 100644 --- a/src/operators/async/elementAtOrNull.ts +++ b/src/operators/async/elementAtOrNull.ts @@ -10,14 +10,7 @@ export class ElementAtOrNull { * @returns {Promise} */ async elementAtOrNull(this: AsyncSequence, index: number): Promise { - let i = 0; - for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { - if (i === index) { - return item.value; - } - i++; - } - return null; + return await this.elementAtOrElse(index, () => null); } } \ No newline at end of file diff --git a/src/operators/async/indexOf.ts b/src/operators/async/indexOf.ts index 5d3a2fd..f23c984 100644 --- a/src/operators/async/indexOf.ts +++ b/src/operators/async/indexOf.ts @@ -9,14 +9,7 @@ export class IndexOf { * @returns {Promise} */ async indexOf(this: AsyncSequence, element: T): Promise { - let index = 0; - for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { - if (element === item.value) { - return index; - } - index++; - } - return -1; + return await this.indexOfFirst(value => value === element); } } \ No newline at end of file diff --git a/src/operators/sync/elementAtOrNull.ts b/src/operators/sync/elementAtOrNull.ts index 678b246..7677fcb 100644 --- a/src/operators/sync/elementAtOrNull.ts +++ b/src/operators/sync/elementAtOrNull.ts @@ -10,14 +10,7 @@ export class ElementAtOrNull { * @returns {T | null} */ elementAtOrNull(this: Sequence, index: number): T | null { - let i = 0; - for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { - if (i === index) { - return item.value; - } - i++; - } - return null; + return this.elementAtOrElse(index, () => null); } } \ No newline at end of file diff --git a/src/operators/sync/indexOf.ts b/src/operators/sync/indexOf.ts index 83f28ad..62d3922 100644 --- a/src/operators/sync/indexOf.ts +++ b/src/operators/sync/indexOf.ts @@ -9,14 +9,7 @@ export class IndexOf { * @returns {number} */ indexOf(this: Sequence, element: T): number { - let index = 0; - for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { - if (element === item.value) { - return index; - } - index++; - } - return -1; + return this.indexOfFirst(value => value === element); } } \ No newline at end of file From a49cdc8740a16d5c1f01e9b9037c00139a60e40b Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:15:28 +0100 Subject: [PATCH 13/28] Update types to not error on non-void return value --- src/operators/async/forEach.ts | 2 +- src/operators/async/forEachIndexed.ts | 4 ++-- src/operators/async/onEach.ts | 2 +- src/operators/sync/forEach.ts | 2 +- src/operators/sync/forEachIndexed.ts | 2 +- src/operators/sync/onEach.ts | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/operators/async/forEach.ts b/src/operators/async/forEach.ts index 28382d6..060ee78 100644 --- a/src/operators/async/forEach.ts +++ b/src/operators/async/forEach.ts @@ -7,7 +7,7 @@ export class ForEach { * * @param {(item: T) => Promise | void} action */ - async forEach(this: AsyncSequence, action: (item: T) => Promise | void) { + async forEach(this: AsyncSequence, action: (item: T) => Promise | unknown) { for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { await action(item.value); } diff --git a/src/operators/async/forEachIndexed.ts b/src/operators/async/forEachIndexed.ts index eca430c..6a511d8 100644 --- a/src/operators/async/forEachIndexed.ts +++ b/src/operators/async/forEachIndexed.ts @@ -8,8 +8,8 @@ export class ForEachIndexed { * * @param {(index: number, value: T) => Promise | void} action */ - async forEachIndexed(this: AsyncSequence, action: (index: number, value: T) => Promise | void) { - this.withIndex() + async forEachIndexed(this: AsyncSequence, action: (index: number, value: T) => Promise | unknown) { + await this.withIndex() .forEach(async it => await action(it.index, it.value)); } diff --git a/src/operators/async/onEach.ts b/src/operators/async/onEach.ts index 0d660d3..9d35fc2 100644 --- a/src/operators/async/onEach.ts +++ b/src/operators/async/onEach.ts @@ -8,7 +8,7 @@ export class OnEach { * @param {(value: T) => Promise | void} action * @returns {AsyncSequence} */ - onEach(this: AsyncSequence, action: (value: T) => Promise | void): AsyncSequence { + onEach(this: AsyncSequence, action: (value: T) => Promise | unknown): AsyncSequence { return this.map(async it => { await action(it); return it; diff --git a/src/operators/sync/forEach.ts b/src/operators/sync/forEach.ts index 5f3ff8f..3c3a53b 100644 --- a/src/operators/sync/forEach.ts +++ b/src/operators/sync/forEach.ts @@ -7,7 +7,7 @@ export class ForEach { * * @param {(item: T) => void} action */ - forEach(this: Sequence, action: (item: T) => void) { + forEach(this: Sequence, action: (item: T) => unknown) { for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { action(item.value); } diff --git a/src/operators/sync/forEachIndexed.ts b/src/operators/sync/forEachIndexed.ts index 5410340..7304e99 100644 --- a/src/operators/sync/forEachIndexed.ts +++ b/src/operators/sync/forEachIndexed.ts @@ -8,7 +8,7 @@ export class ForEachIndexed { * * @param {(index: number, value: T) => void} action */ - forEachIndexed(this: Sequence, action: (index: number, value: T) => void) { + forEachIndexed(this: Sequence, action: (index: number, value: T) => unknown) { this.withIndex() .forEach(it => action(it.index, it.value)); } diff --git a/src/operators/sync/onEach.ts b/src/operators/sync/onEach.ts index 9e1978b..a198dd5 100644 --- a/src/operators/sync/onEach.ts +++ b/src/operators/sync/onEach.ts @@ -8,7 +8,7 @@ export class OnEach { * @param {(value: T) => void} action * @returns {Sequence} */ - onEach(this: Sequence, action: (value: T) => void): Sequence { + onEach(this: Sequence, action: (value: T) => unknown): Sequence { return this.map(it => { action(it); return it; From a138ed9687ede2caae575d0b9a2cba409708a959 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:15:59 +0100 Subject: [PATCH 14/28] Use nullish coalescing operator --- src/operators/async/toArray.ts | 2 +- src/operators/async/toMap.ts | 2 +- src/operators/async/toSet.ts | 2 +- src/operators/sync/toArray.ts | 2 +- src/operators/sync/toMap.ts | 2 +- src/operators/sync/toSet.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/operators/async/toArray.ts b/src/operators/async/toArray.ts index f64490b..360dbae 100644 --- a/src/operators/async/toArray.ts +++ b/src/operators/async/toArray.ts @@ -10,7 +10,7 @@ export class ToArray { * @returns {Promise} */ async toArray(this: AsyncSequence, array?: T[]): Promise { - const result: T[] = array || []; + const result: T[] = array ?? []; for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { result.push(item.value); } diff --git a/src/operators/async/toMap.ts b/src/operators/async/toMap.ts index 653dcc1..0cbab35 100644 --- a/src/operators/async/toMap.ts +++ b/src/operators/async/toMap.ts @@ -10,7 +10,7 @@ export class ToMap { * @returns {Promise>} */ async toMap(this: AsyncSequence<[K, V]>, map?: Map): Promise> { - const result = map || new Map(); + const result = map ?? new Map(); for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { const pair = item.value; const key = pair[0]; diff --git a/src/operators/async/toSet.ts b/src/operators/async/toSet.ts index 571db72..a548e4f 100644 --- a/src/operators/async/toSet.ts +++ b/src/operators/async/toSet.ts @@ -10,7 +10,7 @@ export class ToSet { * @returns {Promise>} */ async toSet(this: AsyncSequence, set?: Set): Promise> { - const result = set || new Set(); + const result = set ?? new Set(); for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { result.add(item.value); } diff --git a/src/operators/sync/toArray.ts b/src/operators/sync/toArray.ts index abe29b6..6ce8a17 100644 --- a/src/operators/sync/toArray.ts +++ b/src/operators/sync/toArray.ts @@ -10,7 +10,7 @@ export class ToArray { * @returns {T[]} */ toArray(this: Sequence, array?: T[]): T[] { - const result: T[] = array || []; + const result: T[] = array ?? []; for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { result.push(item.value); } diff --git a/src/operators/sync/toMap.ts b/src/operators/sync/toMap.ts index 8daa288..ce10568 100644 --- a/src/operators/sync/toMap.ts +++ b/src/operators/sync/toMap.ts @@ -10,7 +10,7 @@ export class ToMap { * @returns {Map} */ toMap(this: Sequence<[K, V]>, map?: Map): Map { - const result = map || new Map(); + const result = map ?? new Map(); for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { const pair = item.value; const key = pair[0]; diff --git a/src/operators/sync/toSet.ts b/src/operators/sync/toSet.ts index 4905deb..8f453c6 100644 --- a/src/operators/sync/toSet.ts +++ b/src/operators/sync/toSet.ts @@ -10,7 +10,7 @@ export class ToSet { * @returns {Set} */ toSet(this: Sequence, set?: Set): Set { - const result = set || new Set(); + const result = set ?? new Set(); for (let item = this.iterator.next(); !item.done; item = this.iterator.next()) { result.add(item.value); } From 0f954247a3b5d4275c2007abc35d1048a9f18aba Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:16:41 +0100 Subject: [PATCH 15/28] Update jsdoc --- src/sequency.ts | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/sequency.ts b/src/sequency.ts index 4d7b4ee..ca1bbc4 100644 --- a/src/sequency.ts +++ b/src/sequency.ts @@ -12,8 +12,10 @@ export {AsyncSequence} from "./AsyncSequence"; * @param {...T} args Arguments * @returns Sequence * @example - * let seq1 = sequenceOf(1, 2, 3); // Sequence - * let seq2 = sequenceOf([1, 2, 3]); // Sequence + * // Sequence + * sequenceOf(1, 2, 3); + * // Sequence + * sequenceOf([1, 2, 3]); */ export function sequenceOf(...args: T[]): Sequence { return asSequence(args); @@ -24,8 +26,8 @@ export function sequenceOf(...args: T[]): Sequence { * @param {...T} args Arguments * @returns AsyncSequence * @example - * asyncSequenceOf(1, 2, 3); // Sequence - * asyncSequenceOf([1, 2, 3]); // Sequence + * asyncSequenceOf(1, 2, 3); // AsyncSequence + * asyncSequenceOf([1, 2, 3]); // AsyncSequence */ export function asyncSequenceOf(...args: T[]): AsyncSequence { return asAsyncSequence(args); @@ -84,15 +86,15 @@ export function asSequence(iterable: Iterable): Sequence { * @param {Iterable | AsyncIterable} iterable Iterable object / generator * @returns AsyncSequence * @example - * // Sequence => 1, 2, 3 + * // AsyncSequence => 1, 2, 3 * asAsyncSequence([1, 2, 3]); - * // Sequence => 1, 2, 3 + * // AsyncSequence => 1, 2, 3 * asAsyncSequence(new Set([1, 2, 3])); - * // Sequence<[string, number]> => ["a", 1], ["b", 2], ["c", 3] + * // AsyncSequence<[string, number]> => ["a", 1], ["b", 2], ["c", 3] * asAsyncSequence(new Map([["a", 1], ["b", 2], ["c", 3]])); - * // Sequence => "a", "b", "c" + * // AsyncSequence => "a", "b", "c" * asAsyncSequence("abc"); - * // Sequence => 0, 1, 2, 3, ... + * // AsyncSequence => 0, 1, 2, 3, ... * asAsyncSequence((async function* () { * let i = 0; * while (true) { @@ -122,6 +124,7 @@ export function asAsyncSequence(iterable: Iterable | AsyncIterable): As * @param {Iterator} iterator Iterator * @returns Sequence * @example + * // Sequence * createSequence({ * next(value) { * return {done: true, value: null}; @@ -137,6 +140,7 @@ export function createSequence(iterator: Iterator): Sequence { * @param {AsyncIterator} iterator AsyncIterator * @returns AsyncSequence * @example + * // Sequence * createAsyncSequence({ * async next(value) { * return {done: true, value: null}; From cc68f2bc7133e56f2191c4aecfbcc3db2e4cd9f4 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:17:05 +0100 Subject: [PATCH 16/28] Add to(Async)Sequence and onEachIndexed --- src/AsyncSequence.ts | 10 ++++++---- src/Sequence.ts | 10 ++++++---- src/operators/async/onEachIndexed.ts | 20 ++++++++++++++++++++ src/operators/async/toSequence.ts | 15 +++++++++++++++ src/operators/sync/onEachIndexed.ts | 20 ++++++++++++++++++++ src/operators/sync/toAsyncSequence.ts | 15 +++++++++++++++ 6 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 src/operators/async/onEachIndexed.ts create mode 100644 src/operators/async/toSequence.ts create mode 100644 src/operators/sync/onEachIndexed.ts create mode 100644 src/operators/sync/toAsyncSequence.ts diff --git a/src/AsyncSequence.ts b/src/AsyncSequence.ts index ab35918..6a5b14b 100644 --- a/src/AsyncSequence.ts +++ b/src/AsyncSequence.ts @@ -48,6 +48,7 @@ import {Minus as MinusOp} from "./operators/async/minus"; import {MinWith as MinWithOp} from "./operators/async/minWith"; import {None as NoneOp} from "./operators/async/none"; import {OnEach as OnEachOp} from "./operators/async/onEach"; +import {OnEachIndexed as OnEachIndexedOp} from "./operators/async/onEachIndexed"; import {Partition as PartitionOp} from "./operators/async/partition"; import {Plus as PlusOp} from "./operators/async/plus"; import {Reduce as ReduceOp} from "./operators/async/reduce"; @@ -66,6 +67,7 @@ import {Take as TakeOp} from "./operators/async/take"; import {TakeWhile as TakeWhileOp} from "./operators/async/takeWhile"; import {ToArray as ToArrayOp} from "./operators/async/toArray"; import {ToMap as ToMapOp} from "./operators/async/toMap"; +import {ToSequence as ToSequenceOp} from "./operators/async/toSequence"; import {ToSet as ToSetOp} from "./operators/async/toSet"; import {Unzip as UnzipOp} from "./operators/async/unzip"; import {WithIndex as WithIndexOp} from "./operators/async/withIndex"; @@ -87,8 +89,8 @@ export interface AsyncSequence extends AsyncSequenceOperators { export interface AsyncSequenceOperators extends AllOp, AnyOp, AsIterableOp, AssociateOp, AssociateByOp, AverageOp, ChunkOp, ContainsOp, CountOp, DistinctOp, DistinctByOp, DropOp, DropWhileOp, ElementAtOp, ElementAtOrElseOp, ElementAtOrNullOp, FilterOp, FilterHolisticallyOp, FilterIndexedOp, FilterNotOp, FilterNotNullOp, FirstOp, FirstOrNullOp, FlatMapOp, FlattenOp, FoldOp, FoldIndexedOp, ForEachOp, ForEachIndexedOp, GroupByOp, IndexOfOp, IndexOfFirstOp, IndexOfLastOp, JoinToStringOp, LastOp, LastOrNullOp, MapOp, MapIndexedOp, MapNotNullOp, MaxOp, MaxByOp, - MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, SortedByOp, - SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp { + MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, OnEachIndexedOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, + SortedByOp, SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, ToSequenceOp, UnzipOp, WithIndexOp, ZipOp { } export class AsyncSequenceImpl { @@ -99,5 +101,5 @@ export class AsyncSequenceImpl { applyMixins(AsyncSequenceImpl, [AllOp, AnyOp, AsIterableOp, AssociateOp, AssociateByOp, AverageOp, ChunkOp, ContainsOp, CountOp, DistinctOp, DistinctByOp, DropOp, DropWhileOp, ElementAtOp, ElementAtOrElseOp, ElementAtOrNullOp, FilterOp, FilterHolisticallyOp, FilterIndexedOp, FilterNotOp, FilterNotNullOp, FirstOp, FirstOrNullOp, FlatMapOp, FlattenOp, FoldOp, FoldIndexedOp, ForEachOp, ForEachIndexedOp, GroupByOp, IndexOfOp, IndexOfFirstOp, IndexOfLastOp, JoinToStringOp, LastOp, LastOrNullOp, MapOp, MapIndexedOp, MapNotNullOp, MaxOp, MaxByOp, - MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, SortedByOp, - SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp]); \ No newline at end of file + MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, OnEachIndexedOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, + SortedByOp, SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, ToSequenceOp, UnzipOp, WithIndexOp, ZipOp]); \ No newline at end of file diff --git a/src/Sequence.ts b/src/Sequence.ts index 830cc9b..23e7396 100644 --- a/src/Sequence.ts +++ b/src/Sequence.ts @@ -1,6 +1,7 @@ import {applyMixins} from "./internal"; import {All as AllOp} from "./operators/sync/all"; import {Any as AnyOp} from "./operators/sync/any"; +import {ToAsyncSequence as ToAsyncSequenceOp} from "./operators/sync/toAsyncSequence"; import {AsIterable as AsIterableOp} from "./operators/sync/asIterable"; import {Associate as AssociateOp} from "./operators/sync/associate"; import {AssociateBy as AssociateByOp} from "./operators/sync/associateBy"; @@ -48,6 +49,7 @@ import {Minus as MinusOp} from "./operators/sync/minus"; import {MinWith as MinWithOp} from "./operators/sync/minWith"; import {None as NoneOp} from "./operators/sync/none"; import {OnEach as OnEachOp} from "./operators/sync/onEach"; +import {OnEachIndexed as OnEachIndexedOp} from "./operators/sync/onEachIndexed"; import {Partition as PartitionOp} from "./operators/sync/partition"; import {Plus as PlusOp} from "./operators/sync/plus"; import {Reduce as ReduceOp} from "./operators/sync/reduce"; @@ -87,8 +89,8 @@ export interface Sequence extends SequenceOperators { export interface SequenceOperators extends AllOp, AnyOp, AsIterableOp, AssociateOp, AssociateByOp, AverageOp, ChunkOp, ContainsOp, CountOp, DistinctOp, DistinctByOp, DropOp, DropWhileOp, ElementAtOp, ElementAtOrElseOp, ElementAtOrNullOp, FilterOp, FilterHolisticallyOp, FilterIndexedOp, FilterNotOp, FilterNotNullOp, FirstOp, FirstOrNullOp, FlatMapOp, FlattenOp, FoldOp, FoldIndexedOp, ForEachOp, ForEachIndexedOp, GroupByOp, IndexOfOp, IndexOfFirstOp, IndexOfLastOp, JoinToStringOp, LastOp, LastOrNullOp, MapOp, MapIndexedOp, MapNotNullOp, MaxOp, MaxByOp, - MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, SortedByOp, - SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp { + MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, OnEachIndexedOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, + SortedByOp, SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToAsyncSequenceOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp { } export class SequenceImpl { @@ -99,5 +101,5 @@ export class SequenceImpl { applyMixins(SequenceImpl, [AllOp, AnyOp, AsIterableOp, AssociateOp, AssociateByOp, AverageOp, ChunkOp, ContainsOp, CountOp, DistinctOp, DistinctByOp, DropOp, DropWhileOp, ElementAtOp, ElementAtOrElseOp, ElementAtOrNullOp, FilterOp, FilterHolisticallyOp, FilterIndexedOp, FilterNotOp, FilterNotNullOp, FirstOp, FirstOrNullOp, FlatMapOp, FlattenOp, FoldOp, FoldIndexedOp, ForEachOp, ForEachIndexedOp, GroupByOp, IndexOfOp, IndexOfFirstOp, IndexOfLastOp, JoinToStringOp, LastOp, LastOrNullOp, MapOp, MapIndexedOp, MapNotNullOp, MaxOp, MaxByOp, - MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, SortedByOp, - SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp]); \ No newline at end of file + MaxWithOp, MergeOp, MinOp, MinByOp, MinusOp, MinWithOp, NoneOp, OnEachOp, OnEachIndexedOp, PartitionOp, PlusOp, ReduceOp, ReduceIndexedOp, ReverseOp, SingleOp, SingleOrNullOp, SortedOp, + SortedByOp, SortedByDescendingOp, SortedDescendingOp, SortedWithOp, SumOp, SumByOp, TakeOp, TakeWhileOp, ToArrayOp, ToAsyncSequenceOp, ToMapOp, ToSetOp, UnzipOp, WithIndexOp, ZipOp]); \ No newline at end of file diff --git a/src/operators/async/onEachIndexed.ts b/src/operators/async/onEachIndexed.ts new file mode 100644 index 0000000..69638e1 --- /dev/null +++ b/src/operators/async/onEachIndexed.ts @@ -0,0 +1,20 @@ +import {AsyncSequence} from "../../sequency"; + +export class OnEachIndexed { + + /** + * Performs the given `action` for each element and returns the sequence and passes the `index` of the current + * element (zero-based). + * + * @param {(index: number, value: T) => Promise | void} action + * @returns {AsyncSequence} + */ + onEachIndexed(this: AsyncSequence, action: (index: number, value: T) => Promise | unknown): AsyncSequence { + return this.withIndex() + .map(async it => { + await action(it.index, it.value); + return it.value; + }); + } + +} \ No newline at end of file diff --git a/src/operators/async/toSequence.ts b/src/operators/async/toSequence.ts new file mode 100644 index 0000000..f253e70 --- /dev/null +++ b/src/operators/async/toSequence.ts @@ -0,0 +1,15 @@ +import {emptySequence, AsyncSequence, Sequence} from "../../sequency"; + +export class ToSequence { + + /** + * Returns an async variant of the sequence. + * + * @returns {Sequence} + */ + async toSequence(this: AsyncSequence, sequence?: Sequence): Promise> { + const result = sequence ?? emptySequence(); + return result.plus(await this.toArray()); + } + +} \ No newline at end of file diff --git a/src/operators/sync/onEachIndexed.ts b/src/operators/sync/onEachIndexed.ts new file mode 100644 index 0000000..91c1d9b --- /dev/null +++ b/src/operators/sync/onEachIndexed.ts @@ -0,0 +1,20 @@ +import {Sequence} from "../../sequency"; + +export class OnEachIndexed { + + /** + * Performs the given `action` for each element and returns the sequence and passes the `index` of the current + * element (zero-based). + * + * @param {(index: number, value: T) => void} action + * @returns {Sequence} + */ + onEachIndexed(this: Sequence, action: (index: number, value: T) => unknown): Sequence { + return this.withIndex() + .map(it => { + action(it.index, it.value); + return it.value; + }); + } + +} \ No newline at end of file diff --git a/src/operators/sync/toAsyncSequence.ts b/src/operators/sync/toAsyncSequence.ts new file mode 100644 index 0000000..e787d8c --- /dev/null +++ b/src/operators/sync/toAsyncSequence.ts @@ -0,0 +1,15 @@ +import {emptyAsyncSequence, AsyncSequence, Sequence} from "../../sequency"; + +export class ToAsyncSequence { + + /** + * Returns an async variant of the sequence. + * + * @returns {AsyncSequence} + */ + toAsyncSequence(this: Sequence, sequence?: AsyncSequence): AsyncSequence { + const result = sequence ?? emptyAsyncSequence(); + return result.plus(this.toArray()); + } + +} \ No newline at end of file From cb27238b96ab08a635543a589fb9597f89acfe6a Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:17:24 +0100 Subject: [PATCH 17/28] Update existing unit tests --- test/operators/sync/all.test.ts | 2 ++ test/operators/sync/any.test.ts | 4 ++++ test/operators/sync/asIterable.test.ts | 10 +++++++--- test/operators/sync/average.test.ts | 6 ++++-- test/operators/sync/contains.test.ts | 2 ++ test/operators/sync/count.test.ts | 2 ++ test/operators/sync/distinct.test.ts | 1 + test/operators/sync/groupBy.test.ts | 2 +- test/operators/sync/maxBy.test.ts | 2 +- test/operators/sync/toArray.test.ts | 2 +- test/operators/sync/toList.test.ts | 2 +- 11 files changed, 26 insertions(+), 9 deletions(-) diff --git a/test/operators/sync/all.test.ts b/test/operators/sync/all.test.ts index c840608..9e269e0 100644 --- a/test/operators/sync/all.test.ts +++ b/test/operators/sync/all.test.ts @@ -4,12 +4,14 @@ describe("all", () => { it("should return false", () => { const result = sequenceOf(1, 2, 3) .all(it => it > 1); + expect(result).toBe(false); }); it("should return true", () => { const result = sequenceOf(1, 2, 3) .all(it => it > 0); + expect(result).toBe(true); }); }); \ No newline at end of file diff --git a/test/operators/sync/any.test.ts b/test/operators/sync/any.test.ts index c3babed..acccffa 100644 --- a/test/operators/sync/any.test.ts +++ b/test/operators/sync/any.test.ts @@ -5,6 +5,7 @@ describe("any", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 3) .any(); + expect(result).toBe(false); }); @@ -12,18 +13,21 @@ describe("any", () => { const result = sequenceOf(1, 2, 3) .filter(it => it > 1) .any(); + expect(result).toBe(true); }); it("should evaluate predicate and return false", () => { const result = sequenceOf(1, 2, 3) .any(it => it > 3); + expect(result).toBe(false); }); it("should evaluate predicate and return true", () => { const result = sequenceOf(1, 2, 3) .any(it => it > 2); + expect(result).toBe(true); }); }); \ No newline at end of file diff --git a/test/operators/sync/asIterable.test.ts b/test/operators/sync/asIterable.test.ts index 57b738e..07b4105 100644 --- a/test/operators/sync/asIterable.test.ts +++ b/test/operators/sync/asIterable.test.ts @@ -7,9 +7,13 @@ describe("asIterable", () => { .asIterable(); const iterator = iterable[Symbol.iterator](); - expect(iterator.next().value).toBe(1); - expect(iterator.next().value).toBe(3); - expect(iterator.next().value).toBe(5); + const results = [1, 3, 5]; + + for (let i = 0; i < results.length; i++) { + const result = iterator.next(); + expect(result.value).toBe(results[i]); + } + expect(iterator.next().done).toBe(true); }); }); \ No newline at end of file diff --git a/test/operators/sync/average.test.ts b/test/operators/sync/average.test.ts index 8eb2498..827ba12 100644 --- a/test/operators/sync/average.test.ts +++ b/test/operators/sync/average.test.ts @@ -1,15 +1,17 @@ -import {emptySequence, sequenceOf, Sequence} from "../../../src/sequency"; +import {emptySequence, sequenceOf} from "../../../src/sequency"; describe("average", () => { it("should calculate average", () => { const avg = sequenceOf(1, 2, 3, 4) .average(); + expect(avg).toBe(2.5); }); it("should return NaN on empty sequence", () => { - const sequence = emptySequence() as Sequence; + const sequence = emptySequence(); const avg = sequence.average(); + expect(avg).toBeNaN(); }); }); \ No newline at end of file diff --git a/test/operators/sync/contains.test.ts b/test/operators/sync/contains.test.ts index 0cf2384..7d0f567 100644 --- a/test/operators/sync/contains.test.ts +++ b/test/operators/sync/contains.test.ts @@ -4,12 +4,14 @@ describe("contains", () => { it("should contain element", () => { const result = sequenceOf(1, 2, 3) .contains(3); + expect(result).toBe(true); }); it("should not contain element", () => { const result = sequenceOf(1, 2, 3) .contains(4); + expect(result).toBe(false); }); }); \ No newline at end of file diff --git a/test/operators/sync/count.test.ts b/test/operators/sync/count.test.ts index 6a1a604..1d279f6 100644 --- a/test/operators/sync/count.test.ts +++ b/test/operators/sync/count.test.ts @@ -3,12 +3,14 @@ import {sequenceOf} from "../../../src/sequency"; describe("count", () => { it("should count results", () => { const num = sequenceOf(1, 2, 3).count(); + expect(num).toBe(3); }); it("should evaluate predicate and count results", () => { const num = sequenceOf(1, 2, 3) .count(it => it > 1); + expect(num).toBe(2); }); }); \ No newline at end of file diff --git a/test/operators/sync/distinct.test.ts b/test/operators/sync/distinct.test.ts index 4327ac2..6acabf2 100644 --- a/test/operators/sync/distinct.test.ts +++ b/test/operators/sync/distinct.test.ts @@ -14,6 +14,7 @@ describe("distinct", () => { const result = range(1, 1_000_000) .distinct() .toArray(); + expect(result.length).toBe(1_000_000); const took = Date.now() - t0; console.log("Took %s ms", took); diff --git a/test/operators/sync/groupBy.test.ts b/test/operators/sync/groupBy.test.ts index 2e9fbec..191efcb 100644 --- a/test/operators/sync/groupBy.test.ts +++ b/test/operators/sync/groupBy.test.ts @@ -7,7 +7,7 @@ describe("groupBy", () => { const c = {k: 3, v: 33} as const; const d = {k: 2, v: 222} as const; - const map = sequenceOf<{k: (typeof a)["k"] | (typeof b)["k"] | (typeof c)["k"] | (typeof d)["k"], v: number}>(a, b, c, d) + const map = sequenceOf<{k: (typeof a | typeof b | typeof c | typeof d)["k"], v: number}>(a, b, c, d) .groupBy(it => it.k); expect(map).toEqual( diff --git a/test/operators/sync/maxBy.test.ts b/test/operators/sync/maxBy.test.ts index 5a4e3e8..9884aa0 100644 --- a/test/operators/sync/maxBy.test.ts +++ b/test/operators/sync/maxBy.test.ts @@ -10,7 +10,7 @@ describe("maxBy", () => { it("should return null on empty sequence", () => { const num = emptySequence() - .maxBy(() => void(0)); + .maxBy(() => 0); expect(num).toBeNull(); }); diff --git a/test/operators/sync/toArray.test.ts b/test/operators/sync/toArray.test.ts index 74ff08d..bc86ec8 100644 --- a/test/operators/sync/toArray.test.ts +++ b/test/operators/sync/toArray.test.ts @@ -18,4 +18,4 @@ describe("toArray", () => { expect(result).toBe(array); expect(result).toEqual([1, 2, 3, 4]); }); -}); +}); \ No newline at end of file diff --git a/test/operators/sync/toList.test.ts b/test/operators/sync/toList.test.ts index 2219c1c..e5a65bb 100644 --- a/test/operators/sync/toList.test.ts +++ b/test/operators/sync/toList.test.ts @@ -18,4 +18,4 @@ describe("toList", () => { expect(result).toBe(array); expect(result).toEqual([1, 2, 3, 4]); }); -}); +}); \ No newline at end of file From 27ea98b195f9f017d78bd71c6750e5a1a0dadada Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:18:08 +0100 Subject: [PATCH 18/28] Add unit tests for async sequence --- test/operators/async/all.test.ts | 17 ++ test/operators/async/any.test.ts | 33 ++++ test/operators/async/asIterable.test.ts | 19 ++ test/operators/async/associate.test.ts | 29 ++++ test/operators/async/associateBy.test.ts | 98 +++++++++++ test/operators/async/average.test.ts | 17 ++ test/operators/async/chunk.test.ts | 43 +++++ test/operators/async/contains.test.ts | 17 ++ test/operators/async/count.test.ts | 16 ++ test/operators/async/distinct.test.ts | 11 ++ test/operators/async/distinctBy.test.ts | 15 ++ test/operators/async/drop.test.ts | 43 +++++ test/operators/async/dropWhile.test.ts | 27 +++ test/operators/async/elementAt.test.ts | 30 ++++ test/operators/async/elementAtOrElse.test.ts | 31 ++++ test/operators/async/elementAtOrNull.test.ts | 31 ++++ test/operators/async/filter.test.ts | 11 ++ test/operators/async/filterIndexed.test.ts | 11 ++ test/operators/async/filterNot.test.ts | 11 ++ test/operators/async/filterNotNull.test.ts | 11 ++ test/operators/async/find.test.ts | 26 +++ test/operators/async/findLast.test.ts | 25 +++ test/operators/async/first.test.ts | 33 ++++ test/operators/async/firstOrNull.test.ts | 26 +++ test/operators/async/flatMap.test.ts | 11 ++ test/operators/async/flatten.test.ts | 19 ++ test/operators/async/fold.test.ts | 17 ++ test/operators/async/foldIndexed.test.ts | 17 ++ test/operators/async/forEach.test.ts | 11 ++ test/operators/async/forEachIndexed.test.ts | 11 ++ test/operators/async/groupBy.test.ts | 21 +++ test/operators/async/indexOf.test.ts | 17 ++ test/operators/async/indexOfFirst.test.ts | 10 ++ test/operators/async/indexOfLast.test.ts | 10 ++ test/operators/async/joinTo.test.ts | 10 ++ test/operators/async/joinToString.test.ts | 38 ++++ test/operators/async/last.test.ts | 33 ++++ test/operators/async/lastOrNull.test.ts | 25 +++ test/operators/async/map.test.ts | 11 ++ test/operators/async/mapIndexed.test.ts | 11 ++ test/operators/async/mapNotNull.test.ts | 16 ++ test/operators/async/max.test.ts | 17 ++ test/operators/async/maxBy.test.ts | 17 ++ test/operators/async/maxWith.test.ts | 17 ++ test/operators/async/merge.test.ts | 35 ++++ test/operators/async/min.test.ts | 17 ++ test/operators/async/minBy.test.ts | 17 ++ test/operators/async/minWith.test.ts | 17 ++ test/operators/async/minus.test.ts | 35 ++++ test/operators/async/none.test.ts | 33 ++++ test/operators/async/onEach.test.ts | 13 ++ test/operators/async/partition.test.ts | 13 ++ test/operators/async/plus.test.ts | 35 ++++ test/operators/async/reduce.test.ts | 17 ++ test/operators/async/reduceIndexed.test.ts | 10 ++ test/operators/async/reverse.test.ts | 11 ++ test/operators/async/single.test.ts | 43 +++++ test/operators/async/singleOrNull.test.ts | 45 +++++ test/operators/async/sorted.test.ts | 164 ++++++++++++++++++ test/operators/async/sortedBy.test.ts | 16 ++ .../async/sortedByDescending.test.ts | 16 ++ test/operators/async/sortedDescending.test.ts | 19 ++ test/operators/async/sortedWith.test.ts | 19 ++ test/operators/async/sum.test.ts | 10 ++ test/operators/async/sumBy.test.ts | 10 ++ test/operators/async/take.test.ts | 35 ++++ test/operators/async/takeWhile.test.ts | 27 +++ test/operators/async/toArray.test.ts | 21 +++ test/operators/async/toList.test.ts | 21 +++ test/operators/async/toMap.test.ts | 43 +++++ test/operators/async/toSet.test.ts | 19 ++ test/operators/async/unzip.test.ts | 12 ++ test/operators/async/zip.test.ts | 27 +++ 73 files changed, 1770 insertions(+) create mode 100644 test/operators/async/all.test.ts create mode 100644 test/operators/async/any.test.ts create mode 100644 test/operators/async/asIterable.test.ts create mode 100644 test/operators/async/associate.test.ts create mode 100644 test/operators/async/associateBy.test.ts create mode 100644 test/operators/async/average.test.ts create mode 100644 test/operators/async/chunk.test.ts create mode 100644 test/operators/async/contains.test.ts create mode 100644 test/operators/async/count.test.ts create mode 100644 test/operators/async/distinct.test.ts create mode 100644 test/operators/async/distinctBy.test.ts create mode 100644 test/operators/async/drop.test.ts create mode 100644 test/operators/async/dropWhile.test.ts create mode 100644 test/operators/async/elementAt.test.ts create mode 100644 test/operators/async/elementAtOrElse.test.ts create mode 100644 test/operators/async/elementAtOrNull.test.ts create mode 100644 test/operators/async/filter.test.ts create mode 100644 test/operators/async/filterIndexed.test.ts create mode 100644 test/operators/async/filterNot.test.ts create mode 100644 test/operators/async/filterNotNull.test.ts create mode 100644 test/operators/async/find.test.ts create mode 100644 test/operators/async/findLast.test.ts create mode 100644 test/operators/async/first.test.ts create mode 100644 test/operators/async/firstOrNull.test.ts create mode 100644 test/operators/async/flatMap.test.ts create mode 100644 test/operators/async/flatten.test.ts create mode 100644 test/operators/async/fold.test.ts create mode 100644 test/operators/async/foldIndexed.test.ts create mode 100644 test/operators/async/forEach.test.ts create mode 100644 test/operators/async/forEachIndexed.test.ts create mode 100644 test/operators/async/groupBy.test.ts create mode 100644 test/operators/async/indexOf.test.ts create mode 100644 test/operators/async/indexOfFirst.test.ts create mode 100644 test/operators/async/indexOfLast.test.ts create mode 100644 test/operators/async/joinTo.test.ts create mode 100644 test/operators/async/joinToString.test.ts create mode 100644 test/operators/async/last.test.ts create mode 100644 test/operators/async/lastOrNull.test.ts create mode 100644 test/operators/async/map.test.ts create mode 100644 test/operators/async/mapIndexed.test.ts create mode 100644 test/operators/async/mapNotNull.test.ts create mode 100644 test/operators/async/max.test.ts create mode 100644 test/operators/async/maxBy.test.ts create mode 100644 test/operators/async/maxWith.test.ts create mode 100644 test/operators/async/merge.test.ts create mode 100644 test/operators/async/min.test.ts create mode 100644 test/operators/async/minBy.test.ts create mode 100644 test/operators/async/minWith.test.ts create mode 100644 test/operators/async/minus.test.ts create mode 100644 test/operators/async/none.test.ts create mode 100644 test/operators/async/onEach.test.ts create mode 100644 test/operators/async/partition.test.ts create mode 100644 test/operators/async/plus.test.ts create mode 100644 test/operators/async/reduce.test.ts create mode 100644 test/operators/async/reduceIndexed.test.ts create mode 100644 test/operators/async/reverse.test.ts create mode 100644 test/operators/async/single.test.ts create mode 100644 test/operators/async/singleOrNull.test.ts create mode 100644 test/operators/async/sorted.test.ts create mode 100644 test/operators/async/sortedBy.test.ts create mode 100644 test/operators/async/sortedByDescending.test.ts create mode 100644 test/operators/async/sortedDescending.test.ts create mode 100644 test/operators/async/sortedWith.test.ts create mode 100644 test/operators/async/sum.test.ts create mode 100644 test/operators/async/sumBy.test.ts create mode 100644 test/operators/async/take.test.ts create mode 100644 test/operators/async/takeWhile.test.ts create mode 100644 test/operators/async/toArray.test.ts create mode 100644 test/operators/async/toList.test.ts create mode 100644 test/operators/async/toMap.test.ts create mode 100644 test/operators/async/toSet.test.ts create mode 100644 test/operators/async/unzip.test.ts create mode 100644 test/operators/async/zip.test.ts diff --git a/test/operators/async/all.test.ts b/test/operators/async/all.test.ts new file mode 100644 index 0000000..079f3d3 --- /dev/null +++ b/test/operators/async/all.test.ts @@ -0,0 +1,17 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("all", () => { + it("should return false", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .all(it => Promise.resolve(it > 1)); + + expect(result).toBe(false); + }); + + it("should return true", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .all(it => Promise.resolve(it > 0)); + + expect(result).toBe(true); + }); +}); \ No newline at end of file diff --git a/test/operators/async/any.test.ts b/test/operators/async/any.test.ts new file mode 100644 index 0000000..7362cf6 --- /dev/null +++ b/test/operators/async/any.test.ts @@ -0,0 +1,33 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("any", () => { + it("should return false", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 3)) + .any(); + + expect(result).toBe(false); + }); + + it("should return true", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 1)) + .any(); + + expect(result).toBe(true); + }); + + it("should evaluate predicate and return false", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .any(it => Promise.resolve(it > 3)); + + expect(result).toBe(false); + }); + + it("should evaluate predicate and return true", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .any(it => Promise.resolve(it > 2)); + + expect(result).toBe(true); + }); +}); \ No newline at end of file diff --git a/test/operators/async/asIterable.test.ts b/test/operators/async/asIterable.test.ts new file mode 100644 index 0000000..91623e4 --- /dev/null +++ b/test/operators/async/asIterable.test.ts @@ -0,0 +1,19 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("asIterable", () => { + it("should return an iterable object conforming to the iterator-protocol", async () => { + const iterable = asyncSequenceOf(1, 2, 3, 4, 5) + .filter(it => Promise.resolve(it % 2 === 1)) + .asIterable(); + + const iterator = iterable[Symbol.asyncIterator](); + const results = [1, 3, 5]; + + for (let i = 0; i < results.length; i++) { + const result = await iterator.next(); + expect(result.value).toBe(results[i]); + } + + expect((await iterator.next()).done).toBe(true); + }); +}); \ No newline at end of file diff --git a/test/operators/async/associate.test.ts b/test/operators/async/associate.test.ts new file mode 100644 index 0000000..992c0d9 --- /dev/null +++ b/test/operators/async/associate.test.ts @@ -0,0 +1,29 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("associate", () => { + it("should associate map", async () => { + const map = await asyncSequenceOf(1, 2, 3) + .associate(it => Promise.resolve([`key_${it}`, it])); + expect(map.size).toBe(3); + + expect(map).toEqual( + new Map([ + ["key_1", 1], + ["key_2", 2], + ["key_3", 3] + ]) + ); + }); + + it("latest entries should win in case of duplicates", async () => { + const map = await asyncSequenceOf({k: 1, v: 1}, {k: 1, v: 11}, {k: 1, v: 111}, {k: 2, v: 222}) + .associate(it => Promise.resolve([it.k, it.v])); + + expect(map).toEqual( + new Map([ + [1, 111], + [2, 222] + ]) + ); + }); +}); \ No newline at end of file diff --git a/test/operators/async/associateBy.test.ts b/test/operators/async/associateBy.test.ts new file mode 100644 index 0000000..af24f97 --- /dev/null +++ b/test/operators/async/associateBy.test.ts @@ -0,0 +1,98 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("associateBy", () => { + it("should associate map by keySelector", async () => { + const a = {k: 1, v: 11}; + const b = {k: 2, v: 22}; + const c = {k: 3, v: 33}; + + const map = await asyncSequenceOf(a, b, c) + .associateBy(it => Promise.resolve(it.k)); + + expect(map).toEqual( + new Map([ + [1, a], + [2, b], + [3, c] + ]) + ); + }); + + it("should associate map by key", async () => { + const a = {k: 1, v: 11}; + const b = {k: 2, v: 22}; + const c = {k: 3, v: 33}; + + const map = await asyncSequenceOf(a, b, c) + .associateBy("k"); + + expect(map).toEqual( + new Map([ + [1, a], + [2, b], + [3, c] + ]) + ); + }); + + it("should associate map by keySelector and valueTransformer", async () => { + const a = {k: 1, v: 11}; + const b = {k: 2, v: 22}; + const c = {k: 3, v: 33}; + + const map = await asyncSequenceOf(a, b, c) + .associateBy( + it => Promise.resolve(it.k), + it => Promise.resolve(it.v) + ); + + expect(map).toEqual( + new Map([ + [1, 11], + [2, 22], + [3, 33] + ]) + ); + }); + + it("should associate map by key and valueTransformer", async () => { + const a = {k: 1, v: 11}; + const b = {k: 2, v: 22}; + const c = {k: 3, v: 33}; + + const map = await asyncSequenceOf(a, b, c) + .associateBy( + "k", + it => Promise.resolve(it.v) + ); + + expect(map).toEqual( + new Map([ + [1, 11], + [2, 22], + [3, 33] + ]) + ); + }); + + it("latest entries should win in case of duplicates", async () => { + const a = {k: 1, v: 11}; + const b = {k: 2, v: 22}; + const c = {k: 3, v: 33}; + const d = {k: 2, v: 222}; + + const map = await asyncSequenceOf(a, b, c, d) + .associateBy( + it => Promise.resolve(it.k), + it => Promise.resolve(it.v) + ); + + expect(map).toEqual( + new Map([ + [1, 11], + [2, 222], + [3, 33] + ]) + ); + }); +}); \ No newline at end of file diff --git a/test/operators/async/average.test.ts b/test/operators/async/average.test.ts new file mode 100644 index 0000000..9112bd4 --- /dev/null +++ b/test/operators/async/average.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("average", () => { + it("should calculate average", async () => { + const avg = await asyncSequenceOf(1, 2, 3, 4) + .average(); + + expect(avg).toBe(2.5); + }); + + it("should return NaN on empty sequence", async () => { + const sequence = emptyAsyncSequence(); + const avg = await sequence.average(); + + expect(avg).toBeNaN(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/chunk.test.ts b/test/operators/async/chunk.test.ts new file mode 100644 index 0000000..66bfb6b --- /dev/null +++ b/test/operators/async/chunk.test.ts @@ -0,0 +1,43 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("chunk", () => { + it("should return list of chunks", async () => { + const chunks = await asyncSequenceOf(1, 2, 3, 4, 5) + .chunk(2); + + expect(chunks).toEqual([ + [1, 2], + [3, 4], + [5] + ]); + }); + + it("should return single chunk", async () => { + const chunks = await asyncSequenceOf(1, 2, 3) + .chunk(5); + + expect(chunks).toEqual([ + [1, 2, 3] + ]); + }); + + it("should return one-size chunks", async () => { + const chunks = await asyncSequenceOf(1, 2, 3) + .chunk(1); + + expect(chunks).toEqual([ + [1], + [2], + [3] + ]); + }); + + it("should throw", async () => { + await expect( + () => asyncSequenceOf(1, 2, 3).chunk(0) + ).rejects.toThrow("chunkSize must be > 0 but is 0"); + await expect( + () => asyncSequenceOf(1, 2, 3).chunk(-1) + ).rejects.toThrow("chunkSize must be > 0 but is -1"); + }); +}); \ No newline at end of file diff --git a/test/operators/async/contains.test.ts b/test/operators/async/contains.test.ts new file mode 100644 index 0000000..500d2ec --- /dev/null +++ b/test/operators/async/contains.test.ts @@ -0,0 +1,17 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("contains", () => { + it("should contain element", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .contains(Promise.resolve(3)); + + expect(result).toBe(true); + }); + + it("should not contain element", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .contains(Promise.resolve(4)); + + expect(result).toBe(false); + }); +}); \ No newline at end of file diff --git a/test/operators/async/count.test.ts b/test/operators/async/count.test.ts new file mode 100644 index 0000000..72cff00 --- /dev/null +++ b/test/operators/async/count.test.ts @@ -0,0 +1,16 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("count", () => { + it("should count results", async () => { + const num = await asyncSequenceOf(1, 2, 3).count(); + + expect(num).toBe(3); + }); + + it("should evaluate predicate and count results", async () => { + const num = await asyncSequenceOf(1, 2, 3) + .count(it => Promise.resolve(it > 1)); + + expect(num).toBe(2); + }); +}); \ No newline at end of file diff --git a/test/operators/async/distinct.test.ts b/test/operators/async/distinct.test.ts new file mode 100644 index 0000000..b3d09df --- /dev/null +++ b/test/operators/async/distinct.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("distinct", () => { + it("should dismiss duplicate items", async () => { + const result = await asyncSequenceOf(1, 1, 2, 3) + .distinct() + .toArray(); + + expect(result).toEqual([1, 2, 3]); + }); +}); diff --git a/test/operators/async/distinctBy.test.ts b/test/operators/async/distinctBy.test.ts new file mode 100644 index 0000000..ae417b3 --- /dev/null +++ b/test/operators/async/distinctBy.test.ts @@ -0,0 +1,15 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("distinctBy", () => { + it("should dismiss items with duplicate selections", async () => { + const result = await asyncSequenceOf({a: 1}, {a: 2}, {a: 1}, {a: 3}) + .distinctBy(it => Promise.resolve(it.a)) + .toArray(); + + expect(result).toEqual([ + {a: 1}, + {a: 2}, + {a: 3} + ]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/drop.test.ts b/test/operators/async/drop.test.ts new file mode 100644 index 0000000..2782378 --- /dev/null +++ b/test/operators/async/drop.test.ts @@ -0,0 +1,43 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("drop", () => { + it("should drop 2 items", async () => { + const result = await asyncSequenceOf(1, 2, 3, 4) + .drop(2) + .toArray(); + + expect(result).toEqual([3, 4]); + }); + + it("should drop all items", async () => { + const result = await asyncSequenceOf(1, 2, 3, 4) + .drop(4) + .toArray(); + + expect(result.length).toBe(0); + }); + + it("should drop all items even if overflow", async () => { + const result = await asyncSequenceOf(1, 2, 3, 4) + .drop(10) + .toArray(); + + expect(result.length).toBe(0); + }); + + it("should drop nothing for n = 0", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .drop(0) + .toArray(); + + expect(result).toEqual([1, 2, 3]); + }); + + it("should drop nothing for n < 0", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .drop(-10) + .toArray(); + + expect(result).toEqual([1, 2, 3]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/dropWhile.test.ts b/test/operators/async/dropWhile.test.ts new file mode 100644 index 0000000..04978bb --- /dev/null +++ b/test/operators/async/dropWhile.test.ts @@ -0,0 +1,27 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("dropWhile", () => { + it("should drop elements until predicate evaluates to false", async () => { + const result = await asyncSequenceOf(1, 2, 3, 2, 1) + .dropWhile(it => Promise.resolve(it < 3)) + .toArray(); + + expect(result).toEqual([3, 2, 1]); + }); + + it("should drop no elements", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .dropWhile(it => Promise.resolve(it > 3)) + .toArray(); + + expect(result).toEqual([1, 2, 3]); + }); + + it("should drop all elements", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .dropWhile(it => Promise.resolve(it > 0)) + .toArray(); + + expect(result.length).toBe(0); + }); +}); \ No newline at end of file diff --git a/test/operators/async/elementAt.test.ts b/test/operators/async/elementAt.test.ts new file mode 100644 index 0000000..eb156e7 --- /dev/null +++ b/test/operators/async/elementAt.test.ts @@ -0,0 +1,30 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("elementAt", () => { + it("should return element at first index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAt(0); + + expect(item).toBe(1); + }); + + it("should return element at middle index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAt(1); + + expect(item).toBe(2); + }); + + it("should return element at last index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAt(2); + + expect(item).toBe(3); + }); + + it("should throw error when index out of bounds", () => { + expect( + () => asyncSequenceOf(1, 2, 3).elementAt(3) + ).rejects.toThrow("Index out of bounds: 3"); + }); +}); \ No newline at end of file diff --git a/test/operators/async/elementAtOrElse.test.ts b/test/operators/async/elementAtOrElse.test.ts new file mode 100644 index 0000000..ab869cd --- /dev/null +++ b/test/operators/async/elementAtOrElse.test.ts @@ -0,0 +1,31 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("elementAtOrElse", () => { + it("should return element at first index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAtOrElse(0, () => Promise.resolve(-1)); + + expect(item).toBe(1); + }); + + it("should return element at middle index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAtOrElse(1, () => Promise.resolve(-1)); + + expect(item).toBe(2); + }); + + it("should return element at last index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAtOrElse(2, () => Promise.resolve(-1)); + + expect(item).toBe(3); + }); + + it("should return default value when index out of bounds", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAtOrElse(3, () => Promise.resolve(1234)); + + expect(item).toBe(1234); + }); +}); \ No newline at end of file diff --git a/test/operators/async/elementAtOrNull.test.ts b/test/operators/async/elementAtOrNull.test.ts new file mode 100644 index 0000000..fafbc31 --- /dev/null +++ b/test/operators/async/elementAtOrNull.test.ts @@ -0,0 +1,31 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("elementAtOrNull", () => { + it("should return element at first index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAtOrNull(0); + + expect(item).toBe(1); + }); + + it("should return element at middle index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAtOrNull(1); + + expect(item).toBe(2); + }); + + it("should return element at last index", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAtOrNull(2); + + expect(item).toBe(3); + }); + + it("should return null when index out of bounds", async () => { + const item = await asyncSequenceOf(1, 2, 3) + .elementAtOrNull(3); + + expect(item).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/filter.test.ts b/test/operators/async/filter.test.ts new file mode 100644 index 0000000..5283d1d --- /dev/null +++ b/test/operators/async/filter.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("filter", () => { + it("should filter elements", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 1)) + .toArray(); + + expect(array).toEqual([2, 3]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/filterIndexed.test.ts b/test/operators/async/filterIndexed.test.ts new file mode 100644 index 0000000..04bcdba --- /dev/null +++ b/test/operators/async/filterIndexed.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("filterIndexed", () => { + it("should filter elements by index", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .filterIndexed((index, _value) => Promise.resolve(index < 2)) + .toArray(); + + expect(array).toEqual([1, 2]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/filterNot.test.ts b/test/operators/async/filterNot.test.ts new file mode 100644 index 0000000..6f121f2 --- /dev/null +++ b/test/operators/async/filterNot.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("filterNot", () => { + it("should filter elements", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filterNot(it => Promise.resolve(it > 2)) + .toArray(); + + expect(result).toEqual([1, 2]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/filterNotNull.test.ts b/test/operators/async/filterNotNull.test.ts new file mode 100644 index 0000000..906faed --- /dev/null +++ b/test/operators/async/filterNotNull.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("filterNotNull", () => { + it("should skip null elements", async () => { + const array: number[] = await asyncSequenceOf(1, null, 2, null, 3) + .filterNotNull() + .toArray(); + + expect(array).toEqual([1, 2, 3]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/find.test.ts b/test/operators/async/find.test.ts new file mode 100644 index 0000000..6e6adcf --- /dev/null +++ b/test/operators/async/find.test.ts @@ -0,0 +1,26 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("find", () => { + it("should return first element of sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 2)) + .find(); + + expect(result).toBe(3); + }); + + it("should return null on empty sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 3)) + .find(); + + expect(result).toBeNull(); + }); + + it("should return first element matching predicate", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .find(it => Promise.resolve(it > 2)); + + expect(result).toBe(3); + }); +}); \ No newline at end of file diff --git a/test/operators/async/findLast.test.ts b/test/operators/async/findLast.test.ts new file mode 100644 index 0000000..00c376b --- /dev/null +++ b/test/operators/async/findLast.test.ts @@ -0,0 +1,25 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("findLast", () => { + it("should return last element of sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .findLast(); + + expect(result).toBe(3); + }); + + it("should return null on empty sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 3)) + .findLast(); + + expect(result).toBeNull(); + }); + + it("should return last element matching predicate", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .findLast(it => Promise.resolve(it > 1)); + + expect(result).toBe(3); + }); +}); \ No newline at end of file diff --git a/test/operators/async/first.test.ts b/test/operators/async/first.test.ts new file mode 100644 index 0000000..01379b5 --- /dev/null +++ b/test/operators/async/first.test.ts @@ -0,0 +1,33 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("first", () => { + it("should return first element of sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 2)) + .first(); + + expect(result).toBe(3); + }); + + it("should throw error on empty sequence", async () => { + expect( + () => asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 3)) + .first() + ).rejects.toThrow("No such element"); + }); + + it("should return first element matching predicate", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .first(it => Promise.resolve(it > 2)); + + expect(result).toBe(3); + }); + + it("should return null if the first element is null", async () => { + const result = await asyncSequenceOf(null) + .first(); + + expect(result).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/firstOrNull.test.ts b/test/operators/async/firstOrNull.test.ts new file mode 100644 index 0000000..e481d2d --- /dev/null +++ b/test/operators/async/firstOrNull.test.ts @@ -0,0 +1,26 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("firstOrNull", () => { + it("should return first element of sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 2)) + .firstOrNull(); + + expect(result).toBe(3); + }); + + it("should return null on empty sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 3)) + .firstOrNull(); + + expect(result).toBeNull(); + }); + + it("should return first element matching predicate", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .firstOrNull(it => Promise.resolve(it > 2)); + + expect(result).toBe(3); + }); +}); \ No newline at end of file diff --git a/test/operators/async/flatMap.test.ts b/test/operators/async/flatMap.test.ts new file mode 100644 index 0000000..f0f6734 --- /dev/null +++ b/test/operators/async/flatMap.test.ts @@ -0,0 +1,11 @@ +import {asAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("flatMap", () => { + it("should flatten element arrays", async () => { + const array = await asyncSequenceOf([1, 2], [3, 4], [5, 6]) + .flatMap(it => Promise.resolve(asAsyncSequence(it))) + .toArray(); + + expect(array).toEqual([1, 2, 3, 4, 5, 6]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/flatten.test.ts b/test/operators/async/flatten.test.ts new file mode 100644 index 0000000..f3dc8ca --- /dev/null +++ b/test/operators/async/flatten.test.ts @@ -0,0 +1,19 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("flatten", () => { + it("should flatten sequence of sequences", async () => { + const array = await asyncSequenceOf(asyncSequenceOf(1, 2), asyncSequenceOf(3, 4), asyncSequenceOf(5, 6)) + .flatten() + .toArray(); + + expect(array).toEqual([1, 2, 3, 4, 5, 6]); + }); + + it("should flatten sequence of arrays", async () => { + const array = await asyncSequenceOf([1, 2], [3, 4], [5, 6]) + .flatten() + .toArray(); + + expect(array).toEqual([1, 2, 3, 4, 5, 6]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/fold.test.ts b/test/operators/async/fold.test.ts new file mode 100644 index 0000000..e6dc897 --- /dev/null +++ b/test/operators/async/fold.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("fold", () => { + it("should 23 + sum of all numbers", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .fold(23, (acc: number, value: number) => Promise.resolve(acc + value)); + + expect(result).toBe(29); + }); + + it("should return initial value on empty sequence", async () => { + const result = await emptyAsyncSequence() + .fold(23, (acc: number, value: number) => Promise.resolve(acc + value)); + + expect(result).toBe(23); + }); +}); \ No newline at end of file diff --git a/test/operators/async/foldIndexed.test.ts b/test/operators/async/foldIndexed.test.ts new file mode 100644 index 0000000..286768f --- /dev/null +++ b/test/operators/async/foldIndexed.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("foldIndexed", () => { + it("should 23 + sum of all numbers and indices", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .foldIndexed(23, (index: number, acc: number, element: number) => Promise.resolve(acc + element + index)); + + expect(result).toBe(32); + }); + + it("should return initial value on empty sequence", async () => { + const result = await emptyAsyncSequence() + .foldIndexed(23, (index: number, acc: number, element: number) => Promise.resolve(acc + element + index)); + + expect(result).toBe(23); + }); +}); \ No newline at end of file diff --git a/test/operators/async/forEach.test.ts b/test/operators/async/forEach.test.ts new file mode 100644 index 0000000..dec68f6 --- /dev/null +++ b/test/operators/async/forEach.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("forEach", () => { + it("should call action for each element", async () => { + const array: number[] = []; + await asyncSequenceOf(1, 2, 3) + .forEach(async it => array.push(it)); + + expect(array).toEqual([1, 2, 3]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/forEachIndexed.test.ts b/test/operators/async/forEachIndexed.test.ts new file mode 100644 index 0000000..626c18b --- /dev/null +++ b/test/operators/async/forEachIndexed.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("forEach", () => { + it("should call action for each element", async () => { + const array: string[] = []; + await asyncSequenceOf(1, 2, 3) + .forEachIndexed(async (index, value) => array.push(`${index}: ${value}`)); + + expect(array).toEqual(["0: 1", "1: 2", "2: 3"]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/groupBy.test.ts b/test/operators/async/groupBy.test.ts new file mode 100644 index 0000000..64582a3 --- /dev/null +++ b/test/operators/async/groupBy.test.ts @@ -0,0 +1,21 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("groupBy", () => { + it("should group by keySelector", async () => { + const a = {k: 1, v: 11} as const; + const b = {k: 2, v: 22} as const; + const c = {k: 3, v: 33} as const; + const d = {k: 2, v: 222} as const; + + const map = await asyncSequenceOf<{k: (typeof a | typeof b | typeof c | typeof d)["k"], v: number}>(a, b, c, d) + .groupBy(it => Promise.resolve(it.k)); + + expect(map).toEqual( + new Map([ + [1, [a]], + [2, [b, d]], + [3, [c]] + ]) + ); + }); +}); \ No newline at end of file diff --git a/test/operators/async/indexOf.test.ts b/test/operators/async/indexOf.test.ts new file mode 100644 index 0000000..0375c91 --- /dev/null +++ b/test/operators/async/indexOf.test.ts @@ -0,0 +1,17 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("indexOf", () => { + it("should return index of element", async () => { + const index = await asyncSequenceOf(1, 2, 3) + .indexOf(3); + + expect(index).toBe(2); + }); + + it("should return -1 if element not found", async () => { + const index = await asyncSequenceOf(1, 2, 3) + .indexOf(4); + + expect(index).toBe(-1); + }); +}); \ No newline at end of file diff --git a/test/operators/async/indexOfFirst.test.ts b/test/operators/async/indexOfFirst.test.ts new file mode 100644 index 0000000..3b93b27 --- /dev/null +++ b/test/operators/async/indexOfFirst.test.ts @@ -0,0 +1,10 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("indexOfFirst", () => { + it("should return index of first element matching given predicate", async () => { + const index = await asyncSequenceOf(1, 2, 2, 3) + .indexOfFirst(it => Promise.resolve(it > 1)); + + expect(index).toBe(1); + }); +}); \ No newline at end of file diff --git a/test/operators/async/indexOfLast.test.ts b/test/operators/async/indexOfLast.test.ts new file mode 100644 index 0000000..1f8ebc4 --- /dev/null +++ b/test/operators/async/indexOfLast.test.ts @@ -0,0 +1,10 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("indexOfLast", () => { + it("should return index of last element matching given predicate", async () => { + const index = await asyncSequenceOf(1, 2, 2, 1) + .indexOfLast(it => Promise.resolve(it > 1)); + + expect(index).toBe(2); + }); +}); \ No newline at end of file diff --git a/test/operators/async/joinTo.test.ts b/test/operators/async/joinTo.test.ts new file mode 100644 index 0000000..1a81c74 --- /dev/null +++ b/test/operators/async/joinTo.test.ts @@ -0,0 +1,10 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("joinTo", () => { + it("should join to given string", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .joinTo({value: "List: ", prefix: "[ ", postfix: " ]"}); + + expect(result).toBe("List: [ 1, 2, 3 ]"); + }); +}); \ No newline at end of file diff --git a/test/operators/async/joinToString.test.ts b/test/operators/async/joinToString.test.ts new file mode 100644 index 0000000..51e8898 --- /dev/null +++ b/test/operators/async/joinToString.test.ts @@ -0,0 +1,38 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("joinToString", () => { + it("should join to string using default config", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .joinToString(); + + expect(result).toBe("1, 2, 3"); + }); + + it("should join to string using different separator", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .joinToString({separator: " | "}); + + expect(result).toBe("1 | 2 | 3"); + }); + + it("should join to string using different prefix and postfix", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .joinToString({prefix: "[ ", postfix: " ]"}); + + expect(result).toBe("[ 1, 2, 3 ]"); + }); + + it("should join to string using transform function", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .joinToString({transform: num => Promise.resolve(`a${num}`)}); + + expect(result).toBe("a1, a2, a3"); + }); + + it("should join to string limiting number of items joined", async () => { + const result = await asyncSequenceOf(1, 2, 3, 4, 5) + .joinToString({limit: 3}); + + expect(result).toBe("1, 2, 3, ..."); + }); +}); \ No newline at end of file diff --git a/test/operators/async/last.test.ts b/test/operators/async/last.test.ts new file mode 100644 index 0000000..d645305 --- /dev/null +++ b/test/operators/async/last.test.ts @@ -0,0 +1,33 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("last", () => { + it("should return last element of sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 1)) + .last(); + + expect(result).toBe(3); + }); + + it("should throw error on empty sequence", async () => { + expect( + () => asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 3)) + .last() + ).rejects.toThrow("No such element"); + }); + + it("should return last element matching predicate", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .last(it => Promise.resolve(it > 1)); + + expect(result).toBe(3); + }); + + it("should return null if the last element is null", async () => { + const result = await asyncSequenceOf(1, 2, null) + .last(); + + expect(result).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/lastOrNull.test.ts b/test/operators/async/lastOrNull.test.ts new file mode 100644 index 0000000..cb82ee9 --- /dev/null +++ b/test/operators/async/lastOrNull.test.ts @@ -0,0 +1,25 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("lastOrNull", () => { + it("should return last element of sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .lastOrNull(); + + expect(result).toBe(3); + }); + + it("should return null on empty sequence", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 3)) + .lastOrNull(); + + expect(result).toBeNull(); + }); + + it("should return last element matching predicate", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .lastOrNull(it => Promise.resolve(it > 1)); + + expect(result).toBe(3); + }); +}); \ No newline at end of file diff --git a/test/operators/async/map.test.ts b/test/operators/async/map.test.ts new file mode 100644 index 0000000..bcc1fcb --- /dev/null +++ b/test/operators/async/map.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("map", () => { + it("should map numbers to strings", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .map(it => Promise.resolve(`num ${it}`)) + .toArray(); + + expect(array).toEqual(["num 1", "num 2", "num 3"]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/mapIndexed.test.ts b/test/operators/async/mapIndexed.test.ts new file mode 100644 index 0000000..444d22b --- /dev/null +++ b/test/operators/async/mapIndexed.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("mapIndexed", () => { + it("should map elements by index and value", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .mapIndexed((index, value) => Promise.resolve(`${index}: ${value}`)) + .toArray(); + + expect(array).toEqual(["0: 1", "1: 2", "2: 3"]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/mapNotNull.test.ts b/test/operators/async/mapNotNull.test.ts new file mode 100644 index 0000000..6bfb01c --- /dev/null +++ b/test/operators/async/mapNotNull.test.ts @@ -0,0 +1,16 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("mapNotNull", () => { + it("should map to non-null items", async () => { + const a1 = {a: 1}; + const a2 = {a: null}; + const a3 = {a: null}; + const a4 = {a: 4}; + + const array = await asyncSequenceOf<{a: number | null}>(a1, a2, a3, a4) + .mapNotNull(it => Promise.resolve(it.a)) + .toArray(); + + expect(array).toEqual([1, 4]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/max.test.ts b/test/operators/async/max.test.ts new file mode 100644 index 0000000..6aad89d --- /dev/null +++ b/test/operators/async/max.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("max", () => { + it("should return max element", async () => { + const num = await asyncSequenceOf(1, 3, 2, 6, 3) + .max(); + + expect(num).toBe(6); + }); + + it("should return null on empty sequence", async () => { + const num = await emptyAsyncSequence() + .max(); + + expect(num).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/maxBy.test.ts b/test/operators/async/maxBy.test.ts new file mode 100644 index 0000000..b662de4 --- /dev/null +++ b/test/operators/async/maxBy.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("maxBy", () => { + it("should return max element by selector", async () => { + const num = await asyncSequenceOf({a: 1}, {a: 3}, {a: 2}) + .maxBy(it => Promise.resolve(it.a)); + + expect(num).toEqual({a: 3}); + }); + + it("should return null on empty sequence", async () => { + const num = await emptyAsyncSequence() + .maxBy(() => Promise.resolve(0)); + + expect(num).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/maxWith.test.ts b/test/operators/async/maxWith.test.ts new file mode 100644 index 0000000..c907f37 --- /dev/null +++ b/test/operators/async/maxWith.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("maxWith", () => { + it("should return max element by comparator", async () => { + const num = await asyncSequenceOf({a: 1}, {a: 3}, {a: 2}) + .maxWith((o1, o2) => Promise.resolve(o1.a > o2.a ? 1 : (o1.a < o2.a ? -1 : 0))); + + expect(num).toEqual({a: 3}); + }); + + it("should return null on empty sequence", async () => { + const num = await emptyAsyncSequence() + .maxWith(() => Promise.resolve(0)); + + expect(num).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/merge.test.ts b/test/operators/async/merge.test.ts new file mode 100644 index 0000000..63d25b8 --- /dev/null +++ b/test/operators/async/merge.test.ts @@ -0,0 +1,35 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("merge", () => { + it("should merge both sequences", async () => { + const result = await asyncSequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) + .merge(asyncSequenceOf({id: 2, val: "bb"}), it => Promise.resolve(it.id)) + .toArray(); + + expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); + }); + + it("should merge given array", async () => { + const result = await asyncSequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) + .merge([{id: 2, val: "bb"}], it => Promise.resolve(it.id)) + .toArray(); + + expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); + }); + + it("should merge both sequences and append new values", async () => { + const result = await asyncSequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) + .merge(asyncSequenceOf({id: 2, val: "bb"}, {id: 4, val: "d"}), it => Promise.resolve(it.id)) + .toArray(); + + expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}, {id: 4, val: "d"}]); + }); + + it("should merge both sequences and prepend new values", async () => { + const result = await asyncSequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) + .merge(asyncSequenceOf({id: 2, val: "bb"}, {id: 4, val: "d"}), it => Promise.resolve(it.id), true) + .toArray(); + + expect(result).toEqual([{id: 4, val: "d"}, {id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/min.test.ts b/test/operators/async/min.test.ts new file mode 100644 index 0000000..26b1a29 --- /dev/null +++ b/test/operators/async/min.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("min", () => { + it("should return min element", async () => { + const num = await asyncSequenceOf(3, 1, 2, 6, 3) + .min(); + + expect(num).toBe(1); + }); + + it("should return null on empty sequence", async () => { + const num = await emptyAsyncSequence() + .min(); + + expect(num).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/minBy.test.ts b/test/operators/async/minBy.test.ts new file mode 100644 index 0000000..5822f06 --- /dev/null +++ b/test/operators/async/minBy.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("minBy", () => { + it("should return min element by selector", async () => { + const num = await asyncSequenceOf({a: 1}, {a: 3}, {a: 2}) + .minBy(it => Promise.resolve(it.a)); + + expect(num).toEqual({a: 1}); + }); + + it("should return null on empty sequence", async () => { + const num = await emptyAsyncSequence() + .minBy(() => Promise.resolve(0)); + + expect(num).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/minWith.test.ts b/test/operators/async/minWith.test.ts new file mode 100644 index 0000000..079858a --- /dev/null +++ b/test/operators/async/minWith.test.ts @@ -0,0 +1,17 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("minWith", () => { + it("should return min element by comparator", async () => { + const num = await asyncSequenceOf({a: 1}, {a: 3}, {a: 2}) + .minWith((o1, o2) => Promise.resolve(o1.a > o2.a ? 1 : (o1.a < o2.a ? -1 : 0))); + + expect(num).toEqual({a: 1}); + }); + + it("should return null on empty sequence", async () => { + const num = await emptyAsyncSequence() + .maxWith(() => Promise.resolve(0)); + + expect(num).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/minus.test.ts b/test/operators/async/minus.test.ts new file mode 100644 index 0000000..2942d7d --- /dev/null +++ b/test/operators/async/minus.test.ts @@ -0,0 +1,35 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("minus", () => { + it("should remove element", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .minus(1) + .toArray(); + + expect(array).toEqual([2, 3]); + }); + + it("should remove array", async () => { + const array = await asyncSequenceOf(1, 2, 3, 4, 5) + .minus([2, 4]) + .toArray(); + + expect(array).toEqual([1, 3, 5]); + }); + + it("should append sequence", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .minus(asyncSequenceOf(1, 2)) + .toArray(); + + expect(array).toEqual([3]); + }); + + it("should append empty sequence", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .minus(emptyAsyncSequence()) + .toArray(); + + expect(array).toEqual([1, 2, 3]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/none.test.ts b/test/operators/async/none.test.ts new file mode 100644 index 0000000..2b81df8 --- /dev/null +++ b/test/operators/async/none.test.ts @@ -0,0 +1,33 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("none", () => { + it("should return false", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 1)) + .none(); + + expect(result).toBe(false); + }); + + it("should return true", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .filter(it => Promise.resolve(it > 3)) + .none(); + + expect(result).toBe(true); + }); + + it("should evaluate predicate and return false", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .none(it => Promise.resolve(it > 1)); + + expect(result).toBe(false); + }); + + it("should evaluate predicate and return true", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .none(it => Promise.resolve(it > 3)); + + expect(result).toBe(true); + }); +}); \ No newline at end of file diff --git a/test/operators/async/onEach.test.ts b/test/operators/async/onEach.test.ts new file mode 100644 index 0000000..6defe41 --- /dev/null +++ b/test/operators/async/onEach.test.ts @@ -0,0 +1,13 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("onEach", () => { + it("should call action for each element", async () => { + const array: number[] = []; + const result = await asyncSequenceOf(1, 2, 3) + .onEach(async it => array.push(it)) + .toArray(); + + expect(array).toEqual([1, 2, 3]); + expect(result).toEqual(array); + }); +}); \ No newline at end of file diff --git a/test/operators/async/partition.test.ts b/test/operators/async/partition.test.ts new file mode 100644 index 0000000..3bb86d5 --- /dev/null +++ b/test/operators/async/partition.test.ts @@ -0,0 +1,13 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("partition", () => { + it("should partition based on the given predicate", async () => { + const result = await asyncSequenceOf(1, 2, 3, 4) + .partition(it => Promise.resolve(it % 2 === 1)); + + expect(result).toHaveProperty("true"); + expect(result).toHaveProperty("false"); + expect(result.true).toEqual([1, 3]); + expect(result.false).toEqual([2, 4]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/plus.test.ts b/test/operators/async/plus.test.ts new file mode 100644 index 0000000..63915ae --- /dev/null +++ b/test/operators/async/plus.test.ts @@ -0,0 +1,35 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("plus", () => { + it("should append element", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .plus(4) + .toArray(); + + expect(array).toEqual([1, 2, 3, 4]); + }); + + it("should append array", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .plus([4, 5]) + .toArray(); + + expect(array).toEqual([1, 2, 3, 4, 5]); + }); + + it("should append sequence", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .plus(asyncSequenceOf(4, 5)) + .toArray(); + + expect(array).toEqual([1, 2, 3, 4, 5]); + }); + + it("should append empty sequence", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .plus(emptyAsyncSequence()) + .toArray(); + + expect(array).toEqual([1, 2, 3]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/reduce.test.ts b/test/operators/async/reduce.test.ts new file mode 100644 index 0000000..29ca666 --- /dev/null +++ b/test/operators/async/reduce.test.ts @@ -0,0 +1,17 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("reduce", () => { + it("should sum all numbers", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .reduce((acc: number, value: number) => Promise.resolve(acc + value)); + + expect(result).toBe(6); + }); + + it("should concat all strings", async () => { + const result = await asyncSequenceOf("a", "b", "c") + .reduce((acc: string, value: string) => Promise.resolve(`${acc}, ${value}`)); + + expect(result).toBe("a, b, c"); + }); +}); \ No newline at end of file diff --git a/test/operators/async/reduceIndexed.test.ts b/test/operators/async/reduceIndexed.test.ts new file mode 100644 index 0000000..d82bdc9 --- /dev/null +++ b/test/operators/async/reduceIndexed.test.ts @@ -0,0 +1,10 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("reduceIndexed", () => { + it("should sum all numbers + indices", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .reduceIndexed((index: number, acc: number, value: number) => Promise.resolve(acc + value + index)); + + expect(result).toBe(9); + }); +}); \ No newline at end of file diff --git a/test/operators/async/reverse.test.ts b/test/operators/async/reverse.test.ts new file mode 100644 index 0000000..b65161a --- /dev/null +++ b/test/operators/async/reverse.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("reverse", () => { + it("should reverse order", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .reverse() + .toArray(); + + expect(array).toEqual([3, 2, 1]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/single.test.ts b/test/operators/async/single.test.ts new file mode 100644 index 0000000..b5dcab4 --- /dev/null +++ b/test/operators/async/single.test.ts @@ -0,0 +1,43 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("single", () => { + it("should return single element", async () => { + const result = await asyncSequenceOf(23) + .single(); + + expect(result).toBe(23); + }); + + it("should throw with more than one element", () => { + expect( + () => asyncSequenceOf(1, 2).single() + ).rejects.toThrow("Expect single element"); + }); + + it("should throw with zero elements", () => { + expect( + () => emptyAsyncSequence().single() + ).rejects.toThrow("No such element"); + }); + + it("should evaluate predicate and return single element", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .single(it => Promise.resolve(it > 2)); + + expect(result).toBe(3); + }); + + it("should evaluate predicate and throw with more than one element", () => { + expect( + () => asyncSequenceOf(1, 2) + .single(it => Promise.resolve(it > 0)) + ).rejects.toThrow("Expect single element"); + }); + + it("should evaluate predicate and throw with zero elements", () => { + expect( + () => asyncSequenceOf(1, 2, 3) + .single(it => Promise.resolve(it > 3)) + ).rejects.toThrow("No such element"); + }); +}); \ No newline at end of file diff --git a/test/operators/async/singleOrNull.test.ts b/test/operators/async/singleOrNull.test.ts new file mode 100644 index 0000000..3680e68 --- /dev/null +++ b/test/operators/async/singleOrNull.test.ts @@ -0,0 +1,45 @@ +import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("singleOrNull", () => { + it("should return single element", async () => { + const result = await asyncSequenceOf(23) + .singleOrNull(); + + expect(result).toBe(23); + }); + + it("should return null with more than one element", async () => { + const result = await asyncSequenceOf(1, 2) + .singleOrNull(); + + expect(result).toBeNull(); + }); + + it("should return null with zero elements", async () => { + const result = await emptyAsyncSequence() + .singleOrNull(); + + expect(result).toBeNull(); + }); + + it("should evaluate predicate and return single element", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .singleOrNull(it => Promise.resolve(it > 2)); + + expect(result).toBe(3); + }); + + it("should evaluate predicate and return null with more than one element", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .singleOrNull(it => Promise.resolve(it > 1)); + + expect(result).toBeNull(); + }); + + it("should evaluate predicate and return null with zero elements", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .singleOrNull(it => Promise.resolve(it > 3)); + + expect(result).toBeNull(); + }); +}); \ No newline at end of file diff --git a/test/operators/async/sorted.test.ts b/test/operators/async/sorted.test.ts new file mode 100644 index 0000000..d06f73c --- /dev/null +++ b/test/operators/async/sorted.test.ts @@ -0,0 +1,164 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("sorted", () => { + it("should sort numbers ascending", async () => { + const array = await asyncSequenceOf(1, 4, 3, 5, 2) + .sorted() + .toArray(); + + expect(array).toEqual([1, 2, 3, 4, 5]); + }); + + it("should sort strings ascending", async () => { + const array = await asyncSequenceOf("1", "4", "3", "5", "2") + .sorted() + .toArray(); + + expect(array).toEqual(["1", "2", "3", "4", "5"]); + }); + + it("should sort numbers by natural order", async () => { + const array = await asyncSequenceOf(1, 4, 3, 5, 2) + .sorted(it => it.naturalOrder()) + .toArray(); + + expect(array).toEqual([1, 2, 3, 4, 5]); + }); + + it("should sort numbers by natural order reversed", async () => { + const array = await asyncSequenceOf(1, 4, 3, 5, 2) + .sorted(it => it.naturalOrder() + .reversed()) + .toArray(); + + expect(array).toEqual([5, 4, 3, 2, 1]); + }); + + it("should sort numbers by reverse order", async () => { + const array = await asyncSequenceOf(1, 4, 3, 5, 2) + .sorted(it => it.reverseOrder()) + .toArray(); + + expect(array).toEqual([5, 4, 3, 2, 1]); + }); + + it("should sort by given compareFn", async () => { + const fn = (a: number, b: number) => a < b ? 1 : a > b ? -1 : 0; + const array = await asyncSequenceOf(1, 4, 3, 5, 2) + .sorted(it => it.compare(fn)) + .toArray(); + + expect(array).toEqual([5, 4, 3, 2, 1]); + }); + + it("should sort by comparing the selected property", async () => { + const array = await asyncSequenceOf({x: 2}, {x: 1}, {x: 3}) + .sorted(it => it.compareBy(it => it.x)) + .toArray(); + + expect(array).toEqual([{x: 1}, {x: 2}, {x: 3}]); + }); + + it("should sort by comparing the given key", async () => { + const array = await asyncSequenceOf({x: 2}, {x: 1}, {x: 3}) + .sorted(it => it.compareBy("x")) + .toArray(); + + expect(array).toEqual([{x: 1}, {x: 2}, {x: 3}]); + }); + + it("should sort by comparing the selected property in reversed order", async () => { + const array = await asyncSequenceOf({x: 2}, {x: 1}, {x: 3}) + .sorted(it => it.compareBy(it => it.x) + .reversed()) + .toArray(); + + expect(array).toEqual([{x: 3}, {x: 2}, {x: 1}]); + }); + + it("should sort by comparing the selected property descending", async () => { + const array = await asyncSequenceOf({x: 2}, {x: 1}, {x: 3}) + .sorted(it => it.compareByDescending(it => it.x)) + .toArray(); + + expect(array).toEqual([{x: 3}, {x: 2}, {x: 1}]); + }); + + it("should sort by comparing the given key descending", async () => { + const array = await asyncSequenceOf({x: 2}, {x: 1}, {x: 3}) + .sorted(it => it.compareByDescending("x")) + .toArray(); + + expect(array).toEqual([{x: 3}, {x: 2}, {x: 1}]); + }); + + it("should sort by comparing the selected property then other property", async () => { + const array = await asyncSequenceOf({x: 2, y: 2}, {x: 1, y: 2}, {x: 1, y: 1}) + .sorted(it => it.compareBy(it => it.x) + .thenBy(it => it.y)) + .toArray(); + + expect(array).toEqual([{x: 1, y: 1}, {x: 1, y: 2}, {x: 2, y: 2}]); + }); + + it("should sort by comparing the given key then other key", async () => { + const array = await asyncSequenceOf({x: 2, y: 2}, {x: 1, y: 2}, {x: 1, y: 1}) + .sorted(it => it.compareBy("x") + .thenBy("y")) + .toArray(); + + expect(array).toEqual([{x: 1, y: 1}, {x: 1, y: 2}, {x: 2, y: 2}]); + }); + + it("should sort by comparing the selected property then other property with nulls last", async () => { + const array = await asyncSequenceOf({x: 2, y: 2}, undefined, null, {x: 1, y: 2}, {x: null, y: undefined}, {x: 1, y: 1}) + .sorted(it => it.compareBy(it => it?.x) + .thenBy(it => it?.y)) + .toArray(); + + expect(array).toEqual([{x: 1, y: 1}, {x: 1, y: 2}, {x: 2, y: 2}, {x: null, y: undefined}, null, undefined]); + }); + + it("should sort by comparing the given key then other key with nulls last", async () => { + const array = await asyncSequenceOf({x: 2, y: 2}, undefined, null, {x: 1, y: 2}, {x: null, y: undefined}, {x: 1, y: 1}) + .sorted(it => it.compareBy("x") + .thenBy("y")) + .toArray(); + + expect(array).toEqual([{x: 1, y: 1}, {x: 1, y: 2}, {x: 2, y: 2}, {x: null, y: undefined}, null, undefined]); + }); + + it("should order nulls first", async () => { + const array = await asyncSequenceOf({x: 2}, null, {x: 1}, {x: 3}, null) + .sorted(it => it.nullsFirst()) + .toArray(); + + expect(array).toEqual([null, null, {x: 2}, {x: 1}, {x: 3}]); + }); + + it("should order nulls last", async () => { + const array = await asyncSequenceOf({x: 2}, null, {x: 1}, {x: 3}, null) + .sorted(it => it.nullsLast()) + .toArray(); + + expect(array).toEqual([{x: 2}, {x: 1}, {x: 3}, null, null]); + }); + + it("should order nulls first then by descending selected property", async () => { + const array = await asyncSequenceOf({x: 2}, null, {x: 1}, {x: 3}, null) + .sorted(it => it.nullsFirst() + .thenByDescending(it => it?.x)) + .toArray(); + + expect(array).toEqual([null, null, {x: 3}, {x: 2}, {x: 1}]); + }); + + it("should order nulls first then by descending key", async () => { + const array = await asyncSequenceOf({x: 2}, null, {x: 1}, {x: 3}, null) + .sorted(it => it.nullsFirst() + .thenByDescending("x")) + .toArray(); + + expect(array).toEqual([null, null, {x: 3}, {x: 2}, {x: 1}]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/sortedBy.test.ts b/test/operators/async/sortedBy.test.ts new file mode 100644 index 0000000..e5c4e9c --- /dev/null +++ b/test/operators/async/sortedBy.test.ts @@ -0,0 +1,16 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("sortedBy", () => { + it("should sort by the given key ascending", async () => { + const a4 = {a: 4}; + const a1 = {a: 1}; + const a3 = {a: 3}; + const a23 = {a: 23}; + + const array = await asyncSequenceOf(a4, a1, a3, a23) + .sortedBy(it => it.a) + .toArray(); + + expect(array).toEqual([a1, a3, a4, a23]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/sortedByDescending.test.ts b/test/operators/async/sortedByDescending.test.ts new file mode 100644 index 0000000..948086d --- /dev/null +++ b/test/operators/async/sortedByDescending.test.ts @@ -0,0 +1,16 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("sortedBy", () => { + it("should sort by the given key descending", async () => { + const a4 = {a: 4}; + const a1 = {a: 1}; + const a3 = {a: 3}; + const a23 = {a: 23}; + + const array = await asyncSequenceOf(a4, a1, a3, a23) + .sortedByDescending(it => it.a) + .toArray(); + + expect(array).toEqual([a23, a4, a3, a1]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/sortedDescending.test.ts b/test/operators/async/sortedDescending.test.ts new file mode 100644 index 0000000..3c98ce8 --- /dev/null +++ b/test/operators/async/sortedDescending.test.ts @@ -0,0 +1,19 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("sorted", () => { + it("should sort numbers descending", async () => { + const array = await asyncSequenceOf(1, 4, 3, 5, 2) + .sortedDescending() + .toArray(); + + expect(array).toEqual([5, 4, 3, 2, 1]); + }); + + it("should sort strings descending", async () => { + const array = await asyncSequenceOf("1", "4", "3", "5", "2") + .sortedDescending() + .toArray(); + + expect(array).toEqual(["5", "4", "3", "2", "1"]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/sortedWith.test.ts b/test/operators/async/sortedWith.test.ts new file mode 100644 index 0000000..263907b --- /dev/null +++ b/test/operators/async/sortedWith.test.ts @@ -0,0 +1,19 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("sortedWith", () => { + it("should sort numbers by given comparator", async () => { + const array = await asyncSequenceOf(1, 4, 3, 5, 2) + .sortedWith((a, b) => { + if (a < b) { + return 1; + } + if (a > b) { + return -1; + } + return 0; + }) + .toArray(); + + expect(array).toEqual([5, 4, 3, 2, 1]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/sum.test.ts b/test/operators/async/sum.test.ts new file mode 100644 index 0000000..9144a63 --- /dev/null +++ b/test/operators/async/sum.test.ts @@ -0,0 +1,10 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("sum", () => { + it("should sum all numbers", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .sum(); + + expect(result).toBe(6); + }); +}); \ No newline at end of file diff --git a/test/operators/async/sumBy.test.ts b/test/operators/async/sumBy.test.ts new file mode 100644 index 0000000..d966835 --- /dev/null +++ b/test/operators/async/sumBy.test.ts @@ -0,0 +1,10 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("sumBy", () => { + it("should sum all selected numbers", async () => { + const result = await asyncSequenceOf({a: 2}, {a: 4}, {a: 6}) + .sumBy(async it => it.a); + + expect(result).toBe(12); + }); +}); \ No newline at end of file diff --git a/test/operators/async/take.test.ts b/test/operators/async/take.test.ts new file mode 100644 index 0000000..97febdb --- /dev/null +++ b/test/operators/async/take.test.ts @@ -0,0 +1,35 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("take", () => { + it("should take first 2 items", async () => { + const result = await asyncSequenceOf(1, 2, 3, 4) + .take(2) + .toArray(); + + expect(result).toEqual([1, 2]); + }); + + it("should take no items", async () => { + const result = await asyncSequenceOf(1, 2, 3, 4) + .take(0) + .toArray(); + + expect(result.length).toBe(0); + }); + + it("should take all items even if overflow", async () => { + const result = await asyncSequenceOf(1, 2, 3, 4) + .take(10) + .toArray(); + + expect(result).toEqual([1, 2, 3, 4]); + }); + + it("should take nothing for n < 0", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .take(-10) + .toArray(); + + expect(result.length).toBe(0); + }); +}); \ No newline at end of file diff --git a/test/operators/async/takeWhile.test.ts b/test/operators/async/takeWhile.test.ts new file mode 100644 index 0000000..3cce6ca --- /dev/null +++ b/test/operators/async/takeWhile.test.ts @@ -0,0 +1,27 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("takeWhile", () => { + it("should take elements until predicate evaluates to false", async () => { + const result = await asyncSequenceOf(1, 2, 3, 2, 1) + .takeWhile(async it => it < 3) + .toArray(); + + expect(result).toEqual([1, 2]); + }); + + it("should take no elements", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .takeWhile(async it => it > 3) + .toArray(); + + expect(result.length).toBe(0); + }); + + it("should take all elements", async () => { + const result = await asyncSequenceOf(1, 2, 3) + .takeWhile(async it => it > 0) + .toArray(); + + expect(result).toEqual([1, 2, 3]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/toArray.test.ts b/test/operators/async/toArray.test.ts new file mode 100644 index 0000000..691cf46 --- /dev/null +++ b/test/operators/async/toArray.test.ts @@ -0,0 +1,21 @@ +import {asAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("toArray", () => { + it("should return new array", async () => { + const input = [1, 2, 3]; + const array = await asAsyncSequence(input) + .toArray(); + + expect(array).not.toBe(input); + expect(array).toEqual(input); + }); + + it("should append items to passed array", async () => { + const array = [1]; + const result = await asyncSequenceOf(2, 3, 4) + .toArray(array); + + expect(result).toBe(array); + expect(result).toEqual([1, 2, 3, 4]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/toList.test.ts b/test/operators/async/toList.test.ts new file mode 100644 index 0000000..c7536f8 --- /dev/null +++ b/test/operators/async/toList.test.ts @@ -0,0 +1,21 @@ +import {asAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; + +describe("toList", () => { + it("should return new array", async () => { + const input = [1, 2, 3]; + const array = await asAsyncSequence(input) + .toList(); + + expect(array).not.toBe(input); + expect(array).toEqual(input); + }); + + it("should append items to passed array", async () => { + const array = [1]; + const result = await asyncSequenceOf(2, 3, 4) + .toList(array); + + expect(result).toBe(array); + expect(result).toEqual([1, 2, 3, 4]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/toMap.test.ts b/test/operators/async/toMap.test.ts new file mode 100644 index 0000000..f1da2a0 --- /dev/null +++ b/test/operators/async/toMap.test.ts @@ -0,0 +1,43 @@ +import {asAsyncSequence} from "../../../src/sequency"; + +describe("toMap", () => { + it("should return items as new map", async () => { + const key1 = {k: 1}; + const key2 = {k: 2}; + const key3 = {k: 3}; + const array: [object, string][] = [[key1, "a"], [key2, "b"], [key3, "c"]]; + const map = await asAsyncSequence(array) + .toMap(); + + expect(map).toEqual( + new Map([ + [key1, "a"], + [key2, "b"], + [key3, "c"] + ]) + ); + }); + + it("should append items to passed map", async () => { + const key0 = {k: 0}; + const key1 = {k: 1}; + const key2 = {k: 2}; + const key3 = {k: 3}; + + const existingMap = new Map(); + existingMap.set(key0, "_"); + + const array: [object, string][] = [[key1, "a"], [key2, "b"], [key3, "c"]]; + const result = await asAsyncSequence(array) + .toMap(existingMap); + + expect(result).toEqual( + new Map([ + [key0, "_"], + [key1, "a"], + [key2, "b"], + [key3, "c"] + ]) + ); + }); +}); \ No newline at end of file diff --git a/test/operators/async/toSet.test.ts b/test/operators/async/toSet.test.ts new file mode 100644 index 0000000..b0d9a52 --- /dev/null +++ b/test/operators/async/toSet.test.ts @@ -0,0 +1,19 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("toSet", () => { + it("should return new set of distinct items", async () => { + const result = await asyncSequenceOf(1, 2, 2, 3, 3, 3) + .toSet(); + + expect(result).toEqual(new Set([1, 2, 3])); + }); + + it("should add distinct items to existing set", async () => { + const existingSet = new Set([4]); + const result = await asyncSequenceOf(1, 2, 2, 3, 3, 3) + .toSet(existingSet); + + expect(result).toBe(existingSet); + expect(result).toEqual(new Set([1, 2, 3, 4])); + }); +}); \ No newline at end of file diff --git a/test/operators/async/unzip.test.ts b/test/operators/async/unzip.test.ts new file mode 100644 index 0000000..49a3079 --- /dev/null +++ b/test/operators/async/unzip.test.ts @@ -0,0 +1,12 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("unzip", () => { + it("should unzip items", async () => { + const [first, second] = await asyncSequenceOf("a", "b", "c") + .zip(asyncSequenceOf(1, 2, 3)) + .unzip(); + + expect(first).toEqual(["a", "b", "c"]); + expect(second).toEqual([1, 2, 3]); + }); +}); \ No newline at end of file diff --git a/test/operators/async/zip.test.ts b/test/operators/async/zip.test.ts new file mode 100644 index 0000000..df5cb8e --- /dev/null +++ b/test/operators/async/zip.test.ts @@ -0,0 +1,27 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("zip", () => { + it("should combine items from both sequences into pairs", async () => { + const array = await asyncSequenceOf("a", "b", "c") + .zip(asyncSequenceOf(1, 2, 3)) + .toArray(); + + expect(array).toEqual([ + ["a", 1], + ["b", 2], + ["c", 3] + ]); + }); + + it("should discard elements if length of sequences is different", async () => { + const array = await asyncSequenceOf(1, 2, 3) + .zip(asyncSequenceOf(1, 2, 3, 4, 5, 6, 7)) + .toArray(); + + expect(array).toEqual([ + [1, 1], + [2, 2], + [3, 3] + ]); + }); +}); \ No newline at end of file From af077bf090036d67d96b16159e16f19a0f7a484f Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:18:38 +0100 Subject: [PATCH 19/28] Add unit tests for to(Async)Sequence --- test/operators/async/toSequence.test.ts | 19 +++++++++++++++++++ test/operators/sync/toAsyncSequence.test.ts | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 test/operators/async/toSequence.test.ts create mode 100644 test/operators/sync/toAsyncSequence.test.ts diff --git a/test/operators/async/toSequence.test.ts b/test/operators/async/toSequence.test.ts new file mode 100644 index 0000000..c63e93a --- /dev/null +++ b/test/operators/async/toSequence.test.ts @@ -0,0 +1,19 @@ +import {asyncSequenceOf, asAsyncSequence, sequenceOf} from "../../../src/sequency"; + +describe("toSequence", () => { + it("should return a regular sequence", async () => { + const input = [1, 2, 3]; + const array = (await asAsyncSequence(input).toSequence()) + .toArray(); + + expect(array).not.toBe(input); + expect(array).toEqual(input); + }); + + it("should append items to passed regular sequence", async () => { + const result = (await asyncSequenceOf(2, 3, 4).toSequence(sequenceOf(1))) + .toArray(); + + expect(result).toEqual([1, 2, 3, 4]); + }); +}); \ No newline at end of file diff --git a/test/operators/sync/toAsyncSequence.test.ts b/test/operators/sync/toAsyncSequence.test.ts new file mode 100644 index 0000000..d9b0ba2 --- /dev/null +++ b/test/operators/sync/toAsyncSequence.test.ts @@ -0,0 +1,19 @@ +import {asyncSequenceOf, asSequence, sequenceOf} from "../../../src/sequency"; + +describe("toAsyncSequence", () => { + it("should return an async sequence", async () => { + const input = [1, 2, 3]; + const array = await asSequence(input).toAsyncSequence() + .toArray(); + + expect(array).not.toBe(input); + expect(array).toEqual(input); + }); + + it("should append items to passed async sequence", async () => { + const result = await sequenceOf(2, 3, 4).toAsyncSequence(asyncSequenceOf(1)) + .toArray(); + + expect(result).toEqual([1, 2, 3, 4]); + }); +}); \ No newline at end of file From 6dd147490d31420bedecf799ecef367d2251dc85 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:18:46 +0100 Subject: [PATCH 20/28] Add unit tests for onEachIndexed --- test/operators/async/onEachIndexed.test.ts | 12 ++++++++++++ test/operators/sync/onEachIndexed.test.ts | 12 ++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 test/operators/async/onEachIndexed.test.ts create mode 100644 test/operators/sync/onEachIndexed.test.ts diff --git a/test/operators/async/onEachIndexed.test.ts b/test/operators/async/onEachIndexed.test.ts new file mode 100644 index 0000000..4d105c6 --- /dev/null +++ b/test/operators/async/onEachIndexed.test.ts @@ -0,0 +1,12 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("onEachIndexed", () => { + it("should call action for each element", async () => { + const array: string[] = []; + await asyncSequenceOf(1, 2, 3) + .onEachIndexed(async (index, value) => array.push(`${index}: ${value}`)) + .toArray(); + + expect(array).toEqual(["0: 1", "1: 2", "2: 3"]); + }); +}); \ No newline at end of file diff --git a/test/operators/sync/onEachIndexed.test.ts b/test/operators/sync/onEachIndexed.test.ts new file mode 100644 index 0000000..d28d9f9 --- /dev/null +++ b/test/operators/sync/onEachIndexed.test.ts @@ -0,0 +1,12 @@ +import {sequenceOf} from "../../../src/sequency"; + +describe("onEachIndexed", () => { + it("should call action for each element", () => { + const array: string[] = []; + sequenceOf(1, 2, 3) + .onEachIndexed((index, value) => array.push(`${index}: ${value}`)) + .toArray(); + + expect(array).toEqual(["0: 1", "1: 2", "2: 3"]); + }); +}); \ No newline at end of file From 068de63594f40ed73235e0ba1a0b3786b42fbdd2 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:24:10 +0100 Subject: [PATCH 21/28] Update entrypoints --- package.json | 4 ++-- webpack.config.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 3a53cef..651affb 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "name": "sequency", "version": "0.20.0", "description": "Functional sequences for processing iterable data in JavaScript", - "main": "lib/Sequence.js", + "main": "lib/sequency.js", "umd:main": "lib-umd/sequency.js", - "typings": "lib/Sequence.d.ts", + "types": "lib/sequency.d.ts", "scripts": { "test": "jest", "watch": "jest --watch --notify", diff --git a/webpack.config.js b/webpack.config.js index ae0d182..8b8edd7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -5,8 +5,8 @@ const TerserPlugin = require("terser-webpack-plugin"); /** @type {webpack.Configuration} */ module.exports = { entry: { - 'sequency': './src/Sequence.ts', - 'sequency.min': './src/Sequence.ts' + 'sequency': './src/sequency.ts', + 'sequency.min': './src/sequency.ts' }, output: { path: path.resolve(__dirname, 'lib-umd'), From 5976e08f8ac5f82e9cb77bdd2a733d8af3568cc5 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 15:59:56 +0100 Subject: [PATCH 22/28] Update imports and exports --- src/ComparatorFactory.ts | 1 - src/IndexedValue.ts | 5 ++--- src/operators/async/joinToString.ts | 2 +- src/operators/sync/joinToString.ts | 2 +- src/sequency.ts | 5 +++++ 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/ComparatorFactory.ts b/src/ComparatorFactory.ts index fc262a2..b815039 100644 --- a/src/ComparatorFactory.ts +++ b/src/ComparatorFactory.ts @@ -1,4 +1,3 @@ -import {asSelector} from "./internal"; import Comparator from "./Comparator"; /** diff --git a/src/IndexedValue.ts b/src/IndexedValue.ts index dfba93d..31cd3e0 100644 --- a/src/IndexedValue.ts +++ b/src/IndexedValue.ts @@ -1,8 +1,7 @@ /** * Defines a `value` with a zero-based `index`. */ -interface IndexedValue { +export default interface IndexedValue { index: number; value: T; -} -export default IndexedValue; \ No newline at end of file +} \ No newline at end of file diff --git a/src/operators/async/joinToString.ts b/src/operators/async/joinToString.ts index f45b189..de3ce17 100644 --- a/src/operators/async/joinToString.ts +++ b/src/operators/async/joinToString.ts @@ -1,6 +1,6 @@ import {AsyncSequence} from "../../sequency"; -export default interface JoinConfig { +export interface JoinConfig { value?: string; separator?: string; prefix?: string; diff --git a/src/operators/sync/joinToString.ts b/src/operators/sync/joinToString.ts index f2fa9dd..d3dd442 100644 --- a/src/operators/sync/joinToString.ts +++ b/src/operators/sync/joinToString.ts @@ -1,6 +1,6 @@ import {Sequence} from "../../sequency"; -export default interface JoinConfig { +export interface JoinConfig { value?: string; separator?: string; prefix?: string; diff --git a/src/sequency.ts b/src/sequency.ts index ca1bbc4..94416d8 100644 --- a/src/sequency.ts +++ b/src/sequency.ts @@ -6,6 +6,11 @@ import {Sequence, SequenceImpl} from "./Sequence"; export {Sequence, Sequence as default} from "./Sequence"; export {AsyncSequence} from "./AsyncSequence"; +export {default as Comparator} from "./Comparator"; +export {default as ComparatorFactory} from "./ComparatorFactory"; +export {default as IndexedValue} from "./IndexedValue"; +export {JoinConfig as JoinToStringConfig} from "./operators/sync/joinToString"; +export {JoinConfig as AsyncJoinToStringConfig} from "./operators/async/joinToString"; /** * Create sequence of multiple arguments of an array of arguments From 165ed10fdad94673d620bd941b7dd4e2b8c3355c Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 16:00:05 +0100 Subject: [PATCH 23/28] Update API doc --- APIDOC.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/APIDOC.md b/APIDOC.md index d74a3a8..6198921 100644 --- a/APIDOC.md +++ b/APIDOC.md @@ -7,14 +7,16 @@ Download the [latest release](https://github.com/winterbe/sequency/releases) fro ```bash npm install sequency ``` + or + ```bash yarn add sequency ``` -### How Sequency works +## How Sequency works -Sequency is centered around the interface [Sequence](https://winterbe.github.io/sequency/interfaces/Sequence.html) to process any kind of iterable data such as arrays, maps and sets. +Sequency is centered around the interface [Sequence](https://winterbe.github.io/sequency/interfaces/Sequence.html) to process any kind of iterable data such as arrays, maps and sets. The interface `Sequence` provides a fluent functional API consisting of intermediate and terminal operations. Intermediate functions return a new sequence, thus enabling method chaining while terminal functions return an arbitrary result. You can explore all available `Sequence` operations by navigating to the [Sequence](https://winterbe.github.io/sequency/interfaces/Sequence.html) interface. @@ -46,6 +48,10 @@ const result = asSequence(numbers) // result: [5, 4, 3] ``` -### License +## Asynchronous sequences + +Sequency supports promises via the dedicated interface [AsyncSequence](https://winterbe.github.io/sequency/interfaces/AsyncSequence.html). This requires you to await the result of terminal functions. + +## License MIT © [winterbe](https://twitter.com/winterbe_) From 346f456c63294b817b829c2824a25f4f1010f401 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 16:38:57 +0100 Subject: [PATCH 24/28] Replace redundant code --- src/BaseJoinToStringConfig.ts | 30 +++++++++++++++++++++++++++++ src/operators/async/joinToString.ts | 14 +++++++------- src/operators/sync/joinToString.ts | 14 +++++++------- 3 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 src/BaseJoinToStringConfig.ts diff --git a/src/BaseJoinToStringConfig.ts b/src/BaseJoinToStringConfig.ts new file mode 100644 index 0000000..deb7899 --- /dev/null +++ b/src/BaseJoinToStringConfig.ts @@ -0,0 +1,30 @@ +export interface BaseJoinToStringConfig { + /** + * Value to prepend + */ + value?: string; + /** + * Element separator + */ + separator?: string; + /** + * Element prefix + */ + prefix?: string; + /** + * Element postfix + */ + postfix?: string; + /** + * Element limit + * + * - -1: unlimited + * - 0: truncate immediately + * - 1..n: truncate after the limit is reached + */ + limit?: number; + /** + * Truncation indicator (like "...") + */ + truncated?: string; +} \ No newline at end of file diff --git a/src/operators/async/joinToString.ts b/src/operators/async/joinToString.ts index de3ce17..d0e442a 100644 --- a/src/operators/async/joinToString.ts +++ b/src/operators/async/joinToString.ts @@ -1,12 +1,12 @@ import {AsyncSequence} from "../../sequency"; +import {BaseJoinToStringConfig} from "../../BaseJoinToStringConfig"; -export interface JoinConfig { - value?: string; - separator?: string; - prefix?: string; - postfix?: string; - limit?: number; - truncated?: string; +export interface JoinConfig extends BaseJoinToStringConfig { + /** + * Transform function + * @param value Sequence element + * @returns {Promise | string} String representation + */ transform?: (value: T) => Promise | string; } diff --git a/src/operators/sync/joinToString.ts b/src/operators/sync/joinToString.ts index d3dd442..6da38c5 100644 --- a/src/operators/sync/joinToString.ts +++ b/src/operators/sync/joinToString.ts @@ -1,12 +1,12 @@ import {Sequence} from "../../sequency"; +import {BaseJoinToStringConfig} from "../../BaseJoinToStringConfig"; -export interface JoinConfig { - value?: string; - separator?: string; - prefix?: string; - postfix?: string; - limit?: number; - truncated?: string; +export interface JoinConfig extends BaseJoinToStringConfig { + /** + * Transform function + * @param value Sequence element + * @returns {string} String representation + */ transform?: (value: T) => string; } From 91795ccdb0bf4cbe80a9046b81f7def6844786d3 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 16:39:13 +0100 Subject: [PATCH 25/28] Add ESM support --- package.json | 34 +++++++++++++++++++++++++--------- tsconfig.cjs.json | 11 +++++++++++ tsconfig.esm.json | 12 ++++++++++++ tsconfig.json | 8 +++++--- webpack.config.js | 4 ++-- 5 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 tsconfig.cjs.json create mode 100644 tsconfig.esm.json diff --git a/package.json b/package.json index 651affb..82e49cb 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,18 @@ "name": "sequency", "version": "0.20.0", "description": "Functional sequences for processing iterable data in JavaScript", - "main": "lib/sequency.js", - "umd:main": "lib-umd/sequency.js", - "types": "lib/sequency.d.ts", + "main": "./lib/cjs/sequency.js", + "module": "./lib/esm/sequency.js", + "umd:main": "./lib/umd/sequency.js", + "types": "./lib/types/sequency.d.ts", + "exports": { + ".": { + "default": "./lib/cjs/sequency.js", + "require": "./lib/cjs/sequency.js", + "import": "./lib/esm/sequency.js", + "types": "./lib/types/sequency.d.ts" + } + }, "scripts": { "test": "jest", "watch": "jest --watch --notify", @@ -15,8 +24,8 @@ "docs-publish": "yarn docs && touch docs/.nojekyll && gh-pages -d docs -t", "bundle": "webpack --mode production && size-limit", "bundle-browsertest": "open ./test/browsertest-lib.html", - "clean": "rimraf lib && rimraf lib-umd && rimraf docs && rimraf coverage", - "compile": "node_modules/.bin/tsc", + "clean": "rimraf lib && rimraf docs && rimraf coverage", + "compile": "node_modules/.bin/tsc -b tsconfig.json tsconfig.esm.json tsconfig.cjs.json", "build": "yarn clean && yarn lint && yarn compile && yarn test && yarn bundle", "prepublishOnly": "yarn build" }, @@ -32,7 +41,6 @@ }, "files": [ "lib", - "lib-umd", "LICENSE" ], "engines": { @@ -61,16 +69,24 @@ "js" ], "transform": { - "^.+\\.ts$": "ts-jest" + "^.+\\.ts$": [ + "ts-jest", + { + "tsconfig": "./tsconfig.esm.json", + "useESM": true + } + ] }, "testMatch": [ "**/test/**/*.ts" ], - "testURL": "http://localhost/" + "testEnvironmentOptions": { + "url": "http://localhost/" + } }, "size-limit": [ { - "path": "lib-umd/sequency.min.js", + "path": "lib/umd/sequency.min.js", "limit": "10 KB" } ], diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json new file mode 100644 index 0000000..3862fd9 --- /dev/null +++ b/tsconfig.cjs.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "target": "ES2015", + "outDir": "./lib/cjs", + "declaration": false, + "emitDeclarationOnly": false, + "declarationDir": null + } +} \ No newline at end of file diff --git a/tsconfig.esm.json b/tsconfig.esm.json new file mode 100644 index 0000000..9193786 --- /dev/null +++ b/tsconfig.esm.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "ES2015", + "target": "ES2015", + "outDir": "./lib/esm", + "declaration": false, + "emitDeclarationOnly": false, + "declarationDir": null, + "esModuleInterop": true + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index cee5b2e..2c64517 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,11 @@ { "compilerOptions": { - "module": "commonjs", - "target": "es2015", - "outDir": "lib", + "module": "ES2015", + "target": "ES2015", + "outDir": "./lib", "declaration": true, + "emitDeclarationOnly": true, + "declarationDir": "./lib/types", "sourceMap": true, "skipLibCheck": true, "removeComments": false, diff --git a/webpack.config.js b/webpack.config.js index 8b8edd7..4935f09 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -9,7 +9,7 @@ module.exports = { 'sequency.min': './src/sequency.ts' }, output: { - path: path.resolve(__dirname, 'lib-umd'), + path: path.resolve(__dirname, 'lib/umd'), filename: '[name].js', libraryTarget: 'umd', library: 'Sequency', @@ -25,7 +25,7 @@ module.exports = { loader: 'ts-loader', options: { transpileOnly: true, - configFile: 'tsconfig.json' + configFile: 'tsconfig.cjs.json' }, exclude: /node_modules/ }] From 987e223287e587d16b551a1dfe8b4e041ebcbba8 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 16:42:32 +0100 Subject: [PATCH 26/28] Remove irregular promise support --- src/operators/async/contains.ts | 4 ++-- test/operators/async/contains.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/operators/async/contains.ts b/src/operators/async/contains.ts index 462b330..9d1165a 100644 --- a/src/operators/async/contains.ts +++ b/src/operators/async/contains.ts @@ -5,10 +5,10 @@ export class Contains { /** * Returns `true` if the sequence contains the given `element`. * - * @param {Promise | T} element + * @param {T} element * @returns {Promise} */ - async contains(this: AsyncSequence, element: Promise | T): Promise { + async contains(this: AsyncSequence, element: T): Promise { const elem = await element; for (let item = await this.iterator.next(); !item.done; item = await this.iterator.next()) { if (elem === item.value) { diff --git a/test/operators/async/contains.test.ts b/test/operators/async/contains.test.ts index 500d2ec..3213650 100644 --- a/test/operators/async/contains.test.ts +++ b/test/operators/async/contains.test.ts @@ -3,14 +3,14 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("contains", () => { it("should contain element", async () => { const result = await asyncSequenceOf(1, 2, 3) - .contains(Promise.resolve(3)); + .contains(3); expect(result).toBe(true); }); it("should not contain element", async () => { const result = await asyncSequenceOf(1, 2, 3) - .contains(Promise.resolve(4)); + .contains(4); expect(result).toBe(false); }); From 5b68f1b4d905e6f5b52be5fc96aabf83468b6417 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 16:51:38 +0100 Subject: [PATCH 27/28] Replace Promise.resolve with async --- test/examples.test.ts | 3 +-- test/operators/async/all.test.ts | 4 ++-- test/operators/async/any.test.ts | 8 ++++---- test/operators/async/asIterable.test.ts | 2 +- test/operators/async/associate.test.ts | 4 ++-- test/operators/async/associateBy.test.ts | 12 ++++++------ test/operators/async/count.test.ts | 2 +- test/operators/async/distinctBy.test.ts | 2 +- test/operators/async/dropWhile.test.ts | 6 +++--- test/operators/async/elementAtOrElse.test.ts | 8 ++++---- test/operators/async/filter.test.ts | 2 +- test/operators/async/filterIndexed.test.ts | 2 +- test/operators/async/filterNot.test.ts | 2 +- test/operators/async/find.test.ts | 6 +++--- test/operators/async/findLast.test.ts | 4 ++-- test/operators/async/first.test.ts | 6 +++--- test/operators/async/firstOrNull.test.ts | 6 +++--- test/operators/async/flatMap.test.ts | 2 +- test/operators/async/fold.test.ts | 4 ++-- test/operators/async/foldIndexed.test.ts | 4 ++-- test/operators/async/groupBy.test.ts | 2 +- test/operators/async/indexOfFirst.test.ts | 2 +- test/operators/async/indexOfLast.test.ts | 2 +- test/operators/async/joinToString.test.ts | 2 +- test/operators/async/last.test.ts | 6 +++--- test/operators/async/lastOrNull.test.ts | 4 ++-- test/operators/async/map.test.ts | 2 +- test/operators/async/mapIndexed.test.ts | 2 +- test/operators/async/mapNotNull.test.ts | 2 +- test/operators/async/maxBy.test.ts | 4 ++-- test/operators/async/maxWith.test.ts | 4 ++-- test/operators/async/merge.test.ts | 8 ++++---- test/operators/async/minBy.test.ts | 4 ++-- test/operators/async/minWith.test.ts | 4 ++-- test/operators/async/none.test.ts | 8 ++++---- test/operators/async/partition.test.ts | 2 +- test/operators/async/reduce.test.ts | 4 ++-- test/operators/async/reduceIndexed.test.ts | 2 +- test/operators/async/single.test.ts | 6 +++--- test/operators/async/singleOrNull.test.ts | 6 +++--- 40 files changed, 82 insertions(+), 83 deletions(-) diff --git a/test/examples.test.ts b/test/examples.test.ts index 551997d..34f351e 100644 --- a/test/examples.test.ts +++ b/test/examples.test.ts @@ -10,8 +10,7 @@ describe("examples", () => { }); it("should generate sequence of fibonacci numbers", () => { - const nums = - generateSequence([0, 1], ([a, b]) => [b, a + b]) + const nums = generateSequence([0, 1], ([a, b]) => [b, a + b]) .map(([a, _]) => a) .take(10) .toArray(); diff --git a/test/operators/async/all.test.ts b/test/operators/async/all.test.ts index 079f3d3..a61d529 100644 --- a/test/operators/async/all.test.ts +++ b/test/operators/async/all.test.ts @@ -3,14 +3,14 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("all", () => { it("should return false", async () => { const result = await asyncSequenceOf(1, 2, 3) - .all(it => Promise.resolve(it > 1)); + .all(async it => it > 1); expect(result).toBe(false); }); it("should return true", async () => { const result = await asyncSequenceOf(1, 2, 3) - .all(it => Promise.resolve(it > 0)); + .all(async it => it > 0); expect(result).toBe(true); }); diff --git a/test/operators/async/any.test.ts b/test/operators/async/any.test.ts index 7362cf6..fc2b037 100644 --- a/test/operators/async/any.test.ts +++ b/test/operators/async/any.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("any", () => { it("should return false", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 3)) + .filter(async it => it > 3) .any(); expect(result).toBe(false); @@ -11,7 +11,7 @@ describe("any", () => { it("should return true", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 1)) + .filter(async it => it > 1) .any(); expect(result).toBe(true); @@ -19,14 +19,14 @@ describe("any", () => { it("should evaluate predicate and return false", async () => { const result = await asyncSequenceOf(1, 2, 3) - .any(it => Promise.resolve(it > 3)); + .any(async it => it > 3); expect(result).toBe(false); }); it("should evaluate predicate and return true", async () => { const result = await asyncSequenceOf(1, 2, 3) - .any(it => Promise.resolve(it > 2)); + .any(async it => it > 2); expect(result).toBe(true); }); diff --git a/test/operators/async/asIterable.test.ts b/test/operators/async/asIterable.test.ts index 91623e4..9aa41a6 100644 --- a/test/operators/async/asIterable.test.ts +++ b/test/operators/async/asIterable.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("asIterable", () => { it("should return an iterable object conforming to the iterator-protocol", async () => { const iterable = asyncSequenceOf(1, 2, 3, 4, 5) - .filter(it => Promise.resolve(it % 2 === 1)) + .filter(async it => it % 2 === 1) .asIterable(); const iterator = iterable[Symbol.asyncIterator](); diff --git a/test/operators/async/associate.test.ts b/test/operators/async/associate.test.ts index 992c0d9..f838c57 100644 --- a/test/operators/async/associate.test.ts +++ b/test/operators/async/associate.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("associate", () => { it("should associate map", async () => { const map = await asyncSequenceOf(1, 2, 3) - .associate(it => Promise.resolve([`key_${it}`, it])); + .associate(async it => [`key_${it}`, it]); expect(map.size).toBe(3); expect(map).toEqual( @@ -17,7 +17,7 @@ describe("associate", () => { it("latest entries should win in case of duplicates", async () => { const map = await asyncSequenceOf({k: 1, v: 1}, {k: 1, v: 11}, {k: 1, v: 111}, {k: 2, v: 222}) - .associate(it => Promise.resolve([it.k, it.v])); + .associate(async it => [it.k, it.v]); expect(map).toEqual( new Map([ diff --git a/test/operators/async/associateBy.test.ts b/test/operators/async/associateBy.test.ts index af24f97..5b9f887 100644 --- a/test/operators/async/associateBy.test.ts +++ b/test/operators/async/associateBy.test.ts @@ -7,7 +7,7 @@ describe("associateBy", () => { const c = {k: 3, v: 33}; const map = await asyncSequenceOf(a, b, c) - .associateBy(it => Promise.resolve(it.k)); + .associateBy(async it => it.k); expect(map).toEqual( new Map([ @@ -42,8 +42,8 @@ describe("associateBy", () => { const map = await asyncSequenceOf(a, b, c) .associateBy( - it => Promise.resolve(it.k), - it => Promise.resolve(it.v) + async it => it.k, + async it => it.v ); expect(map).toEqual( @@ -63,7 +63,7 @@ describe("associateBy", () => { const map = await asyncSequenceOf(a, b, c) .associateBy( "k", - it => Promise.resolve(it.v) + async it => it.v ); expect(map).toEqual( @@ -83,8 +83,8 @@ describe("associateBy", () => { const map = await asyncSequenceOf(a, b, c, d) .associateBy( - it => Promise.resolve(it.k), - it => Promise.resolve(it.v) + async it => it.k, + async it => it.v ); expect(map).toEqual( diff --git a/test/operators/async/count.test.ts b/test/operators/async/count.test.ts index 72cff00..d401763 100644 --- a/test/operators/async/count.test.ts +++ b/test/operators/async/count.test.ts @@ -9,7 +9,7 @@ describe("count", () => { it("should evaluate predicate and count results", async () => { const num = await asyncSequenceOf(1, 2, 3) - .count(it => Promise.resolve(it > 1)); + .count(async it => it > 1); expect(num).toBe(2); }); diff --git a/test/operators/async/distinctBy.test.ts b/test/operators/async/distinctBy.test.ts index ae417b3..5854d5f 100644 --- a/test/operators/async/distinctBy.test.ts +++ b/test/operators/async/distinctBy.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("distinctBy", () => { it("should dismiss items with duplicate selections", async () => { const result = await asyncSequenceOf({a: 1}, {a: 2}, {a: 1}, {a: 3}) - .distinctBy(it => Promise.resolve(it.a)) + .distinctBy(async it => it.a) .toArray(); expect(result).toEqual([ diff --git a/test/operators/async/dropWhile.test.ts b/test/operators/async/dropWhile.test.ts index 04978bb..33afaf6 100644 --- a/test/operators/async/dropWhile.test.ts +++ b/test/operators/async/dropWhile.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("dropWhile", () => { it("should drop elements until predicate evaluates to false", async () => { const result = await asyncSequenceOf(1, 2, 3, 2, 1) - .dropWhile(it => Promise.resolve(it < 3)) + .dropWhile(async it => it < 3) .toArray(); expect(result).toEqual([3, 2, 1]); @@ -11,7 +11,7 @@ describe("dropWhile", () => { it("should drop no elements", async () => { const result = await asyncSequenceOf(1, 2, 3) - .dropWhile(it => Promise.resolve(it > 3)) + .dropWhile(async it => it > 3) .toArray(); expect(result).toEqual([1, 2, 3]); @@ -19,7 +19,7 @@ describe("dropWhile", () => { it("should drop all elements", async () => { const result = await asyncSequenceOf(1, 2, 3) - .dropWhile(it => Promise.resolve(it > 0)) + .dropWhile(async it => it > 0) .toArray(); expect(result.length).toBe(0); diff --git a/test/operators/async/elementAtOrElse.test.ts b/test/operators/async/elementAtOrElse.test.ts index ab869cd..c529fb3 100644 --- a/test/operators/async/elementAtOrElse.test.ts +++ b/test/operators/async/elementAtOrElse.test.ts @@ -3,28 +3,28 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("elementAtOrElse", () => { it("should return element at first index", async () => { const item = await asyncSequenceOf(1, 2, 3) - .elementAtOrElse(0, () => Promise.resolve(-1)); + .elementAtOrElse(0, async () => -1); expect(item).toBe(1); }); it("should return element at middle index", async () => { const item = await asyncSequenceOf(1, 2, 3) - .elementAtOrElse(1, () => Promise.resolve(-1)); + .elementAtOrElse(1, async () => -1); expect(item).toBe(2); }); it("should return element at last index", async () => { const item = await asyncSequenceOf(1, 2, 3) - .elementAtOrElse(2, () => Promise.resolve(-1)); + .elementAtOrElse(2, async () => -1); expect(item).toBe(3); }); it("should return default value when index out of bounds", async () => { const item = await asyncSequenceOf(1, 2, 3) - .elementAtOrElse(3, () => Promise.resolve(1234)); + .elementAtOrElse(3, async () => 1234); expect(item).toBe(1234); }); diff --git a/test/operators/async/filter.test.ts b/test/operators/async/filter.test.ts index 5283d1d..6be1613 100644 --- a/test/operators/async/filter.test.ts +++ b/test/operators/async/filter.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("filter", () => { it("should filter elements", async () => { const array = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 1)) + .filter(async it => it > 1) .toArray(); expect(array).toEqual([2, 3]); diff --git a/test/operators/async/filterIndexed.test.ts b/test/operators/async/filterIndexed.test.ts index 04bcdba..6b77441 100644 --- a/test/operators/async/filterIndexed.test.ts +++ b/test/operators/async/filterIndexed.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("filterIndexed", () => { it("should filter elements by index", async () => { const array = await asyncSequenceOf(1, 2, 3) - .filterIndexed((index, _value) => Promise.resolve(index < 2)) + .filterIndexed(async (index, _value) => index < 2) .toArray(); expect(array).toEqual([1, 2]); diff --git a/test/operators/async/filterNot.test.ts b/test/operators/async/filterNot.test.ts index 6f121f2..e82cb6c 100644 --- a/test/operators/async/filterNot.test.ts +++ b/test/operators/async/filterNot.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("filterNot", () => { it("should filter elements", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filterNot(it => Promise.resolve(it > 2)) + .filterNot(async it => it > 2) .toArray(); expect(result).toEqual([1, 2]); diff --git a/test/operators/async/find.test.ts b/test/operators/async/find.test.ts index 6e6adcf..0e2ffa9 100644 --- a/test/operators/async/find.test.ts +++ b/test/operators/async/find.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("find", () => { it("should return first element of sequence", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 2)) + .filter(async it => it > 2) .find(); expect(result).toBe(3); @@ -11,7 +11,7 @@ describe("find", () => { it("should return null on empty sequence", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 3)) + .filter(async it => it > 3) .find(); expect(result).toBeNull(); @@ -19,7 +19,7 @@ describe("find", () => { it("should return first element matching predicate", async () => { const result = await asyncSequenceOf(1, 2, 3) - .find(it => Promise.resolve(it > 2)); + .find(async it => it > 2); expect(result).toBe(3); }); diff --git a/test/operators/async/findLast.test.ts b/test/operators/async/findLast.test.ts index 00c376b..c59bbe0 100644 --- a/test/operators/async/findLast.test.ts +++ b/test/operators/async/findLast.test.ts @@ -10,7 +10,7 @@ describe("findLast", () => { it("should return null on empty sequence", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 3)) + .filter(async it => it > 3) .findLast(); expect(result).toBeNull(); @@ -18,7 +18,7 @@ describe("findLast", () => { it("should return last element matching predicate", async () => { const result = await asyncSequenceOf(1, 2, 3) - .findLast(it => Promise.resolve(it > 1)); + .findLast(async it => it > 1); expect(result).toBe(3); }); diff --git a/test/operators/async/first.test.ts b/test/operators/async/first.test.ts index 01379b5..d8dd832 100644 --- a/test/operators/async/first.test.ts +++ b/test/operators/async/first.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("first", () => { it("should return first element of sequence", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 2)) + .filter(async it => it > 2) .first(); expect(result).toBe(3); @@ -12,14 +12,14 @@ describe("first", () => { it("should throw error on empty sequence", async () => { expect( () => asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 3)) + .filter(async it => it > 3) .first() ).rejects.toThrow("No such element"); }); it("should return first element matching predicate", async () => { const result = await asyncSequenceOf(1, 2, 3) - .first(it => Promise.resolve(it > 2)); + .first(async it => it > 2); expect(result).toBe(3); }); diff --git a/test/operators/async/firstOrNull.test.ts b/test/operators/async/firstOrNull.test.ts index e481d2d..bf310b1 100644 --- a/test/operators/async/firstOrNull.test.ts +++ b/test/operators/async/firstOrNull.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("firstOrNull", () => { it("should return first element of sequence", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 2)) + .filter(async it => it > 2) .firstOrNull(); expect(result).toBe(3); @@ -11,7 +11,7 @@ describe("firstOrNull", () => { it("should return null on empty sequence", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 3)) + .filter(async it => it > 3) .firstOrNull(); expect(result).toBeNull(); @@ -19,7 +19,7 @@ describe("firstOrNull", () => { it("should return first element matching predicate", async () => { const result = await asyncSequenceOf(1, 2, 3) - .firstOrNull(it => Promise.resolve(it > 2)); + .firstOrNull(async it => it > 2); expect(result).toBe(3); }); diff --git a/test/operators/async/flatMap.test.ts b/test/operators/async/flatMap.test.ts index f0f6734..c89b8c4 100644 --- a/test/operators/async/flatMap.test.ts +++ b/test/operators/async/flatMap.test.ts @@ -3,7 +3,7 @@ import {asAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; describe("flatMap", () => { it("should flatten element arrays", async () => { const array = await asyncSequenceOf([1, 2], [3, 4], [5, 6]) - .flatMap(it => Promise.resolve(asAsyncSequence(it))) + .flatMap(async it => asAsyncSequence(it)) .toArray(); expect(array).toEqual([1, 2, 3, 4, 5, 6]); diff --git a/test/operators/async/fold.test.ts b/test/operators/async/fold.test.ts index e6dc897..ecda2db 100644 --- a/test/operators/async/fold.test.ts +++ b/test/operators/async/fold.test.ts @@ -3,14 +3,14 @@ import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; describe("fold", () => { it("should 23 + sum of all numbers", async () => { const result = await asyncSequenceOf(1, 2, 3) - .fold(23, (acc: number, value: number) => Promise.resolve(acc + value)); + .fold(23, async (acc: number, value: number) => acc + value); expect(result).toBe(29); }); it("should return initial value on empty sequence", async () => { const result = await emptyAsyncSequence() - .fold(23, (acc: number, value: number) => Promise.resolve(acc + value)); + .fold(23, async (acc: number, value: number) => acc + value); expect(result).toBe(23); }); diff --git a/test/operators/async/foldIndexed.test.ts b/test/operators/async/foldIndexed.test.ts index 286768f..dff9aa8 100644 --- a/test/operators/async/foldIndexed.test.ts +++ b/test/operators/async/foldIndexed.test.ts @@ -3,14 +3,14 @@ import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; describe("foldIndexed", () => { it("should 23 + sum of all numbers and indices", async () => { const result = await asyncSequenceOf(1, 2, 3) - .foldIndexed(23, (index: number, acc: number, element: number) => Promise.resolve(acc + element + index)); + .foldIndexed(23, async (index: number, acc: number, element: number) => acc + element + index); expect(result).toBe(32); }); it("should return initial value on empty sequence", async () => { const result = await emptyAsyncSequence() - .foldIndexed(23, (index: number, acc: number, element: number) => Promise.resolve(acc + element + index)); + .foldIndexed(23, async (index: number, acc: number, element: number) => acc + element + index); expect(result).toBe(23); }); diff --git a/test/operators/async/groupBy.test.ts b/test/operators/async/groupBy.test.ts index 64582a3..23b10d8 100644 --- a/test/operators/async/groupBy.test.ts +++ b/test/operators/async/groupBy.test.ts @@ -8,7 +8,7 @@ describe("groupBy", () => { const d = {k: 2, v: 222} as const; const map = await asyncSequenceOf<{k: (typeof a | typeof b | typeof c | typeof d)["k"], v: number}>(a, b, c, d) - .groupBy(it => Promise.resolve(it.k)); + .groupBy(async it => it.k); expect(map).toEqual( new Map([ diff --git a/test/operators/async/indexOfFirst.test.ts b/test/operators/async/indexOfFirst.test.ts index 3b93b27..9aba843 100644 --- a/test/operators/async/indexOfFirst.test.ts +++ b/test/operators/async/indexOfFirst.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("indexOfFirst", () => { it("should return index of first element matching given predicate", async () => { const index = await asyncSequenceOf(1, 2, 2, 3) - .indexOfFirst(it => Promise.resolve(it > 1)); + .indexOfFirst(async it => it > 1); expect(index).toBe(1); }); diff --git a/test/operators/async/indexOfLast.test.ts b/test/operators/async/indexOfLast.test.ts index 1f8ebc4..949d899 100644 --- a/test/operators/async/indexOfLast.test.ts +++ b/test/operators/async/indexOfLast.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("indexOfLast", () => { it("should return index of last element matching given predicate", async () => { const index = await asyncSequenceOf(1, 2, 2, 1) - .indexOfLast(it => Promise.resolve(it > 1)); + .indexOfLast(async it => it > 1); expect(index).toBe(2); }); diff --git a/test/operators/async/joinToString.test.ts b/test/operators/async/joinToString.test.ts index 51e8898..9293ee1 100644 --- a/test/operators/async/joinToString.test.ts +++ b/test/operators/async/joinToString.test.ts @@ -24,7 +24,7 @@ describe("joinToString", () => { it("should join to string using transform function", async () => { const result = await asyncSequenceOf(1, 2, 3) - .joinToString({transform: num => Promise.resolve(`a${num}`)}); + .joinToString({transform: async num => `a${num}`}); expect(result).toBe("a1, a2, a3"); }); diff --git a/test/operators/async/last.test.ts b/test/operators/async/last.test.ts index d645305..e3b1e1b 100644 --- a/test/operators/async/last.test.ts +++ b/test/operators/async/last.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("last", () => { it("should return last element of sequence", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 1)) + .filter(async it => it > 1) .last(); expect(result).toBe(3); @@ -12,14 +12,14 @@ describe("last", () => { it("should throw error on empty sequence", async () => { expect( () => asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 3)) + .filter(async it => it > 3) .last() ).rejects.toThrow("No such element"); }); it("should return last element matching predicate", async () => { const result = await asyncSequenceOf(1, 2, 3) - .last(it => Promise.resolve(it > 1)); + .last(async it => it > 1); expect(result).toBe(3); }); diff --git a/test/operators/async/lastOrNull.test.ts b/test/operators/async/lastOrNull.test.ts index cb82ee9..b0f06ed 100644 --- a/test/operators/async/lastOrNull.test.ts +++ b/test/operators/async/lastOrNull.test.ts @@ -10,7 +10,7 @@ describe("lastOrNull", () => { it("should return null on empty sequence", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 3)) + .filter(async it => it > 3) .lastOrNull(); expect(result).toBeNull(); @@ -18,7 +18,7 @@ describe("lastOrNull", () => { it("should return last element matching predicate", async () => { const result = await asyncSequenceOf(1, 2, 3) - .lastOrNull(it => Promise.resolve(it > 1)); + .lastOrNull(async it => it > 1); expect(result).toBe(3); }); diff --git a/test/operators/async/map.test.ts b/test/operators/async/map.test.ts index bcc1fcb..bab4921 100644 --- a/test/operators/async/map.test.ts +++ b/test/operators/async/map.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("map", () => { it("should map numbers to strings", async () => { const array = await asyncSequenceOf(1, 2, 3) - .map(it => Promise.resolve(`num ${it}`)) + .map(async it => `num ${it}`) .toArray(); expect(array).toEqual(["num 1", "num 2", "num 3"]); diff --git a/test/operators/async/mapIndexed.test.ts b/test/operators/async/mapIndexed.test.ts index 444d22b..98f0e93 100644 --- a/test/operators/async/mapIndexed.test.ts +++ b/test/operators/async/mapIndexed.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("mapIndexed", () => { it("should map elements by index and value", async () => { const array = await asyncSequenceOf(1, 2, 3) - .mapIndexed((index, value) => Promise.resolve(`${index}: ${value}`)) + .mapIndexed(async (index, value) => `${index}: ${value}`) .toArray(); expect(array).toEqual(["0: 1", "1: 2", "2: 3"]); diff --git a/test/operators/async/mapNotNull.test.ts b/test/operators/async/mapNotNull.test.ts index 6bfb01c..595d8f9 100644 --- a/test/operators/async/mapNotNull.test.ts +++ b/test/operators/async/mapNotNull.test.ts @@ -8,7 +8,7 @@ describe("mapNotNull", () => { const a4 = {a: 4}; const array = await asyncSequenceOf<{a: number | null}>(a1, a2, a3, a4) - .mapNotNull(it => Promise.resolve(it.a)) + .mapNotNull(async it => it.a) .toArray(); expect(array).toEqual([1, 4]); diff --git a/test/operators/async/maxBy.test.ts b/test/operators/async/maxBy.test.ts index b662de4..b14d59b 100644 --- a/test/operators/async/maxBy.test.ts +++ b/test/operators/async/maxBy.test.ts @@ -3,14 +3,14 @@ import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; describe("maxBy", () => { it("should return max element by selector", async () => { const num = await asyncSequenceOf({a: 1}, {a: 3}, {a: 2}) - .maxBy(it => Promise.resolve(it.a)); + .maxBy(async it => it.a); expect(num).toEqual({a: 3}); }); it("should return null on empty sequence", async () => { const num = await emptyAsyncSequence() - .maxBy(() => Promise.resolve(0)); + .maxBy(async () => 0); expect(num).toBeNull(); }); diff --git a/test/operators/async/maxWith.test.ts b/test/operators/async/maxWith.test.ts index c907f37..a70e94e 100644 --- a/test/operators/async/maxWith.test.ts +++ b/test/operators/async/maxWith.test.ts @@ -3,14 +3,14 @@ import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; describe("maxWith", () => { it("should return max element by comparator", async () => { const num = await asyncSequenceOf({a: 1}, {a: 3}, {a: 2}) - .maxWith((o1, o2) => Promise.resolve(o1.a > o2.a ? 1 : (o1.a < o2.a ? -1 : 0))); + .maxWith(async (o1, o2) => o1.a > o2.a ? 1 : (o1.a < o2.a ? -1 : 0)); expect(num).toEqual({a: 3}); }); it("should return null on empty sequence", async () => { const num = await emptyAsyncSequence() - .maxWith(() => Promise.resolve(0)); + .maxWith(async () => 0); expect(num).toBeNull(); }); diff --git a/test/operators/async/merge.test.ts b/test/operators/async/merge.test.ts index 63d25b8..33dc28d 100644 --- a/test/operators/async/merge.test.ts +++ b/test/operators/async/merge.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("merge", () => { it("should merge both sequences", async () => { const result = await asyncSequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) - .merge(asyncSequenceOf({id: 2, val: "bb"}), it => Promise.resolve(it.id)) + .merge(asyncSequenceOf({id: 2, val: "bb"}), async it => it.id) .toArray(); expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); @@ -11,7 +11,7 @@ describe("merge", () => { it("should merge given array", async () => { const result = await asyncSequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) - .merge([{id: 2, val: "bb"}], it => Promise.resolve(it.id)) + .merge([{id: 2, val: "bb"}], async it => it.id) .toArray(); expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); @@ -19,7 +19,7 @@ describe("merge", () => { it("should merge both sequences and append new values", async () => { const result = await asyncSequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) - .merge(asyncSequenceOf({id: 2, val: "bb"}, {id: 4, val: "d"}), it => Promise.resolve(it.id)) + .merge(asyncSequenceOf({id: 2, val: "bb"}, {id: 4, val: "d"}), async it => it.id) .toArray(); expect(result).toEqual([{id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}, {id: 4, val: "d"}]); @@ -27,7 +27,7 @@ describe("merge", () => { it("should merge both sequences and prepend new values", async () => { const result = await asyncSequenceOf({id: 1, val: "a"}, {id: 2, val: "b"}, {id: 3, val: "c"}) - .merge(asyncSequenceOf({id: 2, val: "bb"}, {id: 4, val: "d"}), it => Promise.resolve(it.id), true) + .merge(asyncSequenceOf({id: 2, val: "bb"}, {id: 4, val: "d"}), async it => it.id, true) .toArray(); expect(result).toEqual([{id: 4, val: "d"}, {id: 1, val: "a"}, {id: 2, val: "bb"}, {id: 3, val: "c"}]); diff --git a/test/operators/async/minBy.test.ts b/test/operators/async/minBy.test.ts index 5822f06..a06cb4f 100644 --- a/test/operators/async/minBy.test.ts +++ b/test/operators/async/minBy.test.ts @@ -3,14 +3,14 @@ import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; describe("minBy", () => { it("should return min element by selector", async () => { const num = await asyncSequenceOf({a: 1}, {a: 3}, {a: 2}) - .minBy(it => Promise.resolve(it.a)); + .minBy(async it => it.a); expect(num).toEqual({a: 1}); }); it("should return null on empty sequence", async () => { const num = await emptyAsyncSequence() - .minBy(() => Promise.resolve(0)); + .minBy(async () => 0); expect(num).toBeNull(); }); diff --git a/test/operators/async/minWith.test.ts b/test/operators/async/minWith.test.ts index 079858a..61b43fc 100644 --- a/test/operators/async/minWith.test.ts +++ b/test/operators/async/minWith.test.ts @@ -3,14 +3,14 @@ import {emptyAsyncSequence, asyncSequenceOf} from "../../../src/sequency"; describe("minWith", () => { it("should return min element by comparator", async () => { const num = await asyncSequenceOf({a: 1}, {a: 3}, {a: 2}) - .minWith((o1, o2) => Promise.resolve(o1.a > o2.a ? 1 : (o1.a < o2.a ? -1 : 0))); + .minWith(async (o1, o2) => o1.a > o2.a ? 1 : (o1.a < o2.a ? -1 : 0)); expect(num).toEqual({a: 1}); }); it("should return null on empty sequence", async () => { const num = await emptyAsyncSequence() - .maxWith(() => Promise.resolve(0)); + .maxWith(async () => 0); expect(num).toBeNull(); }); diff --git a/test/operators/async/none.test.ts b/test/operators/async/none.test.ts index 2b81df8..9a65093 100644 --- a/test/operators/async/none.test.ts +++ b/test/operators/async/none.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("none", () => { it("should return false", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 1)) + .filter(async it => it > 1) .none(); expect(result).toBe(false); @@ -11,7 +11,7 @@ describe("none", () => { it("should return true", async () => { const result = await asyncSequenceOf(1, 2, 3) - .filter(it => Promise.resolve(it > 3)) + .filter(async it => it > 3) .none(); expect(result).toBe(true); @@ -19,14 +19,14 @@ describe("none", () => { it("should evaluate predicate and return false", async () => { const result = await asyncSequenceOf(1, 2, 3) - .none(it => Promise.resolve(it > 1)); + .none(async it => it > 1); expect(result).toBe(false); }); it("should evaluate predicate and return true", async () => { const result = await asyncSequenceOf(1, 2, 3) - .none(it => Promise.resolve(it > 3)); + .none(async it => it > 3); expect(result).toBe(true); }); diff --git a/test/operators/async/partition.test.ts b/test/operators/async/partition.test.ts index 3bb86d5..adb71f6 100644 --- a/test/operators/async/partition.test.ts +++ b/test/operators/async/partition.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("partition", () => { it("should partition based on the given predicate", async () => { const result = await asyncSequenceOf(1, 2, 3, 4) - .partition(it => Promise.resolve(it % 2 === 1)); + .partition(async it => it % 2 === 1); expect(result).toHaveProperty("true"); expect(result).toHaveProperty("false"); diff --git a/test/operators/async/reduce.test.ts b/test/operators/async/reduce.test.ts index 29ca666..d0c14c3 100644 --- a/test/operators/async/reduce.test.ts +++ b/test/operators/async/reduce.test.ts @@ -3,14 +3,14 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("reduce", () => { it("should sum all numbers", async () => { const result = await asyncSequenceOf(1, 2, 3) - .reduce((acc: number, value: number) => Promise.resolve(acc + value)); + .reduce(async (acc: number, value: number) => acc + value); expect(result).toBe(6); }); it("should concat all strings", async () => { const result = await asyncSequenceOf("a", "b", "c") - .reduce((acc: string, value: string) => Promise.resolve(`${acc}, ${value}`)); + .reduce(async (acc: string, value: string) => `${acc}, ${value}`); expect(result).toBe("a, b, c"); }); diff --git a/test/operators/async/reduceIndexed.test.ts b/test/operators/async/reduceIndexed.test.ts index d82bdc9..dddbd04 100644 --- a/test/operators/async/reduceIndexed.test.ts +++ b/test/operators/async/reduceIndexed.test.ts @@ -3,7 +3,7 @@ import {asyncSequenceOf} from "../../../src/sequency"; describe("reduceIndexed", () => { it("should sum all numbers + indices", async () => { const result = await asyncSequenceOf(1, 2, 3) - .reduceIndexed((index: number, acc: number, value: number) => Promise.resolve(acc + value + index)); + .reduceIndexed(async (index: number, acc: number, value: number) => acc + value + index); expect(result).toBe(9); }); diff --git a/test/operators/async/single.test.ts b/test/operators/async/single.test.ts index b5dcab4..c004bc1 100644 --- a/test/operators/async/single.test.ts +++ b/test/operators/async/single.test.ts @@ -22,7 +22,7 @@ describe("single", () => { it("should evaluate predicate and return single element", async () => { const result = await asyncSequenceOf(1, 2, 3) - .single(it => Promise.resolve(it > 2)); + .single(async it => it > 2); expect(result).toBe(3); }); @@ -30,14 +30,14 @@ describe("single", () => { it("should evaluate predicate and throw with more than one element", () => { expect( () => asyncSequenceOf(1, 2) - .single(it => Promise.resolve(it > 0)) + .single(async it => it > 0) ).rejects.toThrow("Expect single element"); }); it("should evaluate predicate and throw with zero elements", () => { expect( () => asyncSequenceOf(1, 2, 3) - .single(it => Promise.resolve(it > 3)) + .single(async it => it > 3) ).rejects.toThrow("No such element"); }); }); \ No newline at end of file diff --git a/test/operators/async/singleOrNull.test.ts b/test/operators/async/singleOrNull.test.ts index 3680e68..4115d1a 100644 --- a/test/operators/async/singleOrNull.test.ts +++ b/test/operators/async/singleOrNull.test.ts @@ -24,21 +24,21 @@ describe("singleOrNull", () => { it("should evaluate predicate and return single element", async () => { const result = await asyncSequenceOf(1, 2, 3) - .singleOrNull(it => Promise.resolve(it > 2)); + .singleOrNull(async it => it > 2); expect(result).toBe(3); }); it("should evaluate predicate and return null with more than one element", async () => { const result = await asyncSequenceOf(1, 2, 3) - .singleOrNull(it => Promise.resolve(it > 1)); + .singleOrNull(async it => it > 1); expect(result).toBeNull(); }); it("should evaluate predicate and return null with zero elements", async () => { const result = await asyncSequenceOf(1, 2, 3) - .singleOrNull(it => Promise.resolve(it > 3)); + .singleOrNull(async it => it > 3); expect(result).toBeNull(); }); From 737fd17e8ca43bdd114fab977cffce07bcfa4b48 Mon Sep 17 00:00:00 2001 From: ACertainCoder Date: Sat, 30 Mar 2024 16:58:27 +0100 Subject: [PATCH 28/28] Add unit tests for filterHolistically --- test/operators/async/filterHolistically.test.ts | 11 +++++++++++ test/operators/sync/filterHolistically.test.ts | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 test/operators/async/filterHolistically.test.ts create mode 100644 test/operators/sync/filterHolistically.test.ts diff --git a/test/operators/async/filterHolistically.test.ts b/test/operators/async/filterHolistically.test.ts new file mode 100644 index 0000000..58fc560 --- /dev/null +++ b/test/operators/async/filterHolistically.test.ts @@ -0,0 +1,11 @@ +import {asyncSequenceOf} from "../../../src/sequency"; + +describe("filterHolistically", () => { + it("should filter elements as a whole", async () => { + const array = await asyncSequenceOf(1, 2, 2, 3, 3, 3) + .filterHolistically(async (value, _index, array) => array.filter(v => v === value).length < 3) + .toArray(); + + expect(array).toEqual([1, 2, 2]); + }); +}); \ No newline at end of file diff --git a/test/operators/sync/filterHolistically.test.ts b/test/operators/sync/filterHolistically.test.ts new file mode 100644 index 0000000..3b68eac --- /dev/null +++ b/test/operators/sync/filterHolistically.test.ts @@ -0,0 +1,11 @@ +import {sequenceOf} from "../../../src/sequency"; + +describe("filterHolistically", () => { + it("should filter elements as a whole", () => { + const array = sequenceOf(1, 2, 2, 3, 3, 3) + .filterHolistically((value, _index, array) => array.filter(v => v === value).length < 3) + .toArray(); + + expect(array).toEqual([1, 2, 2]); + }); +}); \ No newline at end of file