From e96c2248ee3a200f02b75083d351659f1f4d5ee0 Mon Sep 17 00:00:00 2001 From: Miel Truyen Date: Sun, 3 Dec 2023 10:42:51 +0100 Subject: [PATCH] test: added testing via a browser (puppeteer) --- package.json | 7 +- pnpm-lock.yaml | 618 ++++++++++++++++++ src/index.ts | 4 +- test/basic/test.js | 6 +- .../fixtures/assets/assistant.ttf | Bin 0 -> 79660 bytes .../fixtures/assets/logo-sq.svg | 8 + test/evaluated-web-bundle/fixtures/batman.js | 1 + test/evaluated-web-bundle/fixtures/index.hbs | 18 + test/evaluated-web-bundle/fixtures/index.js | 27 + .../evaluated-web-bundle/snapshots/test.js.md | 73 +++ .../snapshots/test.js.snap | Bin 0 -> 1162 bytes test/evaluated-web-bundle/test.js | 58 ++ test/js-import/snapshots/test.js.md | 4 +- test/js-import/test.js | 4 +- test/live-reload/test.js | 4 +- test/multi-entry/test.js | 4 +- test/rewrite-url/test.js | 4 +- test/templating/test.js | 4 +- test/url-plugin/test.js | 6 +- test/util/code-output.ts | 26 + test/util/index.ts | 6 + test/util/{test.js => misc.js} | 54 -- test/util/print-code-output.ts | 32 + test/util/test-server.ts | 384 +++++++++++ test/util/test.d.ts | 45 -- test/watch/test.js | 4 +- tsconfig.json | 3 +- 27 files changed, 1281 insertions(+), 123 deletions(-) create mode 100644 test/evaluated-web-bundle/fixtures/assets/assistant.ttf create mode 100644 test/evaluated-web-bundle/fixtures/assets/logo-sq.svg create mode 100644 test/evaluated-web-bundle/fixtures/batman.js create mode 100644 test/evaluated-web-bundle/fixtures/index.hbs create mode 100644 test/evaluated-web-bundle/fixtures/index.js create mode 100644 test/evaluated-web-bundle/snapshots/test.js.md create mode 100644 test/evaluated-web-bundle/snapshots/test.js.snap create mode 100644 test/evaluated-web-bundle/test.js create mode 100644 test/util/code-output.ts create mode 100644 test/util/index.ts rename test/util/{test.js => misc.js} (62%) create mode 100644 test/util/print-code-output.ts create mode 100644 test/util/test-server.ts delete mode 100644 test/util/test.d.ts diff --git a/package.json b/package.json index 896c83d..ecea7e3 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.5", + "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-url": "^8.0.2", "@types/node": "^18.18.12", "ava": "^5.3.1", @@ -81,7 +82,11 @@ "rollup-plugin-postcss": "^4.0.2", "tslib": "^2.6.2", "tsx": "^4.4.0", - "typescript": "^5.3.2" + "typescript": "^5.3.2", + "puppeteer": "^21.5.2", + "mime": "^4.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "types": "./types/index.d.ts", "ava": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6238697..639f048 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,6 +31,9 @@ devDependencies: '@rollup/plugin-node-resolve': specifier: ^15.2.3 version: 15.2.3(rollup@3.29.4) + '@rollup/plugin-terser': + specifier: ^0.4.4 + version: 0.4.4(rollup@3.29.4) '@rollup/plugin-typescript': specifier: ^11.1.5 version: 11.1.5(rollup@3.29.4)(tslib@2.6.2)(typescript@5.3.2) @@ -55,12 +58,24 @@ devDependencies: lint-staged: specifier: ^13.3.0 version: 13.3.0 + mime: + specifier: ^4.0.0 + version: 4.0.0 nyc: specifier: ^15.1.0 version: 15.1.0 postcss: specifier: ^8.4.31 version: 8.4.31 + puppeteer: + specifier: ^21.5.2 + version: 21.5.2(typescript@5.3.2) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) rollup: specifier: ^3.29.4 version: 3.29.4 @@ -649,6 +664,13 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -680,6 +702,22 @@ packages: fastq: 1.15.0 dev: true + /@puppeteer/browsers@1.8.0: + resolution: {integrity: sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==} + engines: {node: '>=16.3.0'} + hasBin: true + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.3.1 + tar-fs: 3.0.4 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + /@rollup/plugin-babel@6.0.4(@babel/core@7.23.3)(rollup@3.29.4): resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} engines: {node: '>=14.0.0'} @@ -717,6 +755,21 @@ packages: rollup: 3.29.4 dev: true + /@rollup/plugin-terser@0.4.4(rollup@3.29.4): + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.29.4 + serialize-javascript: 6.0.1 + smob: 1.4.1 + terser: 5.24.0 + dev: true + /@rollup/plugin-typescript@11.1.5(rollup@3.29.4)(tslib@2.6.2)(typescript@5.3.2): resolution: {integrity: sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==} engines: {node: '>=14.0.0'} @@ -766,6 +819,10 @@ packages: picomatch: 2.3.1 rollup: 3.29.4 + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + dev: true + /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -803,6 +860,14 @@ packages: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 18.18.12 + dev: true + optional: true + /acorn-walk@8.3.0: resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} engines: {node: '>=0.4.0'} @@ -814,6 +879,15 @@ packages: hasBin: true dev: true + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -891,6 +965,10 @@ packages: sprintf-js: 1.0.3 dev: true + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /array-find-index@1.0.2: resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} engines: {node: '>=0.10.0'} @@ -916,6 +994,13 @@ packages: engines: {node: '>=12'} dev: true + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.6.2 + dev: true + /ava@5.3.1: resolution: {integrity: sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==} engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} @@ -973,10 +1058,23 @@ packages: - supports-color dev: true + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /basic-ftp@5.0.3: + resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} + engines: {node: '>=10.0.0'} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -1015,6 +1113,21 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1030,6 +1143,11 @@ packages: write-file-atomic: 3.0.3 dev: true + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + /callsites@4.1.0: resolution: {integrity: sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==} engines: {node: '>=12.20'} @@ -1112,6 +1230,16 @@ packages: fsevents: 2.3.3 dev: true + /chromium-bidi@0.4.33(devtools-protocol@0.0.1203626): + resolution: {integrity: sha512-IxoFM5WGQOIAd95qrSXzJUv4eXIrh+RvU3rwwqIiwYuvfE7U/Llj4fejbsJnjJMUYCuGtVQsY2gv7oGl4aTNSQ==} + peerDependencies: + devtools-protocol: '*' + dependencies: + devtools-protocol: 0.0.1203626 + mitt: 3.0.1 + urlpattern-polyfill: 9.0.0 + dev: true + /chunkd@2.0.1: resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} dev: true @@ -1215,6 +1343,10 @@ packages: engines: {node: '>=16'} dev: true + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -1265,6 +1397,30 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /cosmiconfig@8.3.6(typescript@5.3.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.3.2 + dev: true + + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1385,6 +1541,11 @@ packages: array-find-index: 1.0.2 dev: true + /data-uri-to-buffer@6.0.1: + resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} + engines: {node: '>= 14'} + dev: true + /date-time@3.1.0: resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} engines: {node: '>=6'} @@ -1434,6 +1595,15 @@ packages: strip-bom: 4.0.0 dev: true + /degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + dev: true + /del-cli@5.1.0: resolution: {integrity: sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==} engines: {node: '>=14.16'} @@ -1471,6 +1641,10 @@ packages: slash: 4.0.0 dev: true + /devtools-protocol@0.0.1203626: + resolution: {integrity: sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==} + dev: true + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1526,6 +1700,12 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true @@ -1595,12 +1775,29 @@ packages: engines: {node: '>=12'} dev: true + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + /estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} dev: true @@ -1636,10 +1833,28 @@ packages: strip-final-newline: 3.0.0 dev: true + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + dev: true + /fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: true + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1657,6 +1872,12 @@ packages: reusify: 1.0.4 dev: true + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + /figures@5.0.0: resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} engines: {node: '>=14'} @@ -1717,6 +1938,15 @@ packages: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} dev: true + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -1753,6 +1983,13 @@ packages: engines: {node: '>=8.0.0'} dev: true + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1764,6 +2001,18 @@ packages: resolve-pkg-maps: 1.0.0 dev: true + /get-uri@6.0.2: + resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} + engines: {node: '>= 14'} + dependencies: + basic-ftp: 5.0.3 + data-uri-to-buffer: 6.0.1 + debug: 4.3.4 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1870,6 +2119,26 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} @@ -1888,6 +2157,10 @@ packages: postcss: 8.4.31 dev: true + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + /ignore-by-default@2.1.0: resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} engines: {node: '>=10 <11 || >=12 <13 || >=14'} @@ -1905,6 +2178,14 @@ packages: import-from: 3.0.0 dev: true + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + /import-from@3.0.0: resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} engines: {node: '>=8'} @@ -1938,6 +2219,14 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true + /ip@1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: true + + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: true + /irregular-plurals@3.5.0: resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} engines: {node: '>=8'} @@ -2145,6 +2434,13 @@ packages: esprima: 4.0.1 dev: true + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -2161,6 +2457,12 @@ packages: hasBin: true dev: true + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -2292,6 +2594,13 @@ packages: wrap-ansi: 8.1.0 dev: true + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -2305,6 +2614,11 @@ packages: yallist: 4.0.0 dev: true + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: true + /magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} @@ -2410,6 +2724,12 @@ packages: hasBin: true dev: true + /mime@4.0.0: + resolution: {integrity: sha512-pzhgdeqU5pJ9t5WK9m4RT4GgGWqYJylxUf62Yb9datXRwdcw5MjiD1BYI5evF8AgTXN9gtKX3CFLvCUL5fAhEA==} + engines: {node: '>=16'} + hasBin: true + dev: true + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -2444,6 +2764,14 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -2462,6 +2790,23 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-preload@0.2.1: resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} engines: {node: '>=8'} @@ -2669,6 +3014,31 @@ packages: engines: {node: '>=6'} dev: true + /pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.0 + debug: 4.3.4 + get-uri: 6.0.2 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + pac-resolver: 7.0.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /pac-resolver@7.0.0: + resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + ip: 1.1.8 + netmask: 2.0.2 + dev: true + /package-hash@4.0.0: resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} engines: {node: '>=8'} @@ -2679,6 +3049,13 @@ packages: release-zalgo: 1.0.0 dev: true + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -2734,6 +3111,10 @@ packages: engines: {node: '>=8'} dev: true + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -3166,20 +3547,112 @@ packages: fromentries: 1.3.2 dev: true + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + /promise.series@0.2.0: resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} engines: {node: '>=0.12'} dev: true + /proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /puppeteer-core@21.5.2: + resolution: {integrity: sha512-v4T0cWnujSKs+iEfmb8ccd7u4/x8oblEyKqplqKnJ582Kw8PewYAWvkH4qUWhitN3O2q9RF7dzkvjyK5HbzjLA==} + engines: {node: '>=16.13.2'} + dependencies: + '@puppeteer/browsers': 1.8.0 + chromium-bidi: 0.4.33(devtools-protocol@0.0.1203626) + cross-fetch: 4.0.0 + debug: 4.3.4 + devtools-protocol: 0.0.1203626 + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /puppeteer@21.5.2(typescript@5.3.2): + resolution: {integrity: sha512-BaAGJOq8Fl6/cck6obmwaNLksuY0Bg/lIahCLhJPGXBFUD2mCffypa4A592MaWnDcye7eaHmSK9yot0pxctY8A==} + engines: {node: '>=16.13.2'} + requiresBuild: true + dependencies: + '@puppeteer/browsers': 1.8.0 + cosmiconfig: 8.3.6(typescript@5.3.2) + puppeteer-core: 21.5.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + dev: true + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: true + /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} dev: true + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: true + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: true + /read-pkg-up@8.0.0: resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} engines: {node: '>=12'} @@ -3237,6 +3710,11 @@ packages: resolve-from: 5.0.0 dev: true + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -3339,10 +3817,20 @@ packages: queue-microtask: 1.2.3 dev: true + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + /safe-identifier@0.4.2: resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} dev: true + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: true + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3363,6 +3851,12 @@ packages: type-fest: 0.13.1 dev: true + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true @@ -3406,11 +3900,46 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /smob@1.4.1: + resolution: {integrity: sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==} + dev: true + + /socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: true + + /socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: true + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} dev: true + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3466,6 +3995,13 @@ packages: escape-string-regexp: 2.0.0 dev: true + /streamx@2.15.5: + resolution: {integrity: sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: true + /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -3582,11 +4118,38 @@ packages: stable: 0.1.8 dev: true + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: true + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.5 + dev: true + /temp-dir@3.0.0: resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} engines: {node: '>=14.16'} dev: true + /terser@5.24.0: + resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -3596,6 +4159,10 @@ packages: minimatch: 3.1.2 dev: true + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + /time-zone@1.0.0: resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} engines: {node: '>=4'} @@ -3613,6 +4180,10 @@ packages: is-number: 7.0.0 dev: true + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + /trim-newlines@4.1.1: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} engines: {node: '>=12'} @@ -3668,10 +4239,22 @@ packages: dev: true optional: true + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -3683,6 +4266,10 @@ packages: picocolors: 1.0.0 dev: true + /urlpattern-polyfill@9.0.0: + resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} + dev: true + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -3699,11 +4286,22 @@ packages: spdx-expression-parse: 3.0.1 dev: true + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + /well-known-symbols@2.0.0: resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} engines: {node: '>=6'} dev: true + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} dev: true @@ -3781,6 +4379,19 @@ packages: optional: true dev: true + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true @@ -3856,6 +4467,13 @@ packages: yargs-parser: 21.1.1 dev: true + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/src/index.ts b/src/index.ts index e44802b..d4737c0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -82,7 +82,7 @@ export default function html(opts: RollupHtmlOptions = {}): Plugin { let addedEntries = new Map(); let entryNames = new Map(); - const pluginName = 'html2'; + const pluginName = 'html2'; // TODO: Need a better name /** * Short summary: * Intercepts the loading of the html files and parses it with parse5. @@ -103,7 +103,7 @@ export default function html(opts: RollupHtmlOptions = {}): Plugin { * - we might need to know which output is being used to properly extract the html back from the result? (in case of not being included in a JS file) */ return { - name: pluginName,// TODO: Need a better name, original plugin was just named `html` and might still make sense to use in conjunction with this one + name: pluginName, // Track html entrypoints buildStart(options){ diff --git a/test/basic/test.js b/test/basic/test.js index f73efbb..a3ba273 100644 --- a/test/basic/test.js +++ b/test/basic/test.js @@ -2,7 +2,7 @@ import {join, dirname} from "node:path"; import test from "ava"; import { rollup } from "rollup"; -import {debugPrintOutput, getCode} from "../util/test.js"; +import {debugPrintOutput, getCode} from "../util/index.ts"; import html from "../../src/index.ts"; @@ -25,7 +25,7 @@ test.serial('simple', async (t) => { }), ] }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('simple',code); t.snapshot(code); }); @@ -38,7 +38,7 @@ test.serial('inline-script', async (t) => { }), ] }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('inline-script',code); t.snapshot(code); }); diff --git a/test/evaluated-web-bundle/fixtures/assets/assistant.ttf b/test/evaluated-web-bundle/fixtures/assets/assistant.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1c624f9827b908e5c5e62ce9c2c6b69fa88ebf57 GIT binary patch literal 79660 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 z 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 literal 0 HcmV?d00001 diff --git a/test/evaluated-web-bundle/fixtures/assets/logo-sq.svg b/test/evaluated-web-bundle/fixtures/assets/logo-sq.svg new file mode 100644 index 0000000..31f790b --- /dev/null +++ b/test/evaluated-web-bundle/fixtures/assets/logo-sq.svg @@ -0,0 +1,8 @@ + + HTML5 Logo + + + + + + diff --git a/test/evaluated-web-bundle/fixtures/batman.js b/test/evaluated-web-bundle/fixtures/batman.js new file mode 100644 index 0000000..c3685a8 --- /dev/null +++ b/test/evaluated-web-bundle/fixtures/batman.js @@ -0,0 +1 @@ +export const batman = 'bum badum badum baaaaa dum!'; diff --git a/test/evaluated-web-bundle/fixtures/index.hbs b/test/evaluated-web-bundle/fixtures/index.hbs new file mode 100644 index 0000000..9724a18 --- /dev/null +++ b/test/evaluated-web-bundle/fixtures/index.hbs @@ -0,0 +1,18 @@ + + + + + + Test bundle! + + + + + + {{{ head }}} + + +
Here the app should load!
+ + + diff --git a/test/evaluated-web-bundle/fixtures/index.js b/test/evaluated-web-bundle/fixtures/index.js new file mode 100644 index 0000000..4c1172f --- /dev/null +++ b/test/evaluated-web-bundle/fixtures/index.js @@ -0,0 +1,27 @@ +// Dynamically loads libraries and bootstraps the application +(async ()=>{ + // Add a loader here if any + const root = document.getElementById('root') + if(root) root.innerHTML= `
My app has loaded!!
`; + + try { + // Load app + const [ + appModule, + ] = await Promise.all([ + import("./batman.js"), + ]); + + console.log("Bootstrapped, ready to go!"); + + // Wait for DOM to be ready + if(document.readyState === 'loading') { + await new Promise((resolve)=>document.addEventListener('DOMContentLoaded', resolve)); + } + + // Start the app! + root.innerHTML = `
${appModule.batman}
`; + }catch(err){ + console.error(err); + } +})() diff --git a/test/evaluated-web-bundle/snapshots/test.js.md b/test/evaluated-web-bundle/snapshots/test.js.md new file mode 100644 index 0000000..6e02668 --- /dev/null +++ b/test/evaluated-web-bundle/snapshots/test.js.md @@ -0,0 +1,73 @@ +# Snapshot report for `test/evaluated-web-bundle/test.js` + +The actual snapshot is saved in `test.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## web-bundle + +> Snapshot 1 + + { + console: [ + '[log] Bootstrapped, ready to go!', + ], + errors: [], + html: `␊ + ␊ + ␊ + Test bundle!␊ + ␊ + ␊ + ␊ + ␊ + ␊ + I'm cool!␊ + ␊ + ␊ +
bum badum badum baaaaa dum!
␊ + ␊ + ␊ + ␊ + `, + requestsFailed: [], + responses: [ + '200 http://localhost/index.html', + '200 http://localhost/index.js', + '200 http://localhost/batman.js', + ], + } + +## copied-assets + +> Snapshot 1 + + { + console: [ + '[log] Bootstrapped, ready to go!', + ], + errors: [], + html: `␊ + ␊ + ␊ + Test bundle!␊ + ␊ + ␊ + ␊ + ␊ + ␊ + I'm cool!␊ + ␊ + ␊ +
bum badum badum baaaaa dum!
␊ + ␊ + ␊ + ␊ + `, + requestsFailed: [], + responses: [ + '200 http://localhost/index.html', + '200 http://localhost/index.js', + '200 http://localhost/batman.js', + ], + } diff --git a/test/evaluated-web-bundle/snapshots/test.js.snap b/test/evaluated-web-bundle/snapshots/test.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..5e6ee196e570c137570f041f755eab0c1c998271 GIT binary patch literal 1162 zcmV;51aQzxO5 z|3s+p@*j%`00000000B+Ro#x;L=+zHPqwURw^g}?dM#NXQBTHa#!gZtk@~aIB5mNN ztOTeRjy;LJop^$0*4e#50*MDHkH8hL#0BCNV8+QRTR}zdxX2{3=FE4_oIm?~Z>AF= z)7R>!U$`!`;1^3i2_~0iCU~LBWTA4Y)sJtoEYZm~2S4nh17wzS$7u}_LN5?PuMk3) z2%$gr5xUz#=%Lek;IzJ)T<}yo&dv7z{rkwdi=2Jr+;g1IS_pmQ>>_9Xfpd_`Qc1xr zFx~)KysBiSkaL6{Iy>vryWI7*Y zye?86SmCi-l!Y!55vVi~d=PrW!{#PYl&{^2i-A|9vh>`%;?sd=%KN04Co|qw_3ZPj zxp?f;=c=ChK(6MZR6c#-1LRsSeEQUfkq@Kga*3A|%WCGs2nZoQjI0ItKuna+wgB#d!c>4b(^&#z0~ph!qK@=Om9Q?$kg}0eZDnrelbDIBKqC zI20knU1P&AJ)oA2xA;JdMhC?+nO>Ac>sXpF=bucS;xy_3^@fHpPO5v z2*UMfYN|=2xd8r!30F955%0n8AOo{W7U@b z>T(*!5%g}mgvdJV5*(d}G(2U*R;go8S?9ennwZ~P88IV;ofy+R3|Y-0%<>>+7zDF@ zU@?yJm>7Vbh7rST97eHyDJYFGJp}@yX_*mC(!_Q%q&Tiw2Qv}$D24#utNPRF^md>$ z?%C4YP)|*PyG^hm>6ymIp>+;%7sDnT#UhBBxOzcEY+Kf$f#}fyA`|X9GW%_qFOHtv zeBRB__~O&Kn@TB;Z>C7U-HfIFL}u5kp^_D~TVw;Tl2Us^D=K|0_`pj2848}=u|$>rRgB-zH(EH}HHANSjnVZWUf_3GJpP-#^xw5zIg;1y-YukeNPTz$RZ z18**~OToQizujmJ4-XIfZ5v*{ZD#7w&f{WZ9^b3@_m^C0HA)J>GmHPcfqzhOwUDLa z$`HiPuPuarTNA?m)2d3Yot^dW=;#PJcWz<3@4)tMW6s|1ErkATA@t|~p)U_^JK4Xb ze25$eIUgDdxrx;MPRQ9S_nDMh=_*+)c=p(>c#>VaTDmiNY|VDxHhTnwxMm1HX}5(; z6Ol`$+f8Ln$yWM~vo`qn9R?R_t$ssopZufxB+>Jv{JV84j-ID-QSdBCl;T=#X?jc3 cTbka|^p>W#G`*$i{{v0`1>=<)NK_9108U&-VgLXD literal 0 HcmV?d00001 diff --git a/test/evaluated-web-bundle/test.js b/test/evaluated-web-bundle/test.js new file mode 100644 index 0000000..82219a3 --- /dev/null +++ b/test/evaluated-web-bundle/test.js @@ -0,0 +1,58 @@ +import {join, dirname} from "node:path"; + +import test from "ava"; +import { rollup } from "rollup"; +import urlPlugin from "@rollup/plugin-url"; + +import html from "../../src/index.ts"; +import serveTest from "../util/test-server.ts"; + +/** + * @type {OutputOptions} + */ +const output= { + dir: 'output', // Output all files + format: 'es', // iifi and cjs should be added to tests + sourcemap: true,// Test if #sourcemapUrl is not accidentally included in the html-output + chunkFileNames: '[name].js', + entryFileNames: '[name].[extname]', + assetFileNames: '[name].[extname]', +}; + +import {fileURLToPath} from "node:url"; +import handlebars from "handlebars"; +const __dirname = dirname(fileURLToPath(import.meta.url)); +process.chdir(join(__dirname, 'fixtures')); + + +const defaultAssetInclude = [ + '**/*.(png|jpg|jpeg|gif|ico|svg)',// images, svg + '**/*.(woff|woff2|eot|ttf|otf)',// fonts + '**/*.(webm|mp4)',// video +]; + +test.serial('web-bundle', async (t) => { + const bundle = await rollup({ + input: 'index.hbs', + treeshake: 'smallest', + plugins: [ + html({ + transform(src) { + return handlebars.compile(src)({ + head: `I'm cool!` + }); + } + }), + urlPlugin({ + include: defaultAssetInclude, + }), + + serveTest({ + path: 'index.html', + t, + }) + ], + }); + await bundle.generate(output); +}); + diff --git a/test/js-import/snapshots/test.js.md b/test/js-import/snapshots/test.js.md index 50c5968..f63ad4a 100644 --- a/test/js-import/snapshots/test.js.md +++ b/test/js-import/snapshots/test.js.md @@ -37,7 +37,7 @@ Generated by [AVA](https://avajs.dev). sources: [ '../icon.svg', '../index.html', - '../index.js', + '../index.ts', ], sourcesContent: [ 'export default "data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2032%2032%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%20%20%3Cpath%20style%3D%22fill%3Anone%3Bstroke%3A%2300ff0d%3Bstroke-width%3A5%3Bstroke-linecap%3Asquare%3Bstroke-linejoin%3Amiter%3Bstroke-dasharray%3Anone%3Bstroke-opacity%3A1%22%20d%3D%22M4.1%2014.72%2016%2026.31%2028.38%205.09%22%2F%3E%3C%2Fsvg%3E"', @@ -66,6 +66,6 @@ Generated by [AVA](https://avajs.dev). code: undefined, fileName: 'index-f75fa1e5.js.map', map: undefined, - source: '{"version":3,"file":"index-f75fa1e5.js","sources":["../icon.svg","../index.html","../index.js"],"sourcesContent":["export default \\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2032%2032%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%20%20%3Cpath%20style%3D%22fill%3Anone%3Bstroke%3A%2300ff0d%3Bstroke-width%3A5%3Bstroke-linecap%3Asquare%3Bstroke-linejoin%3Amiter%3Bstroke-dasharray%3Anone%3Bstroke-opacity%3A1%22%20d%3D%22M4.1%2014.72%2016%2026.31%2028.38%205.09%22%2F%3E%3C%2Fsvg%3E\\"","\\n \\n \\n\\n \\n \\n \\n \\n\\n","import html from \\"./index.html\\"\\n\\nexport function render(){\\n return html;\\n}\\n"],"names":[],"mappings":"AAAA,aAAe;;ACAf,MAAA,IAAA,GAAA,CAAA;AACA,+BAA+B,EAAwD,MAAA,CAAA;AACvF;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,CAAA;;ACNN,SAAS,MAAM,EAAE;AACxB,IAAI,OAAO,IAAI,CAAC;AAChB;;;;"}', + source: '{"version":3,"file":"index-f75fa1e5.js","sources":["../icon.svg","../index.html","../index.ts"],"sourcesContent":["export default \\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2032%2032%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%20%20%3Cpath%20style%3D%22fill%3Anone%3Bstroke%3A%2300ff0d%3Bstroke-width%3A5%3Bstroke-linecap%3Asquare%3Bstroke-linejoin%3Amiter%3Bstroke-dasharray%3Anone%3Bstroke-opacity%3A1%22%20d%3D%22M4.1%2014.72%2016%2026.31%2028.38%205.09%22%2F%3E%3C%2Fsvg%3E\\"","\\n \\n \\n\\n \\n \\n \\n \\n\\n","import html from \\"./index.html\\"\\n\\nexport function render(){\\n return html;\\n}\\n"],"names":[],"mappings":"AAAA,aAAe;;ACAf,MAAA,IAAA,GAAA,CAAA;AACA,+BAA+B,EAAwD,MAAA,CAAA;AACvF;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,CAAA;;ACNN,SAAS,MAAM,EAAE;AACxB,IAAI,OAAO,IAAI,CAAC;AAChB;;;;"}', }, ] diff --git a/test/js-import/test.js b/test/js-import/test.js index 7d739db..f4a30dd 100644 --- a/test/js-import/test.js +++ b/test/js-import/test.js @@ -3,7 +3,7 @@ import {join, dirname} from "node:path"; import test from "ava"; import { rollup } from "rollup"; -import {debugPrintOutput, getCode} from "../util/test.js"; +import {debugPrintOutput, getCode} from "../util/index.ts"; import html from "../../src/index.ts"; import handlebars from "handlebars"; @@ -38,7 +38,7 @@ test.serial('js-import', async (t) => { }), ] }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('js-import',code); t.snapshot(code); }); diff --git a/test/live-reload/test.js b/test/live-reload/test.js index 4842cca..8fe7d29 100644 --- a/test/live-reload/test.js +++ b/test/live-reload/test.js @@ -3,7 +3,7 @@ import {join, dirname} from "node:path"; import test from "ava"; import {rollup} from "rollup"; import liveReload from "rollup-plugin-livereload"; -import {debugPrintOutput, getCode} from "../util/test.js"; +import {debugPrintOutput, getCode} from "../util/index.ts"; import html from "../../src/index.ts"; @@ -29,7 +29,7 @@ test.serial('live-reload', async (t) => { }) ] }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); await bundle.close();// Make sure live-reload closes itself debugPrintOutput('live-reload',code); t.snapshot(code); diff --git a/test/multi-entry/test.js b/test/multi-entry/test.js index a465f5d..b0397fa 100644 --- a/test/multi-entry/test.js +++ b/test/multi-entry/test.js @@ -2,7 +2,7 @@ import {resolve, join, dirname} from "node:path"; import test from "ava"; import { rollup } from "rollup"; -import {debugPrintOutput, getCode} from "../util/test.js"; +import {debugPrintOutput, getCode} from "../util/index.ts"; import html from "../../src/index.ts"; @@ -28,7 +28,7 @@ test.serial('multi-entry', async (t) => { }), ] }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('multi-entry',code); t.snapshot(code); }); diff --git a/test/rewrite-url/test.js b/test/rewrite-url/test.js index 1bea26f..236ecd3 100644 --- a/test/rewrite-url/test.js +++ b/test/rewrite-url/test.js @@ -2,7 +2,7 @@ import {resolve, join, dirname} from "node:path"; import * as path from "node:path"; import test from "ava"; import { rollup } from "rollup"; -import {debugPrintOutput, getCode} from "../util/test.js"; +import {debugPrintOutput, getCode} from "../util/index.ts"; import html from "../../src/index.ts"; @@ -32,7 +32,7 @@ test.serial('rewrite-url', async (t) => { }), ] }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('rewrite-url',code); t.snapshot(code); }); diff --git a/test/templating/test.js b/test/templating/test.js index 243b1b7..ebbfa5d 100644 --- a/test/templating/test.js +++ b/test/templating/test.js @@ -3,7 +3,7 @@ import {join, dirname} from "node:path"; import test from "ava"; import { rollup } from "rollup"; -import {debugPrintOutput, getCode} from "../util/test.js"; +import {debugPrintOutput, getCode} from "../util/index.ts"; import html from "../../src/index.ts"; import handlebars from "handlebars"; @@ -30,7 +30,7 @@ test.serial('handlebars', async (t) => { }) ] }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('handlebars',code); t.snapshot(code); }); diff --git a/test/url-plugin/test.js b/test/url-plugin/test.js index dbdd35d..cab1edb 100644 --- a/test/url-plugin/test.js +++ b/test/url-plugin/test.js @@ -4,7 +4,7 @@ import test from "ava"; import { rollup } from "rollup"; import urlPlugin from "@rollup/plugin-url"; -import {debugPrintOutput, getCode} from "../util/test.js"; +import {debugPrintOutput, getCode} from "../util/index.ts"; import html from "../../src/index.ts"; @@ -37,7 +37,7 @@ test.serial('copied-assets', async (t) => { }), ], }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('copied-assets',code); t.snapshot(code); }); @@ -55,7 +55,7 @@ test.serial('inlined-assets', async (t) => { }), ] }); - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('inlined-assets',code); t.snapshot(code); }); diff --git a/test/util/code-output.ts b/test/util/code-output.ts new file mode 100644 index 0000000..2a6b7c6 --- /dev/null +++ b/test/util/code-output.ts @@ -0,0 +1,26 @@ +import type {RollupBuild, OutputOptions, OutputAsset, OutputChunk, SourceMap} from "rollup"; + +export interface TestOutput{ + code: string, + fileName: string, + source: any, + map: any +} + +export const getCode = async (bundle: RollupBuild, outputOptions: OutputOptions): Promise => { + const { output } = await bundle.generate(outputOptions || { format: 'cjs', exports: 'auto' }); + + return output.sort((a,b)=> { + if(a.fileName === b.fileName && (a).source !== (b).source){ return (a).source<(b).source?-1:1} + return a.fileName < b.fileName ? -1 : (a.fileName > b.fileName? 1 : 0); + }).map(chunk=> { + const { code, map } = (chunk); + const { fileName, source } = (chunk); + return { + code, + fileName, + source, + map + }; + }); +}; diff --git a/test/util/index.ts b/test/util/index.ts new file mode 100644 index 0000000..8b95f2a --- /dev/null +++ b/test/util/index.ts @@ -0,0 +1,6 @@ +export * from "./code-output.ts"; +export * from "./print-code-output.ts"; +export * from "./test-server.ts"; + + +export * from './misc.js'; diff --git a/test/util/test.js b/test/util/misc.js similarity index 62% rename from test/util/test.js rename to test/util/misc.js index 1819db7..c721774 100644 --- a/test/util/test.js +++ b/test/util/misc.js @@ -1,59 +1,5 @@ import path from "node:path"; import process from "node:process"; -import chalk from "chalk"; - -/** - * @param {import('rollup').RollupBuild} bundle - * @param {import('rollup').OutputOptions} [outputOptions] - */ -export const getCode = async (bundle, outputOptions, allFiles = false) => { - const { output } = await bundle.generate(outputOptions || { format: 'cjs', exports: 'auto' }); - - if (allFiles) { - return output.sort((a,b)=> { - if(a.fileName === b.fileName && a.source !== b.source){ return a.source b.fileName? 1 : 0); - }).map(({ code, fileName, source, map }) => { - return { - code, - fileName, - source, - map - }; - }); - } - const [{ code }] = output; - return code; -}; - -export const debugPrintOutput = async (header, files) => { - const out = []; - - const headFn = chalk.bgCyan; - const headPadding = header.split('').map(x=>'#').join(''); - out.push(...[ - headFn(`##${headPadding}##`), - headFn(`# ${header} #`), - headFn(`##${headPadding}##`), - ]); - - const fileHeadFn = chalk.blue; - const fileContentFn = chalk.blackBright; - out.push(...(files.map(file=>{ - return [ - fileHeadFn(`${file.fileName}:`), - fileContentFn(`${file.code??file.source}`), - '', - ] - }).flat())); - - out.push(...[ - headFn(`##${headPadding}##`), - ]); - - process.env.DEBUG? console.log(out.join('\n')) : null; -}; - /** * @param {import('rollup').RollupBuild} bundle diff --git a/test/util/print-code-output.ts b/test/util/print-code-output.ts new file mode 100644 index 0000000..aa55319 --- /dev/null +++ b/test/util/print-code-output.ts @@ -0,0 +1,32 @@ +import process from "node:process"; +import chalk from "chalk"; + +import {TestOutput} from "./code-output.ts"; + +export const debugPrintOutput = async (header: string, files: TestOutput[]) => { + const out = []; + + const headFn = chalk.bgCyan; + const headPadding = header.split('').map(x=>'#').join(''); + out.push(...[ + headFn(`##${headPadding}##`), + headFn(`# ${header} #`), + headFn(`##${headPadding}##`), + ]); + + const fileHeadFn = chalk.blue; + const fileContentFn = chalk.blackBright; + out.push(...(files.map(file=>{ + return [ + fileHeadFn(`${file.fileName}:`), + fileContentFn(`${file.code??file.source}`), + '', + ] + }).flat())); + + out.push(...[ + headFn(`##${headPadding}##`), + ]); + + process.env.DEBUG? console.log(out.join('\n')) : null; +}; diff --git a/test/util/test-server.ts b/test/util/test-server.ts new file mode 100644 index 0000000..a620667 --- /dev/null +++ b/test/util/test-server.ts @@ -0,0 +1,384 @@ +/** + * Puppeteer + from-memory devServer rollup plugin to open the result in a webpage en output the result + * (after an optional series of commands to the puppeteer Page) + */ + + +import puppeteer, {Page} from "puppeteer"; +import http from 'http'; +import {resolve, posix} from "node:path"; +import {URL} from "node:url"; + + +import { readFile } from 'fs' +import { createServer as createHttpsServer } from 'https' +import { createServer} from 'http' +import { Mime } from 'mime/lite' +import standardTypes from 'mime/types/standard.js' +import otherTypes from 'mime/types/other.js' + + +import type {NormalizedOutputOptions, OutputAsset, OutputBundle, OutputChunk, Plugin} from 'rollup' + +import type { + IncomingHttpHeaders, OutgoingHttpHeaders, + IncomingMessage, ServerResponse, + Server +} from 'http' +import type { ServerOptions } from 'https' +type TypeMap = { + [key: string]: string[]; +}; + +type ErrorCodeException = Error & {code: string}; + +export interface RollupServeOptions { + /** + * Change the path to be opened when the test is started + * Remember to start with a slash, e.g. `'/different/page'` + */ + path?: string + + cb?: PageTestCallback + t?: any + + /** + * Set to `true` to return index.html (200) instead of error page (404) + * or path to fallback page + */ + historyApiFallback?: boolean | string + + /** + * Change the host of the server (default: `'localhost'`) + */ + host?: string + + /** + * Change the port that the server will listen on (default: `10001`) + */ + port?: number | string + + /** + * By default server will be served over HTTP (https: `false`). It can optionally be served over HTTPS. + */ + https?: ServerOptions | false + + /** + * Set custom response headers + */ + headers?: + | IncomingHttpHeaders + | OutgoingHttpHeaders + | { + // i.e. Parameters + [name: string]: number | string | ReadonlyArray + } + + /** + * Set custom mime types, usage https://github.com/broofa/mime#mimedefinetypemap-force--false + */ + mimeTypes?: TypeMap + + /** + * Execute function after server has begun listening + */ + onListening?: (server: Server) => void +} + +/** + * Serve your rolled up bundle like webpack-dev-server + * @param {import('..').RollupServeOptions} options + */ +export default function serveTest (options: RollupServeOptions ): Plugin { + const mime = new Mime(standardTypes, otherTypes) + const testOptions = { + port: 0, + headers: {}, + historyApiFallback: true, + onListening: function noop (){}, + ...options||{}, + https: options.https??false, + mimeTypes: options.mimeTypes? mime.define(options.mimeTypes, true): false + } + + let server : Server; + let bundle : OutputBundle = {}; + + const requestListener = (request: IncomingMessage, response: ServerResponse) => { + // Remove querystring + const unsafePath = decodeURI(request.url!.split('?')[0]) + + // Don't allow path traversal + const urlPath = posix.normalize(unsafePath) + + for(const [key, value] of Object.entries((testOptions.headers))){ + response.setHeader(key, value!); + } + + function urlToFilePath(url:string){ + return url[0]==='/'?url.slice(1):url; + } + let filePath = urlToFilePath(urlPath); // Todo check if we need to strip '/' + let file: OutputChunk|OutputAsset; + if(!bundle[filePath] && testOptions.historyApiFallback) { + const fallbackPath = typeof testOptions.historyApiFallback === 'string' + ? testOptions.historyApiFallback + : '/index.html'; + if(bundle[urlToFilePath(fallbackPath)]){ + filePath = urlToFilePath(fallbackPath); + } + } + file = bundle[filePath]; + if(!file){ + return notFound(response, filePath); + }else{ + const content = (file).code || (file).source; // Todo might need to read a source file; + return found(response, mime.getType(filePath!), content); + } + // + // if(bundle[urlPath]){ + // const fallbackPath = typeof testOptions.historyApiFallback === 'string' ? testOptions.historyApiFallback : '/index.html' + // } + // + // readFileFromContentBase(contentBase, urlPath, function (error, content, filePath) { + // if (!error) { + // return found(response, mime.getType(filePath!), content) + // } + // if ((error).code !== 'ENOENT') { + // response.writeHead(500) + // response.end('500 Internal Server Error' + + // '\n\n' + filePath + + // '\n\n' + Object.values(error).join('\n') + + // '\n\n(rollup-plugin-serve)', 'utf-8') + // return + // } + // if (testOptions.historyApiFallback) { + // const fallbackPath = typeof testOptions.historyApiFallback === 'string' ? testOptions.historyApiFallback : '/index.html' + // readFileFromContentBase(contentBase, fallbackPath, function (error, content, filePath) { + // if (error) { + // notFound(response, filePath) + // } else { + // found(response, mime.getType(filePath), content) + // } + // }) + // } else { + // notFound(response, filePath) + // } + // }) + } + + + function closeServerOnTermination () { + const terminationSignals = ['SIGINT', 'SIGTERM', 'SIGQUIT', 'SIGHUP'] + terminationSignals.forEach(signal => { + process.on(signal, () => { + if (server) { + server.close() + process.exit() + } + }) + }) + } + + + // release previous server instance if rollup is reloading configuration in watch mode + // @ts-ignore + if (server) { + server.close() + } else { + closeServerOnTermination() + } + + // If HTTPS options are available, create an HTTPS server + server = testOptions.https + ? createHttpsServer(testOptions.https, requestListener) + : createServer(requestListener) + server.listen( + typeof(testOptions.port)==='string'? Number.parseInt(testOptions.port):testOptions.port, + testOptions.host, + undefined, + () => testOptions.onListening?.(server) + ) + + testOptions.port = (server.address())?.port ?? testOptions.port; + + // Assemble url for error and info messages + const url = (testOptions.https ? 'https' : 'http') + '://' + (testOptions.host || 'localhost') + ':' + testOptions.port + + // Handle common server errors + server.on('error', e => { + if ((e).code === 'EADDRINUSE') { + console.error(url + ' is in use, either stop the other server or use a different port.') + process.exit() + } else { + throw e + } + }) + + let first = true + + return { + name: 'serve', + generateBundle: { + order: 'post', + async handler(options, output){ + bundle = output; + if (first) { + first = false + + const testOutput = await runTest({ + page: testOptions.path!, + cb: testOptions.cb, + }, url) + testOptions.t?.snapshot?.(testOutput); + } + } + }, + closeBundle (){ + // Done with the bundle + } + } +} + + +function notFound (response: ServerResponse, filePath: string) { + response.writeHead(404) + response.end( + '404 Not Found' + '\n\n' + filePath, + 'utf-8' + ) +} + +function found (response: ServerResponse, mimeType: string|null, content: any) { + response.writeHead(200, { 'Content-Type': mimeType || 'text/plain' }) + response.end(content, 'utf-8') +} + +function green (text: string) { + return '\u001b[1m\u001b[32m' + text + '\u001b[39m\u001b[22m' +} + + + +export type PageTestCallback = (page: Page)=>Promise; +export interface TestFilterOptions{ + html?: boolean + console?: ('log'|'error'|'warn')[] | true + errors?: boolean, // again don't know possible values + responses?: boolean, // interesting to see what other values were requested + requestsFailed?: boolean, // will probably also be replicated into console errors, but helpful to have if imports werent found +} +export interface TestOptions { + page: string + cb: PageTestCallback + filterOutput: TestFilterOptions + replaceHost: boolean + replaceHostWith?: string +} +const defaultOptions: Partial = { + page: 'index.html', + cb: async (page: Page)=>{ + await page.waitForNetworkIdle({}); + }, + replaceHost: true, + replaceHostWith: `http://localhost`, + filterOutput:{ + html: true, + console: ['log','error','warn'],// TODO: or warning? need to check what possible values are + errors: true, // again don't know possible values + responses: true, // interesting to see what other values were requested + requestsFailed: true, // will probably also be replicated into console errors, but helpful to have if imports werent found + } +} +export interface TestOutput{ + html?: string, + console?: string[], + errors?: string[], + responses?: string[], + requestsFailed?: string[], +} +export async function runTest(opts: Partial, hostUrl: string){ + const options : TestOptions = ({ + ...defaultOptions, + ...opts, + filterOutput: { + ...defaultOptions.filterOutput, + ...(opts?.filterOutput), + }, + }); + const { + page: path, + cb, + replaceHost, + replaceHostWith, + filterOutput + } = options; + + const browser = await puppeteer.launch({ + headless: 'new', + }); + const page = await browser.newPage(); + + let output : TestOutput = { + console: [], + errors: [], + responses: [], + requestsFailed: [] + }; + + try{ + // Track requests, errors and console + page.on('console', message => { + let [type, text] = [message.type(), message.text()]; + if(replaceHost){ + text = text.replaceAll(hostUrl, replaceHostWith!); + } + if((filterOutput.console)?.includes?.(type) ?? (filterOutput.console === true)){// TODO: add callback option + output.console?.push(`[${type}] ${text}`); + } + }).on('pageerror', ({ message }) => { + let text = message; + if(replaceHost){ + text = text.replaceAll(hostUrl, replaceHostWith!); + } + if(filterOutput.errors === true) {// TODO add callback option + output.errors?.push(text) + } + }).on('response', response => { + let [status, url] = [response.status(), response.url()] + if(replaceHost){ + url = url.replaceAll(hostUrl, replaceHostWith!); + } + if(filterOutput.responses === true) {// TODO add callback option + output.responses?.push(`${status} ${url}`) + } + }).on('requestfailed', request => { + let [failure, url] = [request.failure()?.errorText, request.url()]; + if(replaceHost){ + failure = failure?.replaceAll(hostUrl, replaceHostWith!); + url = url.replaceAll(hostUrl, replaceHostWith!); + } + if(filterOutput.requestsFailed === true) {// TODO add callback option + output.requestsFailed?.push(`${failure} ${url}`) + } + }); + + const url = new URL(`${hostUrl}/${path??''}`); + await page.goto(url.href); + + if(!cb) { + await page.waitForNetworkIdle({}); + }else{ + await cb(page); + } + const htmlHandle = await page.$('html'); + const html = await page.evaluate(html => html?.outerHTML??html?.innerHTML, htmlHandle); + + // Add the final html + output.html = html; + }finally{ + await page.close(); + await browser.close(); + } + return output; +} diff --git a/test/util/test.d.ts b/test/util/test.d.ts deleted file mode 100644 index e2ac0bc..0000000 --- a/test/util/test.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* eslint-disable import/no-extraneous-dependencies */ -import type { RollupBuild, OutputOptions, OutputChunk, OutputAsset } from 'rollup'; -import type { Assertions } from 'ava'; - -interface GetCode { - (bundle: RollupBuild, outputOptions?: OutputOptions | null, allFiles?: false): Promise; - (bundle: RollupBuild, outputOptions: OutputOptions | null | undefined, allFiles: true): Promise< - Array<{ - code: OutputChunk['code'] | undefined; - fileName: OutputChunk['fileName'] | OutputAsset['fileName']; - source: OutputAsset['source'] | undefined; - }> - >; -} - -export const getCode: GetCode; - -export function getFiles( - bundle: RollupBuild, - outputOptions?: OutputOptions -): Promise< - { - fileName: string; - content: any; - }[] ->; - -export function evaluateBundle(bundle: RollupBuild): Promise>; - -export function getImports(bundle: RollupBuild): Promise; - -export function getResolvedModules(bundle: RollupBuild): Promise>; - -export function onwarn(warning: string | any): void; - -export function testBundle( - t: Assertions, - bundle: RollupBuild, - options: { inject: Record; options: Record } -): Promise<{ - code: string; - error?: any; - result?: any; - module: Pick; -}>; diff --git a/test/watch/test.js b/test/watch/test.js index 224d3e4..a1f81e2 100644 --- a/test/watch/test.js +++ b/test/watch/test.js @@ -2,7 +2,7 @@ import {join, dirname} from "node:path"; import test from "ava"; import * as rollup from "rollup"; -import {debugPrintOutput, getCode} from "../util/test.js"; +import {debugPrintOutput, getCode} from "../util/index.ts"; import {resolve} from "node:path"; import {writeFile} from "node:fs/promises"; @@ -49,7 +49,7 @@ test.serial('watch', async (t) => { // Just wait on the watch mode to pick up on the changes }, async (bundle)=>{ - const code = await getCode(bundle, output, true); + const code = await getCode(bundle, output); debugPrintOutput('watch',code); // Reset the source file diff --git a/tsconfig.json b/tsconfig.json index db4fb87..8af2d8b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,8 @@ "target": "ESNext", "module": "ESNext", "moduleResolution": "NodeNext", - "allowJs": true + "allowJs": true, + "allowImportingTsExtensions": true }, "exclude": ["dist", "node_modules", "test/types"], "include": ["src/**/*", "types/**/*"],