From c6fb555b103ccfc9fe43b748a1c2c7dc61451c49 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 00:36:09 +0900 Subject: [PATCH 01/32] Refactor to prepare for full release --- package-lock.json | 1858 ++++++++++++++++++++++---- package.json | 7 +- packages.dhall | 93 +- spago.dhall | 13 + src/Web/Router.purs | 126 +- src/Web/Router/Driver/Hash.purs | 6 +- src/Web/Router/Driver/PushState.purs | 10 +- src/Web/Router/Internal/Control.purs | 87 ++ src/Web/Router/Internal/Types.purs | 68 + src/Web/Router/Types.purs | 89 -- 10 files changed, 1820 insertions(+), 537 deletions(-) create mode 100644 src/Web/Router/Internal/Control.purs create mode 100644 src/Web/Router/Internal/Types.purs delete mode 100644 src/Web/Router/Types.purs diff --git a/package-lock.json b/package-lock.json index 406447a..b879add 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,123 @@ { - "name": "purescript-wire-react-routing", + "name": "purescript-web-router", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "purescript-wire-react-routing", + "name": "purescript-web-router", "version": "1.0.0", + "hasInstallScript": true, "license": "ISC", "devDependencies": { - "purescript": "^0.14.0", + "purescript": "^0.15.4", "purescript-psa": "^0.8.2", "purty": "^7.0.0", - "spago": "^0.19.1" + "spago": "^0.20.9" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/ajv": { @@ -41,9 +146,9 @@ } }, "node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "engines": { "node": ">=6" @@ -88,9 +193,9 @@ ] }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "dependencies": { "safer-buffer": "~2.1.0" @@ -99,7 +204,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "engines": { "node": ">=0.8" @@ -108,13 +213,13 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, "engines": { "node": "*" @@ -127,15 +232,15 @@ "dev": true }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "dependencies": { "tweetnacl": "^0.14.3" @@ -158,15 +263,15 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -197,7 +302,7 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "node_modules/chalk": { @@ -220,10 +325,19 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "dependencies": { "restore-cursor": "^2.0.0" @@ -244,7 +358,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/combined-stream": { @@ -262,7 +376,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/concat-stream": { @@ -295,9 +409,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "node_modules/cross-spawn": { @@ -332,13 +446,13 @@ "node_modules/cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", "dev": true }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -347,15 +461,47 @@ "node": ">=0.10" } }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -371,7 +517,7 @@ "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "dependencies": { "jsbn": "~0.1.0", @@ -384,6 +530,16 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -402,10 +558,16 @@ "node": ">=6" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -440,7 +602,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, "engines": [ "node >=0.6.0" @@ -486,7 +648,7 @@ "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "engines": { "node": "*" @@ -509,7 +671,7 @@ "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -525,10 +687,20 @@ "minipass": "^2.6.0" } }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, "node_modules/fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -540,7 +712,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/get-stream": { @@ -561,22 +733,22 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -588,15 +760,15 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, "engines": { "node": ">=4" @@ -619,16 +791,36 @@ "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "dependencies": { "assert-plus": "^1.0.0", @@ -640,25 +832,75 @@ "npm": ">=1.3.7" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", "dev": true }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -671,15 +913,27 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "engines": { "node": ">=4" } }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -690,48 +944,51 @@ } }, "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { @@ -743,22 +1000,22 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/log-symbols": { @@ -799,6 +1056,157 @@ "yallist": "^3.0.2" } }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -806,21 +1214,21 @@ "dev": true }, "node_modules/mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "1.46.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -836,9 +1244,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -848,30 +1256,113 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", "dev": true, "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" } }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "dependencies": { - "minipass": "^2.9.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" } }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -894,12 +1385,12 @@ } }, "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -908,7 +1399,7 @@ "node_modules/move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", "dev": true, "dependencies": { "aproba": "^1.1.1", @@ -925,6 +1416,15 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/npm-run-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", @@ -949,7 +1449,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" @@ -979,6 +1479,21 @@ "node": ">=8" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", @@ -993,7 +1508,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1011,7 +1526,7 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "node_modules/process-nextick-args": { @@ -1023,13 +1538,26 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "node_modules/pump": { @@ -1073,22 +1601,22 @@ } }, "node_modules/purescript": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.0.tgz", - "integrity": "sha512-iTA1k8mwxHqrJp/K296g6omVfve5RCjnB5D6Up93PVtZdP66mCIqlOYC4hrLBHg2hgkk27xePDt5NUXKvH4ApQ==", + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.15.4.tgz", + "integrity": "sha512-6Ge3IMcIxKkOUXg91cBgvjbqu5SxdfwbvWi1P4g+E2maxfvDv+roWAmLyOteTsxQE4SEa/wWoCZvnZ/AEjvrMw==", "dev": true, "hasInstallScript": true, "dependencies": { - "purescript-installer": "^0.2.0" + "purescript-installer": "^0.2.6" }, "bin": { "purs": "purs.bin" } }, "node_modules/purescript-installer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.2.5.tgz", - "integrity": "sha512-fQAWWP5a7scuchXecjpU4r4KEgSPuS6bBnaP01k9f71qqD28HaJ2m4PXHFkhkR4oATAxTPIGCtmTwtVoiBOHog==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.2.6.tgz", + "integrity": "sha512-22un7k/S0hETctsMMVlCEuXlvy1VAgN/uL49B65dQVPUVd17fh9CbB5kd9xoqiADUyw3t5HgL68lCwmDwrCCVw==", "dev": true, "dependencies": { "arch": "^2.1.1", @@ -1108,6 +1636,7 @@ "pump": "^3.0.0", "request": "^2.88.0", "rimraf": "^2.6.3", + "semver": "^7.3.7", "tar": "^4.4.6", "which": "^1.3.1", "zen-observable": "^0.8.14" @@ -1143,9 +1672,9 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, "engines": { "node": ">=0.6" @@ -1201,7 +1730,7 @@ "node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "dependencies": { "onetime": "^2.0.0", @@ -1223,7 +1752,7 @@ "node_modules/restore-cursor/node_modules/onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "dependencies": { "mimic-fn": "^1.0.0" @@ -1232,6 +1761,15 @@ "node": ">=4" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -1247,7 +1785,7 @@ "node_modules/run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", "dev": true, "dependencies": { "aproba": "^1.1.1" @@ -1265,6 +1803,39 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1287,29 +1858,123 @@ } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/spago": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/spago/-/spago-0.19.1.tgz", - "integrity": "sha512-OD/yopJZ9Ub+XsFtayDeLAWLT4kLdMxosJEyyp8W5OkyJVVSbCrvYacsO7iq3lSuHJmmNny/TEZdyb7uSyupng==", + "version": "0.20.9", + "resolved": "https://registry.npmjs.org/spago/-/spago-0.20.9.tgz", + "integrity": "sha512-r5TUxnYn9HawlQyMswlhIk24BGFSN2KGbqgZFZrn47GjTpMscU14xkt9CqTWgoSQYsoZieG+3dUtOxUQ7GYD7w==", "dev": true, "hasInstallScript": true, "dependencies": { - "request": "^2.88.0", - "tar": "^4.4.8" + "make-fetch-happen": "^9.1.0", + "tar": "^6.1.11" }, "bin": { "spago": "spago" } }, + "node_modules/spago/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/spago/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/spago/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/spago/node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/spago/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", @@ -1332,9 +1997,9 @@ } }, "node_modules/ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "dependencies": { "figgy-pudding": "^3.5.1" @@ -1413,23 +2078,62 @@ } }, "node_modules/tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dev": true, "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" }, "engines": { "node": ">=4.5" } }, + "node_modules/tar/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/tar/node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/tar/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -1456,7 +2160,7 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -1468,13 +2172,13 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "node_modules/unique-filename": { @@ -1507,13 +2211,14 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "bin": { "uuid": "bin/uuid" @@ -1522,7 +2227,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "engines": [ "node >=0.6.0" @@ -1533,6 +2238,12 @@ "extsprintf": "^1.2.0" } }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -1562,7 +2273,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/xtend": { @@ -1575,9 +2286,9 @@ } }, "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "node_modules/yallist": { @@ -1594,6 +2305,85 @@ } }, "dependencies": { + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1613,9 +2403,9 @@ "dev": true }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, "ansi-styles": { @@ -1640,9 +2430,9 @@ "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -1651,19 +2441,19 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { @@ -1673,15 +2463,15 @@ "dev": true }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "requires": { "tweetnacl": "^0.14.3" @@ -1704,15 +2494,15 @@ } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", "dev": true }, "cacache": { @@ -1740,7 +2530,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "chalk": { @@ -1760,10 +2550,16 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "dev": true, "requires": { "restore-cursor": "^2.0.0" @@ -1781,7 +2577,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "combined-stream": { @@ -1796,7 +2592,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "concat-stream": { @@ -1826,9 +2622,9 @@ } }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "cross-spawn": { @@ -1856,22 +2652,45 @@ "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", "dev": true }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true }, "duplexify": { @@ -1889,7 +2708,7 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", @@ -1902,6 +2721,16 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -1917,10 +2746,16 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "execa": { @@ -1949,7 +2784,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fast-deep-equal": { @@ -1989,7 +2824,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "form-data": { @@ -2006,7 +2841,7 @@ "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -2020,12 +2855,24 @@ "dev": true, "requires": { "minipass": "^2.6.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + } } }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -2037,7 +2884,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "get-stream": { @@ -2052,36 +2899,36 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true }, "har-validator": { @@ -2097,13 +2944,30 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -2111,22 +2975,63 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -2139,10 +3044,22 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, "is-plain-obj": { @@ -2152,45 +3069,45 @@ "dev": true }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -2202,18 +3119,18 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -2246,6 +3163,126 @@ "yallist": "^3.0.2" } }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "dependencies": { + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2253,18 +3290,18 @@ "dev": true }, "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.46.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -2274,37 +3311,101 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" } }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "requires": { - "minipass": "^2.9.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "mississippi": { @@ -2326,18 +3427,18 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", "dev": true, "requires": { "aproba": "^1.1.1", @@ -2354,6 +3455,12 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, "npm-run-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", @@ -2372,7 +3479,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -2393,6 +3500,15 @@ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", "dev": true }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", @@ -2407,7 +3523,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -2419,7 +3535,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "process-nextick-args": { @@ -2431,13 +3547,23 @@ "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "pump": { @@ -2480,18 +3606,18 @@ "dev": true }, "purescript": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.14.0.tgz", - "integrity": "sha512-iTA1k8mwxHqrJp/K296g6omVfve5RCjnB5D6Up93PVtZdP66mCIqlOYC4hrLBHg2hgkk27xePDt5NUXKvH4ApQ==", + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.15.4.tgz", + "integrity": "sha512-6Ge3IMcIxKkOUXg91cBgvjbqu5SxdfwbvWi1P4g+E2maxfvDv+roWAmLyOteTsxQE4SEa/wWoCZvnZ/AEjvrMw==", "dev": true, "requires": { - "purescript-installer": "^0.2.0" + "purescript-installer": "^0.2.6" } }, "purescript-installer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.2.5.tgz", - "integrity": "sha512-fQAWWP5a7scuchXecjpU4r4KEgSPuS6bBnaP01k9f71qqD28HaJ2m4PXHFkhkR4oATAxTPIGCtmTwtVoiBOHog==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.2.6.tgz", + "integrity": "sha512-22un7k/S0hETctsMMVlCEuXlvy1VAgN/uL49B65dQVPUVd17fh9CbB5kd9xoqiADUyw3t5HgL68lCwmDwrCCVw==", "dev": true, "requires": { "arch": "^2.1.1", @@ -2511,6 +3637,7 @@ "pump": "^3.0.0", "request": "^2.88.0", "rimraf": "^2.6.3", + "semver": "^7.3.7", "tar": "^4.4.6", "which": "^1.3.1", "zen-observable": "^0.8.14" @@ -2529,9 +3656,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "readable-stream": { @@ -2580,7 +3707,7 @@ "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "dev": true, "requires": { "onetime": "^2.0.0", @@ -2596,7 +3723,7 @@ "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -2604,6 +3731,12 @@ } } }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -2616,7 +3749,7 @@ "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", "dev": true, "requires": { "aproba": "^1.1.1" @@ -2634,6 +3767,32 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2650,25 +3809,95 @@ "dev": true }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, + "socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, "spago": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/spago/-/spago-0.19.1.tgz", - "integrity": "sha512-OD/yopJZ9Ub+XsFtayDeLAWLT4kLdMxosJEyyp8W5OkyJVVSbCrvYacsO7iq3lSuHJmmNny/TEZdyb7uSyupng==", + "version": "0.20.9", + "resolved": "https://registry.npmjs.org/spago/-/spago-0.20.9.tgz", + "integrity": "sha512-r5TUxnYn9HawlQyMswlhIk24BGFSN2KGbqgZFZrn47GjTpMscU14xkt9CqTWgoSQYsoZieG+3dUtOxUQ7GYD7w==", "dev": true, "requires": { - "request": "^2.88.0", - "tar": "^4.4.8" + "make-fetch-happen": "^9.1.0", + "tar": "^6.1.11" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -2683,9 +3912,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -2752,18 +3981,45 @@ } }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "through2": { @@ -2789,7 +4045,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -2798,13 +4054,13 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "unique-filename": { @@ -2837,7 +4093,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "uuid": { @@ -2849,12 +4105,20 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + } } }, "which": { @@ -2880,7 +4144,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "xtend": { @@ -2890,9 +4154,9 @@ "dev": true }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { diff --git a/package.json b/package.json index af8dd38..9dcdc3e 100644 --- a/package.json +++ b/package.json @@ -4,14 +4,15 @@ "description": "", "main": "index.js", "scripts": { - "build": "spago build" + "build": "spago build", + "postinstall": "spago install" }, "author": "", "license": "ISC", "devDependencies": { - "purescript": "^0.14.0", + "purescript": "^0.15.4", "purescript-psa": "^0.8.2", "purty": "^7.0.0", - "spago": "^0.19.1" + "spago": "^0.20.9" } } diff --git a/packages.dhall b/packages.dhall index a4d51b6..57d87fd 100644 --- a/packages.dhall +++ b/packages.dhall @@ -4,13 +4,6 @@ Welcome to your new Dhall package-set! Below are instructions for how to edit this file for most use cases, so that you don't need to know Dhall to use it. -## Warning: Don't Move This Top-Level Comment! - -Due to how `dhall format` currently works, this comment's -instructions cannot appear near corresponding sections below -because `dhall format` will delete the comment. However, -it will not delete a top-level comment like this one. - ## Use Cases Most will want to do one or both of these options: @@ -31,28 +24,25 @@ Purpose: the package set's repo Syntax: -Replace the overrides' "{=}" (an empty record) with the following idea -The "//" or "⫽" means "merge these two records and - when they have the same value, use the one on the right:" +where `entityName` is one of the following: +- dependencies +- repo +- version ------------------------------- -let overrides = - { packageName = - upstream.packageName // { updateEntity1 = "new value", updateEntity2 = "new value" } - , packageName = - upstream.packageName // { version = "v4.0.0" } - , packageName = - upstream.packageName // { repo = "https://www.example.com/path/to/new/repo.git" } - } +let upstream = -- +in upstream + with packageName.entityName = "new value" ------------------------------- Example: ------------------------------- -let overrides = - { halogen = - upstream.halogen // { version = "master" } - , halogen-vdom = - upstream.halogen-vdom // { version = "v4.0.0" } - } +let upstream = -- +in upstream + with halogen.version = "master" + with halogen.repo = "https://example.com/path/to/git/repo.git" + + with halogen-vdom.version = "v4.0.0" + with halogen-vdom.dependencies = [ "extra-dependency" ] # halogen-vdom.dependencies ------------------------------- ### Additions @@ -61,37 +51,30 @@ Purpose: - Add packages that aren't already included in the default package set Syntax: -Replace the additions' "{=}" (an empty record) with the following idea: +where `` is: +- a tag (i.e. "v4.0.0") +- a branch (i.e. "master") +- commit hash (i.e. "701f3e44aafb1a6459281714858fadf2c4c2a977") ------------------------------- -let additions = - { package-name = - { dependencies = - [ "dependency1" - , "dependency2" - ] - , repo = - "https://example.com/path/to/git/repo.git" - , version = - "tag ('v4.0.0') or branch ('master')" - } - , package-name = - { dependencies = - [ "dependency1" - , "dependency2" - ] - , repo = - "https://example.com/path/to/git/repo.git" - , version = - "tag ('v4.0.0') or branch ('master')" - } - , etc. - } +let upstream = -- +in upstream + with new-package-name = + { dependencies = + [ "dependency1" + , "dependency2" + ] + , repo = + "https://example.com/path/to/git/repo.git" + , version = + "" + } ------------------------------- Example: ------------------------------- -let additions = - { benchotron = +let upstream = -- +in upstream + with benchotron = { dependencies = [ "arrays" , "exists" @@ -113,14 +96,10 @@ let additions = , version = "v7.0.0" } - } ------------------------------- -} let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.14.0-20210311/packages.dhall sha256:3da8be2b7b4a0e7de6186591167b363023695accffb98a8639e9e7d06e2070d6 - -let overrides = {=} - -let additions = {=} + https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20220718/packages.dhall + sha256:a6d66723b6109f1e3eaf6575910f1c51aa545965ce313024ba329360e2f009ac -in upstream // overrides // additions +in upstream diff --git a/spago.dhall b/spago.dhall index eae900b..c6f27a1 100644 --- a/spago.dhall +++ b/spago.dhall @@ -1,16 +1,29 @@ {- Welcome to a Spago project! You can edit this file as you like. + +Need help? See the following resources: +- Spago documentation: https://github.com/purescript/spago +- Dhall language tour: https://docs.dhall-lang.org/tutorials/Language-Tour.html + +When creating a new Spago project, you can use +`spago init --no-comments` or `spago init -C` +to generate this file without the comments in this block. -} { name = "web-router" , dependencies = [ "aff" , "effect" + , "foldable-traversable" + , "foreign" , "freet" , "indexed-monad" + , "maybe" , "prelude" , "profunctor-lenses" + , "refs" , "routing" + , "type-equality" ] , packages = ./packages.dhall , sources = [ "src/**/*.purs", "test/**/*.purs" ] diff --git a/src/Web/Router.purs b/src/Web/Router.purs index 1b0e8b9..b4bf229 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -1,94 +1,54 @@ -module Web.Router - ( module Types - , makeRouter - , override - , redirect - , continue - , _RouterState - , _Transitioning - , _Resolved - , isTransitioning - , isResolved - ) where +module Web.Router (module Exports, mkRouter) where import Prelude -import Control.Monad.Free.Trans (liftFreeT, runFreeT) -import Data.Lens (Lens', Prism', is, lens, prism') import Data.Maybe (Maybe(..)) import Effect (Effect) -import Effect.Aff (error, killFiber, launchAff, launchAff_) +import Effect.Aff (Aff, launchAff_) import Effect.Class (liftEffect) import Effect.Ref as Ref -import Web.Router.Types (Command(..), Driver(..), RouterState(..), Resolved, Router, Transition(..), Transitioning) -import Web.Router.Types (Driver, Driver', RouterState(..), Resolved, Router, Transition, TransitionState, Transitioning) as Types +import Web.Router.Internal.Control (Command(..), Resolved, RouterM, Routing, runRouter) +import Web.Router.Internal.Control (Resolved, RouterM, Routing) as Exports +import Web.Router.Internal.Types (Driver(..), Router, RouterEvent(..)) +import Web.Router.Internal.Types (Driver, Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Exports -makeRouter :: +mkRouter :: forall i o. - (Maybe i -> i -> Transition i o Transitioning Resolved Unit) -> - (RouterState i -> Effect Unit) -> + (Maybe i -> i -> RouterM i o Routing Resolved Unit) -> + (RouterEvent i -> Effect Unit) -> Driver i o -> Effect (Router o) -makeRouter handleTransition handleState (Driver driver) = do - fiberRef <- Ref.new (pure unit) - previousRouteRef <- Ref.new Nothing +mkRouter onRouteStart onEvent (Driver driver) = do + lastEventRef <- Ref.new Nothing let - runRouter route = do - oldFiber <- Ref.read fiberRef - launchAff_ (killFiber (error "Transition cancelled") oldFiber) - previousRoute <- Ref.read previousRouteRef - handleState (Transitioning previousRoute route) - let - finalise r = - liftEffect do - Ref.write (Just r) previousRouteRef - handleState $ Resolved previousRoute r - fiber <- - launchAff case handleTransition previousRoute route of - Transition router -> - router - # runFreeT \cmd -> do - case cmd of - Redirect route' -> liftEffect do driver.redirect route' - Override route' -> finalise route' - Continue -> finalise route - mempty - Ref.write fiber fiberRef - pure { initialize: driver.initialize runRouter, navigate: driver.navigate, redirect: driver.redirect } - -override :: forall i o. i -> Transition i o Transitioning Resolved Unit -override route = Transition (liftFreeT (Override route)) - -redirect :: forall i o. o -> Transition i o Transitioning Resolved Unit -redirect route = Transition (liftFreeT (Redirect route)) - -continue :: forall i o. Transition i o Transitioning Resolved Unit -continue = Transition (liftFreeT Continue) - -_RouterState :: forall route. Lens' (RouterState route) route -_RouterState = lens getter setter - where - getter = case _ of - Transitioning _ route -> route - Resolved _ route -> route - - setter = case _ of - Transitioning route _ -> Transitioning route - Resolved route _ -> Resolved route - -_Transitioning :: forall route. Prism' (RouterState route) route -_Transitioning = - prism' (Transitioning Nothing) case _ of - Transitioning _ route -> Just route - _ -> Nothing - -_Resolved :: forall route. Prism' (RouterState route) route -_Resolved = - prism' (Resolved Nothing) case _ of - Resolved _ route -> Just route - _ -> Nothing - -isTransitioning :: forall route. RouterState route -> Boolean -isTransitioning = is _Transitioning - -isResolved :: forall route. RouterState route -> Boolean -isResolved = is _Resolved + readPreviousRoute :: Effect (Maybe i) + readPreviousRoute = + Ref.read lastEventRef + <#> case _ of + Just (Resolved _ route) -> Just route + Just (Routing (Just route) _) -> Just route + _ -> Nothing + + handleEvent :: RouterEvent i -> Effect Unit + handleEvent event = do + Ref.write (Just event) lastEventRef + onEvent event + + onCommand :: forall a. i -> Command i o a -> Aff Unit + onCommand newRoute cmd = + liftEffect do + previousRoute <- readPreviousRoute + case cmd of + Continue -> handleEvent (Resolved previousRoute newRoute) + Override route -> handleEvent (Resolved previousRoute route) + Redirect route -> driver.redirect route + + runRouter' :: i -> Effect Unit + runRouter' newRoute = do + previousRoute <- readPreviousRoute + handleEvent (Routing previousRoute newRoute) + launchAff_ (runRouter (onCommand newRoute) (onRouteStart previousRoute newRoute)) + pure + { initialize: driver.initialize runRouter' + , navigate: driver.navigate + , redirect: driver.redirect + } diff --git a/src/Web/Router/Driver/Hash.purs b/src/Web/Router/Driver/Hash.purs index 98210f3..7ab2422 100644 --- a/src/Web/Router/Driver/Hash.purs +++ b/src/Web/Router/Driver/Hash.purs @@ -3,10 +3,10 @@ module Web.Router.Driver.Hash where import Prelude import Data.Foldable (class Foldable) import Routing.Hash as Hash -import Web.Router.Types (Driver(..)) +import Web.Router.Internal.Types (Driver(..)) -makeDriver :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Driver i o -makeDriver parser printer = +mkDriver :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Driver i o +mkDriver parser printer = Driver { initialize: Hash.matchesWith parser <<< const , navigate: Hash.setHash <<< printer diff --git a/src/Web/Router/Driver/PushState.purs b/src/Web/Router/Driver/PushState.purs index 4049ae0..b4220c6 100644 --- a/src/Web/Router/Driver/PushState.purs +++ b/src/Web/Router/Driver/PushState.purs @@ -6,13 +6,13 @@ import Effect (Effect) import Foreign (unsafeToForeign) import Routing.PushState (PushStateInterface) import Routing.PushState as PushState -import Web.Router.Types (Driver(..)) +import Web.Router.Internal.Types (Driver(..)) -makeDriver :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Effect (Driver i o) -makeDriver parser printer = makeDriver_ parser printer <$> PushState.makeInterface +mkDriver :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Effect (Driver i o) +mkDriver parser printer = mkDriver_ parser printer <$> PushState.makeInterface -makeDriver_ :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> PushStateInterface -> Driver i o -makeDriver_ parser printer interface = +mkDriver_ :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> PushStateInterface -> Driver i o +mkDriver_ parser printer interface = Driver { initialize: \k -> PushState.matchesWith parser (\_ -> k) interface , navigate: interface.pushState (unsafeToForeign {}) <<< printer diff --git a/src/Web/Router/Internal/Control.purs b/src/Web/Router/Internal/Control.purs new file mode 100644 index 0000000..abb2ae4 --- /dev/null +++ b/src/Web/Router/Internal/Control.purs @@ -0,0 +1,87 @@ +module Web.Router.Internal.Control + ( Command(..) + , Resolved + , RouterM + , RouterIndex + , Routing + , continue + , override + , redirect + , runRouter + ) + where + +import Prelude + +import Control.Applicative.Indexed (class IxApplicative, iapply, imap, ipure) +import Control.Apply.Indexed (class IxApply) +import Control.Bind.Indexed (class IxBind, ibind) +import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) +import Control.Monad.Indexed (class IxMonad, iap) +import Data.Functor.Indexed (class IxFunctor) +import Effect.Aff (Aff) +import Effect.Aff.Class (class MonadAff, liftAff) +import Effect.Class (class MonadEffect, liftEffect) +import Type.Equality (class TypeEquals) + +data Command :: Type -> Type -> Type -> Type +data Command i o a + = Continue + | Override i + | Redirect o + +derive instance Functor (Command i o) + +data RouterIndex +foreign import data Routing :: RouterIndex +foreign import data Resolved :: RouterIndex + +newtype RouterM :: Type -> Type -> RouterIndex -> RouterIndex -> Type -> Type +newtype RouterM i o x y a + = RouterM (FreeT (Command i o) Aff a) + +instance IxFunctor (RouterM i o) where + imap f (RouterM r) = RouterM (map f r) + +instance IxApply (RouterM i o) where + iapply = iap + +instance IxApplicative (RouterM i o) where + ipure a = RouterM (pure a) + +instance IxBind (RouterM i o) where + ibind (RouterM r) f = RouterM (r >>= \a -> case f a of RouterM r' -> r') + +instance IxMonad (RouterM i o) + +instance (TypeEquals Routing x) => Functor (RouterM i o x x) where + map = imap + +instance (TypeEquals Routing x) => Apply (RouterM i o x x) where + apply = iapply + +instance (TypeEquals Routing x) => Applicative (RouterM i o x x) where + pure = ipure + +instance (TypeEquals Routing x) => Bind (RouterM i o x x) where + bind = ibind + +instance (TypeEquals Routing x) => Monad (RouterM i o x x) + +instance (TypeEquals Routing x) => MonadEffect (RouterM i o x x) where + liftEffect eff = RouterM (liftEffect eff) + +instance (TypeEquals Routing x) => MonadAff (RouterM i o x x) where + liftAff aff = RouterM (liftAff aff) + +runRouter :: forall i o. (forall a. Command i o a -> Aff Unit) -> RouterM i o Routing Resolved Unit -> Aff Unit +runRouter handleCmd (RouterM router) = runFreeT (\cmd -> handleCmd cmd *> mempty) router + +continue :: forall i o. RouterM i o Routing Resolved Unit +continue = RouterM (liftFreeT Continue) + +override :: forall i o. i -> RouterM i o Routing Resolved Unit +override route = RouterM (liftFreeT (Override route)) + +redirect :: forall i o. o -> RouterM i o Routing Resolved Unit +redirect route = RouterM (liftFreeT (Redirect route)) diff --git a/src/Web/Router/Internal/Types.purs b/src/Web/Router/Internal/Types.purs new file mode 100644 index 0000000..458ec00 --- /dev/null +++ b/src/Web/Router/Internal/Types.purs @@ -0,0 +1,68 @@ +module Web.Router.Internal.Types + ( Driver' + , Driver(..) + , Router + , RouterEvent(..) + , _Resolved + , _RouterEvent + , _Routing + , isResolved + , isRouting + ) where + +import Prelude +import Data.Lens (Lens', Prism', is, lens, prism') +import Data.Maybe (Maybe(..)) +import Effect (Effect) + +type Router route + = { initialize :: Effect (Effect Unit) + , navigate :: route -> Effect Unit + , redirect :: route -> Effect Unit + } + +newtype Driver :: Type -> Type -> Type +newtype Driver i o + = Driver + { initialize :: (i -> Effect Unit) -> Effect (Effect Unit) + , navigate :: o -> Effect Unit + , redirect :: o -> Effect Unit + } + +type Driver' route + = Driver route route + +data RouterEvent route + = Routing (Maybe route) route + | Resolved (Maybe route) route + +derive instance eqRoute :: Eq route => Eq (RouterEvent route) + +_RouterEvent :: forall route. Lens' (RouterEvent route) route +_RouterEvent = lens getter setter + where + getter = case _ of + Routing _ route -> route + Resolved _ route -> route + + setter = case _ of + Routing route _ -> Routing route + Resolved route _ -> Resolved route + +_Routing :: forall route. Prism' (RouterEvent route) route +_Routing = + prism' (Routing Nothing) case _ of + Routing _ route -> Just route + _ -> Nothing + +_Resolved :: forall route. Prism' (RouterEvent route) route +_Resolved = + prism' (Resolved Nothing) case _ of + Resolved _ route -> Just route + _ -> Nothing + +isRouting :: forall route. RouterEvent route -> Boolean +isRouting = is _Routing + +isResolved :: forall route. RouterEvent route -> Boolean +isResolved = is _Resolved diff --git a/src/Web/Router/Types.purs b/src/Web/Router/Types.purs deleted file mode 100644 index 2ca5bcd..0000000 --- a/src/Web/Router/Types.purs +++ /dev/null @@ -1,89 +0,0 @@ -module Web.Router.Types where - -import Prelude -import Control.Monad.Free.Trans (FreeT) -import Control.Monad.Indexed (class IxApplicative, class IxApply, class IxBind, class IxFunctor, class IxMonad, iap) -import Data.Maybe (Maybe) -import Data.Newtype (class Newtype) -import Effect (Effect) -import Effect.Aff (Aff) -import Effect.Aff.Class (class MonadAff, liftAff) -import Effect.Class (class MonadEffect, liftEffect) -import Type.Equality (class TypeEquals) - -type Router route - = { initialize :: Effect (Effect Unit) - , navigate :: route -> Effect Unit - , redirect :: route -> Effect Unit - } - -newtype Driver :: Type -> Type -> Type -newtype Driver i o - = Driver - { initialize :: (i -> Effect Unit) -> Effect (Effect Unit) - , navigate :: o -> Effect Unit - , redirect :: o -> Effect Unit - } - -type Driver' route - = Driver route route - -data RouterState route - = Transitioning (Maybe route) route - | Resolved (Maybe route) route - -derive instance eqRoute :: Eq route => Eq (RouterState route) - -data Command :: Type -> Type -> Type -> Type -data Command i o a - = Override i - | Redirect o - | Continue - -derive instance functorCommand :: Functor (Command i o) - -data TransitionState - -foreign import data Transitioning :: TransitionState - -foreign import data Resolved :: TransitionState - -newtype Transition :: Type -> Type -> TransitionState -> TransitionState -> Type -> Type -newtype Transition i o x y a - = Transition (FreeT (Command i o) Aff a) - -derive instance newtypeTransition :: Newtype (Transition i o x y a) _ - -instance ixFunctorTransition :: IxFunctor (Transition i o) where - imap f (Transition router) = Transition (map f router) - -instance ixApplyTransition :: IxApply (Transition i o) where - iapply = iap - -instance ixApplicativeTransition :: IxApplicative (Transition i o) where - ipure a = Transition (pure a) - -instance ixBindTransition :: IxBind (Transition i o) where - ibind (Transition router) f = Transition (router >>= \a -> case f a of Transition next -> next) - -instance ixMonadTransition :: IxMonad (Transition i o) - -instance functorTransition :: (TypeEquals Transitioning x, TypeEquals x y) => Functor (Transition i o x y) where - map f (Transition router) = Transition (map f router) - -instance applyTransition :: (TypeEquals Transitioning x, TypeEquals x y) => Apply (Transition i o x y) where - apply = ap - -instance applicativeTransition :: (TypeEquals Transitioning x, TypeEquals x y) => Applicative (Transition i o x y) where - pure a = Transition (pure a) - -instance bindTransition :: (TypeEquals Transitioning x, TypeEquals x y) => Bind (Transition i o x y) where - bind (Transition router) f = Transition (router >>= \a -> case f a of Transition next -> next) - -instance monadTransition :: (TypeEquals Transitioning x, TypeEquals x y) => Monad (Transition i o x y) - -instance monadEffectTransition :: (TypeEquals Transitioning x, TypeEquals x y) => MonadEffect (Transition i o x y) where - liftEffect eff = Transition (liftEffect eff) - -instance monadAffTransition :: (TypeEquals Transitioning x, TypeEquals x y) => MonadAff (Transition i o x y) where - liftAff aff = Transition (liftAff aff) From f8454fc601797cb6a556f7cdc6598aaf97261162 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 00:38:24 +0900 Subject: [PATCH 02/32] Update CI --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7f48a9..b42326f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,12 +8,12 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v3 - uses: thomashoneyman/setup-purescript@main with: - purescript: "0.14.0" - spago: "0.19.1" + purescript: "0.15.4" + spago: "0.20.9" - name: Cache PureScript dependencies uses: actions/cache@v2 From 3d32e6def3a495077670cf241718a497fe0db96e Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 00:39:47 +0900 Subject: [PATCH 03/32] Split up reexports --- src/Web/Router.purs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Web/Router.purs b/src/Web/Router.purs index b4bf229..945c1b6 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -1,4 +1,4 @@ -module Web.Router (module Exports, mkRouter) where +module Web.Router (module Control, module Types, mkRouter) where import Prelude import Data.Maybe (Maybe(..)) @@ -7,9 +7,9 @@ import Effect.Aff (Aff, launchAff_) import Effect.Class (liftEffect) import Effect.Ref as Ref import Web.Router.Internal.Control (Command(..), Resolved, RouterM, Routing, runRouter) -import Web.Router.Internal.Control (Resolved, RouterM, Routing) as Exports +import Web.Router.Internal.Control (Resolved, RouterM, Routing) as Control import Web.Router.Internal.Types (Driver(..), Router, RouterEvent(..)) -import Web.Router.Internal.Types (Driver, Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Exports +import Web.Router.Internal.Types (Driver, Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types mkRouter :: forall i o. From 005f1175cc286abb52acbf14d1e2d61f0d349dfb Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 00:45:32 +0900 Subject: [PATCH 04/32] Expose routing DSL commands --- src/Web/Router.purs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Web/Router.purs b/src/Web/Router.purs index 945c1b6..4344e2b 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -7,7 +7,7 @@ import Effect.Aff (Aff, launchAff_) import Effect.Class (liftEffect) import Effect.Ref as Ref import Web.Router.Internal.Control (Command(..), Resolved, RouterM, Routing, runRouter) -import Web.Router.Internal.Control (Resolved, RouterM, Routing) as Control +import Web.Router.Internal.Control (Resolved, RouterIndex, RouterM, Routing, continue, override, redirect) as Control import Web.Router.Internal.Types (Driver(..), Router, RouterEvent(..)) import Web.Router.Internal.Types (Driver, Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types From a516321ea241a640abee40b6228986ee3ec8295b Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 00:53:32 +0900 Subject: [PATCH 05/32] Remove unnecessary braces --- src/Web/Router/Internal/Control.purs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Web/Router/Internal/Control.purs b/src/Web/Router/Internal/Control.purs index abb2ae4..60aac14 100644 --- a/src/Web/Router/Internal/Control.purs +++ b/src/Web/Router/Internal/Control.purs @@ -54,24 +54,24 @@ instance IxBind (RouterM i o) where instance IxMonad (RouterM i o) -instance (TypeEquals Routing x) => Functor (RouterM i o x x) where +instance TypeEquals Routing x => Functor (RouterM i o x x) where map = imap -instance (TypeEquals Routing x) => Apply (RouterM i o x x) where +instance TypeEquals Routing x => Apply (RouterM i o x x) where apply = iapply -instance (TypeEquals Routing x) => Applicative (RouterM i o x x) where +instance TypeEquals Routing x => Applicative (RouterM i o x x) where pure = ipure -instance (TypeEquals Routing x) => Bind (RouterM i o x x) where +instance TypeEquals Routing x => Bind (RouterM i o x x) where bind = ibind -instance (TypeEquals Routing x) => Monad (RouterM i o x x) +instance TypeEquals Routing x => Monad (RouterM i o x x) -instance (TypeEquals Routing x) => MonadEffect (RouterM i o x x) where +instance TypeEquals Routing x => MonadEffect (RouterM i o x x) where liftEffect eff = RouterM (liftEffect eff) -instance (TypeEquals Routing x) => MonadAff (RouterM i o x x) where +instance TypeEquals Routing x => MonadAff (RouterM i o x x) where liftAff aff = RouterM (liftAff aff) runRouter :: forall i o. (forall a. Command i o a -> Aff Unit) -> RouterM i o Routing Resolved Unit -> Aff Unit From be98328b9161d3573735b95731e691a43e43099d Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 00:55:56 +0900 Subject: [PATCH 06/32] Update readme --- README.md | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index a5e2e73..ebd86b5 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,9 @@ # purescript-web-router -A basic pushstate router for React with support for asynchronous routing logic, built using [react-basic-hooks](https://github.com/spicydonuts/purescript-react-basic-hooks). I recommend [routing-duplex](https://github.com/natefaubion/purescript-routing-duplex) for easy parsing and printing. +A basic pushstate router for React with support for asynchronous routing logic. I recommend [routing-duplex](https://github.com/natefaubion/purescript-routing-duplex) for easy parsing and printing. For a basic example see [here](https://github.com/robertdp/purescript-web-router-example/tree/master/src). ## How to use with Spago -Add `web-router` to your `packages.dhall`: - -```dhall -let additions = - { web-router = - { dependencies = - [ "aff" - , "effect" - , "freet" - , "indexed-monad" - , "prelude" - , "profunctor-lenses" - , "routing" - ] - , repo = "https://github.com/robertdp/purescript-web-router.git" - , version = "v0.3.0" - } - } -``` - -And then install with -`$ spago install web-router` +Install with `$ spago install web-router` (coming soon) From aab911c3912dde868e88983c90bd0ef766d16180 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 01:28:39 +0900 Subject: [PATCH 07/32] Export Driver' alias --- src/Web/Router.purs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Web/Router.purs b/src/Web/Router.purs index 4344e2b..6e0344e 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -9,7 +9,7 @@ import Effect.Ref as Ref import Web.Router.Internal.Control (Command(..), Resolved, RouterM, Routing, runRouter) import Web.Router.Internal.Control (Resolved, RouterIndex, RouterM, Routing, continue, override, redirect) as Control import Web.Router.Internal.Types (Driver(..), Router, RouterEvent(..)) -import Web.Router.Internal.Types (Driver, Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types +import Web.Router.Internal.Types (Driver, Driver', Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types mkRouter :: forall i o. From 8a1f9a61a32a4964006fb56a9ddf239db0a9a174 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 01:35:24 +0900 Subject: [PATCH 08/32] Loosen internal exports --- src/Web/Router.purs | 6 +++++- src/Web/Router/Internal/Control.purs | 13 +------------ src/Web/Router/Internal/Types.purs | 12 +----------- 3 files changed, 7 insertions(+), 24 deletions(-) diff --git a/src/Web/Router.purs b/src/Web/Router.purs index 6e0344e..c19e47b 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -1,4 +1,8 @@ -module Web.Router (module Control, module Types, mkRouter) where +module Web.Router + ( module Control + , module Types + , mkRouter + ) where import Prelude import Data.Maybe (Maybe(..)) diff --git a/src/Web/Router/Internal/Control.purs b/src/Web/Router/Internal/Control.purs index 60aac14..e4b124c 100644 --- a/src/Web/Router/Internal/Control.purs +++ b/src/Web/Router/Internal/Control.purs @@ -1,15 +1,4 @@ -module Web.Router.Internal.Control - ( Command(..) - , Resolved - , RouterM - , RouterIndex - , Routing - , continue - , override - , redirect - , runRouter - ) - where +module Web.Router.Internal.Control where import Prelude diff --git a/src/Web/Router/Internal/Types.purs b/src/Web/Router/Internal/Types.purs index 458ec00..34cc46c 100644 --- a/src/Web/Router/Internal/Types.purs +++ b/src/Web/Router/Internal/Types.purs @@ -1,14 +1,4 @@ -module Web.Router.Internal.Types - ( Driver' - , Driver(..) - , Router - , RouterEvent(..) - , _Resolved - , _RouterEvent - , _Routing - , isResolved - , isRouting - ) where +module Web.Router.Internal.Types where import Prelude import Data.Lens (Lens', Prism', is, lens, prism') From 6d6af59eddbbf0f688fcfbcb5584447955bba854 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 02:15:36 +0900 Subject: [PATCH 09/32] More explicit naming --- src/Web/Router.purs | 4 ++-- src/Web/Router/Internal/Control.purs | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Web/Router.purs b/src/Web/Router.purs index c19e47b..55e5518 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -10,7 +10,7 @@ import Effect (Effect) import Effect.Aff (Aff, launchAff_) import Effect.Class (liftEffect) import Effect.Ref as Ref -import Web.Router.Internal.Control (Command(..), Resolved, RouterM, Routing, runRouter) +import Web.Router.Internal.Control (RouterCommand(..), Resolved, RouterM, Routing, runRouter) import Web.Router.Internal.Control (Resolved, RouterIndex, RouterM, Routing, continue, override, redirect) as Control import Web.Router.Internal.Types (Driver(..), Router, RouterEvent(..)) import Web.Router.Internal.Types (Driver, Driver', Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types @@ -37,7 +37,7 @@ mkRouter onRouteStart onEvent (Driver driver) = do Ref.write (Just event) lastEventRef onEvent event - onCommand :: forall a. i -> Command i o a -> Aff Unit + onCommand :: forall a. i -> RouterCommand i o a -> Aff Unit onCommand newRoute cmd = liftEffect do previousRoute <- readPreviousRoute diff --git a/src/Web/Router/Internal/Control.purs b/src/Web/Router/Internal/Control.purs index e4b124c..98c5e8a 100644 --- a/src/Web/Router/Internal/Control.purs +++ b/src/Web/Router/Internal/Control.purs @@ -13,13 +13,13 @@ import Effect.Aff.Class (class MonadAff, liftAff) import Effect.Class (class MonadEffect, liftEffect) import Type.Equality (class TypeEquals) -data Command :: Type -> Type -> Type -> Type -data Command i o a +data RouterCommand :: Type -> Type -> Type -> Type +data RouterCommand i o a = Continue | Override i | Redirect o -derive instance Functor (Command i o) +derive instance Functor (RouterCommand i o) data RouterIndex foreign import data Routing :: RouterIndex @@ -27,7 +27,7 @@ foreign import data Resolved :: RouterIndex newtype RouterM :: Type -> Type -> RouterIndex -> RouterIndex -> Type -> Type newtype RouterM i o x y a - = RouterM (FreeT (Command i o) Aff a) + = RouterM (FreeT (RouterCommand i o) Aff a) instance IxFunctor (RouterM i o) where imap f (RouterM r) = RouterM (map f r) @@ -63,7 +63,7 @@ instance TypeEquals Routing x => MonadEffect (RouterM i o x x) where instance TypeEquals Routing x => MonadAff (RouterM i o x x) where liftAff aff = RouterM (liftAff aff) -runRouter :: forall i o. (forall a. Command i o a -> Aff Unit) -> RouterM i o Routing Resolved Unit -> Aff Unit +runRouter :: forall i o. (forall a. RouterCommand i o a -> Aff Unit) -> RouterM i o Routing Resolved Unit -> Aff Unit runRouter handleCmd (RouterM router) = runFreeT (\cmd -> handleCmd cmd *> mempty) router continue :: forall i o. RouterM i o Routing Resolved Unit From aa7ee222291433dc81e5e45a68dedb3566022980 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 08:57:42 +0900 Subject: [PATCH 10/32] Change Driver to a type alias --- src/Web/Router.purs | 4 ++-- src/Web/Router/Driver/Hash.purs | 11 +++++------ src/Web/Router/Driver/PushState.purs | 11 +++++------ src/Web/Router/Internal/Types.purs | 12 +++++------- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/Web/Router.purs b/src/Web/Router.purs index 55e5518..4c0a11d 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -12,7 +12,7 @@ import Effect.Class (liftEffect) import Effect.Ref as Ref import Web.Router.Internal.Control (RouterCommand(..), Resolved, RouterM, Routing, runRouter) import Web.Router.Internal.Control (Resolved, RouterIndex, RouterM, Routing, continue, override, redirect) as Control -import Web.Router.Internal.Types (Driver(..), Router, RouterEvent(..)) +import Web.Router.Internal.Types (Driver, Router, RouterEvent(..)) import Web.Router.Internal.Types (Driver, Driver', Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types mkRouter :: @@ -21,7 +21,7 @@ mkRouter :: (RouterEvent i -> Effect Unit) -> Driver i o -> Effect (Router o) -mkRouter onRouteStart onEvent (Driver driver) = do +mkRouter onRouteStart onEvent driver = do lastEventRef <- Ref.new Nothing let readPreviousRoute :: Effect (Maybe i) diff --git a/src/Web/Router/Driver/Hash.purs b/src/Web/Router/Driver/Hash.purs index 7ab2422..31ce732 100644 --- a/src/Web/Router/Driver/Hash.purs +++ b/src/Web/Router/Driver/Hash.purs @@ -3,12 +3,11 @@ module Web.Router.Driver.Hash where import Prelude import Data.Foldable (class Foldable) import Routing.Hash as Hash -import Web.Router.Internal.Types (Driver(..)) +import Web.Router.Internal.Types (Driver) mkDriver :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Driver i o mkDriver parser printer = - Driver - { initialize: Hash.matchesWith parser <<< const - , navigate: Hash.setHash <<< printer - , redirect: Hash.setHash <<< printer - } + { initialize: Hash.matchesWith parser <<< const + , navigate: Hash.setHash <<< printer + , redirect: Hash.setHash <<< printer + } diff --git a/src/Web/Router/Driver/PushState.purs b/src/Web/Router/Driver/PushState.purs index b4220c6..5799a99 100644 --- a/src/Web/Router/Driver/PushState.purs +++ b/src/Web/Router/Driver/PushState.purs @@ -6,15 +6,14 @@ import Effect (Effect) import Foreign (unsafeToForeign) import Routing.PushState (PushStateInterface) import Routing.PushState as PushState -import Web.Router.Internal.Types (Driver(..)) +import Web.Router.Internal.Types (Driver) mkDriver :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Effect (Driver i o) mkDriver parser printer = mkDriver_ parser printer <$> PushState.makeInterface mkDriver_ :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> PushStateInterface -> Driver i o mkDriver_ parser printer interface = - Driver - { initialize: \k -> PushState.matchesWith parser (\_ -> k) interface - , navigate: interface.pushState (unsafeToForeign {}) <<< printer - , redirect: interface.replaceState (unsafeToForeign {}) <<< printer - } + { initialize: \k -> PushState.matchesWith parser (\_ -> k) interface + , navigate: interface.pushState (unsafeToForeign {}) <<< printer + , redirect: interface.replaceState (unsafeToForeign {}) <<< printer + } diff --git a/src/Web/Router/Internal/Types.purs b/src/Web/Router/Internal/Types.purs index 34cc46c..6cc70b7 100644 --- a/src/Web/Router/Internal/Types.purs +++ b/src/Web/Router/Internal/Types.purs @@ -11,13 +11,11 @@ type Router route , redirect :: route -> Effect Unit } -newtype Driver :: Type -> Type -> Type -newtype Driver i o - = Driver - { initialize :: (i -> Effect Unit) -> Effect (Effect Unit) - , navigate :: o -> Effect Unit - , redirect :: o -> Effect Unit - } +type Driver i o + = { initialize :: (i -> Effect Unit) -> Effect (Effect Unit) + , navigate :: o -> Effect Unit + , redirect :: o -> Effect Unit + } type Driver' route = Driver route route From 70b35fb602724abee066366c1c4678187ee615fc Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 09:32:25 +0900 Subject: [PATCH 11/32] Add back fiber tracking and killing --- src/Web/Router.purs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Web/Router.purs b/src/Web/Router.purs index 4c0a11d..39224ba 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -5,15 +5,16 @@ module Web.Router ) where import Prelude +import Data.Foldable (for_) import Data.Maybe (Maybe(..)) import Effect (Effect) -import Effect.Aff (Aff, launchAff_) +import Effect.Aff (Aff, error, killFiber, launchAff, launchAff_) import Effect.Class (liftEffect) import Effect.Ref as Ref -import Web.Router.Internal.Control (RouterCommand(..), Resolved, RouterM, Routing, runRouter) import Web.Router.Internal.Control (Resolved, RouterIndex, RouterM, Routing, continue, override, redirect) as Control -import Web.Router.Internal.Types (Driver, Router, RouterEvent(..)) +import Web.Router.Internal.Control (RouterCommand(..), Resolved, RouterM, Routing, runRouter) import Web.Router.Internal.Types (Driver, Driver', Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types +import Web.Router.Internal.Types (Driver, Router, RouterEvent(..)) mkRouter :: forall i o. @@ -22,6 +23,7 @@ mkRouter :: Driver i o -> Effect (Router o) mkRouter onRouteStart onEvent driver = do + lastFiberRef <- Ref.new Nothing lastEventRef <- Ref.new Nothing let readPreviousRoute :: Effect (Maybe i) @@ -42,15 +44,21 @@ mkRouter onRouteStart onEvent driver = do liftEffect do previousRoute <- readPreviousRoute case cmd of - Continue -> handleEvent (Resolved previousRoute newRoute) - Override route -> handleEvent (Resolved previousRoute route) + Continue -> handleEvent $ Resolved previousRoute newRoute + Override route -> handleEvent $ Resolved previousRoute route Redirect route -> driver.redirect route runRouter' :: i -> Effect Unit runRouter' newRoute = do + lastFiber <- Ref.read lastFiberRef + for_ lastFiber $ killFiber (error "Killing previous routing fiber") >>> launchAff_ previousRoute <- readPreviousRoute - handleEvent (Routing previousRoute newRoute) - launchAff_ (runRouter (onCommand newRoute) (onRouteStart previousRoute newRoute)) + handleEvent $ Routing previousRoute newRoute + newFiber <- + onRouteStart previousRoute newRoute + # runRouter (onCommand newRoute) + # launchAff + Ref.write (Just newFiber) lastFiberRef pure { initialize: driver.initialize runRouter' , navigate: driver.navigate From 77f7ec12c2e18abccf47cc95faad2f7984af0857 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:10:56 +0900 Subject: [PATCH 12/32] Update to purs-tidy --- .vscode/settings.json | 2 +- package-lock.json | 25 ++++++++++--------------- package.json | 2 +- src/Web/Router.purs | 22 +++++++++++----------- src/Web/Router/Internal/Control.purs | 8 ++++---- src/Web/Router/Internal/Types.purs | 25 ++++++++++++------------- 6 files changed, 39 insertions(+), 45 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 53b259f..b29d3f5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,8 +2,8 @@ "purescript.addNpmPath": true, "purescript.addPscPackageSources": true, "purescript.addSpagoSources": true, - "purescript.editorMode": true, "purescript.buildCommand": "spago build -- --json-errors", + "purescript.formatter": "purs-tidy", "[purescript]": { "editor.formatOnSave": true } diff --git a/package-lock.json b/package-lock.json index b879add..d63c486 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "devDependencies": { "purescript": "^0.15.4", "purescript-psa": "^0.8.2", - "purty": "^7.0.0", + "purs-tidy": "^0.9.0", "spago": "^0.20.9" } }, @@ -1657,18 +1657,13 @@ "psa": "index.js" } }, - "node_modules/purty": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/purty/-/purty-7.0.0.tgz", - "integrity": "sha512-gHHghPEjRY39GUJ8KnOMRfPArJILGCXwEhX6BmEdNiLgZuCjLLBLyawGiKFjYMfy8H5Dsk5NbgwIGslrPrernA==", + "node_modules/purs-tidy": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/purs-tidy/-/purs-tidy-0.9.0.tgz", + "integrity": "sha512-7la7Jw5CyuMDXJMliGiK746xevUScDCTJ0eMvN/mV/NAQF2c9Cqa31QNx5O15ae2d7SuFDqEiVALFzHYD601Cg==", "dev": true, - "os": [ - "linux", - "darwin", - "win32" - ], "bin": { - "purty": "bin/purty.js" + "purs-tidy": "bin/index.js" } }, "node_modules/qs": { @@ -3649,10 +3644,10 @@ "integrity": "sha512-4Olf0aQQrNCfcDLXQI3gJgINEQ+3U+4QPLmQ2LHX2L/YOXSwM7fOGIUs/wMm/FQnwERUyQmHKQTJKB4LIjE2fg==", "dev": true }, - "purty": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/purty/-/purty-7.0.0.tgz", - "integrity": "sha512-gHHghPEjRY39GUJ8KnOMRfPArJILGCXwEhX6BmEdNiLgZuCjLLBLyawGiKFjYMfy8H5Dsk5NbgwIGslrPrernA==", + "purs-tidy": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/purs-tidy/-/purs-tidy-0.9.0.tgz", + "integrity": "sha512-7la7Jw5CyuMDXJMliGiK746xevUScDCTJ0eMvN/mV/NAQF2c9Cqa31QNx5O15ae2d7SuFDqEiVALFzHYD601Cg==", "dev": true }, "qs": { diff --git a/package.json b/package.json index 9dcdc3e..81902d1 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "devDependencies": { "purescript": "^0.15.4", "purescript-psa": "^0.8.2", - "purty": "^7.0.0", + "purs-tidy": "^0.9.0", "spago": "^0.20.9" } } diff --git a/src/Web/Router.purs b/src/Web/Router.purs index 39224ba..c8b38d2 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -16,13 +16,13 @@ import Web.Router.Internal.Control (RouterCommand(..), Resolved, RouterM, Routin import Web.Router.Internal.Types (Driver, Driver', Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types import Web.Router.Internal.Types (Driver, Router, RouterEvent(..)) -mkRouter :: - forall i o. - (Maybe i -> i -> RouterM i o Routing Resolved Unit) -> - (RouterEvent i -> Effect Unit) -> - Driver i o -> - Effect (Router o) -mkRouter onRouteStart onEvent driver = do +mkRouter + :: forall i o + . (Maybe i -> i -> RouterM i o Routing Resolved Unit) + -> (RouterEvent i -> Effect Unit) + -> Driver i o + -> Effect (Router o) +mkRouter onNavigation onEvent driver = do lastFiberRef <- Ref.new Nothing lastEventRef <- Ref.new Nothing let @@ -30,9 +30,9 @@ mkRouter onRouteStart onEvent driver = do readPreviousRoute = Ref.read lastEventRef <#> case _ of - Just (Resolved _ route) -> Just route - Just (Routing (Just route) _) -> Just route - _ -> Nothing + Just (Resolved _ route) -> Just route + Just (Routing (Just route) _) -> Just route + _ -> Nothing handleEvent :: RouterEvent i -> Effect Unit handleEvent event = do @@ -55,7 +55,7 @@ mkRouter onRouteStart onEvent driver = do previousRoute <- readPreviousRoute handleEvent $ Routing previousRoute newRoute newFiber <- - onRouteStart previousRoute newRoute + onNavigation previousRoute newRoute # runRouter (onCommand newRoute) # launchAff Ref.write (Just newFiber) lastFiberRef diff --git a/src/Web/Router/Internal/Control.purs b/src/Web/Router/Internal/Control.purs index 98c5e8a..6e020f7 100644 --- a/src/Web/Router/Internal/Control.purs +++ b/src/Web/Router/Internal/Control.purs @@ -13,7 +13,7 @@ import Effect.Aff.Class (class MonadAff, liftAff) import Effect.Class (class MonadEffect, liftEffect) import Type.Equality (class TypeEquals) -data RouterCommand :: Type -> Type -> Type -> Type +data RouterCommand :: Type -> Type -> Type -> Type data RouterCommand i o a = Continue | Override i @@ -22,12 +22,12 @@ data RouterCommand i o a derive instance Functor (RouterCommand i o) data RouterIndex + foreign import data Routing :: RouterIndex foreign import data Resolved :: RouterIndex newtype RouterM :: Type -> Type -> RouterIndex -> RouterIndex -> Type -> Type -newtype RouterM i o x y a - = RouterM (FreeT (RouterCommand i o) Aff a) +newtype RouterM i o x y a = RouterM (FreeT (RouterCommand i o) Aff a) instance IxFunctor (RouterM i o) where imap f (RouterM r) = RouterM (map f r) @@ -47,7 +47,7 @@ instance TypeEquals Routing x => Functor (RouterM i o x x) where map = imap instance TypeEquals Routing x => Apply (RouterM i o x x) where - apply = iapply + apply = iapply instance TypeEquals Routing x => Applicative (RouterM i o x x) where pure = ipure diff --git a/src/Web/Router/Internal/Types.purs b/src/Web/Router/Internal/Types.purs index 6cc70b7..6606074 100644 --- a/src/Web/Router/Internal/Types.purs +++ b/src/Web/Router/Internal/Types.purs @@ -5,26 +5,25 @@ import Data.Lens (Lens', Prism', is, lens, prism') import Data.Maybe (Maybe(..)) import Effect (Effect) -type Router route - = { initialize :: Effect (Effect Unit) - , navigate :: route -> Effect Unit - , redirect :: route -> Effect Unit - } +type Router route = + { initialize :: Effect (Effect Unit) + , navigate :: route -> Effect Unit + , redirect :: route -> Effect Unit + } -type Driver i o - = { initialize :: (i -> Effect Unit) -> Effect (Effect Unit) - , navigate :: o -> Effect Unit - , redirect :: o -> Effect Unit - } +type Driver i o = + { initialize :: (i -> Effect Unit) -> Effect (Effect Unit) + , navigate :: o -> Effect Unit + , redirect :: o -> Effect Unit + } -type Driver' route - = Driver route route +type Driver' route = Driver route route data RouterEvent route = Routing (Maybe route) route | Resolved (Maybe route) route -derive instance eqRoute :: Eq route => Eq (RouterEvent route) +derive instance Eq route => Eq (RouterEvent route) _RouterEvent :: forall route. Lens' (RouterEvent route) route _RouterEvent = lens getter setter From bb5091da22b428c5499d0d8fbc44b9d6ca194b11 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:11:08 +0900 Subject: [PATCH 13/32] Strip commends from Dhall files --- packages.dhall | 100 ------------------------------------------------- spago.dhall | 12 ------ 2 files changed, 112 deletions(-) diff --git a/packages.dhall b/packages.dhall index 57d87fd..30d8b94 100644 --- a/packages.dhall +++ b/packages.dhall @@ -1,103 +1,3 @@ -{- -Welcome to your new Dhall package-set! - -Below are instructions for how to edit this file for most use -cases, so that you don't need to know Dhall to use it. - -## Use Cases - -Most will want to do one or both of these options: -1. Override/Patch a package's dependency -2. Add a package not already in the default package set - -This file will continue to work whether you use one or both options. -Instructions for each option are explained below. - -### Overriding/Patching a package - -Purpose: -- Change a package's dependency to a newer/older release than the - default package set's release -- Use your own modified version of some dependency that may - include new API, changed API, removed API by - using your custom git repo of the library rather than - the package set's repo - -Syntax: -where `entityName` is one of the following: -- dependencies -- repo -- version -------------------------------- -let upstream = -- -in upstream - with packageName.entityName = "new value" -------------------------------- - -Example: -------------------------------- -let upstream = -- -in upstream - with halogen.version = "master" - with halogen.repo = "https://example.com/path/to/git/repo.git" - - with halogen-vdom.version = "v4.0.0" - with halogen-vdom.dependencies = [ "extra-dependency" ] # halogen-vdom.dependencies -------------------------------- - -### Additions - -Purpose: -- Add packages that aren't already included in the default package set - -Syntax: -where `` is: -- a tag (i.e. "v4.0.0") -- a branch (i.e. "master") -- commit hash (i.e. "701f3e44aafb1a6459281714858fadf2c4c2a977") -------------------------------- -let upstream = -- -in upstream - with new-package-name = - { dependencies = - [ "dependency1" - , "dependency2" - ] - , repo = - "https://example.com/path/to/git/repo.git" - , version = - "" - } -------------------------------- - -Example: -------------------------------- -let upstream = -- -in upstream - with benchotron = - { dependencies = - [ "arrays" - , "exists" - , "profunctor" - , "strings" - , "quickcheck" - , "lcg" - , "transformers" - , "foldable-traversable" - , "exceptions" - , "node-fs" - , "node-buffer" - , "node-readline" - , "datetime" - , "now" - ] - , repo = - "https://github.com/hdgarrood/purescript-benchotron.git" - , version = - "v7.0.0" - } -------------------------------- --} let upstream = https://github.com/purescript/package-sets/releases/download/psc-0.15.4-20220718/packages.dhall sha256:a6d66723b6109f1e3eaf6575910f1c51aa545965ce313024ba329360e2f009ac diff --git a/spago.dhall b/spago.dhall index c6f27a1..6df215f 100644 --- a/spago.dhall +++ b/spago.dhall @@ -1,15 +1,3 @@ -{- -Welcome to a Spago project! -You can edit this file as you like. - -Need help? See the following resources: -- Spago documentation: https://github.com/purescript/spago -- Dhall language tour: https://docs.dhall-lang.org/tutorials/Language-Tour.html - -When creating a new Spago project, you can use -`spago init --no-comments` or `spago init -C` -to generate this file without the comments in this block. --} { name = "web-router" , dependencies = [ "aff" From c644c8e210be8f7432bd07bc5e50fe9e0c6cd0e4 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:11:21 +0900 Subject: [PATCH 14/32] Flesh out readme --- README.md | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 121 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ebd86b5..24a67a5 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,127 @@ # purescript-web-router -A basic pushstate router for React with support for asynchronous routing logic. I recommend [routing-duplex](https://github.com/natefaubion/purescript-routing-duplex) for easy parsing and printing. +A basic router for browsers with support for asynchronous routing logic. Bring your own printing and parsing (check out [routing-duplex](https://github.com/natefaubion/purescript-routing-duplex)). For a basic example see [here](https://github.com/robertdp/purescript-web-router-example/tree/master/src). -## How to use with Spago +## How to use -Install with `$ spago install web-router` (coming soon) +### 1. Install with Spago + +`$ spago install web-router` (coming soon) + +### 2. Define your routes + +```purescript +data Route + = Page Page + | NotFound + +data Page + = Home + | ProductList + | ProductView ProductId + | About + | ContactUs + +type ProductId = Int +``` + +### 3. Implement parsing and printing + +This example uses [routing-duplex](https://github.com/natefaubion/purescript-routing-duplex). + +
+Imports +
+import Prelude hiding ((/))
+import Data.Either (Either)
+import Data.Generic.Rep (class Generic)
+import Routing.Duplex (RouteDuplex', default, int, parse, print, root, segment)
+import Routing.Duplex.Generic (noArgs, sum)
+import Routing.Duplex.Generic.Syntax ((/))
+import Routing.Duplex.Parser (RouteError)
+
+
+ +```purescript +derive instance Generic Route _ +derive instance Generic Page _ + +productId :: RouteDuplex' ProductId +productId = int segment + +routes :: RouteDuplex' Route +routes = + default NotFound $ + sum + { "Page": pages + , "NotFound": "404" / noArgs + } + +pages :: RouteDuplex' Page +pages = + root $ + sum + { "Home": noArgs + , "ProductList": "products" / noArgs + , "ProductView": "products" / productId + , "About": "about" / noArgs + , "ContactUs": "about" / noArgs + } + +-- This is route parser we need to pass to the driver. +-- It can produce any route which allows the parser to return a value of `NotFound` instead of failing. +parseRoute :: forall String -> Either RouteError Route +parseRoute = parse routes + +-- This is the route printer we need to pass to the driver. +-- It can only print paths to valid pages, which means a path can't be produced for the `NotFound` route. +-- With this approach routes can be seperated based on whether they should be a navigation target and have a URL. +printRoute :: Page -> String +printRoute = print pages +``` + +### Define how your application reacts to navigation and routing events + +
+Imports +
+import Web.Router as Router
+
+
+ +```purescript +onNavigation :: Maybe Route -> Route -> RouterM Route Page Routing Resolved Unit +onNavigation previousRoute requestedRoute = do + Router.continue -- accept the navigation to the requested route + +onEvent :: RoutingEvent Route -> Effect Unit +onEvent newEvent = + case newEvent of + Router.Routing oldRoute newRoute -> + showNavigationSpinner + Router.Resolved oldRoute newRoute -> + hideNavigationSpinner + setCurrentRoute newRoute +``` + +### Connect up the driver and router + +
+Imports +
+import Web.Router as Router
+import Web.Router.Driver.PushState as PushState
+
+
+ +```purescript +mkRouter :: Effect (Router.Router Route Page) +mkRouter = do + driver <- PushState.mkDriver parseRoute printRoute + router <- Router.mkRouter onNavigation onEvent + pure router +``` + +Both pushstate and hash drivers are included, or a custom driver can be implemented. An example of a custom driver could be one that synchronises some navigation state over sockets, allowing an experience where one users behaviour could be broadcast to multiple users to follow along. From 606c49ffae362a5f9c4da22c7287699b1bc32bee Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:13:16 +0900 Subject: [PATCH 15/32] Add note about symmetry --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 24a67a5..3e644b8 100644 --- a/README.md +++ b/README.md @@ -70,14 +70,15 @@ pages = , "ContactUs": "about" / noArgs } --- This is route parser we need to pass to the driver. --- It can produce any route which allows the parser to return a value of `NotFound` instead of failing. +-- | This is route parser we need to pass to the driver. +-- | It can produce any route which allows the parser to return a value of `NotFound` instead of failing. parseRoute :: forall String -> Either RouteError Route parseRoute = parse routes --- This is the route printer we need to pass to the driver. --- It can only print paths to valid pages, which means a path can't be produced for the `NotFound` route. --- With this approach routes can be seperated based on whether they should be a navigation target and have a URL. +-- | This is the route printer we need to pass to the driver. +-- | It can only print paths to valid pages, which means a path can't be produced for the `NotFound` route. +-- | With this approach routes can be seperated based on whether they should be a navigation target and have a URL. +-- | Note: assymetry is not required, and a symmetrical printer works just fine as well. printRoute :: Page -> String printRoute = print pages ``` From ea06c35bfb4c71ed041277c00c9a4b0b7021a2db Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:14:06 +0900 Subject: [PATCH 16/32] Language --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e644b8..f2e1e22 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ parseRoute = parse routes -- | This is the route printer we need to pass to the driver. -- | It can only print paths to valid pages, which means a path can't be produced for the `NotFound` route. -- | With this approach routes can be seperated based on whether they should be a navigation target and have a URL. --- | Note: assymetry is not required, and a symmetrical printer works just fine as well. +-- | Note: assymetry is not required, and a symmetrical printer works as well. printRoute :: Page -> String printRoute = print pages ``` From 5bfd1b5edf7ee66868421dfea05ec31e757a3bec Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:19:43 +0900 Subject: [PATCH 17/32] Update routes --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f2e1e22..1b63db0 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ This example uses [routing-duplex](https://github.com/natefaubion/purescript-rou import Prelude hiding ((/)) import Data.Either (Either) import Data.Generic.Rep (class Generic) -import Routing.Duplex (RouteDuplex', default, int, parse, print, root, segment) +import Routing.Duplex (RouteDuplex', default, end, int, parse, print, root, segment) import Routing.Duplex.Generic (noArgs, sum) import Routing.Duplex.Generic.Syntax ((/)) import Routing.Duplex.Parser (RouteError) @@ -55,13 +55,13 @@ routes :: RouteDuplex' Route routes = default NotFound $ sum - { "Page": pages + { "Page": root pages , "NotFound": "404" / noArgs } pages :: RouteDuplex' Page pages = - root $ + end $ sum { "Home": noArgs , "ProductList": "products" / noArgs From a88f04cb32e177970c1cf595e5b0ca6affd6863c Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:20:53 +0900 Subject: [PATCH 18/32] Mention React --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b63db0..f875ba1 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A basic router for browsers with support for asynchronous routing logic. Bring your own printing and parsing (check out [routing-duplex](https://github.com/natefaubion/purescript-routing-duplex)). -For a basic example see [here](https://github.com/robertdp/purescript-web-router-example/tree/master/src). +For a basic React example see [here](https://github.com/robertdp/purescript-web-router-example/tree/master/src). ## How to use From ea47f6fcd40e336817a9952470844cf97a8d1492 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:22:43 +0900 Subject: [PATCH 19/32] Fix qualified example --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f875ba1..3bf5c4d 100644 --- a/README.md +++ b/README.md @@ -93,11 +93,11 @@ import Web.Router as Router ```purescript -onNavigation :: Maybe Route -> Route -> RouterM Route Page Routing Resolved Unit +onNavigation :: Maybe Route -> Route -> Router.RouterM Route Page Router.Routing Router.Resolved Unit onNavigation previousRoute requestedRoute = do Router.continue -- accept the navigation to the requested route -onEvent :: RoutingEvent Route -> Effect Unit +onEvent :: Router.RoutingEvent Route -> Effect Unit onEvent newEvent = case newEvent of Router.Routing oldRoute newRoute -> From 249ba1a0a49c4a5cfadf862274b55bd333847bf3 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:24:14 +0900 Subject: [PATCH 20/32] Update var name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3bf5c4d..dee2653 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ onNavigation previousRoute requestedRoute = do onEvent :: Router.RoutingEvent Route -> Effect Unit onEvent newEvent = case newEvent of - Router.Routing oldRoute newRoute -> + Router.Routing oldRoute requestedRoute -> showNavigationSpinner Router.Resolved oldRoute newRoute -> hideNavigationSpinner From ac05db94b157dd0c1436edd192b2541a8fd11708 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:25:10 +0900 Subject: [PATCH 21/32] Update var name --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dee2653..8c41db4 100644 --- a/README.md +++ b/README.md @@ -100,9 +100,9 @@ onNavigation previousRoute requestedRoute = do onEvent :: Router.RoutingEvent Route -> Effect Unit onEvent newEvent = case newEvent of - Router.Routing oldRoute requestedRoute -> + Router.Routing previousRoute requestedRoute -> showNavigationSpinner - Router.Resolved oldRoute newRoute -> + Router.Resolved previousRoute newRoute -> hideNavigationSpinner setCurrentRoute newRoute ``` From 663bef87aacc7b4df0df0f1bd3086b8c76969074 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:28:22 +0900 Subject: [PATCH 22/32] Language --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c41db4..5ef5b18 100644 --- a/README.md +++ b/README.md @@ -125,4 +125,4 @@ mkRouter = do pure router ``` -Both pushstate and hash drivers are included, or a custom driver can be implemented. An example of a custom driver could be one that synchronises some navigation state over sockets, allowing an experience where one users behaviour could be broadcast to multiple users to follow along. +Both pushstate and hash drivers are included, or a custom driver can be implemented. An example of a custom driver could be one that synchronises some navigation state over sockets, for an experience where one user's behaviour could be broadcast to multiple users to follow along. From 11475224a0dc42474b7c86947fe5eba612d9349f Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:29:35 +0900 Subject: [PATCH 23/32] Language --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ef5b18..be90b4c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # purescript-web-router -A basic router for browsers with support for asynchronous routing logic. Bring your own printing and parsing (check out [routing-duplex](https://github.com/natefaubion/purescript-routing-duplex)). +A router for browsers that supports asynchronous routing logic. Bring your own printing and parsing (check out [routing-duplex](https://github.com/natefaubion/purescript-routing-duplex)). For a basic React example see [here](https://github.com/robertdp/purescript-web-router-example/tree/master/src). From ede2647f2f004ef8ab4b8a29c15650c8e52c9617 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 11:32:17 +0900 Subject: [PATCH 24/32] Fix hidden code blocks --- README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index be90b4c..107a1fb 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,8 @@ This example uses [routing-duplex](https://github.com/natefaubion/purescript-rou
Imports -
+
+```purescript
 import Prelude hiding ((/))
 import Data.Either (Either)
 import Data.Generic.Rep (class Generic)
@@ -41,7 +42,8 @@ import Routing.Duplex (RouteDuplex', default, end, int, parse, print, root, segm
 import Routing.Duplex.Generic (noArgs, sum)
 import Routing.Duplex.Generic.Syntax ((/))
 import Routing.Duplex.Parser (RouteError)
-
+``` +
```purescript @@ -87,9 +89,11 @@ printRoute = print pages
Imports -
+
+```purescript
 import Web.Router as Router
-
+``` +
```purescript @@ -111,10 +115,12 @@ onEvent newEvent =
Imports -
+
+```purescript
 import Web.Router as Router
 import Web.Router.Driver.PushState as PushState
-
+``` +
```purescript From 2efb416839260db66e7a8f79ee5d808676122500 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 12:14:54 +0900 Subject: [PATCH 25/32] Ix qualified exports --- README.md | 2 +- src/Web/Router.purs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 107a1fb..15b5dbb 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ import Web.Router as Router ```purescript onNavigation :: Maybe Route -> Route -> Router.RouterM Route Page Router.Routing Router.Resolved Unit -onNavigation previousRoute requestedRoute = do +onNavigation previousRoute requestedRoute = Router.do Router.continue -- accept the navigation to the requested route onEvent :: Router.RoutingEvent Route -> Effect Unit diff --git a/src/Web/Router.purs b/src/Web/Router.purs index c8b38d2..76625bc 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -1,10 +1,12 @@ module Web.Router ( module Control + , module Ix , module Types , mkRouter ) where import Prelude +import Control.Monad.Indexed.Qualified (apply, bind, discard, map, pure) as Ix import Data.Foldable (for_) import Data.Maybe (Maybe(..)) import Effect (Effect) From a4f6fddf3d1096efe3ff69a3f244834ad67466ba Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 12:26:09 +0900 Subject: [PATCH 26/32] Switch to mkInterface pattern --- README.md | 6 +++--- src/Web/Router.purs | 14 +++++++------- src/Web/Router/Driver/PushState.purs | 19 ------------------- src/Web/Router/{Driver => }/Hash.purs | 8 ++++---- src/Web/Router/Internal/Types.purs | 6 +++--- src/Web/Router/PushState.purs | 19 +++++++++++++++++++ 6 files changed, 36 insertions(+), 36 deletions(-) delete mode 100644 src/Web/Router/Driver/PushState.purs rename src/Web/Router/{Driver => }/Hash.purs (50%) create mode 100644 src/Web/Router/PushState.purs diff --git a/README.md b/README.md index 15b5dbb..030face 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ onEvent newEvent = ```purescript import Web.Router as Router -import Web.Router.Driver.PushState as PushState +import Web.Router.PushState as PushState ``` @@ -126,8 +126,8 @@ import Web.Router.Driver.PushState as PushState ```purescript mkRouter :: Effect (Router.Router Route Page) mkRouter = do - driver <- PushState.mkDriver parseRoute printRoute - router <- Router.mkRouter onNavigation onEvent + driver <- PushState.mkInterface parseRoute printRoute + router <- Router.mkInterface onNavigation onEvent driver pure router ``` diff --git a/src/Web/Router.purs b/src/Web/Router.purs index 76625bc..3ff5a13 100644 --- a/src/Web/Router.purs +++ b/src/Web/Router.purs @@ -2,7 +2,7 @@ module Web.Router ( module Control , module Ix , module Types - , mkRouter + , mkInterface ) where import Prelude @@ -15,16 +15,16 @@ import Effect.Class (liftEffect) import Effect.Ref as Ref import Web.Router.Internal.Control (Resolved, RouterIndex, RouterM, Routing, continue, override, redirect) as Control import Web.Router.Internal.Control (RouterCommand(..), Resolved, RouterM, Routing, runRouter) -import Web.Router.Internal.Types (Driver, Driver', Router, RouterEvent(..), _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types -import Web.Router.Internal.Types (Driver, Router, RouterEvent(..)) +import Web.Router.Internal.Types (DriverInterface, DriverInterface', RouterEvent(..), RouterInterface, _Resolved, _RouterEvent, _Routing, isResolved, isRouting) as Types +import Web.Router.Internal.Types (DriverInterface, RouterEvent(..), RouterInterface) -mkRouter +mkInterface :: forall i o . (Maybe i -> i -> RouterM i o Routing Resolved Unit) -> (RouterEvent i -> Effect Unit) - -> Driver i o - -> Effect (Router o) -mkRouter onNavigation onEvent driver = do + -> DriverInterface i o + -> Effect (RouterInterface o) +mkInterface onNavigation onEvent driver = do lastFiberRef <- Ref.new Nothing lastEventRef <- Ref.new Nothing let diff --git a/src/Web/Router/Driver/PushState.purs b/src/Web/Router/Driver/PushState.purs deleted file mode 100644 index 5799a99..0000000 --- a/src/Web/Router/Driver/PushState.purs +++ /dev/null @@ -1,19 +0,0 @@ -module Web.Router.Driver.PushState where - -import Prelude -import Data.Foldable (class Foldable) -import Effect (Effect) -import Foreign (unsafeToForeign) -import Routing.PushState (PushStateInterface) -import Routing.PushState as PushState -import Web.Router.Internal.Types (Driver) - -mkDriver :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Effect (Driver i o) -mkDriver parser printer = mkDriver_ parser printer <$> PushState.makeInterface - -mkDriver_ :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> PushStateInterface -> Driver i o -mkDriver_ parser printer interface = - { initialize: \k -> PushState.matchesWith parser (\_ -> k) interface - , navigate: interface.pushState (unsafeToForeign {}) <<< printer - , redirect: interface.replaceState (unsafeToForeign {}) <<< printer - } diff --git a/src/Web/Router/Driver/Hash.purs b/src/Web/Router/Hash.purs similarity index 50% rename from src/Web/Router/Driver/Hash.purs rename to src/Web/Router/Hash.purs index 31ce732..68d91eb 100644 --- a/src/Web/Router/Driver/Hash.purs +++ b/src/Web/Router/Hash.purs @@ -1,12 +1,12 @@ -module Web.Router.Driver.Hash where +module Web.Router.Hash where import Prelude import Data.Foldable (class Foldable) import Routing.Hash as Hash -import Web.Router.Internal.Types (Driver) +import Web.Router.Internal.Types (DriverInterface) -mkDriver :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Driver i o -mkDriver parser printer = +mkInterface :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> DriverInterface i o +mkInterface parser printer = { initialize: Hash.matchesWith parser <<< const , navigate: Hash.setHash <<< printer , redirect: Hash.setHash <<< printer diff --git a/src/Web/Router/Internal/Types.purs b/src/Web/Router/Internal/Types.purs index 6606074..ff20e7d 100644 --- a/src/Web/Router/Internal/Types.purs +++ b/src/Web/Router/Internal/Types.purs @@ -5,19 +5,19 @@ import Data.Lens (Lens', Prism', is, lens, prism') import Data.Maybe (Maybe(..)) import Effect (Effect) -type Router route = +type RouterInterface route = { initialize :: Effect (Effect Unit) , navigate :: route -> Effect Unit , redirect :: route -> Effect Unit } -type Driver i o = +type DriverInterface i o = { initialize :: (i -> Effect Unit) -> Effect (Effect Unit) , navigate :: o -> Effect Unit , redirect :: o -> Effect Unit } -type Driver' route = Driver route route +type DriverInterface' route = DriverInterface route route data RouterEvent route = Routing (Maybe route) route diff --git a/src/Web/Router/PushState.purs b/src/Web/Router/PushState.purs new file mode 100644 index 0000000..c00d8e6 --- /dev/null +++ b/src/Web/Router/PushState.purs @@ -0,0 +1,19 @@ +module Web.Router.PushState where + +import Prelude +import Data.Foldable (class Foldable) +import Effect (Effect) +import Foreign (unsafeToForeign) +import Routing.PushState (PushStateInterface) +import Routing.PushState as PushState +import Web.Router.Internal.Types (DriverInterface) + +mkInterface :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> Effect (DriverInterface i o) +mkInterface parser printer = mkInterface_ parser printer <$> PushState.makeInterface + +mkInterface_ :: forall f i o. Foldable f => (String -> f i) -> (o -> String) -> PushStateInterface -> DriverInterface i o +mkInterface_ parser printer interface = + { initialize: \k -> PushState.matchesWith parser (\_ -> k) interface + , navigate: interface.pushState (unsafeToForeign {}) <<< printer + , redirect: interface.replaceState (unsafeToForeign {}) <<< printer + } From 54caf8037fb2a459afe619fda8a6562ff5b4c52c Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 12:53:13 +0900 Subject: [PATCH 27/32] Fix example bug --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 030face..48a25cb 100644 --- a/README.md +++ b/README.md @@ -57,13 +57,13 @@ routes :: RouteDuplex' Route routes = default NotFound $ sum - { "Page": root pages + { "Page": pages , "NotFound": "404" / noArgs } pages :: RouteDuplex' Page pages = - end $ + root $ end $ sum { "Home": noArgs , "ProductList": "products" / noArgs From 767d3e3d1c1ae298c240d0cd1160edb936ae7d3b Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 13:24:22 +0900 Subject: [PATCH 28/32] More detailed nav example --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 48a25cb..1b410a2 100644 --- a/README.md +++ b/README.md @@ -98,8 +98,20 @@ import Web.Router as Router ```purescript onNavigation :: Maybe Route -> Route -> Router.RouterM Route Page Router.Routing Router.Resolved Unit -onNavigation previousRoute requestedRoute = Router.do - Router.continue -- accept the navigation to the requested route +onNavigation previousRoute requestedRoute = + case requestedRoute, previousRoute of + NotFound, Just route -> Router.do + liftEffect showBrokenNavigationMessage + Router.redirect route -- redirect back to the previous route and show a message + NotFound, Nothing -> + Router.continue -- no previous route, so just show the "not found" page + _ -> Router.do + access <- liftAff fetchAccessForRoute + if userHasAccess requestedRoute access then + Router.continue -- they have access, so continue + else + Router.override NotFound -- no access, so pretend the page doesn't exist + onEvent :: Router.RoutingEvent Route -> Effect Unit onEvent newEvent = From 27f858c39654d97e54a5c79818abaa2de10030a0 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 13:25:04 +0900 Subject: [PATCH 29/32] Fix naming --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b410a2..6785cde 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ onNavigation previousRoute requestedRoute = NotFound, Nothing -> Router.continue -- no previous route, so just show the "not found" page _ -> Router.do - access <- liftAff fetchAccessForRoute + access <- liftAff fetchUserAccess if userHasAccess requestedRoute access then Router.continue -- they have access, so continue else From 7f3c38f134886d5b68b3369e154bb9db30eabc49 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 13:26:37 +0900 Subject: [PATCH 30/32] Clearer language --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6785cde..16f05a0 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ onNavigation previousRoute requestedRoute = _ -> Router.do access <- liftAff fetchUserAccess if userHasAccess requestedRoute access then - Router.continue -- they have access, so continue + Router.continue -- they have access, so resolve with the requested page else Router.override NotFound -- no access, so pretend the page doesn't exist From 632be0491b0f0b1ff98a925f82fad32a4c11e001 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 13:29:36 +0900 Subject: [PATCH 31/32] Simplify the example structure --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 16f05a0..f67bb21 100644 --- a/README.md +++ b/README.md @@ -99,12 +99,14 @@ import Web.Router as Router ```purescript onNavigation :: Maybe Route -> Route -> Router.RouterM Route Page Router.Routing Router.Resolved Unit onNavigation previousRoute requestedRoute = - case requestedRoute, previousRoute of - NotFound, Just route -> Router.do - liftEffect showBrokenNavigationMessage - Router.redirect route -- redirect back to the previous route and show a message - NotFound, Nothing -> - Router.continue -- no previous route, so just show the "not found" page + case requestedRoute of + NotFound -> + case previousRoute of + Just route -> Router.do + liftEffect showBrokenNavigationMessage + Router.redirect route -- redirect back to the previous route and show a message + Nothing -> + Router.continue -- no previous route, so just show the "not found" page _ -> Router.do access <- liftAff fetchUserAccess if userHasAccess requestedRoute access then From 0729dbc7af21aeba7338fcf8475ad7db7165b897 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 21 Jul 2022 13:33:18 +0900 Subject: [PATCH 32/32] Update example --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f67bb21..aa37114 100644 --- a/README.md +++ b/README.md @@ -102,11 +102,11 @@ onNavigation previousRoute requestedRoute = case requestedRoute of NotFound -> case previousRoute of - Just route -> Router.do + Just (Page page) -> Router.do liftEffect showBrokenNavigationMessage - Router.redirect route -- redirect back to the previous route and show a message - Nothing -> - Router.continue -- no previous route, so just show the "not found" page + Router.redirect page -- redirect back to the previous page and show a message + _ -> + Router.continue -- no previous page, so just show the "not found" page _ -> Router.do access <- liftAff fetchUserAccess if userHasAccess requestedRoute access then