diff --git a/CHANGELOG.md b/CHANGELOG.md index e939c85..ddb3e5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## 3.7.0 + +New features: + +- `clickLink` now works for internal links when testing a `Browser.application` +- `clickLink` now works for links with aria-label +- `clickLink` now works for links containing img with alt text +- `pushUrl` now works properly for relative urls with query and/or fragment +- Added `SimulatedEffect.Task.sequence` + + ## 3.6.3 Bug fixes: diff --git a/PUBLISHING.md b/PUBLISHING.md index 003dbc7..e7bc654 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -1,4 +1,5 @@ - `git switch -c release/` +- Optionally update javascript dependencies with `npx npm-check-updates` and commit changes - `npx elm bump` - Update CHANGELOG.md (replace "main" with the new version number, and review the notes for the new version) - Commit changes diff --git a/README.md b/README.md index d5e797d..584fbea 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,8 @@ import MyProgram exposing (Flags, Msg, Model) -- just an imaginary example start : String -> Flags -> ProgramTest Model Msg (Cmd Msg) start initialUrl flags = ProgramTest.createApplication - { onUrlChange = MyProgram.OnRouteChange + { onUrlChange = MyProgram.OnUrlChange + , onUrlRequest = MyProgram.OnUrlRequest , init = -- NOTE: the type of MyProgram.init is: -- MyProgram.Flags -> Navigation.Location -> (MyProgram.Model, Cmd MyProgram.Msg) diff --git a/elm.json b/elm.json index ee9a994..28354ce 100644 --- a/elm.json +++ b/elm.json @@ -3,7 +3,7 @@ "name": "avh4/elm-program-test", "summary": "Test Elm programs", "license": "MIT", - "version": "3.6.3", + "version": "3.7.0", "exposed-modules": [ "ProgramTest", "SimulatedEffect.Cmd", diff --git a/package.json b/package.json index b45c07e..1d7d063 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "devDependencies": { - "@vue/babel-preset-app": "^4.5.15", + "@vue/babel-preset-app": "^5.0.8", "chokidar-cli": "^3.0.0", - "concurrently": "^7.0.0", + "concurrently": "^7.3.0", "elm-doc-preview": "^5.0.5", - "elm-test": "^0.19.1-revision7", - "elm-tooling": "^1.7.0", - "vuepress": "^1.9.5" + "elm-test": "^0.19.1-revision9", + "elm-tooling": "^1.8.0", + "vuepress": "^1.9.7" }, "scripts": { "postinstall": "elm-tooling install", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd8083c..019c9e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,21 +1,21 @@ lockfileVersion: 5.3 specifiers: - '@vue/babel-preset-app': ^4.5.15 + '@vue/babel-preset-app': ^5.0.8 chokidar-cli: ^3.0.0 - concurrently: ^7.0.0 + concurrently: ^7.3.0 elm-doc-preview: ^5.0.5 - elm-test: ^0.19.1-revision7 - elm-tooling: ^1.7.0 - vuepress: ^1.9.5 + elm-test: ^0.19.1-revision9 + elm-tooling: ^1.8.0 + vuepress: ^1.9.7 devDependencies: - '@vue/babel-preset-app': 4.5.15 + '@vue/babel-preset-app': 5.0.8 chokidar-cli: 3.0.0 - concurrently: 7.0.0 + concurrently: 7.3.0 elm-doc-preview: 5.0.5 - elm-test: 0.19.1-revision7 - elm-tooling: 1.7.0 + elm-test: 0.19.1-revision9 + elm-tooling: 1.8.0 vuepress: 1.9.7 packages: @@ -1436,7 +1436,7 @@ packages: svg-tags: 1.0.0 dev: true - /@vue/babel-preset-app/4.5.15: + /@vue/babel-preset-app/4.5.15_vue@2.6.14: resolution: {integrity: sha512-J+YttzvwRfV1BPczf8r3qCevznYk+jh531agVF+5EYlHF4Sgh/cGXTz9qkkiux3LQgvhEGXgmCteg1n38WuuKg==} peerDependencies: vue: ^2 || ^3.0.0-0 @@ -1462,14 +1462,15 @@ packages: core-js: 3.21.0 core-js-compat: 3.21.0 semver: 6.3.0 + vue: 2.6.14 transitivePeerDependencies: - supports-color dev: true - /@vue/babel-preset-app/4.5.15_vue@2.6.14: - resolution: {integrity: sha512-J+YttzvwRfV1BPczf8r3qCevznYk+jh531agVF+5EYlHF4Sgh/cGXTz9qkkiux3LQgvhEGXgmCteg1n38WuuKg==} + /@vue/babel-preset-app/5.0.8: + resolution: {integrity: sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==} peerDependencies: - vue: ^2 || ^3.0.0-0 + vue: ^2 || ^3.2.13 peerDependenciesMeta: core-js: optional: true @@ -1491,8 +1492,7 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 core-js: 3.21.0 core-js-compat: 3.21.0 - semver: 6.3.0 - vue: 2.6.14 + semver: 7.3.7 transitivePeerDependencies: - supports-color dev: true @@ -1900,7 +1900,7 @@ packages: dev: true /agentkeepalive/2.2.0: - resolution: {integrity: sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=} + resolution: {integrity: sha512-TnB6ziK363p7lR8QpeLC8aMr8EGYBKZTpgzQLfqTs3bR0Oo5VbKdwKf8h0dSzsYrB7lSCgfJnMZKqShvlq5Oyg==} engines: {node: '>= 0.10.0'} dev: true @@ -1951,7 +1951,7 @@ packages: dev: true /alphanum-sort/1.0.2: - resolution: {integrity: sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=} + resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} dev: true /ansi-align/3.0.1: @@ -1979,7 +1979,7 @@ packages: dev: true /ansi-regex/2.1.1: - resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true @@ -1994,7 +1994,7 @@ packages: dev: true /ansi-styles/2.2.1: - resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} dev: true @@ -2038,7 +2038,7 @@ packages: dev: true /arr-diff/4.0.0: - resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: true @@ -2048,7 +2048,7 @@ packages: dev: true /arr-union/3.1.0: - resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=} + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: true @@ -2061,19 +2061,19 @@ packages: dev: true /array-union/1.0.2: - resolution: {integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=} + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 dev: true /array-uniq/1.0.3: - resolution: {integrity: sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=} + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true /array-unique/0.3.2: - resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=} + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: true @@ -2093,7 +2093,7 @@ packages: dev: true /assert-plus/1.0.0: - resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=} + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} dev: true @@ -2105,7 +2105,7 @@ packages: dev: true /assign-symbols/1.0.0: - resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: true @@ -2124,7 +2124,7 @@ packages: dev: true /asynckit/0.4.0: - resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true /atob/2.1.2: @@ -2153,7 +2153,7 @@ packages: dev: true /aws-sign2/0.7.0: - resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true /aws4/1.11.0: @@ -2243,7 +2243,7 @@ packages: dev: true /bcrypt-pbkdf/1.0.2: - resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=} + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: tweetnacl: 0.14.5 dev: true @@ -2302,7 +2302,7 @@ packages: dev: true /bonjour/3.5.0: - resolution: {integrity: sha1-jokKGD2O6aI5OzhExpGkK897yfU=} + resolution: {integrity: sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==} dependencies: array-flatten: 2.1.2 deep-equal: 1.1.1 @@ -2313,7 +2313,7 @@ packages: dev: true /boolbase/1.0.0: - resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true /boxen/4.2.0: @@ -2337,6 +2337,12 @@ packages: concat-map: 0.0.1 dev: true + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /braces/2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} @@ -2361,7 +2367,7 @@ packages: dev: true /brorand/1.1.0: - resolution: {integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=} + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} dev: true /browserify-aes/1.2.0: @@ -2444,7 +2450,7 @@ packages: dev: true /buffer-xor/1.0.3: - resolution: {integrity: sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=} + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} dev: true /buffer/4.9.2: @@ -2456,7 +2462,7 @@ packages: dev: true /builtin-status-codes/3.0.0: - resolution: {integrity: sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=} + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} dev: true /bundle-require/2.1.8_esbuild@0.14.7: @@ -2489,7 +2495,7 @@ packages: chownr: 1.1.4 figgy-pudding: 3.5.2 glob: 7.2.0 - graceful-fs: 4.2.9 + graceful-fs: 4.2.10 infer-owner: 1.0.4 lru-cache: 5.1.1 mississippi: 3.0.0 @@ -2553,30 +2559,30 @@ packages: dev: true /call-me-maybe/1.0.1: - resolution: {integrity: sha1-JtII6onje1y95gJQoV8DHBak1ms=} + resolution: {integrity: sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==} dev: true /caller-callsite/2.0.0: - resolution: {integrity: sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=} + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} dependencies: callsites: 2.0.0 dev: true /caller-path/2.0.0: - resolution: {integrity: sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=} + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} engines: {node: '>=4'} dependencies: caller-callsite: 2.0.0 dev: true /callsites/2.0.0: - resolution: {integrity: sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=} + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} dev: true /camel-case/3.0.0: - resolution: {integrity: sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=} + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} dependencies: no-case: 2.3.2 upper-case: 1.1.3 @@ -2606,11 +2612,11 @@ packages: dev: true /caseless/0.12.0: - resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true /chalk/1.1.3: - resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} dependencies: ansi-styles: 2.2.1 @@ -2773,7 +2779,7 @@ packages: dev: true /collection-visit/1.0.0: - resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: map-visit: 1.0.0 @@ -2794,7 +2800,7 @@ packages: dev: true /color-name/1.1.3: - resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true /color-name/1.1.4: @@ -2839,13 +2845,13 @@ packages: engines: {node: '>= 6'} dev: true - /commander/7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + /commander/9.4.0: + resolution: {integrity: sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==} + engines: {node: ^12.20.0 || >=14} dev: true /commondir/1.0.1: - resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true /component-emitter/1.3.0: @@ -2886,19 +2892,20 @@ packages: typedarray: 0.0.6 dev: true - /concurrently/7.0.0: - resolution: {integrity: sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==} + /concurrently/7.3.0: + resolution: {integrity: sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==} engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} hasBin: true dependencies: chalk: 4.1.2 date-fns: 2.28.0 lodash: 4.17.21 - rxjs: 6.6.7 + rxjs: 7.5.6 + shell-quote: 1.7.3 spawn-command: 0.0.2-1 supports-color: 8.1.1 tree-kill: 1.2.2 - yargs: 16.2.0 + yargs: 17.5.1 dev: true /configstore/5.0.1: @@ -2906,7 +2913,7 @@ packages: engines: {node: '>=8'} dependencies: dot-prop: 5.3.0 - graceful-fs: 4.2.9 + graceful-fs: 4.2.10 make-dir: 3.1.0 unique-string: 2.0.0 write-file-atomic: 3.0.3 @@ -2934,7 +2941,7 @@ packages: dev: true /constants-browserify/1.0.0: - resolution: {integrity: sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=} + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} dev: true /content-disposition/0.5.4: @@ -2976,7 +2983,7 @@ packages: dev: true /copy-descriptor/0.1.1: - resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true @@ -3010,11 +3017,12 @@ packages: /core-js/3.21.0: resolution: {integrity: sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. requiresBuild: true dev: true /core-util-is/1.0.2: - resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: true /core-util-is/1.0.3: @@ -3133,7 +3141,7 @@ packages: dev: true /css-parse/2.0.0: - resolution: {integrity: sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=} + resolution: {integrity: sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==} dependencies: css: 2.2.4 dev: true @@ -3239,12 +3247,12 @@ packages: dev: true /cssnano-util-get-arguments/4.0.0: - resolution: {integrity: sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=} + resolution: {integrity: sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==} engines: {node: '>=6.9.0'} dev: true /cssnano-util-get-match/4.0.0: - resolution: {integrity: sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=} + resolution: {integrity: sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==} engines: {node: '>=6.9.0'} dev: true @@ -3278,11 +3286,11 @@ packages: dev: true /cyclist/1.0.1: - resolution: {integrity: sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=} + resolution: {integrity: sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==} dev: true /dashdash/1.14.1: - resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=} + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} dependencies: assert-plus: 1.0.0 @@ -3294,7 +3302,7 @@ packages: dev: true /de-indent/1.0.2: - resolution: {integrity: sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=} + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true /debug/2.6.9: @@ -3346,7 +3354,7 @@ packages: dev: true /decode-uri-component/0.2.0: - resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} + resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} engines: {node: '>=0.10'} dev: true @@ -3398,14 +3406,14 @@ packages: dev: true /define-property/0.2.5: - resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=} + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: true /define-property/1.0.0: - resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=} + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 @@ -3433,7 +3441,7 @@ packages: dev: true /delayed-stream/1.0.0: - resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: true @@ -3473,7 +3481,7 @@ packages: dev: true /dns-equal/1.0.0: - resolution: {integrity: sha1-s55/HabrCnW6nBcySzR1PEfgZU0=} + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} dev: true /dns-packet/1.3.4: @@ -3484,13 +3492,14 @@ packages: dev: true /dns-txt/2.0.2: - resolution: {integrity: sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=} + resolution: {integrity: sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==} dependencies: buffer-indexof: 1.1.1 dev: true /docsearch.js/2.6.3: resolution: {integrity: sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==} + deprecated: This package has been deprecated and is no longer maintained. Please use @docsearch/js. dependencies: algoliasearch: 3.35.1 autocomplete.js: 0.36.0 @@ -3582,7 +3591,7 @@ packages: dev: true /ecc-jsbn/0.1.2: - resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=} + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 @@ -3631,26 +3640,29 @@ packages: - utf-8-validate dev: true - /elm-test/0.19.1-revision7: - resolution: {integrity: sha512-sd3nCQMeYMaY84Sz41bVJ30ZvQN1/4ZcD8uYMOuUbM39FDh58NY9/AcImVJ7Z+gjCFdcSU6VscZzhUoPW8jp6Q==} - engines: {node: '>=10.13.0'} + /elm-solve-deps-wasm/1.0.1: + resolution: {integrity: sha512-A05XKZKhzM8vWTo8KvNR4g1ICt9iMPOAMfo79OK25c+tQaLSfQ8iMYvW6XgSEd+SgRfM5VSKX4hKEiH6iTiWsg==} + dev: true + + /elm-test/0.19.1-revision9: + resolution: {integrity: sha512-lvHJbh16sy7oUBBPIEMN+0v6dGDZFmfvwq+V+TnGPk5ZlI64vcykx8E8+zLt/E+Ja42UKMMXXgN1ZHQ1V6Ic2Q==} + engines: {node: '>=12.20.0'} hasBin: true dependencies: chalk: 4.1.2 chokidar: 3.5.3 - commander: 7.2.0 + commander: 9.4.0 cross-spawn: 7.0.3 - elm-tooling: 1.7.0 - glob: 7.2.0 - graceful-fs: 4.2.9 - rimraf: 3.0.2 + elm-solve-deps-wasm: 1.0.1 + glob: 8.0.3 + graceful-fs: 4.2.10 split: 1.0.1 which: 2.0.2 xmlbuilder: 15.1.1 dev: true - /elm-tooling/1.7.0: - resolution: {integrity: sha512-EHZ54voWrG3BhUONbH/wFw5U95H6N7R4QFgXHDrPIaDBDdeyNkpFu4QWArSWkhzxyCF7hqT8ya2yy7SferDsgg==} + /elm-tooling/1.8.0: + resolution: {integrity: sha512-IjMvW/VHqxLidlJSAocBGDBmqiZ1NS0lK/UCMRU4ULEEaTVjpSd/9Dv0mH2ok0H0egSTYx19GnrdL4Lq9h+z+A==} hasBin: true dev: true @@ -3663,7 +3675,7 @@ packages: dev: true /emojis-list/2.1.0: - resolution: {integrity: sha1-TapNnbAPmBmIDHn6RXrlsJof04k=} + resolution: {integrity: sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==} engines: {node: '>= 0.10'} dev: true @@ -3687,7 +3699,7 @@ packages: resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} engines: {node: '>=6.9.0'} dependencies: - graceful-fs: 4.2.9 + graceful-fs: 4.2.10 memory-fs: 0.5.0 tapable: 1.1.3 dev: true @@ -3937,11 +3949,11 @@ packages: dev: true /escape-html/1.0.3: - resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true /escape-string-regexp/1.0.5: - resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true @@ -3996,7 +4008,7 @@ packages: dev: true /events/1.1.1: - resolution: {integrity: sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=} + resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} engines: {node: '>=0.4.x'} dev: true @@ -4033,7 +4045,7 @@ packages: dev: true /expand-brackets/2.1.4: - resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=} + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: debug: 2.6.9 @@ -4092,14 +4104,14 @@ packages: dev: true /extend-shallow/2.0.1: - resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: true /extend-shallow/3.0.2: - resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=} + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: assign-symbols: 1.0.0 @@ -4184,7 +4196,7 @@ packages: optional: true /fill-range/4.0.0: - resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 2.0.1 @@ -4276,16 +4288,16 @@ packages: dev: true /for-in/1.0.2: - resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} dev: true /foreach/2.0.5: - resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=} + resolution: {integrity: sha512-ZBbtRiapkZYLsqoPyZOR+uPfto0GRMNQN1GwzZtZt7iZvPPbDDQV0JF5Hx4o/QFQ5c0vyuoZ98T8RSBbopzWtA==} dev: true /forever-agent/0.6.1: - resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true /form-data/2.3.3: @@ -4303,7 +4315,7 @@ packages: dev: true /fragment-cache/0.2.1: - resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=} + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 @@ -4315,7 +4327,7 @@ packages: dev: true /from2/2.3.0: - resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: inherits: 2.0.4 readable-stream: 2.3.7 @@ -4325,22 +4337,22 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.9 + graceful-fs: 4.2.10 jsonfile: 4.0.0 universalify: 0.1.2 dev: true /fs-write-stream-atomic/1.0.10: - resolution: {integrity: sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=} + resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} dependencies: - graceful-fs: 4.2.9 + graceful-fs: 4.2.10 iferr: 0.1.5 imurmurhash: 0.1.4 readable-stream: 2.3.7 dev: true /fs.realpath/1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true /fsevents/1.2.13: @@ -4408,18 +4420,18 @@ packages: dev: true /get-value/2.0.6: - resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: true /getpass/0.1.7: - resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=} + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} dependencies: assert-plus: 1.0.0 dev: true /glob-parent/3.1.0: - resolution: {integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=} + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} dependencies: is-glob: 3.1.0 path-dirname: 1.0.2 @@ -4433,7 +4445,7 @@ packages: dev: true /glob-to-regexp/0.3.0: - resolution: {integrity: sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=} + resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} dev: true /glob/7.2.0: @@ -4447,6 +4459,17 @@ packages: path-is-absolute: 1.0.1 dev: true + /glob/8.0.3: + resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.0 + once: 1.4.0 + dev: true + /global-dirs/2.1.0: resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} engines: {node: '>=8'} @@ -4467,7 +4490,7 @@ packages: dev: true /globby/6.1.0: - resolution: {integrity: sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=} + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: array-union: 1.0.2 @@ -4478,7 +4501,7 @@ packages: dev: true /globby/7.1.1: - resolution: {integrity: sha1-+yzP+UAfhgCUXfral0QMypcrhoA=} + resolution: {integrity: sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==} engines: {node: '>=4'} dependencies: array-union: 1.0.2 @@ -4520,8 +4543,8 @@ packages: url-parse-lax: 3.0.0 dev: true - /graceful-fs/4.2.9: - resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true /gray-matter/4.0.3: @@ -4539,7 +4562,7 @@ packages: dev: true /har-schema/2.0.0: - resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} engines: {node: '>=4'} dev: true @@ -4553,7 +4576,7 @@ packages: dev: true /has-ansi/2.0.0: - resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 @@ -4564,7 +4587,7 @@ packages: dev: true /has-flag/3.0.0: - resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true @@ -4586,7 +4609,7 @@ packages: dev: true /has-value/0.3.1: - resolution: {integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=} + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: get-value: 2.0.6 @@ -4595,7 +4618,7 @@ packages: dev: true /has-value/1.0.0: - resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=} + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: get-value: 2.0.6 @@ -4604,12 +4627,12 @@ packages: dev: true /has-values/0.1.4: - resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=} + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: true /has-values/1.0.0: - resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=} + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: is-number: 3.0.0 @@ -4638,7 +4661,7 @@ packages: dev: true /hash-sum/1.0.2: - resolution: {integrity: sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=} + resolution: {integrity: sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==} dev: true /hash.js/1.1.7: @@ -4664,7 +4687,7 @@ packages: dev: true /hmac-drbg/1.0.1: - resolution: {integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=} + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 @@ -4672,7 +4695,7 @@ packages: dev: true /hogan.js/3.0.2: - resolution: {integrity: sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=} + resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} hasBin: true dependencies: mkdirp: 0.3.0 @@ -4680,7 +4703,7 @@ packages: dev: true /hpack.js/2.1.6: - resolution: {integrity: sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=} + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: inherits: 2.0.4 obuf: 1.1.2 @@ -4689,11 +4712,11 @@ packages: dev: true /hsl-regex/1.0.0: - resolution: {integrity: sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=} + resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==} dev: true /hsla-regex/1.0.0: - resolution: {integrity: sha1-wc56MWjIxmFAM6S194d/OyJfnDg=} + resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} dev: true /html-entities/1.4.0: @@ -4715,7 +4738,7 @@ packages: dev: true /html-tags/2.0.0: - resolution: {integrity: sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=} + resolution: {integrity: sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==} engines: {node: '>=4'} dev: true @@ -4738,7 +4761,7 @@ packages: dev: true /http-deceiver/1.2.7: - resolution: {integrity: sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=} + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} dev: true /http-errors/1.6.3: @@ -4814,7 +4837,7 @@ packages: dev: true /http-signature/1.2.0: - resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} dependencies: assert-plus: 1.0.0 @@ -4823,7 +4846,7 @@ packages: dev: true /https-browserify/1.0.0: - resolution: {integrity: sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=} + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} dev: true /iconv-lite/0.4.24: @@ -4834,7 +4857,7 @@ packages: dev: true /icss-replace-symbols/1.1.0: - resolution: {integrity: sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=} + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} dev: true /icss-utils/4.1.1: @@ -4849,7 +4872,7 @@ packages: dev: true /iferr/0.1.5: - resolution: {integrity: sha1-xg7taebY/bazEEofy8ocGS3FtQE=} + resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} dev: true /ignore/3.3.10: @@ -4866,14 +4889,14 @@ packages: dev: true /import-cwd/2.1.0: - resolution: {integrity: sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=} + resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} engines: {node: '>=4'} dependencies: import-from: 2.1.0 dev: true /import-fresh/2.0.0: - resolution: {integrity: sha1-2BNVwVYS04bGH53dOSLUMEgipUY=} + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} dependencies: caller-path: 2.0.0 @@ -4881,14 +4904,14 @@ packages: dev: true /import-from/2.1.0: - resolution: {integrity: sha1-M1238qev/VOqpHHUuAId7ja387E=} + resolution: {integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true /import-lazy/2.1.0: - resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=} + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} engines: {node: '>=4'} dev: true @@ -4902,12 +4925,12 @@ packages: dev: true /imurmurhash/0.1.4: - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true /indexes-of/1.0.1: - resolution: {integrity: sha1-8w9xbI4r00bHtn0985FVZqfAVgc=} + resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} dev: true /infer-owner/1.0.4: @@ -4915,18 +4938,18 @@ packages: dev: true /inflight/1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true /inherits/2.0.1: - resolution: {integrity: sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=} + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} dev: true /inherits/2.0.3: - resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=} + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: true /inherits/2.0.4: @@ -4959,12 +4982,12 @@ packages: dev: true /ip-regex/2.1.0: - resolution: {integrity: sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=} + resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} engines: {node: '>=4'} dev: true /ip/1.1.5: - resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=} + resolution: {integrity: sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==} dev: true /ipaddr.js/1.9.1: @@ -4973,7 +4996,7 @@ packages: dev: true /is-absolute-url/2.1.0: - resolution: {integrity: sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=} + resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} engines: {node: '>=0.10.0'} dev: true @@ -4983,7 +5006,7 @@ packages: dev: true /is-accessor-descriptor/0.1.6: - resolution: {integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=} + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 @@ -5005,7 +5028,7 @@ packages: dev: true /is-arrayish/0.2.1: - resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true /is-arrayish/0.3.2: @@ -5019,7 +5042,7 @@ packages: dev: true /is-binary-path/1.0.1: - resolution: {integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=} + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} engines: {node: '>=0.10.0'} dependencies: binary-extensions: 1.13.1 @@ -5057,7 +5080,7 @@ packages: dev: true /is-color-stop/1.1.0: - resolution: {integrity: sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=} + resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} dependencies: css-color-names: 0.0.4 hex-color-regex: 1.1.0 @@ -5074,7 +5097,7 @@ packages: dev: true /is-data-descriptor/0.1.4: - resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 @@ -5113,7 +5136,7 @@ packages: dev: true /is-directory/0.3.1: - resolution: {integrity: sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=} + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} dev: true @@ -5124,7 +5147,7 @@ packages: dev: true /is-extendable/0.1.1: - resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=} + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} dev: true @@ -5136,12 +5159,12 @@ packages: dev: true /is-extglob/2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true /is-fullwidth-code-point/2.0.0: - resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} dev: true @@ -5151,7 +5174,7 @@ packages: dev: true /is-glob/3.1.0: - resolution: {integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=} + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 @@ -5190,7 +5213,7 @@ packages: dev: true /is-number/3.0.0: - resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 @@ -5231,7 +5254,7 @@ packages: dev: true /is-plain-obj/1.1.0: - resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=} + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true @@ -5264,7 +5287,7 @@ packages: dev: true /is-stream/1.1.0: - resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: true @@ -5283,7 +5306,7 @@ packages: dev: true /is-typedarray/1.0.0: - resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true /is-weakref/1.0.2: @@ -5298,7 +5321,7 @@ packages: dev: true /is-wsl/1.1.0: - resolution: {integrity: sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=} + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} engines: {node: '>=4'} dev: true @@ -5314,7 +5337,7 @@ packages: dev: true /isarray/1.0.0: - resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true /isarray/2.0.5: @@ -5322,27 +5345,27 @@ packages: dev: true /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true /isobject/2.1.0: - resolution: {integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=} + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: true /isobject/3.0.1: - resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: true /isstream/0.1.2: - resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: true /javascript-stringify/1.6.0: - resolution: {integrity: sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=} + resolution: {integrity: sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==} dev: true /javascript-stringify/2.1.0: @@ -5362,11 +5385,11 @@ packages: dev: true /jsbn/0.1.1: - resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} dev: true /jsesc/0.5.0: - resolution: {integrity: sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=} + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true dev: true @@ -5393,7 +5416,7 @@ packages: dev: true /json-stringify-safe/5.0.1: - resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: true /json3/3.3.3: @@ -5401,7 +5424,7 @@ packages: dev: true /json5/0.5.1: - resolution: {integrity: sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=} + resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} hasBin: true dev: true @@ -5421,9 +5444,9 @@ packages: dev: true /jsonfile/4.0.0: - resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: - graceful-fs: 4.2.9 + graceful-fs: 4.2.10 dev: true /jsprim/1.4.2: @@ -5447,14 +5470,14 @@ packages: dev: true /kind-of/3.2.2: - resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true /kind-of/4.0.0: - resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=} + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 @@ -5491,7 +5514,7 @@ packages: dev: true /load-script/1.0.0: - resolution: {integrity: sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=} + resolution: {integrity: sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==} dev: true /loader-runner/2.4.0: @@ -5500,7 +5523,7 @@ packages: dev: true /loader-utils/0.2.17: - resolution: {integrity: sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=} + resolution: {integrity: sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==} dependencies: big.js: 3.2.0 emojis-list: 2.1.0 @@ -5533,11 +5556,11 @@ packages: dev: true /lodash._reinterpolate/3.0.0: - resolution: {integrity: sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=} + resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} dev: true /lodash.clonedeep/4.5.0: - resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} dev: true /lodash.debounce/4.0.8: @@ -5545,11 +5568,11 @@ packages: dev: true /lodash.kebabcase/4.1.1: - resolution: {integrity: sha1-hImxyw0p/4gZXM7KRI/21swpXDY=} + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} dev: true /lodash.memoize/4.1.2: - resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true /lodash.template/4.5.0: @@ -5570,7 +5593,7 @@ packages: dev: true /lodash.uniq/4.5.0: - resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=} + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true /lodash/4.17.21: @@ -5583,7 +5606,7 @@ packages: dev: true /lower-case/1.1.4: - resolution: {integrity: sha1-miyr0bno4K6ZOkv31YdcOcQujqw=} + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} dev: true /lowercase-keys/1.0.1: @@ -5609,6 +5632,13 @@ packages: yallist: 3.1.1 dev: true + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + /make-dir/2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -5625,12 +5655,12 @@ packages: dev: true /map-cache/0.2.2: - resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} dev: true /map-visit/1.0.0: - resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=} + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 @@ -5655,11 +5685,11 @@ packages: dev: true /markdown-it-container/2.0.0: - resolution: {integrity: sha1-ABm0P9Au7+zi8ZYKKJX7qBpARpU=} + resolution: {integrity: sha512-IxPOaq2LzrGuFGyYq80zaorXReh2ZHGFOB1/Hen429EJL1XkPI3FJTpx9TsJeua+j2qTru4h3W1TiCRdeivMmA==} dev: true /markdown-it-emoji/1.4.0: - resolution: {integrity: sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=} + resolution: {integrity: sha512-QCz3Hkd+r5gDYtS2xsFXmBYrgw6KuWcJZLCEkdfAuwzZbShCmCfta+hwAMq4NX/4xPzkSHduMKgMkkPUJxSXNg==} dev: true /markdown-it-table-of-contents/0.4.4: @@ -5695,7 +5725,7 @@ packages: dev: true /mdurl/1.0.1: - resolution: {integrity: sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=} + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: true /media-typer/0.3.0: @@ -5704,7 +5734,7 @@ packages: dev: true /memory-fs/0.4.1: - resolution: {integrity: sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=} + resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} dependencies: errno: 0.1.8 readable-stream: 2.3.7 @@ -5803,7 +5833,7 @@ packages: dev: true /min-document/2.19.0: - resolution: {integrity: sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=} + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} dependencies: dom-walk: 0.1.2 dev: true @@ -5826,7 +5856,7 @@ packages: dev: true /minimalistic-crypto-utils/1.0.1: - resolution: {integrity: sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=} + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} dev: true /minimatch/3.0.5: @@ -5835,6 +5865,13 @@ packages: brace-expansion: 1.1.11 dev: true + /minimatch/5.1.0: + resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist/1.2.5: resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} dev: true @@ -5864,7 +5901,7 @@ packages: dev: true /mkdirp/0.3.0: - resolution: {integrity: sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=} + resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==} deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) dev: true @@ -5882,7 +5919,7 @@ packages: dev: true /move-concurrently/1.0.1: - resolution: {integrity: sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=} + resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} dependencies: aproba: 1.2.0 copy-concurrently: 1.0.5 @@ -5893,7 +5930,7 @@ packages: dev: true /ms/2.0.0: - resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true /ms/2.1.2: @@ -5905,7 +5942,7 @@ packages: dev: true /multicast-dns-service-types/1.1.0: - resolution: {integrity: sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=} + resolution: {integrity: sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==} dev: true /multicast-dns/6.2.3: @@ -6002,7 +6039,7 @@ packages: dev: true /normalize-path/2.1.1: - resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 @@ -6014,7 +6051,7 @@ packages: dev: true /normalize-range/0.1.2: - resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} dev: true @@ -6038,14 +6075,14 @@ packages: dev: true /npm-run-path/2.0.2: - resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=} + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 dev: true /nprogress/0.2.0: - resolution: {integrity: sha1-y480xTIT2JVyP8urkH6UIq28r7E=} + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} dev: true /nth-check/1.0.2: @@ -6061,7 +6098,7 @@ packages: dev: true /num2fraction/1.2.2: - resolution: {integrity: sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=} + resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} dev: true /oauth-sign/0.9.0: @@ -6069,12 +6106,12 @@ packages: dev: true /object-assign/4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true /object-copy/0.1.0: - resolution: {integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=} + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: copy-descriptor: 0.1.1 @@ -6100,7 +6137,7 @@ packages: dev: true /object-visit/1.0.1: - resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 @@ -6126,7 +6163,7 @@ packages: dev: true /object.pick/1.3.0: - resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=} + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 @@ -6158,7 +6195,7 @@ packages: dev: true /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true @@ -6200,7 +6237,7 @@ packages: dev: true /os-browserify/0.3.0: - resolution: {integrity: sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=} + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} dev: true /p-cancelable/1.1.0: @@ -6209,7 +6246,7 @@ packages: dev: true /p-finally/1.0.0: - resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: true @@ -6274,7 +6311,7 @@ packages: dev: true /param-case/2.1.1: - resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} dependencies: no-case: 2.3.2 dev: true @@ -6290,7 +6327,7 @@ packages: dev: true /parse-json/4.0.0: - resolution: {integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=} + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} dependencies: error-ex: 1.3.2 @@ -6303,7 +6340,7 @@ packages: dev: true /pascalcase/0.1.1: - resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: true @@ -6312,11 +6349,11 @@ packages: dev: true /path-dirname/1.0.2: - resolution: {integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=} + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} dev: true /path-exists/3.0.0: - resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} dev: true @@ -6326,16 +6363,16 @@ packages: dev: true /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true /path-is-inside/1.0.2: - resolution: {integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=} + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} dev: true /path-key/2.0.1: - resolution: {integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=} + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true @@ -6371,7 +6408,7 @@ packages: dev: true /performance-now/2.1.0: - resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true /picocolors/0.2.1: @@ -6388,12 +6425,12 @@ packages: dev: true /pify/2.3.0: - resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: true /pify/3.0.0: - resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} dev: true @@ -6403,14 +6440,14 @@ packages: dev: true /pinkie-promise/2.0.1: - resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: true /pinkie/2.0.4: - resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: true @@ -6438,7 +6475,7 @@ packages: dev: true /posix-character-classes/0.1.1: - resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} dev: true @@ -6777,7 +6814,7 @@ packages: dev: true /prepend-http/2.0.0: - resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=} + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} dev: true @@ -6811,12 +6848,12 @@ packages: dev: true /process/0.11.10: - resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=} + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} dev: true /promise-inflight/1.0.1: - resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} dev: true /proxy-addr/2.0.7: @@ -6828,11 +6865,11 @@ packages: dev: true /prr/1.0.1: - resolution: {integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY=} + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true /pseudomap/1.0.2: - resolution: {integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM=} + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true /psl/1.8.0: @@ -6877,7 +6914,7 @@ packages: dev: true /punycode/1.4.1: - resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true /punycode/2.1.1: @@ -6893,7 +6930,7 @@ packages: dev: true /q/1.5.1: - resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true @@ -6917,7 +6954,7 @@ packages: dev: true /querystring-es3/0.2.1: - resolution: {integrity: sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=} + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} engines: {node: '>=0.4.x'} dev: true @@ -6994,7 +7031,7 @@ packages: resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} engines: {node: '>=0.10'} dependencies: - graceful-fs: 4.2.9 + graceful-fs: 4.2.10 micromatch: 3.1.10 readable-stream: 2.3.7 dev: true @@ -7087,12 +7124,12 @@ packages: dev: true /relateurl/0.2.7: - resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} dev: true /remove-trailing-separator/1.1.0: - resolution: {integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=} + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: true /renderkid/2.0.7: @@ -7111,7 +7148,7 @@ packages: dev: true /repeat-string/1.6.1: - resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=} + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} dev: true @@ -7143,7 +7180,7 @@ packages: dev: true /require-directory/2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: true @@ -7152,23 +7189,23 @@ packages: dev: true /requires-port/1.0.0: - resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=} + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true /resolve-cwd/2.0.0: - resolution: {integrity: sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=} + resolution: {integrity: sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true /resolve-from/3.0.0: - resolution: {integrity: sha1-six699nWiBvItuZTM17rywoYh0g=} + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} dev: true /resolve-url/0.2.1: - resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: true @@ -7193,16 +7230,16 @@ packages: dev: true /retry/0.12.0: - resolution: {integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=} + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: true /rgb-regex/1.0.1: - resolution: {integrity: sha1-wODWiC3w4jviVKR16O3UGRX+rrE=} + resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==} dev: true /rgba-regex/1.0.0: - resolution: {integrity: sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=} + resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} dev: true /rimraf/2.7.1: @@ -7212,13 +7249,6 @@ packages: glob: 7.2.0 dev: true - /rimraf/3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.0 - dev: true - /ripemd160/2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: @@ -7227,16 +7257,15 @@ packages: dev: true /run-queue/1.0.3: - resolution: {integrity: sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=} + resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} dependencies: aproba: 1.2.0 dev: true - /rxjs/6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} + /rxjs/7.5.6: + resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} dependencies: - tslib: 1.14.1 + tslib: 2.4.0 dev: true /safe-buffer/5.1.2: @@ -7248,7 +7277,7 @@ packages: dev: true /safe-regex/1.1.0: - resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=} + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: true @@ -7288,7 +7317,7 @@ packages: dev: true /select-hose/2.0.0: - resolution: {integrity: sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=} + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true /selfsigned/1.10.14: @@ -7319,6 +7348,14 @@ packages: hasBin: true dev: true + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /send/0.17.2: resolution: {integrity: sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==} engines: {node: '>= 0.8.0'} @@ -7388,7 +7425,7 @@ packages: dev: true /setimmediate/1.0.5: - resolution: {integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=} + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: true /setprototypeof/1.1.0: @@ -7408,7 +7445,7 @@ packages: dev: true /shebang-command/1.2.0: - resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=} + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 @@ -7422,7 +7459,7 @@ packages: dev: true /shebang-regex/1.0.0: - resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=} + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true @@ -7431,6 +7468,10 @@ packages: engines: {node: '>=8'} dev: true + /shell-quote/1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} + dev: true + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -7444,13 +7485,13 @@ packages: dev: true /simple-swizzle/0.2.2: - resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 dev: true /slash/1.0.0: - resolution: {integrity: sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=} + resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} engines: {node: '>=0.10.0'} dev: true @@ -7513,7 +7554,7 @@ packages: dev: true /sort-keys/2.0.0: - resolution: {integrity: sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=} + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} engines: {node: '>=4'} dependencies: is-plain-obj: 1.1.0 @@ -7552,7 +7593,7 @@ packages: dev: true /source-map/0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true @@ -7567,7 +7608,7 @@ packages: dev: true /spawn-command/0.0.2-1: - resolution: {integrity: sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=} + resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} dev: true /spdy-transport/3.0.0_supports-color@6.1.0: @@ -7610,7 +7651,7 @@ packages: dev: true /sprintf-js/1.0.3: - resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true /sshpk/1.17.0: @@ -7637,6 +7678,7 @@ packages: /stable/0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: true /stack-utils/1.0.5: @@ -7647,7 +7689,7 @@ packages: dev: true /static-extend/0.1.2: - resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=} + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: define-property: 0.2.5 @@ -7694,7 +7736,7 @@ packages: dev: true /strict-uri-encode/1.1.0: - resolution: {integrity: sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=} + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} engines: {node: '>=0.10.0'} dev: true @@ -7743,7 +7785,7 @@ packages: dev: true /strip-ansi/3.0.1: - resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 @@ -7764,12 +7806,12 @@ packages: dev: true /strip-bom-string/1.0.0: - resolution: {integrity: sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=} + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} dev: true /strip-eof/1.0.0: - resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=} + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: true @@ -7813,7 +7855,7 @@ packages: dev: true /supports-color/2.0.0: - resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=} + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} dev: true @@ -7851,7 +7893,7 @@ packages: dev: true /svg-tags/1.0.0: - resolution: {integrity: sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=} + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} dev: true /svgo/1.3.2: @@ -7914,11 +7956,11 @@ packages: dev: true /text-table/0.2.0: - resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true /through/2.3.8: - resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true /through2/2.0.5: @@ -7940,7 +7982,7 @@ packages: dev: true /timsort/0.3.0: - resolution: {integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=} + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} dev: true /tmp/0.1.0: @@ -7951,20 +7993,20 @@ packages: dev: true /to-arraybuffer/1.0.1: - resolution: {integrity: sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=} + resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} dev: true /to-factory/1.0.0: - resolution: {integrity: sha1-hzivi9lxIK0dQEeXKtpVY7+UebE=} + resolution: {integrity: sha512-JVYrY42wMG7ddf+wBUQR/uHGbjUHZbLisJ8N62AMm0iTZ0p8YTcZLzdtomU0+H+wa99VbkyvQGB3zxB7NDzgIQ==} dev: true /to-fast-properties/2.0.0: - resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true /to-object-path/0.3.0: - resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=} + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 @@ -7976,7 +8018,7 @@ packages: dev: true /to-regex-range/2.1.1: - resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=} + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: is-number: 3.0.0 @@ -8010,7 +8052,7 @@ packages: dev: true /toposort/1.0.7: - resolution: {integrity: sha1-LmhELZ9k7HILjMieZEOsbKqVACk=} + resolution: {integrity: sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==} dev: true /tough-cookie/2.5.0: @@ -8026,8 +8068,8 @@ packages: hasBin: true dev: true - /tslib/1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true /tty-browserify/0.0.0: @@ -8035,13 +8077,13 @@ packages: dev: true /tunnel-agent/0.6.0: - resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 dev: true /tweetnacl/0.14.5: - resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} dev: true /type-fest/0.21.3: @@ -8069,7 +8111,7 @@ packages: dev: true /typedarray/0.0.6: - resolution: {integrity: sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=} + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true /uc.micro/1.0.6: @@ -8128,11 +8170,11 @@ packages: dev: true /uniq/1.0.1: - resolution: {integrity: sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=} + resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} dev: true /uniqs/2.0.0: - resolution: {integrity: sha1-/+3ks2slKQaW5uFl1KWe25mOawI=} + resolution: {integrity: sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==} dev: true /unique-filename/1.1.1: @@ -8165,11 +8207,11 @@ packages: dev: true /unquote/1.1.1: - resolution: {integrity: sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=} + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} dev: true /unset-value/1.0.0: - resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=} + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} dependencies: has-value: 0.3.1 @@ -8201,7 +8243,7 @@ packages: dev: true /upper-case/1.1.3: - resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} dev: true /uri-js/4.4.1: @@ -8211,7 +8253,7 @@ packages: dev: true /urix/0.1.0: - resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=} + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: true @@ -8242,7 +8284,7 @@ packages: dev: true /url/0.11.0: - resolution: {integrity: sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=} + resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} dependencies: punycode: 1.3.2 querystring: 0.2.0 @@ -8254,7 +8296,7 @@ packages: dev: true /util-deprecate/1.0.2: - resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true /util.promisify/1.0.0: @@ -8274,7 +8316,7 @@ packages: dev: true /util/0.10.3: - resolution: {integrity: sha1-evsa/lCAUkZInj23/g7TeTNqwPk=} + resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==} dependencies: inherits: 2.0.1 dev: true @@ -8286,7 +8328,7 @@ packages: dev: true /utila/0.4.0: - resolution: {integrity: sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=} + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} dev: true /utils-merge/1.0.1: @@ -8306,7 +8348,7 @@ packages: dev: true /vary/1.1.2: - resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: true @@ -8454,7 +8496,7 @@ packages: /watchpack/1.7.5: resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} dependencies: - graceful-fs: 4.2.9 + graceful-fs: 4.2.10 neo-async: 2.6.2 optionalDependencies: chokidar: 3.5.3 @@ -8634,7 +8676,7 @@ packages: dev: true /when/3.6.4: - resolution: {integrity: sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=} + resolution: {integrity: sha512-d1VUP9F96w664lKINMGeElWdhhb5sC+thXM+ydZGU3ZnaE09Wv6FaS+mpM9570kcDs/xMfcXJBTLsMdHEFYY9Q==} dev: true /which-boxed-primitive/1.0.2: @@ -8698,7 +8740,7 @@ packages: dev: true /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true /write-file-atomic/3.0.3: @@ -8760,13 +8802,17 @@ packages: dev: true /yallist/2.1.2: - resolution: {integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=} + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true /yallist/3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + /yargs-parser/13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} dependencies: @@ -8774,9 +8820,9 @@ packages: decamelize: 1.2.0 dev: true - /yargs-parser/20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} dev: true /yargs/13.3.2: @@ -8794,9 +8840,9 @@ packages: yargs-parser: 13.1.2 dev: true - /yargs/16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + /yargs/17.5.1: + resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} + engines: {node: '>=12'} dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -8804,9 +8850,9 @@ packages: require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.9 + yargs-parser: 21.1.1 dev: true /zepto/1.2.0: - resolution: {integrity: sha1-4Se9nmb9hGvl6rSME5SIL3wOT5g=} + resolution: {integrity: sha512-C1x6lfvBICFTQIMgbt3JqMOno3VOtkWat/xEakLTOurskYIHPmzJrzd1e8BnmtdDVJlGuk5D+FxyCA8MPmkIyA==} dev: true diff --git a/src/ProgramTest.elm b/src/ProgramTest.elm index 22d432a..69ae2c8 100644 --- a/src/ProgramTest.elm +++ b/src/ProgramTest.elm @@ -210,6 +210,7 @@ import ProgramTest.ComplexQuery as ComplexQuery exposing (ComplexQuery) import ProgramTest.EffectSimulation as EffectSimulation exposing (EffectSimulation) import ProgramTest.Failure as Failure exposing (Failure(..)) import ProgramTest.Program as Program exposing (Program) +import Result.Extra import SimulatedEffect exposing (SimulatedEffect, SimulatedSub, SimulatedTask) import String.Extra import Test.Html.Event @@ -303,7 +304,8 @@ createHelper : { init : ( model, effect ) , update : msg -> model -> ( model, effect ) , view : model -> Html msg - , onRouteChange : Url -> Maybe msg + , onUrlRequest : Maybe (Browser.UrlRequest -> msg) + , onUrlChange : Maybe (Url -> msg) } -> ProgramOptions model msg effect -> ProgramTest model msg effect @@ -312,7 +314,8 @@ createHelper program options = program_ = { update = program.update , view = program.view - , onRouteChange = program.onRouteChange + , onUrlRequest = program.onUrlRequest + , onUrlChange = program.onUrlChange , subscriptions = options.subscriptions , withinFocus = identity } @@ -365,7 +368,8 @@ createSandbox program = { init = ( program.init, () ) , update = \msg model -> ( program.update msg model, () ) , view = program.view - , onRouteChange = \_ -> Nothing + , onUrlRequest = Nothing + , onUrlChange = Nothing } @@ -388,7 +392,8 @@ createWorker program = { init = program.init flags , update = program.update , view = \_ -> Html.text "** Programs created with ProgramTest.createWorker do not have a view. Use ProgramTest.createElement instead if you meant to provide a view function. **" - , onRouteChange = \_ -> Nothing + , onUrlRequest = Nothing + , onUrlChange = Nothing } @@ -412,7 +417,8 @@ createElement program = { init = program.init flags , update = program.update , view = program.view - , onRouteChange = \_ -> Nothing + , onUrlRequest = Nothing + , onUrlChange = Nothing } @@ -530,7 +536,8 @@ createDocument program = { init = program.init flags , update = program.update , view = \model -> Html.node "body" [] (program.view model).body - , onRouteChange = \_ -> Nothing + , onUrlRequest = Nothing + , onUrlChange = Nothing } @@ -567,7 +574,8 @@ createApplication program = { init = program.init flags url () , update = program.update , view = \model -> Html.node "body" [] (program.view model).body - , onRouteChange = program.onUrlChange >> Just + , onUrlRequest = Just program.onUrlRequest + , onUrlChange = Just program.onUrlChange } @@ -753,10 +761,18 @@ simulateLabeledInputHelper functionDescription fieldId label allowTextArea addit ) -{-| TODO: have other internal functions use this to have more consistent error message. --} -simulateComplexQuery : String -> (ComplexQuery (Query.Single msg) -> ComplexQuery msg) -> ProgramTest model msg effect -> ProgramTest model msg effect -simulateComplexQuery functionName complexQuery = +runComplexQuery : + String + -> (ComplexQuery (Query.Single msg) -> ComplexQuery a) + -> + (a + -> Program model msg effect (SimulatedSub msg) + -> TestState model msg effect + -> Result Failure (TestState model msg effect) + ) + -> ProgramTest model msg effect + -> ProgramTest model msg effect +runComplexQuery functionName complexQuery fn = andThen <| \program state -> let @@ -764,27 +780,23 @@ simulateComplexQuery functionName complexQuery = Program.renderView program state.currentModel in case ComplexQuery.run (complexQuery (ComplexQuery.succeed view)) of - ( _, Ok msg ) -> - TestState.update msg program state + ( _, Ok a ) -> + fn a program state ( highlight, Err queryFailure ) -> Err (ViewAssertionFailed ("ProgramTest." ++ functionName) (Html.map (\_ -> ()) (program.view state.currentModel)) highlight queryFailure) +{-| TODO: have other internal functions use this to have more consistent error message. +-} +simulateComplexQuery : String -> (ComplexQuery (Query.Single msg) -> ComplexQuery msg) -> ProgramTest model msg effect -> ProgramTest model msg effect +simulateComplexQuery functionName complexQuery = + runComplexQuery functionName complexQuery TestState.update + + assertComplexQuery : String -> (ComplexQuery (Query.Single msg) -> ComplexQuery ignored) -> ProgramTest model msg effect -> ProgramTest model msg effect assertComplexQuery functionName complexQuery = - andThen <| - \program state -> - let - view = - Program.renderView program state.currentModel - in - case ComplexQuery.run (complexQuery (ComplexQuery.succeed view)) of - ( _, Ok _ ) -> - Ok state - - ( highlight, Err queryFailure ) -> - Err (ViewAssertionFailed ("ProgramTest." ++ functionName) (Html.map (\_ -> ()) (program.view state.currentModel)) highlight queryFailure) + runComplexQuery functionName complexQuery (\_ _ state -> Ok state) {-| Simulates a custom DOM event. @@ -997,16 +1009,41 @@ sets `preventDefault`, but this will be done in the future after -} clickLink : String -> String -> ProgramTest model msg effect -> ProgramTest model msg effect -clickLink linkText href programTest = +clickLink linkText href = let functionDescription = "clickLink " ++ String.Extra.escape linkText - findLinkTag = - [ Selector.tag "a" - , Selector.attribute (Html.Attributes.href href) - , Selector.containing [ Selector.text linkText ] - ] + findLink = + ComplexQuery.exactlyOneOf "Expected one of the following to exist" + [ ( " with text" + , ComplexQuery.find (Just "find link") + [ "a" ] + [ Selector.tag "a" + , Selector.attribute (Html.Attributes.href href) + , Selector.containing [ Selector.text linkText ] + ] + ) + , ( " with aria-label" + , ComplexQuery.find (Just "find link") + [ "a" ] + [ Selector.tag "a" + , Selector.attribute (Html.Attributes.href href) + , Selector.attribute (Html.Attributes.attribute "aria-label" linkText) + ] + ) + , ( " with with alt text" + , ComplexQuery.find (Just "find link") + [ "a" ] + [ Selector.tag "a" + , Selector.attribute (Html.Attributes.href href) + , Selector.containing + [ Selector.tag "img" + , Selector.attribute (Html.Attributes.alt linkText) + ] + ] + ) + ] normalClick = ( "click" @@ -1032,63 +1069,53 @@ clickLink linkText href programTest = ] ) + respondsTo event single = + single + |> Test.Html.Event.simulate event + |> Test.Html.Event.toResult + |> Result.Extra.isOk + tryClicking : { otherwise : Program model msg effect (SimulatedSub msg) -> TestState model msg effect -> Result Failure (TestState model msg effect) } - -> ProgramTest model msg effect - -> ProgramTest model msg effect - tryClicking { otherwise } = - andThen <| - \program state -> - let - link = - Program.renderView program state.currentModel - |> Query.find findLinkTag - in - if respondsTo normalClick link then - -- there is a click handler - -- first make sure the handler properly respects "Open in new tab", etc - if respondsTo ctrlClick link || respondsTo metaClick link then - Err - (CustomFailure functionDescription - (String.concat - [ "Found an `` tag has an onClick handler, " - , "but the handler is overriding ctrl-click and meta-click.\n\n" - , "A properly behaved single-page app should not override ctrl- and meta-clicks on `` tags " - , "because this prevents users from opening links in new tabs/windows.\n\n" - , "Use `onClickPreventDefaultForLinkWithHref` defined at instead of `onClick` to fix this problem.\n\n" - , "See discussion of this issue at ." - ] - ) - ) - - else - -- everything looks good, so simulate that event and ignore the `href` - simulateHelper functionDescription (Query.find findLinkTag) normalClick program state - - else - -- the link doesn't have a click handler - otherwise program state + -> Query.Single msg + -> Program model msg effect (SimulatedSub msg) + -> TestState model msg effect + -> Result Failure (TestState model msg effect) + tryClicking { otherwise } single program state = + if respondsTo normalClick single then + -- there is a click handler + -- first make sure the handler properly respects "Open in new tab", etc + if respondsTo ctrlClick single || respondsTo metaClick single then + Err + (CustomFailure functionDescription + (String.concat + [ "Found an `` tag has an onClick handler, " + , "but the handler is overriding ctrl-click and meta-click.\n\n" + , "A properly behaved single-page app should not override ctrl- and meta-clicks on `` tags " + , "because this prevents users from opening links in new tabs/windows.\n\n" + , "Use `onClickPreventDefaultForLinkWithHref` defined at instead of `onClick` to fix this problem.\n\n" + , "See discussion of this issue at ." + ] + ) + ) - respondsTo event single = - case - single - |> Test.Html.Event.simulate event - |> Test.Html.Event.toResult - of - Err _ -> - False + else + -- everything looks good, so simulate that event and ignore the `href` + single + |> Test.Html.Event.simulate normalClick + |> Test.Html.Event.toResult + |> Result.mapError (SimulateFailed functionDescription) + |> Result.andThen (\msg -> TestState.update msg program state) - Ok _ -> - True + else + -- the link doesn't have a click handler + otherwise program state in - programTest - |> assertComplexQuery functionDescription - (ComplexQuery.find Nothing [ "a" ] findLinkTag) - |> tryClicking { otherwise = \_ -> TestState.simulateLoadUrlHelper functionDescription href >> Err } + runComplexQuery functionDescription findLink (tryClicking { otherwise = TestState.urlRequestHelper functionDescription href }) {-| Simulates replacing the text in an input field labeled with the given label. @@ -1865,7 +1892,7 @@ The parameter may be an absolute URL or relative URL. -} routeChange : String -> ProgramTest model msg effect -> ProgramTest model msg effect routeChange url = - andThen (TestState.routeChangeHelper "routeChange" 0 url) + andThen (TestState.urlChangeHelper "routeChange" 0 url) {-| Make an assertion about the current state of a `ProgramTest`'s model. diff --git a/src/ProgramTest/ComplexQuery.elm b/src/ProgramTest/ComplexQuery.elm index fed8d67..8defc05 100644 --- a/src/ProgramTest/ComplexQuery.elm +++ b/src/ProgramTest/ComplexQuery.elm @@ -3,6 +3,7 @@ module ProgramTest.ComplexQuery exposing (ComplexQuery, Failure(..), FailureCont import Json.Encode as Json import ProgramTest.TestHtmlHacks as TestHtmlHacks import ProgramTest.TestHtmlParser as TestHtmlParser +import Result.Extra import Set exposing (Set) import Test.Html.Event import Test.Html.Query as Query @@ -356,14 +357,4 @@ firstErrorOf source choices = countSuccesses : List (Result String String) -> Int countSuccesses results = - List.length (List.filter isOk results) - - -isOk : Result x a -> Bool -isOk result = - case result of - Ok _ -> - True - - Err _ -> - False + List.length (List.filter Result.Extra.isOk results) diff --git a/src/ProgramTest/Program.elm b/src/ProgramTest/Program.elm index 98cd8b9..25ffd84 100644 --- a/src/ProgramTest/Program.elm +++ b/src/ProgramTest/Program.elm @@ -1,5 +1,6 @@ module ProgramTest.Program exposing (Program, renderView) +import Browser import Html exposing (Html) import Test.Html.Query as Query import Url exposing (Url) @@ -15,7 +16,8 @@ Note that we also parameterize `effect` and `sub` separately because type alias Program model msg effect sub = { update : msg -> model -> ( model, effect ) , view : model -> Html msg - , onRouteChange : Url -> Maybe msg + , onUrlRequest : Maybe (Browser.UrlRequest -> msg) + , onUrlChange : Maybe (Url -> msg) , subscriptions : Maybe (model -> sub) , withinFocus : Query.Single msg -> Query.Single msg } diff --git a/src/Result/Extra.elm b/src/Result/Extra.elm new file mode 100644 index 0000000..d36599c --- /dev/null +++ b/src/Result/Extra.elm @@ -0,0 +1,11 @@ +module Result.Extra exposing (isOk) + + +isOk : Result x a -> Bool +isOk result = + case result of + Ok _ -> + True + + Err _ -> + False diff --git a/src/SimulatedEffect/Task.elm b/src/SimulatedEffect/Task.elm index 21d5b94..61234d1 100644 --- a/src/SimulatedEffect/Task.elm +++ b/src/SimulatedEffect/Task.elm @@ -1,6 +1,6 @@ module SimulatedEffect.Task exposing ( perform, attempt - , andThen, succeed, fail + , andThen, succeed, fail, sequence , map, map2, map3, map4, map5 , mapError, onError ) @@ -20,7 +20,7 @@ to help you implement the function to provide when using [`ProgramTest.withSimul # Chains -@docs andThen, succeed, fail +@docs andThen, succeed, fail, sequence # Maps @@ -98,6 +98,14 @@ fail = SimulatedEffect.Fail +{-| Start with a list of tasks, and turn them into a single task that returns a +list. +-} +sequence : List (SimulatedTask x a) -> SimulatedTask x (List a) +sequence tasks = + List.foldr (map2 (::)) (succeed []) tasks + + {-| Transform a task. -} map : (a -> b) -> SimulatedTask x a -> SimulatedTask x b diff --git a/src/TestState.elm b/src/TestState.elm index 00f9b79..72b6666 100644 --- a/src/TestState.elm +++ b/src/TestState.elm @@ -1,11 +1,11 @@ -module TestState exposing (TestState, advanceTime, drain, queueEffect, routeChangeHelper, simulateLoadUrlHelper, update, withSimulation) +module TestState exposing (TestState, advanceTime, drain, queueEffect, update, urlChangeHelper, urlRequestHelper, withSimulation) import Dict import PairingHeap import ProgramTest.EffectSimulation as EffectSimulation exposing (EffectSimulation) import ProgramTest.Failure exposing (Failure(..)) import ProgramTest.Program exposing (Program) -import SimulatedEffect exposing (SimulatedEffect, SimulatedSub) +import SimulatedEffect exposing (SimulatedEffect) import String.Extra import Url exposing (Url) import Url.Extra @@ -84,10 +84,10 @@ queueSimulatedEffect program effect state = } SimulatedEffect.PushUrl url -> - routeChangeHelper ("simulating effect: SimulatedEffect.Navigation.pushUrl " ++ String.Extra.escape url) 0 url program state + urlChangeHelper ("simulating effect: SimulatedEffect.Navigation.pushUrl " ++ String.Extra.escape url) 0 url program state SimulatedEffect.ReplaceUrl url -> - routeChangeHelper ("simulating effect: SimulatedEffect.Navigation.replaceUrl " ++ String.Extra.escape url) 1 url program state + urlChangeHelper ("simulating effect: SimulatedEffect.Navigation.replaceUrl " ++ String.Extra.escape url) 1 url program state SimulatedEffect.Back n -> case state.navigation of @@ -106,7 +106,7 @@ queueSimulatedEffect program effect state = Ok state Just first -> - routeChangeHelper ("simulating effect: SimulatedEffect.Navigation.Back " ++ String.fromInt n) 2 (Url.toString first) program state + urlChangeHelper ("simulating effect: SimulatedEffect.Navigation.Back " ++ String.fromInt n) 2 (Url.toString first) program state SimulatedEffect.Load url -> Err (simulateLoadUrlHelper ("simulating effect: SimulatedEffect.Navigation.load " ++ url) url state) @@ -143,8 +143,28 @@ simulateLoadUrlHelper functionDescription href state = ChangedPage functionDescription location -routeChangeHelper : String -> Int -> String -> Program model msg effect sub -> TestState model msg effect -> Result Failure (TestState model msg effect) -routeChangeHelper functionName removeFromBackStack url program state = +urlRequestHelper : String -> String -> Program model msg effect sub -> TestState model msg effect -> Result Failure (TestState model msg effect) +urlRequestHelper functionDescription href program state = + case Maybe.map .currentLocation state.navigation of + Just location -> + case program.onUrlRequest of + Just onUrlRequest -> + update (onUrlRequest (Url.Extra.toUrlRequest location href)) program state + + Nothing -> + Err (ChangedPage functionDescription (Url.Extra.resolve location href)) + + Nothing -> + case Url.fromString href of + Nothing -> + Err (NoBaseUrl functionDescription href) + + Just location -> + Err (ChangedPage functionDescription location) + + +urlChangeHelper : String -> Int -> String -> Program model msg effect sub -> TestState model msg effect -> Result Failure (TestState model msg effect) +urlChangeHelper functionName removeFromBackStack url program state = case state.navigation of Nothing -> Err (ProgramDoesNotSupportNavigation functionName) @@ -155,13 +175,13 @@ routeChangeHelper functionName removeFromBackStack url program state = Url.Extra.resolve currentLocation url processRouteChange = - case program.onRouteChange newLocation of + case program.onUrlChange of Nothing -> Ok - Just msg -> + Just onUrlChange -> -- TODO: should this be set before or after? - update msg program + update (onUrlChange newLocation) program in { state | navigation = diff --git a/src/Url/Extra.elm b/src/Url/Extra.elm index 7a22b3e..94b0020 100644 --- a/src/Url/Extra.elm +++ b/src/Url/Extra.elm @@ -1,31 +1,100 @@ -module Url.Extra exposing (resolve) +module Url.Extra exposing (resolve, toUrlRequest) {-| TODO: this module should implement the algorithm described at -} -import Url exposing (Url) +import Browser +import Url exposing (Protocol(..), Url) {-| This resolves a URL string (either an absolute or relative URL) against a base URL (given as a `Location`). -} resolve : Url -> String -> Url resolve base url = - Url.fromString url - -- TODO: implement correct logic (current logic is only correct for "authority-relative" URLs without query or fragment strings) - |> Maybe.withDefault - { base - | path = - if String.startsWith "/" url then - url - - else - String.split "/" base.path - |> List.reverse - |> List.drop 1 - |> List.reverse - |> (\l -> l ++ String.split "/" url) - |> String.join "/" - , query = Nothing - , fragment = Nothing - } + -- TODO: This passes all the tests (except one), but could probably be nicer. + case Url.fromString url of + Just newUrl -> + newUrl + + Nothing -> + (if String.isEmpty url then + base + + else if String.startsWith "#" url then + { base | fragment = Just (String.dropLeft 1 url) } + + else if String.startsWith "?" url then + { base + | query = Just (String.dropLeft 1 url) + , fragment = Nothing + } + + else if String.startsWith "//" url then + { base | host = String.dropLeft 2 url, path = "", fragment = Nothing, query = Nothing } + + else + { base + | path = + if String.startsWith "/" url then + url + + else if url == ".." || String.startsWith "../" url then + String.split "/" base.path + |> List.reverse + |> List.drop 1 + |> parseDoubleDots url + + else + String.split "/" base.path + |> List.reverse + |> List.drop 1 + |> List.reverse + |> (\l -> + l + ++ String.split "/" + (if String.startsWith "./" url then + String.dropLeft 2 url + + else if String.startsWith "." url then + String.dropLeft 1 url + + else + url + ) + ) + |> String.join "/" + , fragment = Nothing + , query = Nothing + } + ) + |> (\u -> + -- pass back through Url.fromString just to get the query and fragment in the right place + Url.toString u + |> Url.fromString + |> Maybe.withDefault u + ) + + +parseDoubleDots : String -> List String -> String +parseDoubleDots url pathSegments = + if String.startsWith "../" url then + parseDoubleDots (String.dropLeft 3 url) (List.drop 1 pathSegments) + + else if String.startsWith ".." url then + parseDoubleDots (String.dropLeft 2 url) (List.drop 1 pathSegments) + + else + String.join "/" (List.reverse pathSegments) ++ "/" ++ url + + +toUrlRequest : Url -> String -> Browser.UrlRequest +toUrlRequest base href = + resolve base href + |> (\url -> + if url.protocol == base.protocol && url.host == base.host && url.port_ == base.port_ then + Browser.Internal url + + else + Browser.External href + ) diff --git a/tests/ProgramTestTests/SimulatedEffects/BasicTest.elm b/tests/ProgramTestTests/SimulatedEffects/BasicTest.elm index 8c63e68..0097f78 100644 --- a/tests/ProgramTestTests/SimulatedEffects/BasicTest.elm +++ b/tests/ProgramTestTests/SimulatedEffects/BasicTest.elm @@ -28,4 +28,12 @@ all = \() -> startTask (Task.succeed 5 |> Task.andThen ((+) 10 >> Task.fail)) |> ProgramTest.expectModel (Expect.equal [ "Err 15" ]) + , test "simulated Task.sequence" <| + \() -> + startTask (Task.sequence [ Task.succeed 1, Task.succeed 2 ]) + |> ProgramTest.expectModel (Expect.equal [ "Ok [1,2]" ]) + , test "simulated Task.sequence fail" <| + \() -> + startTask (Task.sequence [ Task.succeed 1, Task.fail () ]) + |> ProgramTest.expectModel (Expect.equal [ "Err ()" ]) ] diff --git a/tests/ProgramTestTests/UserInput/ClickLinkTest.elm b/tests/ProgramTestTests/UserInput/ClickLinkTest.elm index fcebb2b..93e4a46 100644 --- a/tests/ProgramTestTests/UserInput/ClickLinkTest.elm +++ b/tests/ProgramTestTests/UserInput/ClickLinkTest.elm @@ -1,11 +1,12 @@ module ProgramTestTests.UserInput.ClickLinkTest exposing (all) import Expect -import Html exposing (Html) +import Html import Html.Attributes exposing (href) import Html.Events import Json.Decode import ProgramTest exposing (ProgramTest) +import SimulatedEffect import Test exposing (..) import Test.Expect exposing (expectFailure) import TestingProgram exposing (Msg(..)) @@ -33,6 +34,12 @@ linkProgram = Html.div [] [ Html.a [ href "https://example.com/link" ] [ Html.text "External" ] , Html.a [ href "/settings" ] [ Html.text "Relative" ] + , Html.a + [ href "https://example.com/link" + , Html.Attributes.attribute "aria-label" "Aria" + ] + [] + , Html.a [ href "https://example.com/link" ] [ Html.img [ Html.Attributes.alt "Alt Text" ] [] ] ] } |> ProgramTest.withBaseUrl "http://localhost:3000/Main.elm" @@ -47,12 +54,22 @@ all = linkProgram |> ProgramTest.clickLink "External" "https://example.com/link" |> ProgramTest.expectPageChange "https://example.com/link" + , test "can verify a link with aria-label" <| + \() -> + linkProgram + |> ProgramTest.clickLink "Aria" "https://example.com/link" + |> ProgramTest.expectPageChange "https://example.com/link" + , test "can verify a link with img and alt text" <| + \() -> + linkProgram + |> ProgramTest.clickLink "Alt Text" "https://example.com/link" + |> ProgramTest.expectPageChange "https://example.com/link" , test "can verify a relative link" <| \() -> linkProgram |> ProgramTest.clickLink "Relative" "/settings" |> ProgramTest.expectPageChange "http://localhost:3000/settings" - , test "can verify an internal (single-page app) link" <| + , test "can verify an internal (single-page app) link with onClick handler" <| \() -> ProgramTest.createApplication { onUrlChange = .path @@ -75,6 +92,18 @@ all = |> ProgramTest.start () |> ProgramTest.clickLink "SPA" "#search" |> ProgramTest.expectModel (Expect.equal ";GoToSearch") + , test "internal (single-page app) link causes url change" <| + \() -> + TestingProgram.application SimulatedEffect.None + |> ProgramTest.clickLink "SPA" "/search?q=query" + |> ProgramTest.ensureBrowserHistory (Expect.equal [ "https://example.com/path" ]) + |> ProgramTest.ensureBrowserUrl (Expect.equal "https://example.com/search?q=query") + |> ProgramTest.expectModel (Expect.equal [ "OnUrlChange: https://example.com/search?q=query" ]) + , test "external link changes page" <| + \() -> + TestingProgram.application SimulatedEffect.None + |> ProgramTest.clickLink "External" "http://external.com/test" + |> ProgramTest.expectPageChange "http://external.com/test" , test "gives accessibility advice for links with bad onClick" <| \() -> TestingProgram.startView diff --git a/tests/TestingProgram.elm b/tests/TestingProgram.elm index 1d238f3..07af96a 100644 --- a/tests/TestingProgram.elm +++ b/tests/TestingProgram.elm @@ -3,9 +3,12 @@ module TestingProgram exposing (Model, Msg(..), ProgramTest, application, startE {-| This is a generic program for use in tests for many elm-program-test modules. -} +import Browser import Html exposing (Html) +import Html.Attributes import ProgramTest exposing (SimulatedEffect) import SimulatedEffect.Cmd +import SimulatedEffect.Navigation import Url @@ -38,13 +41,16 @@ application : SimulatedEffect Msg -> ProgramTest application initialEffects = ProgramTest.createApplication { onUrlChange = \location -> Log ("OnUrlChange: " ++ Url.toString location) - , onUrlRequest = \_ -> Debug.todo "ProgramTestTests-2:onUrlRequest" + , onUrlRequest = UrlRequested , init = \() location key -> ( [], initialEffects ) , update = update , view = \_ -> { title = "page title" - , body = [] + , body = + [ Html.a [ Html.Attributes.href "/search?q=query" ] [ Html.text "SPA" ] + , Html.a [ Html.Attributes.href "http://external.com/test" ] [ Html.text "External" ] + ] } } |> ProgramTest.withSimulatedEffects identity @@ -60,6 +66,7 @@ type Msg = Clear | Log String | ProduceEffects (SimulatedEffect Msg) + | UrlRequested Browser.UrlRequest update : Msg -> Model -> ( Model, SimulatedEffect Msg ) @@ -79,3 +86,11 @@ update msg model = ( model , effect ) + + UrlRequested urlRequest -> + case urlRequest of + Browser.Internal url -> + ( model, SimulatedEffect.Navigation.pushUrl (Url.toString url) ) + + Browser.External href -> + ( model, SimulatedEffect.Navigation.load href ) diff --git a/tests/Url/ExtraTest.elm b/tests/Url/ExtraTest.elm index 0a12d97..b8727a3 100644 --- a/tests/Url/ExtraTest.elm +++ b/tests/Url/ExtraTest.elm @@ -1,5 +1,6 @@ module Url.ExtraTest exposing (all) +import Browser exposing (UrlRequest(..)) import Expect import Test exposing (..) import Url @@ -19,15 +20,25 @@ all = Expect.fail ("Unable to parse base url: " ++ base) Just b -> - Url.Extra.resolve b relative - |> Url.toString - |> Expect.equal expected + Just (Url.Extra.resolve b relative) + |> Expect.equal (Url.fromString expected) in [ check "https://example.com/path" "https://example.com/new" "https://example.com/new" , check "https://example.com/path" "/new" "https://example.com/new" , check "https://example.com/path" "new" "https://example.com/new" , check "https://example.com/path/file" "new" "https://example.com/path/new" , check "https://example.com/path?query#fragment" "new" "https://example.com/new" + , check "https://example.com/path?query#fragment" "new?q#f" "https://example.com/new?q#f" + , check "https://example.com/path?query#fragment" "?q#f" "https://example.com/path?q#f" + , check "https://example.com/path?query#fragment" "#f" "https://example.com/path?query#f" + , check "https://example.com/path?query#fragment" "?q" "https://example.com/path?q" + , check "https://example.com/path?query#fragment" "" "https://example.com/path?query#fragment" + , check "https://example.com/path?query#fragment" "../path2" "https://example.com/path2" + , check "https://example.com/path" "/new?q#f" "https://example.com/new?q#f" + , check "https://example.com/path" "/new?q" "https://example.com/new?q" + , check "https://example.com/path" "/new#f" "https://example.com/new#f" + , check "https://example.com/path" "//new.example.com?q#f" "https://new.example.com?q#f" + , check "https://example.com/path" "//new.example.com/new?q#f" "https://new.example.com/new?q#f" , describe "W3 reference examples" <| let baseUri = @@ -36,32 +47,60 @@ all = [ describe "5.4.1 Normal Examples" [ -- check baseUri "g:h" "g:h" check baseUri "g" "http://a/b/c/g" - - -- , check baseUri "./g" "http://a/b/c/g" + , check baseUri "./g" "http://a/b/c/g" , check baseUri "g/" "http://a/b/c/g/" , check baseUri "/g" "http://a/g" - - -- , check baseUri "//g" "http://g" - -- , check baseUri "?y" "http://a/b/c/d;p?y" + , check baseUri "//g" "http://g/" -- In 5.4.1 Normal Examples this is "http://g", but Url.Parser defaults to "/" for empty path segment + , check baseUri "?y" "http://a/b/c/d;p?y" , check baseUri "g?y" "http://a/b/c/g?y" - - -- , check baseUri "#s" "http://a/b/c/d;p?q#s" + , check baseUri "#s" "http://a/b/c/d;p?q#s" , check baseUri "g#s" "http://a/b/c/g#s" , check baseUri "g?y#s" "http://a/b/c/g?y#s" , check baseUri ";x" "http://a/b/c/;x" , check baseUri "g;x" "http://a/b/c/g;x" , check baseUri "g;x?y#s" "http://a/b/c/g;x?y#s" - - -- , check baseUri "" "http://a/b/c/d;p?q" - -- , check baseUri "." "http://a/b/c/" - -- , check baseUri "./" "http://a/b/c/" - -- , check baseUri ".." "http://a/b/" - -- , check baseUri "../" "http://a/b/" - -- , check baseUri "../g" "http://a/b/g" - -- , check baseUri "../.." "http://a/" - -- , check baseUri "../../" "http://a/" - -- , check baseUri "../../g" "http://a/g" + , check baseUri "" "http://a/b/c/d;p?q" + , check baseUri "." "http://a/b/c/" + , check baseUri "./" "http://a/b/c/" + , check baseUri ".." "http://a/b/" + , check baseUri "../" "http://a/b/" + , check baseUri "../g" "http://a/b/g" + , check baseUri "../.." "http://a/" + , check baseUri "../../" "http://a/" + , check baseUri "../../g" "http://a/g" ] ] ] + , describe "toUrlRequest" <| + let + requestToString req = + case req of + Internal url -> + "INTERNAL:" ++ Url.toString url + + External href -> + "EXTERNAL:" ++ href + + check base relative expected = + test ("resolve " ++ base ++ " " ++ relative) <| + \() -> + case Url.fromString base of + Nothing -> + Expect.fail ("Unable to parse base url: " ++ base) + + Just b -> + Url.Extra.toUrlRequest b relative + |> requestToString + |> Expect.equal expected + in + [ check "https://example.com/path" "https://example.com/new" "INTERNAL:https://example.com/new" + , check "https://example.com/path" "/new" "INTERNAL:https://example.com/new" + , check "https://example.com/path" "new" "INTERNAL:https://example.com/new" + , check "https://example.com/path/file" "new?query#fragment" "INTERNAL:https://example.com/path/new?query#fragment" + , check "https://example.com/path?query#fragment" "new" "INTERNAL:https://example.com/new" + , check "http://localhost:3000" "http://localhost:3000/new" "INTERNAL:http://localhost:3000/new" + , check "https://example.com/path/file" "https://example2.com/new" "EXTERNAL:https://example2.com/new" + , check "https://example.com/path/file" "http://example.com/path/file" "EXTERNAL:http://example.com/path/file" + , check "http://localhost:3000" "http://localhost:5000" "EXTERNAL:http://localhost:5000" + ] ]