diff --git a/.changeset/fluffy-ladybugs-fry.md b/.changeset/fluffy-ladybugs-fry.md new file mode 100644 index 00000000..702bec98 --- /dev/null +++ b/.changeset/fluffy-ladybugs-fry.md @@ -0,0 +1,5 @@ +--- +"microsite": patch +--- + +Remove prettier from core dependencies diff --git a/.changeset/late-lions-leave.md b/.changeset/late-lions-leave.md new file mode 100644 index 00000000..0c92119a --- /dev/null +++ b/.changeset/late-lions-leave.md @@ -0,0 +1,5 @@ +--- +"microsite": patch +--- + +Remove PostCSS logic from core dependencies. Microsite will prompt users to install PostCSS locally if detected. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..8ad171bc --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# Contributing to Microsite + +This codebase is a monorepo, set up with [Lerna](https://github.com/lerna/lerna). You should start by familiarizing yourself with `lerna`, as it operates a little bit differently than the standard Node/NPM workflow. + +> Note: Commands should generally be run from the root directory of the monorepo rather than a subdirectory like `packages/microsite`. + +## Initial dev setup + +1. Install [Volta](https://volta.sh/) if you haven't already. It's our favorite tools for managing Node/NPM versions, and automatically picks up the correct Node version for this project. + +2. Install dependencies for the monorepo: `npm install`. + +3. Install and link dependencies in sub-packages: `npx lerna bootstrap` + +## Adding features/fixing bugs +Please open an issue describing your feature/bug before opening a PR. + +Please ensure that your PR is covered by a test, if applicable. Microsite currently has very fews tests but this is something we hope to prioritize. + +## Testing + +Our tests are written in TypeScript with [`uvu`](https://github.com/lukeed/uvu). They are run with the `uvu` CLI and [`@swc-node/register`](https://github.com/Brooooooklyn/swc-node/tree/master/packages/register). + +> Note: as of `@swc-node/register@1.0.3`, `jsxFactory` and `jsxFragmentFactory` are not respected. This means any Preact components need to include the following comment at the top of the file: +> `/* @jsx h */` +> This should be fixed in the next version of `@swc-node/register`. + +```bash +npm run test + +# Or watch mode (requires a file change to run the first time) +npm run test:watch +``` + +**VSCode:** There are launch actions included for both single-run and watch mode. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..1ccb36f9 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,21 @@ +name: Test + +on: push + +jobs: + test: + name: Test + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - uses: volta-cli/action@v1 + + - run: npm ci + + - run: npm run bootstrap:ci + + - run: npm run test diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..c120bbfd --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run tests", + "request": "launch", + "console": "integratedTerminal", + "autoAttachChildProcesses": true, + "runtimeArgs": [ + "run-script", + "test" + ], + "runtimeExecutable": "npm", + "skipFiles": [ + "/**" + ], + "type": "pwa-node" + }, + { + "name": "Watch tests", + "request": "launch", + "console": "integratedTerminal", + "autoAttachChildProcesses": true, + "runtimeArgs": [ + "run-script", + "test:watch" + ], + "runtimeExecutable": "npm", + "skipFiles": [ + "/**" + ], + "type": "pwa-node" + }, + ] +} diff --git a/package-lock.json b/package-lock.json index d44a68e3..1930aff0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2621,6 +2621,30 @@ "glob-to-regexp": "^0.3.0" } }, + "@napi-rs/triples": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.2.tgz", + "integrity": "sha512-EL3SiX43m9poFSnhDx4d4fn9SSaqyO2rHsCNhETi9bWPmjXK3uPJ0QpPFtx39FEdHcz1vJmsiW41kqc0AgvtzQ==", + "dev": true + }, + "@node-rs/helper": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.0.0.tgz", + "integrity": "sha512-B4CSMHCuYPqai3LMsRTXyvBEP24YRnCZUUsDPYkgFD6tFA+q43rLkaEzsnTJTKJq5ZnJ4n5YJpJwEz7Xn8+0vg==", + "dev": true, + "requires": { + "@napi-rs/triples": "^1.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -2830,6 +2854,170 @@ "@types/node": ">= 8" } }, + "@swc-node/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@swc-node/core/-/core-1.2.0.tgz", + "integrity": "sha512-b2/KhALbKlrxCfnYbxm8aB4TmlmQwTuQkuZMGxmx4UaGKEgw78tdbR+eS45lWdBRv30/CeCHermMxcxwvU7DXg==", + "dev": true, + "requires": { + "@swc/core": "^1.2.46" + } + }, + "@swc-node/register": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@swc-node/register/-/register-1.0.4.tgz", + "integrity": "sha512-svYIPXdApREvZwc3gAufs8A4dT8pWjJdwsPfuFxcJ0hKnTWqWN11XOLOEFOVIR+76BYIRKZxlcNrDF2rP1FIzw==", + "dev": true, + "requires": { + "@swc-node/core": "^1.2.0", + "@swc-node/sourcemap-support": "^0.1.8", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "pirates": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@swc-node/sourcemap-support": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@swc-node/sourcemap-support/-/sourcemap-support-0.1.8.tgz", + "integrity": "sha512-AOH32yNN8UJh6Ayc+r3mnPdrjqqEjtXr9wsEiEhh3OqJWFXqkMOHC+18FYhHdTzGzhaYqUshQONjqOTC38yx7Q==", + "dev": true, + "requires": { + "source-map-support": "^0.5.19" + } + }, + "@swc/core": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.46.tgz", + "integrity": "sha512-mcyaP/uHykJdBZ4HXgbaiVVHZIVdgieclzQbZf/eDeqdqdA0BB0eVucPnJ1Lb5mTSf+eopwsUVcnKo4R+jpycg==", + "dev": true, + "requires": { + "@node-rs/helper": "^1.0.0", + "@swc/core-android-arm64": "^1.2.46", + "@swc/core-darwin-arm64": "^1.2.46", + "@swc/core-darwin-x64": "^1.2.46", + "@swc/core-linux-arm-gnueabihf": "^1.2.46", + "@swc/core-linux-arm64-gnu": "^1.2.46", + "@swc/core-linux-x64-gnu": "^1.2.46", + "@swc/core-linux-x64-musl": "^1.2.46", + "@swc/core-win32-x64-msvc": "^1.2.46" + } + }, + "@swc/core-android-arm64": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.46.tgz", + "integrity": "sha512-VFHvcrpOwDXcsHAHQ0k0yd3kBDJKCrm4U1kKC4gn5oXlNEXvc2UOAzQNc6+gYqTTopvJ9xDsjrAX0Ugha2WewA==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-arm64": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.46.tgz", + "integrity": "sha512-wNcHEcKrHCM1GpQo2FyWpYnr2v5E4mz5+0FxO27QB2oHoUVN6bxMuY0yFmK0e0FmspZfetWKz+q3iNb92QwlaA==", + "dev": true, + "optional": true + }, + "@swc/core-darwin-x64": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.46.tgz", + "integrity": "sha512-Kq8dKTCWjQl+HQzcSjxQtpDET3NAJMycf1XizesjHlROQy16uab3zSXze/9kH/A3E2eGM/1GmmdMk6D9xgJOFw==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.46.tgz", + "integrity": "sha512-f3q45vPXuCy/OudgIpv3Sw/x9CMsiEEzBtMLkyiyZH6RRKLeSy0DvJezKqBQ/OE7DhrBLGzM64D8Kx//zla6vg==", + "dev": true, + "optional": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.46.tgz", + "integrity": "sha512-oe9VM/tUnRQ1JbHkOiLZwF9X1rrfX5INvQIktkf1l0Sw8d8RssVqu9dEAQ2V0Mk4JPvnnyKCAtur9hjbOmtsZw==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.46.tgz", + "integrity": "sha512-NfmXIL61FPAlG/YIOZRZTw8pczf8zkB+V+H6udds/i8c4tpIsZLqaOy6sGFjIBRLEDSs2AXO9C5nLlR5Fr2KnQ==", + "dev": true, + "optional": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.46.tgz", + "integrity": "sha512-Rj4j8FRj9nO6FwcUEhws2PM5w6/PJOF4LXDiGWi0yWG4XDqOto0lm1KVXZ++9XIpql7szPHbeW44yNuBd64eyw==", + "dev": true, + "optional": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.2.46", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.46.tgz", + "integrity": "sha512-VSw9G9wbg+qCqnMo0hDGt0WUAXBZRR6BziAmJxt/O8g7qeCZyKajgccAGaQtDUDkz3LtoU+5MKTaVRUJq5Pp/g==", + "dev": true, + "optional": true + }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -2897,12 +3085,40 @@ "through": ">=2.2.7 <3" } }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -3370,6 +3586,12 @@ "wcwidth": "^1.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "btoa-lite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", @@ -4475,6 +4697,29 @@ "which": "^2.0.1" } }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, "csv": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/csv/-/csv-5.3.2.tgz", @@ -4538,6 +4783,45 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + } + } + }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -4583,6 +4867,12 @@ } } }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -4595,6 +4885,12 @@ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", @@ -4678,6 +4974,12 @@ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, + "dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", + "dev": true + }, "detect-indent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", @@ -4703,6 +5005,23 @@ "path-type": "^4.0.0" } }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -4870,12 +5189,37 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -5084,6 +5428,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastq": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", @@ -6152,6 +6502,15 @@ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -6559,6 +6918,12 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -6740,6 +7105,12 @@ } } }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, "is-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", @@ -6855,6 +7226,79 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + } + } + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -6918,6 +7362,12 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "kleur": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", + "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", + "dev": true + }, "lerna": { "version": "3.22.1", "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.22.1.tgz", @@ -6944,6 +7394,16 @@ "npmlog": "^4.1.2" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -7636,6 +8096,12 @@ "run-queue": "^1.0.3" } }, + "mri": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", + "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -7760,6 +8226,12 @@ } } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "nopt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", @@ -7903,6 +8375,12 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -8044,6 +8522,20 @@ "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -8228,6 +8720,12 @@ "protocols": "^1.4.0" } }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -8303,6 +8801,15 @@ "pinkie": "^2.0.0" } }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -8378,6 +8885,12 @@ } } }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "prettier": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", @@ -8707,6 +9220,26 @@ "uuid": "^3.3.2" } }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8825,6 +9358,15 @@ "tslib": "^1.9.0" } }, + "sade": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", + "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -8846,6 +9388,15 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -9201,6 +9752,16 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -9366,6 +9927,12 @@ } } }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -9563,6 +10130,12 @@ "has-flag": "^3.0.0" } }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "tar": { "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", @@ -9716,6 +10289,12 @@ "is-number": "^7.0.0" } }, + "totalist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz", + "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==", + "dev": true + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -9848,6 +10427,15 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", @@ -10024,6 +10612,27 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "uvu": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.1.tgz", + "integrity": "sha512-JGxttnOGDFs77FaZ0yMUHIzczzQ5R1IlDeNW6Wymw6gAscwMdAffVOP6TlxLIfReZyK8tahoGwWZaTCJzNFDkg==", + "dev": true, + "requires": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3", + "totalist": "^2.0.0" + }, + "dependencies": { + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + } + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -10062,6 +10671,33 @@ "extsprintf": "^1.2.0" } }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "watchlist": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/watchlist/-/watchlist-0.2.3.tgz", + "integrity": "sha512-xStuPg489QXZbRirnmIMo7OaKFnGkvTQn7tCUC/sVmVVEvDQQnnVl/k9D5yg3nXgpebgPHpfApBLHMpEbAqvSQ==", + "dev": true, + "requires": { + "mri": "^1.1.5" + } + }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -10077,6 +10713,21 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, "whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", @@ -10230,6 +10881,12 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -10374,6 +11031,24 @@ } } }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 83c0b70c..1a62e0c4 100644 --- a/package.json +++ b/package.json @@ -9,16 +9,22 @@ "build": "npx lerna run build --scope=microsite --scope=create-microsite --sort", "prebuild:examples": "node scripts/generate-examples", "build:examples": "npx lerna run build --scope='@example/*' --parallel", - "postbuild:examples": "node scripts/copy-examples" + "postbuild:examples": "node scripts/copy-examples", + "test": "SWC_NODE_PROJECT=./tsconfig.test.json uvu packages test -r @swc-node/register -i _fixtures", + "test:watch": "watchlist packages -- npm run test" }, "devDependencies": { "@changesets/cli": "^2.11.2", + "@swc-node/register": "1.0.4", "fs-extra": "^9.0.1", "husky": "^4.3.0", + "jsdom": "^16.4.0", "lerna": "^3.22.1", "lint-staged": "^10.4.2", "prettier": "^2.1.2", - "typescript": "^4.1.2" + "typescript": "^4.1.2", + "uvu": "^0.5.0", + "watchlist": "0.2.3" }, "volta": { "node": "12.20.1" diff --git a/packages/create-microsite/test/example.ts b/packages/create-microsite/test/example.ts new file mode 100644 index 00000000..b0bc4e65 --- /dev/null +++ b/packages/create-microsite/test/example.ts @@ -0,0 +1,10 @@ +import { suite } from 'uvu'; +import * as assert from 'uvu/assert'; + +const a = suite('a'); + +a('a test', () => { + assert.is(1, 1); +}); + +a.run(); diff --git a/packages/microsite/assets/snowpack.config.cjs b/packages/microsite/assets/snowpack.config.cjs index 11efaf7f..479b413d 100644 --- a/packages/microsite/assets/snowpack.config.cjs +++ b/packages/microsite/assets/snowpack.config.cjs @@ -8,9 +8,9 @@ module.exports = { '@prefresh/snowpack', 'microsite/assets/snowpack-plugin.cjs' ], - installOptions: { - installTypes: true, - externalPackage: [ + packageOptions: { + source: 'local', + external: [ ...builtins, "microsite/server/fetch", "microsite/document", diff --git a/packages/microsite/package.json b/packages/microsite/package.json index 78d8cd0b..dd83b1e9 100644 --- a/packages/microsite/package.json +++ b/packages/microsite/package.json @@ -43,9 +43,8 @@ "**/*.d.ts" ], "dependencies": { - "@prefresh/snowpack": "^3.0.0", + "@prefresh/snowpack": "^3.0.1", "@snowpack/plugin-dotenv": "^2.0.5", - "@snowpack/plugin-postcss": "^1.0.11", "arg": "^5.0.0", "cacache": "^15.0.5", "cosmiconfig": "^7.0.0", @@ -58,17 +57,12 @@ "open": "^7.3.0", "path-browserify": "^1.0.1", "polka": "^0.5.2", - "postcss": "^8.2.1", - "postcss-cli": "^8.3.1", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-preset-env": "^6.7.0", "preact": "^10.5.5", "preact-render-to-string": "5.1.11", - "prettier": "^2.1.2", "rollup": "^2.32.1", "rollup-plugin-styles": "^3.11.0", "sirv": "^1.0.10", - "snowpack": "^3.0.0-rc.2" + "snowpack": "^3.0.5" }, "devDependencies": { "@types/node": "^12.19.0", diff --git a/packages/microsite/src/cli/microsite-build.ts b/packages/microsite/src/cli/microsite-build.ts index 23eff593..ca73ed94 100644 --- a/packages/microsite/src/cli/microsite-build.ts +++ b/packages/microsite/src/cli/microsite-build.ts @@ -1,4 +1,4 @@ -import { buildProject } from "snowpack"; +import { build as buildProject } from "snowpack"; import { dirname, resolve } from "path"; import glob from "globby"; import arg from "arg"; @@ -61,15 +61,11 @@ export default async function build( let basePath = resolveNormalizedBasePath(args); setBasePath(basePath); - const [errs, config] = await loadConfiguration("build"); - if (errs) { - errs.forEach((err) => console.error(err.message)); - return; - } + const config = await loadConfiguration("build"); const buildStart = performance.now(); await Promise.all([ prepare(), - buildProject({ config, cwd: process.cwd(), lockfile: null }), + buildProject({ config, lockfile: null }), ]); let pages = await glob(resolve(STAGING_DIR, "src/pages/**/*.js")); @@ -289,7 +285,7 @@ async function bundlePagesForSSR(paths: string[]) { * * Components reused for multiple routes are placed in a shared chunk. * - * All code from 'web_modules' is placed in a vendor chunk. + * All code from '_snowpack/pkg' is placed in a vendor chunk. */ manualChunks(id, { getModuleInfo }) { const info = getModuleInfo(id); @@ -300,7 +296,7 @@ async function bundlePagesForSSR(paths: string[]) { // If we only import this module in global/index.js, inline to _global chunk if (/global\/index\.js$/.test(info.importers[0])) return `_hydrate/chunks/_vendor/global`; } - if (/web_modules/.test(info.id)) return `_hydrate/chunks/_vendor/index`; + if (/_snowpack\/pkg/.test(info.id)) return `_hydrate/chunks/_vendor/index`; const dependentStaticEntryPoints = []; const dependentHydrateEntryPoints = []; diff --git a/packages/microsite/src/cli/microsite-dev.ts b/packages/microsite/src/cli/microsite-dev.ts index dcfe6adf..ba25c566 100644 --- a/packages/microsite/src/cli/microsite-dev.ts +++ b/packages/microsite/src/cli/microsite-dev.ts @@ -1,4 +1,4 @@ -import { startDevServer } from "snowpack"; +import { startServer } from "snowpack"; import arg from "arg"; import { join, resolve, extname } from "path"; import type { IncomingMessage, ServerResponse } from "http"; @@ -13,7 +13,7 @@ import { loadConfiguration } from "../utils/command.js"; const pageScript = ( page: string, props?: any -) => `import { csr } from '/web_modules/microsite/client/csr.js'; +) => `import { csr } from '/_snowpack/pkg/microsite/client/csr.js'; import Page from '${page}'; csr("${page.replace(/\/src\/pages/, "").replace(/\.js$/, "")}", ${ props ? `Page, ${JSON.stringify(props)}` : `Page` @@ -21,8 +21,8 @@ csr("${page.replace(/\/src\/pages/, "").replace(/\.js$/, "")}", ${ const errorScript = ( props: any -) => `import { h, render } from '/web_modules/preact.js'; -import Page from '/web_modules/microsite/error.js'; +) => `import { h, render } from '/_snowpack/pkg/preact.js'; +import Page from '/_snowpack/pkg/microsite/error.js'; const root = document.querySelector('#__microsite'); render(h(Page, ${JSON.stringify(props)}, null), root);`; @@ -37,26 +37,28 @@ const globalScript = () => `(async () => { document.documentElement.style.removeProperty('visibility'); })()`; -const doc = ( +const doc = async ( page: string, props?: any -) => `\n\n\n\t\n\t +) => { + return `\n\n\n\t\n\t \t\t
\t\t -\t\t +\t\t \t\t \t\t -\n`; +\n` +}; const errorPage = ( props: any ) => `\n\n\n\t\n\t \t\t
\t\t -\t\t +\t\t \t\t \t\t`; @@ -80,14 +82,9 @@ export default async function dev(argvOrParsedArgs: string[]|ReturnType console.error(err)); - return; - } - - const snowpack = await startDevServer({ - cwd: process.cwd(), + const config = await loadConfiguration('dev'); + + const snowpack = await startServer({ config, lockfile: null, }); @@ -104,7 +101,7 @@ export default async function dev(argvOrParsedArgs: string[]|ReturnType); contents = contents.replace(/(\?h[\s\S]*?\?)<\/hydrate-marker>/g, '<$1>\n'); - contents = prettier.format(contents, { - parser: "html", - embeddedLanguageFormatting: "off", - }); contents = '\n\n' + contents; return { diff --git a/packages/microsite/src/utils/command.ts b/packages/microsite/src/utils/command.ts index ece9f150..09af1ee4 100644 --- a/packages/microsite/src/utils/command.ts +++ b/packages/microsite/src/utils/command.ts @@ -6,6 +6,7 @@ const require = createRequire(import.meta.url); import { fileExists } from "./fs.js"; import { createConfiguration } from "snowpack"; import cc from "cosmiconfig"; +import { yellow } from "kleur/colors"; const { cosmiconfig } = cc; const _config = require("microsite/assets/snowpack.config.cjs"); @@ -39,7 +40,22 @@ export async function loadConfiguration(mode: "dev" | "build") { ? resolveTsconfigPathsToAlias({ tsconfigPath }) : {}; const userConfig = snowpackconfigPath ? require(snowpackconfigPath) : {}; - + + if (usesPostCSS) { + const missing = []; + const deps = ['@snowpack/plugin-postcss', 'postcss', 'postcss-cli']; + deps.forEach(dependency => { + try { + require.resolve(dependency); + } catch (e) { + missing.push(dependency); + } + }); + if (missing.length > 0) { + console.error(yellow(`It looks like you're trying to use PostCSS!\nMicrosite will automatically use your configuration, but requires some 'devDependencies' to do so.\n\nPlease run 'npm install --save-dev ${missing.join(' ')}'\n`)); + process.exit(1); + } + } const additionalPlugins = usesPostCSS ? ["@snowpack/plugin-postcss"] : []; switch (mode) { @@ -47,6 +63,11 @@ export async function loadConfiguration(mode: "dev" | "build") { return createConfiguration({ ...userConfig, ..._config, + buildOptions: { + ...userConfig.buildOptions, + ..._config.buildOptions, + ssr: true + }, plugins: [...additionalPlugins, ..._config.plugins, ...(userConfig.plugins ?? [])], alias: { ...(userConfig.aliases ?? {}), @@ -54,25 +75,32 @@ export async function loadConfiguration(mode: "dev" | "build") { ...(_config.alias ?? {}), "microsite/hydrate": "microsite/client/hydrate", }, - installOptions: { - ...(userConfig.installOptions ?? {}), - ..._config.installOptions, - externalPackage: ["/web_modules/microsite/_error.js"], + packageOptions: { + ..._config.packageOptions, + external: ["/web_modules/microsite/_error.js"], }, }); case "build": return createConfiguration({ ...userConfig, ..._config, + buildOptions: { + ...userConfig.buildOptions, + ..._config.buildOptions, + ssr: true + }, plugins: [...additionalPlugins, ..._config.plugins, ...(userConfig.plugins ?? [])], alias: { ...(userConfig.aliases ?? {}), ...aliases, ...(_config.alias ?? {}), }, - installOptions: { - ...(userConfig.installOptions ?? {}), - ..._config.installOptions, + packageOptions: { + ..._config.packageOptions, + external: [ + ...(userConfig.packageOptions?.external ?? []), + ..._config.packageOptions.external, + ].filter((v) => v !== "preact"), rollup: { ...(userConfig.installOptions?.rollup ?? {}), ...(_config.installOptions?.rollup ?? {}), @@ -85,11 +113,7 @@ export async function loadConfiguration(mode: "dev" | "build") { } } ], - }, - externalPackage: [ - ...(userConfig.installOptions?.externalPackage ?? []), - ..._config.installOptions.externalPackage, - ].filter((v) => v !== "preact"), + } }, }); } diff --git a/packages/microsite/test/_fixtures/env.ts b/packages/microsite/test/_fixtures/env.ts new file mode 100644 index 00000000..236894d8 --- /dev/null +++ b/packages/microsite/test/_fixtures/env.ts @@ -0,0 +1,48 @@ +import { JSDOM } from 'jsdom'; +import * as Preact from 'preact'; +import { act } from 'preact/test-utils'; + +const { window } = new JSDOM('
'); + +export function setup() { + // @ts-ignore + global.window = window; + global.document = window.document; + global.navigator = window.navigator; + global.getComputedStyle = window.getComputedStyle; + global.requestAnimationFrame = null; +} + +export function reset() { + window.document.title = ''; + window.document.head.innerHTML = ''; + window.document.body.innerHTML = '
'; +} + +/** + * @typedef RenderOutput + * @property container {HTMLElement} + * @property component {Preact.VNode} + */ + +/** + * @return {RenderOutput} + */ +export function render(Tag, props = {}) { + const container = window.document.querySelector('main'); + const component = Preact.h(Tag, props); + Preact.render(component, container) + return { container, component }; +} + +/** + * @param {HTMLElement} elem + * @param {String} event + * @param {any} [details] + */ +export async function fire(elem, event, details) { + await act(() => { + let evt = new window.Event(event, details); + elem.dispatchEvent(evt); + }); +} diff --git a/packages/microsite/test/document.ts b/packages/microsite/test/document.ts new file mode 100644 index 00000000..ab34269e --- /dev/null +++ b/packages/microsite/test/document.ts @@ -0,0 +1,20 @@ +import { suite } from 'uvu'; +import * as assert from 'uvu/assert'; +import * as ENV from './_fixtures/env'; +import { Document } from '../src/document'; + + +const component = suite('Component'); +component.before(ENV.setup); +component.before.each(ENV.reset); + +component('should render a basic HTML document', () => { + const { container } = ENV.render(Document, {}); + + assert.snapshot( + container.innerHTML, + `
` + ); +}); + +component.run(); diff --git a/packages/microsite/test/utils/fs.ts b/packages/microsite/test/utils/fs.ts new file mode 100644 index 00000000..32deaa17 --- /dev/null +++ b/packages/microsite/test/utils/fs.ts @@ -0,0 +1,18 @@ +import { suite } from 'uvu'; +import * as assert from 'uvu/assert'; +import { fileExists } from '../../src/utils/fs'; + +import { resolve } from 'path'; + + +const exists = suite('fileExists'); + +exists('should be a function', () => { + assert.type(fileExists, 'function'); +}); + +exists('should return true', async () => { + assert.is(await fileExists(resolve(__dirname, '../../package.json')), true); +}); + +exists.run(); diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 00000000..1e606c32 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "moduleResolution": "node", + "jsx": "react", + "jsxFactory": "h", + "jsxFragmentFactory": "Fragment", + }, + "include": [ + "**/test/**/*", + "**/src/**/*" + ] +}