diff --git a/package-lock.json b/package-lock.json index 4e69eda..a54ca40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,10 @@ "resolved": "https://registry.npmjs.org/@andrewbranch/untar.js/-/untar.js-1.0.2.tgz", "integrity": "sha512-hL80MHK3b++pEp6K23+Nl5r5D1F19DRagp2ruCBIv4McyCiLKq67vUNvEQY1aGCAKNZ8GxV23n5MhOm7RwO8Pg==" }, + "node_modules/@arethetypeswrong/cli": { + "resolved": "packages/cli", + "link": true + }, "node_modules/@arethetypeswrong/core": { "resolved": "packages/core", "link": true @@ -28,10 +32,19 @@ "resolved": "packages/web", "link": true }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.4.tgz", - "integrity": "sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "cpu": [ "arm" ], @@ -45,9 +58,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.4.tgz", - "integrity": "sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "cpu": [ "arm64" ], @@ -61,9 +74,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.4.tgz", - "integrity": "sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "cpu": [ "x64" ], @@ -77,9 +90,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.4.tgz", - "integrity": "sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", "cpu": [ "arm64" ], @@ -93,9 +106,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.4.tgz", - "integrity": "sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "cpu": [ "x64" ], @@ -109,9 +122,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.4.tgz", - "integrity": "sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", "cpu": [ "arm64" ], @@ -125,9 +138,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.4.tgz", - "integrity": "sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", "cpu": [ "x64" ], @@ -141,9 +154,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.4.tgz", - "integrity": "sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", "cpu": [ "arm" ], @@ -157,9 +170,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.4.tgz", - "integrity": "sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", "cpu": [ "arm64" ], @@ -173,9 +186,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.4.tgz", - "integrity": "sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", "cpu": [ "ia32" ], @@ -189,9 +202,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.4.tgz", - "integrity": "sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "cpu": [ "loong64" ], @@ -205,9 +218,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.4.tgz", - "integrity": "sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", "cpu": [ "mips64el" ], @@ -221,9 +234,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.4.tgz", - "integrity": "sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", "cpu": [ "ppc64" ], @@ -237,9 +250,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.4.tgz", - "integrity": "sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", "cpu": [ "riscv64" ], @@ -253,9 +266,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.4.tgz", - "integrity": "sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", "cpu": [ "s390x" ], @@ -269,9 +282,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.4.tgz", - "integrity": "sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "cpu": [ "x64" ], @@ -285,9 +298,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.4.tgz", - "integrity": "sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", "cpu": [ "x64" ], @@ -301,9 +314,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.4.tgz", - "integrity": "sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", "cpu": [ "x64" ], @@ -317,9 +330,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.4.tgz", - "integrity": "sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", "cpu": [ "x64" ], @@ -333,9 +346,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.4.tgz", - "integrity": "sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", "cpu": [ "arm64" ], @@ -349,9 +362,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.4.tgz", - "integrity": "sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", "cpu": [ "ia32" ], @@ -365,9 +378,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz", - "integrity": "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "cpu": [ "x64" ], @@ -386,6 +399,16 @@ "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", "dev": true }, + "node_modules/@types/node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, "node_modules/@types/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz", @@ -405,6 +428,34 @@ "integrity": "sha512-RpO62vB2lkjEkyLbwTheA2+uwYmtVMWTr/kWRI++UAgVdZqNqdAuIQl/SxBCGeMKfdjWaXPbyhZbiCc4PAj+KA==", "dev": true }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -413,10 +464,89 @@ "semver": "^7.0.0" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/esbuild": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz", - "integrity": "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, "bin": { @@ -426,28 +556,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.4", - "@esbuild/android-arm64": "0.17.4", - "@esbuild/android-x64": "0.17.4", - "@esbuild/darwin-arm64": "0.17.4", - "@esbuild/darwin-x64": "0.17.4", - "@esbuild/freebsd-arm64": "0.17.4", - "@esbuild/freebsd-x64": "0.17.4", - "@esbuild/linux-arm": "0.17.4", - "@esbuild/linux-arm64": "0.17.4", - "@esbuild/linux-ia32": "0.17.4", - "@esbuild/linux-loong64": "0.17.4", - "@esbuild/linux-mips64el": "0.17.4", - "@esbuild/linux-ppc64": "0.17.4", - "@esbuild/linux-riscv64": "0.17.4", - "@esbuild/linux-s390x": "0.17.4", - "@esbuild/linux-x64": "0.17.4", - "@esbuild/netbsd-x64": "0.17.4", - "@esbuild/openbsd-x64": "0.17.4", - "@esbuild/sunos-x64": "0.17.4", - "@esbuild/win32-arm64": "0.17.4", - "@esbuild/win32-ia32": "0.17.4", - "@esbuild/win32-x64": "0.17.4" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/fetch-ponyfill": { @@ -463,6 +593,20 @@ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==" }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -495,6 +639,14 @@ "node": ">= 0.4.0" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/immer": { "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", @@ -516,6 +668,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -527,6 +687,27 @@ "node": ">=10" } }, + "node_modules/mime-db": { + "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.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.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -670,6 +851,41 @@ "node": ">=0.10.0" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -688,15 +904,15 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/typescript": { - "version": "5.0.0-dev.20230207", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.0-dev.20230207.tgz", - "integrity": "sha512-MBas9Ly9cx5yODCQZFKjteVtRa8//VshqSThNpX8D3XxPQEG+yBhtizEUPwrc2kLx33xnr7qGABEifZeepuKwg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/validate-npm-package-name": { @@ -1167,6 +1383,44 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "packages/cli": { + "name": "@arethetypeswrong/cli", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "@arethetypeswrong/core": "^0.0.6", + "chalk": "^4.1.2", + "cli-table3": "^0.6.3", + "commander": "^10.0.1" + }, + "bin": { + "attw": "dist/index.js" + }, + "devDependencies": { + "@types/node": "^20.2.5", + "@types/node-fetch": "^2.6.4", + "typescript": "^5.0.0-dev.20230207" + } + }, + "packages/cli/node_modules/@types/node": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "dev": true + }, + "packages/cli/node_modules/typescript": { + "version": "5.0.0-dev.20230207", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.0-dev.20230207.tgz", + "integrity": "sha512-MBas9Ly9cx5yODCQZFKjteVtRa8//VshqSThNpX8D3XxPQEG+yBhtizEUPwrc2kLx33xnr7qGABEifZeepuKwg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "packages/core": { "name": "@arethetypeswrong/core", "version": "0.0.6", @@ -1206,6 +1460,32 @@ "resolved": "https://registry.npmjs.org/@andrewbranch/untar.js/-/untar.js-1.0.2.tgz", "integrity": "sha512-hL80MHK3b++pEp6K23+Nl5r5D1F19DRagp2ruCBIv4McyCiLKq67vUNvEQY1aGCAKNZ8GxV23n5MhOm7RwO8Pg==" }, + "@arethetypeswrong/cli": { + "version": "file:packages/cli", + "requires": { + "@arethetypeswrong/core": "^0.0.6", + "@types/node": "^20.2.5", + "@types/node-fetch": "^2.6.4", + "chalk": "^4.1.2", + "cli-table3": "^0.6.3", + "commander": "^10.0.1", + "typescript": "^5.0.0-dev.20230207" + }, + "dependencies": { + "@types/node": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "dev": true + }, + "typescript": { + "version": "5.0.0-dev.20230207", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.0-dev.20230207.tgz", + "integrity": "sha512-MBas9Ly9cx5yODCQZFKjteVtRa8//VshqSThNpX8D3XxPQEG+yBhtizEUPwrc2kLx33xnr7qGABEifZeepuKwg==", + "dev": true + } + } + }, "@arethetypeswrong/core": { "version": "file:packages/core", "requires": { @@ -1230,157 +1510,163 @@ "vite": "^4.0.4" } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, "@esbuild/android-arm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.4.tgz", - "integrity": "sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.4.tgz", - "integrity": "sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.4.tgz", - "integrity": "sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.4.tgz", - "integrity": "sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.4.tgz", - "integrity": "sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.4.tgz", - "integrity": "sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.4.tgz", - "integrity": "sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.4.tgz", - "integrity": "sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.4.tgz", - "integrity": "sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.4.tgz", - "integrity": "sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.4.tgz", - "integrity": "sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.4.tgz", - "integrity": "sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.4.tgz", - "integrity": "sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.4.tgz", - "integrity": "sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.4.tgz", - "integrity": "sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.4.tgz", - "integrity": "sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.4.tgz", - "integrity": "sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.4.tgz", - "integrity": "sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.4.tgz", - "integrity": "sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.4.tgz", - "integrity": "sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.4.tgz", - "integrity": "sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz", - "integrity": "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "dev": true, "optional": true }, @@ -1390,6 +1676,16 @@ "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", "dev": true }, + "@types/node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, "@types/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz", @@ -1408,6 +1704,25 @@ "integrity": "sha512-RpO62vB2lkjEkyLbwTheA2+uwYmtVMWTr/kWRI++UAgVdZqNqdAuIQl/SxBCGeMKfdjWaXPbyhZbiCc4PAj+KA==", "dev": true }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -1416,34 +1731,90 @@ "semver": "^7.0.0" } }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "esbuild": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz", - "integrity": "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "requires": { - "@esbuild/android-arm": "0.17.4", - "@esbuild/android-arm64": "0.17.4", - "@esbuild/android-x64": "0.17.4", - "@esbuild/darwin-arm64": "0.17.4", - "@esbuild/darwin-x64": "0.17.4", - "@esbuild/freebsd-arm64": "0.17.4", - "@esbuild/freebsd-x64": "0.17.4", - "@esbuild/linux-arm": "0.17.4", - "@esbuild/linux-arm64": "0.17.4", - "@esbuild/linux-ia32": "0.17.4", - "@esbuild/linux-loong64": "0.17.4", - "@esbuild/linux-mips64el": "0.17.4", - "@esbuild/linux-ppc64": "0.17.4", - "@esbuild/linux-riscv64": "0.17.4", - "@esbuild/linux-s390x": "0.17.4", - "@esbuild/linux-x64": "0.17.4", - "@esbuild/netbsd-x64": "0.17.4", - "@esbuild/openbsd-x64": "0.17.4", - "@esbuild/sunos-x64": "0.17.4", - "@esbuild/win32-arm64": "0.17.4", - "@esbuild/win32-ia32": "0.17.4", - "@esbuild/win32-x64": "0.17.4" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "fetch-ponyfill": { @@ -1459,6 +1830,17 @@ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==" }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -1481,6 +1863,11 @@ "function-bind": "^1.1.1" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "immer": { "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", @@ -1495,6 +1882,11 @@ "has": "^1.0.3" } }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1503,6 +1895,21 @@ "yallist": "^4.0.0" } }, + "mime-db": { + "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.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.52.0" + } + }, "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -1585,6 +1992,32 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -1597,9 +2030,9 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "typescript": { - "version": "5.0.0-dev.20230207", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.0-dev.20230207.tgz", - "integrity": "sha512-MBas9Ly9cx5yODCQZFKjteVtRa8//VshqSThNpX8D3XxPQEG+yBhtizEUPwrc2kLx33xnr7qGABEifZeepuKwg==" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" }, "validate-npm-package-name": { "version": "5.0.0", diff --git a/packages/cli/README.md b/packages/cli/README.md new file mode 100644 index 0000000..d76faa8 --- /dev/null +++ b/packages/cli/README.md @@ -0,0 +1,175 @@ +# arethetypeswrong/cli + +A CLI wrapper for [arethetypeswrong](https://arethetypeswrong.github.io/). + +## Installation + +**NOTE:** The package has not yet been published to NPM. + +```shell +npm i -g @arethetypeswrong/cli +``` + + + + + + + +## Usage + +The `attw` command acts very similarly to [the arethetypeswrong website](https://arethetypeswrong.github.io/), with some additional features that are useful for command line usage. + +The usage is: + +```shell +attw [options] +``` + +Where `` is a required positional argument - either the path to a local `.tar.gz` file, or the name of an NPM package. + +## Configuration + +`attw` supports a JSON config file (by default named `.attw.json`) which allows you to pre-set the command line arguments. The options are a one-to-one mapping of the command line flags, changed to camelCase, and are all documented in their relevant `Options` section below. + +Note that the `--config-path` option cannot be set from the config file :upside_down_face: + +### Options + +#### Help + +Show help information and exit. + +In the CLI: `--help`, `-h` + +```shell +attw --help +``` + +#### Version + +Print the current version of `attw` and exit. + +In the CLI: `--version`, `-v` + +```shell +attw --version +``` + +#### Format + +The format to print the output in. Defaults to `table`. + +The available values are: +- `table` +- `table-flipped`, where the resolution kinds are the table's head, and the entry points label the table's rows +- `ascii`, for large tables where the output is clunky +- `raw`, outputs the raw JSON data (overriding all other rendering options) + +In the CLI: `--format`, `-F` + +```shell +attw --format +``` + +In the config file, `format` can be a string value. + +#### From NPM + +Treat `` as the name (and, optionally, version) of a package from the NPM registry. + +In the CLI: `--from-npm`, `-f` + +```shell +attw --from-npm +``` + +In the config file, `fromNpm` can be a boolean value. + +#### Ignore Rules + +Specifies rules/problems to ignore (i.e. not raise an error for). + +The available values are: +- `wildcard` +- `no-resolution` +- `untyped-resolution` +- `false-cjs` +- `false-esm` +- `cjs-resolves-to-esm` +- `fallback-condition` +- `cjs-only-exports-default` +- `false-export-default` +- `unexpected-esm-syntax` +- `unexpected-cjs-syntax` + +In the CLI: `--ignore-rules` + +```shell +attw --ignore-rules +``` + +In the config file, `ignoreRules` can be an array of strings. + +#### Summary/No Summary + +Whether to display a summary of what the different errors/problems mean. Defaults to showing the summary (`--summary`). + +In the CLI: `--summary`/`--no-summary` + +```shell +attw --summary/--no-summary +``` + +In the config file, `summary` can be a boolean value. + +#### Emoji/No Emoji + +Whether to print the information with emojis. Defaults to printing with emojis (`--emoji`). + +In the CLI: `--emoji`/`--no-emoji` + +```shell +attw --emoji/--no-emoji +``` + +In the config file, `emoji` can be a boolean value. + +#### Color/No Color + +Whether to print with colors. Defaults to printing with colors (`--color`). + +The `FORCE_COLOR` env variable is also available for use (set is to `0` or `1`). + +In the CLI: `--color`/`--no-color` + +```shell +attw --color/--no-color +``` + +In the config file, `color` can be a boolean value. + +#### Quiet + +When set, nothing will be printed to STDOUT. + +In the CLI: `--quiet`, `-q` + +```shell +attw --quiet +``` + +In the config file, `quiet` can be a boolean value. + +#### Config Path + +The path to the config file. Defaults to `./.attw.json`. + +In the CLI: `--config-path ` + +```shell +attw --config-path +``` + +Cannot be set from within the config file itself. + diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000..79982c7 --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,39 @@ +{ + "name": "@arethetypeswrong/cli", + "version": "0.0.1", + "description": "A CLI tool for arethetypeswrong.github.io", + "author": "Andrew Branch & ej-shafran", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/arethetypeswrong/arethetypeswrong.github.io.git", + "directory": "packages/cli" + }, + "files": [ + "dist" + ], + "bin": { + "attw": "./dist/index.js" + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "tsc": "tsc", + "local:install": "npm install -g .", + "local:uninstall": "npm uninstall -g @arethetypeswrong/cli", + "build": "npm run local:uninstall && npm run tsc && npm run local:install" + }, + "type": "module", + "devDependencies": { + "@types/node": "^20.2.5", + "@types/node-fetch": "^2.6.4", + "typescript": "^5.0.0-dev.20230207" + }, + "dependencies": { + "@arethetypeswrong/core": "^0.0.6", + "chalk": "^4.1.2", + "cli-table3": "^0.6.3", + "commander": "^10.0.1" + } +} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts new file mode 100644 index 0000000..a139ead --- /dev/null +++ b/packages/cli/src/index.ts @@ -0,0 +1,142 @@ +#!/usr/bin/env node + +import * as core from "@arethetypeswrong/core"; +import { Option, program } from "commander"; +import chalk from "chalk"; +import { readFile } from "fs/promises"; +import { FetchError } from "node-fetch"; +import { createRequire } from "module"; + +import * as render from "./render/index.js"; +import { readConfig } from "./readConfig.js"; +import { problemFlags } from "./problemUtils.js"; + +const packageJson = createRequire(import.meta.url)("../package.json"); +const version = packageJson.version; +const coreVersion = packageJson.dependencies["@arethetypeswrong/core"].substring(1); +const tsVersion = packageJson.devDependencies.typescript.substring(1); + +const formats = ["table", "table-flipped", "ascii", "json"] as const; + +type Format = (typeof formats)[number]; + +export interface Opts { + fromNpm?: boolean; + summary?: boolean; + emoji?: boolean; + color?: boolean; + quiet?: boolean; + configPath?: string; + ignoreRules?: string[]; + format: Format; +} + +program + .addHelpText("before", `ATTW CLI (v${version})\n`) + .addHelpText("after", `\ncore: v${coreVersion}, typescript: v${tsVersion}`) + .version(`v${version}`) + .name("attw") + .description( + `${chalk.bold.blue( + "Are the Types Wrong?" + )} attempts to analyze npm package contents for issues with their TypeScript types, +particularly ESM-related module resolution issues.` + ) + .argument("", "the file to check; by default a path to a .tar.gz file, unless --from-npm is set") + .option("-f, --from-npm", "read from the npm registry instead of a local file") + .addOption(new Option("-F, --format ", "specify the print format").choices(formats).default("table")) + .option("-q, --quiet", "don't print anything to STDOUT (overrides all other options)") + .addOption( + new Option("--ignore-rules ", "specify rules to ignore").choices(Object.values(problemFlags)).default([]) + ) + .option("--summary, --no-summary", "whether to print summary information about the different errors") + .option("--emoji, --no-emoji", "whether to use any emojis") + .option("--color, --no-color", "whether to use any colors (the FORCE_COLOR env variable is also available)") + .option("--config-path ", "path to config file (default: ./.attw.json)") + .action(async (fileName: string) => { + const opts = program.opts(); + await readConfig(program, opts.configPath); + opts.ignoreRules = opts.ignoreRules?.map( + (value) => Object.keys(problemFlags).find((key) => problemFlags[key as core.ProblemKind] === value) as string + ); + + if (opts.quiet) { + console.log = () => { }; + } + + if (!opts.color) { + process.env.FORCE_COLOR = "0"; + } + + let analysis: core.Analysis; + if (opts.fromNpm) { + try { + const result = core.parsePackageSpec(fileName); + if (result.status === "error") { + program.error(result.error); + } else { + analysis = await core.checkPackage(result.data.packageName, result.data.version); + } + } catch (error) { + if (error instanceof FetchError) { + program.error(`error while fetching package:\n${error.message}`, { code: error.code }); + } + + handleError(error, "checking package"); + } + } else { + try { + const file = await readFile(fileName); + const data = new Uint8Array(file); + analysis = await core.checkTgz(data); + } catch (error) { + handleError(error, "checking file"); + } + } + + if (opts.format === "json") { + const result = { analysis } as { + analysis: core.Analysis; + problems?: Partial>; + }; + + if (analysis.containsTypes) { + result.problems = core.groupByKind(core.getProblems(analysis)); + } + + console.log(JSON.stringify(result)); + + if ( + analysis.containsTypes && + core.getProblems(analysis).some((problem) => !opts.ignoreRules.includes(problem.kind)) + ) + process.exit(1); + + return; + } + + console.log(); + if (analysis.containsTypes) { + await render.typed(analysis, opts); + + if ( + analysis.containsTypes && + core.getProblems(analysis).some((problem) => !opts.ignoreRules.includes(problem.kind)) + ) + process.exit(1); + } else { + render.untyped(analysis as core.UntypedAnalysis); + } + }); + +program.parse(process.argv); + +function handleError(error: unknown, title: string): never { + if (error && typeof error === "object" && "message" in error) { + program.error(`error while ${title}:\n${error.message}`, { + code: "code" in error && typeof error.code === "string" ? error.code : "UNKNOWN", + }); + } + + program.error(`unknown error while ${title}`, { code: "UNKNOWN" }); +} diff --git a/packages/cli/src/problemUtils.ts b/packages/cli/src/problemUtils.ts new file mode 100644 index 0000000..6bdf3b4 --- /dev/null +++ b/packages/cli/src/problemUtils.ts @@ -0,0 +1,76 @@ +import * as core from "@arethetypeswrong/core"; +import type { ProblemKind } from "@arethetypeswrong/core"; + +export const problemFlags: Record = { + Wildcard: "wildcard", + NoResolution: "no-resolution", + UntypedResolution: "untyped-resolution", + FalseCJS: "false-cjs", + FalseESM: "false-esm", + CJSResolvesToESM: "cjs-resolves-to-esm", + FallbackCondition: "fallback-condition", + CJSOnlyExportsDefault: "cjs-only-exports-default", + FalseExportDefault: "false-export-default", + UnexpectedESMSyntax: "unexpected-esm-syntax", + UnexpectedCJSSyntax: "unexpected-cjs-syntax", +}; + +export const problemEmoji: Record = { + Wildcard: "โ“", + NoResolution: "๐Ÿ’€", + UntypedResolution: "๐Ÿšซ", + FalseCJS: "๐ŸŽญ", + FalseESM: "๐Ÿ‘บ", + CJSResolvesToESM: "โš ๏ธ", + FallbackCondition: "๐Ÿ›", + CJSOnlyExportsDefault: "๐Ÿคจ", + FalseExportDefault: "โ—๏ธ", + UnexpectedESMSyntax: "๐Ÿšญ", + UnexpectedCJSSyntax: "๐Ÿšฑ", +}; + +export const withEmoji: Record = { + Wildcard: `${problemEmoji.Wildcard} Unable to check`, + NoResolution: `${problemEmoji.NoResolution} Failed to resolve`, + UntypedResolution: `${problemEmoji.UntypedResolution} No types`, + FalseCJS: `${problemEmoji.FalseCJS} Masquerading as CJS`, + FalseESM: `${problemEmoji.FalseESM} Masquerading as ESM`, + CJSResolvesToESM: `${problemEmoji.CJSResolvesToESM} ESM (dynamic import only)`, + FallbackCondition: `${problemEmoji.FallbackCondition} Used fallback condition`, + CJSOnlyExportsDefault: `${problemEmoji.CJSOnlyExportsDefault} CJS default export`, + FalseExportDefault: `${problemEmoji.FalseExportDefault} Incorrect default export`, + UnexpectedESMSyntax: `${problemEmoji.UnexpectedESMSyntax} Unexpected ESM syntax`, + UnexpectedCJSSyntax: `${problemEmoji.UnexpectedCJSSyntax} Unexpected CJS syntax`, +}; + +export const noEmoji: Record = { + Wildcard: `Unable to check`, + NoResolution: `Failed to resolve`, + UntypedResolution: `No types`, + FalseCJS: `Masquerading as CJS`, + FalseESM: `Masquerading as ESM`, + CJSResolvesToESM: `ESM (dynamic import only)`, + FallbackCondition: `Used fallback condition`, + CJSOnlyExportsDefault: `CJS default export`, + FalseExportDefault: `Incorrect default export`, + UnexpectedESMSyntax: `Unexpected ESM syntax`, + UnexpectedCJSSyntax: `Unexpected CJS syntax`, +}; + +export const problemShortDescriptions = { + emoji: withEmoji, + noEmoji: noEmoji, +}; + +export const resolutionKinds: Record = { + node10: "node10", + "node16-cjs": "node16 (from CJS)", + "node16-esm": "node16 (from ESM)", + bundler: "bundler", +}; + +export const moduleKinds = { + 1: "(CJS)", + 99: "(ESM)", + "": "", +}; diff --git a/packages/cli/src/readConfig.ts b/packages/cli/src/readConfig.ts new file mode 100644 index 0000000..81dd9ad --- /dev/null +++ b/packages/cli/src/readConfig.ts @@ -0,0 +1,47 @@ +import { Command } from "commander"; +import { readFile } from "fs/promises"; +import { problemFlags } from "./problemUtils.js"; + +export async function readConfig(program: Command, alternate = ".attw.json") { + try { + const results = await readFile(alternate, "utf8"); + if (!results) return; + + const opts = JSON.parse(results); + for (let key in opts) { + if (key === "configPath") + program.error(`cannot set "configPath" within ${alternate}`, { code: "INVALID_OPTION" }); + + const value = opts[key]; + + if (key === "ignoreRules") { + if (!Array.isArray(value)) program.error(`error: config option 'ignore' should be an array.`); + const invalid = value.find((rule) => !Object.values(problemFlags).includes(rule)); + if (invalid) + program.error( + `error: config option 'ignoreRules' argument '${invalid}' is invalid. Allowed choices are ${Object.values( + problemFlags + ).join(", ")}.` + ); + } + + if (Array.isArray(value)) { + const opt = program.getOptionValue(key); + + if (Array.isArray(opt)) { + program.setOptionValueWithSource(key, [...opt, ...value], "config"); + + continue; + } + } + + if (key !== "help" && key !== "version") program.setOptionValueWithSource(key, opts[key], "config"); + } + } catch (error) { + if (!error || typeof error !== "object" || !("code" in error) || !("message" in error)) { + program.error("unknown error while reading config file", { code: "UNKNOWN" }); + } else if (error.code !== "ENOENT") { + program.error(`error while reading config file:\n${error.message}`); + } + } +} diff --git a/packages/cli/src/render/index.ts b/packages/cli/src/render/index.ts new file mode 100644 index 0000000..f4a1f72 --- /dev/null +++ b/packages/cli/src/render/index.ts @@ -0,0 +1,2 @@ +export * from './typed.js'; +export * from './untyped.js'; diff --git a/packages/cli/src/render/tableFlipped.ts b/packages/cli/src/render/tableFlipped.ts new file mode 100644 index 0000000..7b6ec63 --- /dev/null +++ b/packages/cli/src/render/tableFlipped.ts @@ -0,0 +1,19 @@ +import chalk from "chalk"; +import type { GenericTable, HorizontalTableRow } from "cli-table3"; + +export function tableFlipped(table: GenericTable) { + return table.options.head + .slice(1) + .map((entryPoint, i) => { + const keyValuePairs = table.reduce((acc, cur) => { + const key = cur[0]?.toString(); + const value = cur[i + 1]?.toString(); + return acc + `${key}: ${value}\n`; + }, ""); + return `${chalk.bold.blue(entryPoint)} + +${keyValuePairs} +***********************************`; + }) + .join("\n\n"); +} diff --git a/packages/cli/src/render/typed.ts b/packages/cli/src/render/typed.ts new file mode 100644 index 0000000..fe3f97f --- /dev/null +++ b/packages/cli/src/render/typed.ts @@ -0,0 +1,127 @@ +import * as core from "@arethetypeswrong/core"; +import { allResolutionKinds } from "@arethetypeswrong/core/utils"; +import Table, { type GenericTable, type HorizontalTableRow } from "cli-table3"; +import chalk from "chalk"; + +import { moduleKinds, problemEmoji, resolutionKinds, problemShortDescriptions, problemFlags } from "../problemUtils.js"; +import type { Opts } from "../index.js"; +import { tableFlipped } from "./tableFlipped.js"; + +export async function typed(analysis: core.TypedAnalysis, opts: Opts) { + const problems = core + .getProblems(analysis) + .filter((problem) => !opts.ignoreRules || !opts.ignoreRules.includes(problem.kind)); + + const subpaths = Object.keys(analysis.entrypointResolutions); + + if (opts.ignoreRules && opts.ignoreRules.length) { + console.log( + chalk.gray( + ` (ignoring rules: ${opts.ignoreRules + .map((rule) => `'${problemFlags[rule as core.ProblemKind]}'`) + .join(", ")})\n` + ) + ); + } + + if (opts.summary) { + const summaries = core.summarizeProblems(problems, analysis); + const defaultSummary = !opts.emoji ? " No problems found" : " No problems found ๐ŸŒŸ"; + const summaryTexts = summaries.map((summary) => { + return summary.messages + .map((message) => { + const messageText = message.messageText.split(". ").join(".\n "); + if (!opts.emoji) return ` ${messageText}`; + return ` ${problemEmoji[summary.kind]} ${messageText}`; + }) + .join("\n"); + }); + + console.log((summaryTexts.join("\n\n") || defaultSummary) + "\n"); + } + + const entrypoints = subpaths.map((s) => { + const hasProblems = problems.some((p) => p.entrypoint === s); + const color = hasProblems ? "redBright" : "greenBright"; + + if (s === ".") return chalk.bold[color](`"${analysis.packageName}"`); + else return chalk.bold[color](`"${analysis.packageName}/${s.substring(2)}"`); + }); + + if (opts.format === "table-flipped") { + const table = new Table({ + head: ["", ...allResolutionKinds.map((kind) => chalk.reset(resolutionKinds[kind]))], + colWidths: [20, ...allResolutionKinds.map(() => 25)], + }); + + subpaths.forEach((subpath, i) => { + const point = entrypoints[i]; + let row = [point]; + + row = row.concat( + allResolutionKinds.map((kind) => { + const problemsForCell = problems.filter( + (problem) => problem.entrypoint === subpath && problem.resolutionKind === kind + ); + + const resolution = analysis.entrypointResolutions[subpath][kind].resolution; + + const descriptions = problemShortDescriptions[!opts.emoji ? "noEmoji" : "emoji"]; + + if (problemsForCell.length) { + return problemsForCell.map((problem) => descriptions[problem.kind]).join("\n"); + } + + const jsonResult = !opts.emoji ? "OK (JSON)" : "๐ŸŸข (JSON)"; + + const moduleResult = (!opts.emoji ? "OK " : "๐ŸŸข ") + moduleKinds[resolution?.moduleKind?.detectedKind || ""]; + + return resolution?.isJson ? jsonResult : moduleResult; + }) + ); + + table.push(row); + }); + console.log(table.toString()); + return; + } + + const table = new Table({ + head: ["", ...entrypoints], + colWidths: [20, ...entrypoints.map(() => 35)], + }) as GenericTable; + + allResolutionKinds.forEach((kind) => { + let row = [resolutionKinds[kind]]; + + row = row.concat( + subpaths.map((subpath) => { + const problemsForCell = problems.filter( + (problem) => problem.entrypoint === subpath && problem.resolutionKind === kind + ); + + const resolution = analysis.entrypointResolutions[subpath][kind].resolution; + + const descriptions = problemShortDescriptions[!opts.emoji ? "noEmoji" : "emoji"]; + + if (problemsForCell.length) { + return problemsForCell.map((problem) => descriptions[problem.kind]).join("\n"); + } + + const jsonResult = !opts.emoji ? "OK (JSON)" : "๐ŸŸข (JSON)"; + + const moduleResult = (!opts.emoji ? "OK " : "๐ŸŸข ") + moduleKinds[resolution?.moduleKind?.detectedKind || ""]; + + return resolution?.isJson ? jsonResult : moduleResult; + }) + ); + + table.push(row); + }); + + if (opts.format === "ascii") { + console.log(tableFlipped(table)); + } else { + console.log(table.toString()); + } +} diff --git a/packages/cli/src/render/untyped.ts b/packages/cli/src/render/untyped.ts new file mode 100644 index 0000000..8c986b7 --- /dev/null +++ b/packages/cli/src/render/untyped.ts @@ -0,0 +1,5 @@ +import * as core from "@arethetypeswrong/core"; + +export function untyped(analysis: core.UntypedAnalysis) { + console.log("This package does not contain types.\nDetails: ", analysis); +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000..875740d --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,12 @@ +{ + // "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": ["es2019", "webworker"], + "module": "nodenext", + "rootDir": "src", + "types": ["ts-expose-internals", "node"], + "declaration": false, + "outDir": "./dist" + }, + "include": ["src"] +} diff --git a/packages/core/src/fetchTarballHost.ts b/packages/core/src/fetchTarballHost.ts index bf65c0c..50dd815 100644 --- a/packages/core/src/fetchTarballHost.ts +++ b/packages/core/src/fetchTarballHost.ts @@ -22,6 +22,7 @@ async function createPackageFSFromTarball(tarball: Uint8Array): Promise { async function createPackageFS(packageName: string, packageVersion = "latest"): Promise { const manifestUrl = `https://registry.npmjs.org/${packageName}/${packageVersion}`; const manifest = await fetch(manifestUrl).then((r) => r.json()); + if (typeof manifest === "string") throw { message: manifest, code: "NO_VERSION" }; const tarballUrl = manifest.dist.tarball; const tarball = new Uint8Array((await fetch(tarballUrl).then((r) => r.arrayBuffer())) satisfies ArrayBuffer); const data = gunzipSync(tarball); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index cb0d5d0..c002fe2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,3 +1,4 @@ export * from "./checkPackage.js"; export * from "./problems.js"; export type * from "./types.js"; +export * from './parsePackageSpec.js'; diff --git a/packages/core/src/parsePackageSpec.ts b/packages/core/src/parsePackageSpec.ts new file mode 100644 index 0000000..c043e6a --- /dev/null +++ b/packages/core/src/parsePackageSpec.ts @@ -0,0 +1,53 @@ +import validatePackgeName from "validate-npm-package-name"; +import type { Failable, ParsedPackageSpec } from "./types.js"; + +// Good grief https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string +const semverRegex = + /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; + +export function parsePackageSpec(input: string): Failable { + let packageName; + let version; + let i = 0; + if (input.startsWith("@")) { + i = input.indexOf("/"); + if (i === -1 || i === 1) { + return { + status: "error", + error: "Invalid package name", + }; + } + if (input.substring(0, i) === "@types") { + return { + status: "error", + error: "@types packages are not supported", + }; + } + i++; + } + i = input.indexOf("@", i); + if (i === -1) { + packageName = input; + } else { + packageName = input.slice(0, i); + version = input.slice(i + 1); + } + + // check if packageName is a valid npm package name + if (validatePackgeName(packageName).errors) { + return { + status: "error", + error: "Invalid package name", + }; + } + if (version && version !== "latest" && !semverRegex.test(version)) { + return { + status: "error", + error: "Invalid version", + }; + } + return { + status: "success", + data: { packageName, version }, + }; +} diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 086109c..95e7283 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -69,3 +69,11 @@ export interface Resolution { moduleKind: ModuleKind | undefined; exports?: SymbolTable | false; } + +export type Failable = { status: "error"; error: string } | { status: "success"; data: T }; + +export interface ParsedPackageSpec { + packageName: string; + version: string | undefined; +} + diff --git a/packages/web/src/main.ts b/packages/web/src/main.ts index 5b83f8b..f87536d 100644 --- a/packages/web/src/main.ts +++ b/packages/web/src/main.ts @@ -1,13 +1,10 @@ -import validatePackgeName from "validate-npm-package-name"; import type { ResultMessage } from "../worker/worker.ts"; import { subscribeRenderer } from "./renderer.ts"; -import { updateState, type PackageInfo, type ParsedPackageSpec, getState, subscribe, type State } from "./state.ts"; +import { updateState, type PackageInfo, getState, subscribe, type State } from "./state.ts"; import { shallowEqual } from "./utils/shallowEqual.ts"; import NProgress from "nprogress"; +import { parsePackageSpec, type ParsedPackageSpec } from "@arethetypeswrong/core"; -// Good grief https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string -const semverRegex = - /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; const worker = new Worker(new URL("../worker/worker.ts", import.meta.url), { type: "module" }); worker.onmessage = async (event: MessageEvent) => { updateState((state) => { @@ -161,55 +158,6 @@ async function fetchPackageInfo({ packageName, version }: ParsedPackageSpec): Pr } } -type Failable = { status: "error"; error: string } | { status: "success"; data: T }; - -function parsePackageSpec(input: string): Failable { - let packageName; - let version; - let i = 0; - if (input.startsWith("@")) { - i = input.indexOf("/"); - if (i === -1 || i === 1) { - return { - status: "error", - error: "Invalid package name", - }; - } - if (input.substring(0, i) === "@types") { - return { - status: "error", - error: "@types packages are not supported", - }; - } - i++; - } - i = input.indexOf("@", i); - if (i === -1) { - packageName = input; - } else { - packageName = input.slice(0, i); - version = input.slice(i + 1); - } - - // check if packageName is a valid npm package name - if (validatePackgeName(packageName).errors) { - return { - status: "error", - error: "Invalid package name", - }; - } - if (version && version !== "latest" && !semverRegex.test(version)) { - return { - status: "error", - error: "Invalid version", - }; - } - return { - status: "success", - data: { packageName, version }, - }; -} - function debounce(fn: (value: T) => void, delay: number) { let timeout: number | undefined; return (value: T) => { diff --git a/packages/web/src/state.ts b/packages/web/src/state.ts index e3d8a8b..f05a064 100644 --- a/packages/web/src/state.ts +++ b/packages/web/src/state.ts @@ -1,4 +1,4 @@ -import type { Analysis, ProblemSummary, Problem } from "@arethetypeswrong/core"; +import type { Analysis, ProblemSummary, Problem, ParsedPackageSpec } from "@arethetypeswrong/core"; import { produce } from "immer"; export interface Checks { @@ -17,11 +17,6 @@ export interface State { checks?: Checks; } -export interface ParsedPackageSpec { - packageName: string; - version: string | undefined; -} - export interface PackageInfoState { parsed?: ParsedPackageSpec; info?: PackageInfo; diff --git a/tsconfig.base.json b/tsconfig.base.json index 1c93b47..dd087cc 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -11,4 +11,4 @@ "declarationMap": true, "types": [] } -} \ No newline at end of file +}