git.iko.soy/rowtype-yoga/purescript-playwright
on main help sign in
100 files changed+2895−624
since splitsnapshots
unifiedsplit
.github/workflows/ci.yml+24 .gitignore+3 .spago/aff-promise/v4.0.0+1 .spago/aff/v7.0.0+1 .spago/argonaut-core/v7.0.0+1 .spago/arraybuffer-types/v3.0.2+1 .spago/arrays/v7.0.0+1 .spago/assert/v6.0.0+1 .spago/bifunctors/v6.0.0+1 .spago/console/v6.0.0+1 .spago/const/v6.0.0+1 .spago/contravariant/v6.0.0+1 .spago/control/v6.0.0+1 .spago/datetime/v6.0.0+1 .spago/distributive/v6.0.0+1 .spago/effect/v4.0.0+1 .spago/either/v6.0.0+1 .spago/enums/v6.0.0+1 .spago/exceptions/v6.0.0+1 .spago/exists/v6.0.0+1 .spago/foldable-traversable/v6.0.0+1 .spago/foreign-object/v4.0.0+1 .spago/foreign/v7.0.0+1 .spago/functions/v6.0.0+1 .spago/functors/v5.0.0+1 .spago/gen/v4.0.0+1 .spago/identity/v6.0.0+1 .spago/integers/v6.0.0+1 .spago/invariant/v6.0.0+1 .spago/js-date/v8.0.0+1 .spago/lazy/v6.0.0+1 .spago/lists/v7.0.0+1 .spago/literals/7b2ae20f77c67b7e419a92fdd0dc7a09b447b18e+1 .spago/literals/es-modules+1 .spago/maybe/v6.0.0+1 .spago/newtype/v5.0.0+1 .spago/node-buffer/v8.0.0+1 .spago/node-fs-aff/v9.0.0+1 .spago/node-fs/v8.0.0+1 .spago/node-path/v5.0.0+1 .spago/node-streams/v7.0.0+1 .spago/nonempty/v7.0.0+1 .spago/now/v6.0.0+1 .spago/nullable/v6.0.0+1 .spago/numbers/v9.0.0+1 .spago/ordered-collections/v3.0.0+1 .spago/orders/v6.0.0+1 .spago/package.json+1 .spago/parallel/v6.0.0+1 .spago/partial/v4.0.0+1 .spago/prelude/v6.0.0+1 .spago/profunctor/v6.0.0+1 .spago/psci-support/v6.0.0+1 .spago/refs/v6.0.0+1 .spago/run.js+3 .spago/safe-coerce/v2.0.0+1 .spago/st/v6.0.0+1 .spago/strings/v6.0.0+1 .spago/tailrec/v6.0.0+1 .spago/transformers/v6.0.0+1 .spago/tuples/v7.0.0+1 .spago/type-equality/v4.0.1+1 .spago/typelevel-prelude/v7.0.0+1 .spago/unfoldable/v6.0.0+1 .spago/unsafe-coerce/v6.0.0+1 .spago/untagged-union/es-modules+1 .spago/untagged-union/v0.3.0+1 bower.json−17 bun.lock+563 package.json+13−12 packages.dhall−43 spago.dhall−16 spago.lock+1379 spago.yaml+34 src/Playwright.js+25 src/Playwright.purs+196−120 src/Playwright/ConsoleMessage.purs+1−1 src/Playwright/Data.js+23−22 src/Playwright/Download.js+8−15 src/Playwright/Download.purs+1−1 src/Playwright/Event.js+5−11 src/Playwright/Event.purs+72−8 src/Playwright/FileChooser.purs+41 src/Playwright/Internal.js+20−45 src/Playwright/Internal.purs+3−13 src/Playwright/JSHandle.js+11 src/Playwright/JSHandle.purs+34 src/Playwright/Keyboard.purs+3−3 src/Playwright/Locator.js+9 src/Playwright/Locator.purs+49 src/Playwright/Mouse.purs+4−4 src/Playwright/Options.purs+94−68 src/Playwright/Response.js+10 src/Playwright/Response.purs+57−14 src/Playwright/Test.js+7 src/Playwright/Test.purs+15 test/Main.purs+121−153 test/TestUtils.js−5 test/TestUtils.purs−53 test/browser.spec.js+3
.github/workflows/ci.ymlnew file+24
@@ -0,0 +1,24 @@
1+name: CI
2+
3+on:
4+ push:
5+ branches: [main]
6+ pull_request:
7+ branches: [main]
8+ workflow_dispatch:
9+
10+jobs:
11+ build:
12+ runs-on: ubuntu-latest
13+ steps:
14+ - uses: actions/checkout@v4
15+ - uses: actions/setup-node@v4
16+ with:
17+ node-version: 22
18+ - uses: oven-sh/setup-bun@v2
19+ - name: Install dependencies
20+ run: bun install
21+ - name: Install Chromium
22+ run: bunx playwright install --with-deps chromium
23+ - name: Build and run browser regressions
24+ run: bun run test
.gitignore+3
@@ -7,3 +7,6 @@
77/.psc*
88/.purs*
99/.psa*
10+/.spago/
11+/test-results/
12+/playwright-report/
.spago/aff-promise/v4.0.0new file+1

Submodule changed.

.spago/aff/v7.0.0new file+1

Submodule changed.

.spago/argonaut-core/v7.0.0new file+1

Submodule changed.

.spago/arraybuffer-types/v3.0.2new file+1

Submodule changed.

.spago/arrays/v7.0.0new file+1

Submodule changed.

.spago/assert/v6.0.0new file+1

Submodule changed.

.spago/bifunctors/v6.0.0new file+1

Submodule changed.

.spago/console/v6.0.0new file+1

Submodule changed.

.spago/const/v6.0.0new file+1

Submodule changed.

.spago/contravariant/v6.0.0new file+1

Submodule changed.

.spago/control/v6.0.0new file+1

Submodule changed.

.spago/datetime/v6.0.0new file+1

Submodule changed.

.spago/distributive/v6.0.0new file+1

Submodule changed.

.spago/effect/v4.0.0new file+1

Submodule changed.

.spago/either/v6.0.0new file+1

Submodule changed.

.spago/enums/v6.0.0new file+1

Submodule changed.

.spago/exceptions/v6.0.0new file+1

Submodule changed.

.spago/exists/v6.0.0new file+1

Submodule changed.

.spago/foldable-traversable/v6.0.0new file+1

Submodule changed.

.spago/foreign-object/v4.0.0new file+1

Submodule changed.

.spago/foreign/v7.0.0new file+1

Submodule changed.

.spago/functions/v6.0.0new file+1

Submodule changed.

.spago/functors/v5.0.0new file+1

Submodule changed.

.spago/gen/v4.0.0new file+1

Submodule changed.

.spago/identity/v6.0.0new file+1

Submodule changed.

.spago/integers/v6.0.0new file+1

Submodule changed.

.spago/invariant/v6.0.0new file+1

Submodule changed.

.spago/js-date/v8.0.0new file+1

Submodule changed.

.spago/lazy/v6.0.0new file+1

Submodule changed.

.spago/lists/v7.0.0new file+1

Submodule changed.

.spago/literals/7b2ae20f77c67b7e419a92fdd0dc7a09b447b18enew file+1

Submodule changed.

.spago/literals/es-modulesnew file+1

Submodule changed.

.spago/maybe/v6.0.0new file+1

Submodule changed.

.spago/newtype/v5.0.0new file+1

Submodule changed.

.spago/node-buffer/v8.0.0new file+1

Submodule changed.

.spago/node-fs-aff/v9.0.0new file+1

Submodule changed.

.spago/node-fs/v8.0.0new file+1

Submodule changed.

.spago/node-path/v5.0.0new file+1

Submodule changed.

.spago/node-streams/v7.0.0new file+1

Submodule changed.

.spago/nonempty/v7.0.0new file+1

Submodule changed.

.spago/now/v6.0.0new file+1

Submodule changed.

.spago/nullable/v6.0.0new file+1

Submodule changed.

.spago/numbers/v9.0.0new file+1

Submodule changed.

.spago/ordered-collections/v3.0.0new file+1

Submodule changed.

.spago/orders/v6.0.0new file+1

Submodule changed.

.spago/package.jsonnew file+1
@@ -0,0 +1 @@
1+{"type":"module" }
.spago/parallel/v6.0.0new file+1

Submodule changed.

.spago/partial/v4.0.0new file+1

Submodule changed.

.spago/prelude/v6.0.0new file+1

Submodule changed.

.spago/profunctor/v6.0.0new file+1

Submodule changed.

.spago/psci-support/v6.0.0new file+1

Submodule changed.

.spago/refs/v6.0.0new file+1

Submodule changed.

.spago/run.jsnew file+3
@@ -0,0 +1,3 @@
1+import { main } from '/Users/mark/code/purescript-playwright/output/Test.Main/index.js'
2+
3+main()
.spago/safe-coerce/v2.0.0new file+1

Submodule changed.

.spago/st/v6.0.0new file+1

Submodule changed.

.spago/strings/v6.0.0new file+1

Submodule changed.

.spago/tailrec/v6.0.0new file+1

Submodule changed.

.spago/transformers/v6.0.0new file+1

Submodule changed.

.spago/tuples/v7.0.0new file+1

Submodule changed.

.spago/type-equality/v4.0.1new file+1

Submodule changed.

.spago/typelevel-prelude/v7.0.0new file+1

Submodule changed.

.spago/unfoldable/v6.0.0new file+1

Submodule changed.

.spago/unsafe-coerce/v6.0.0new file+1

Submodule changed.

.spago/untagged-union/es-modulesnew file+1

Submodule changed.

.spago/untagged-union/v0.3.0new file+1

Submodule changed.

bower.jsondeleted−17
@@ -1,17 +0,0 @@
1−{
2− "name": "purescript-playwright",
3− "ignore": [
4− "**/.*",
5− "node_modules",
6− "bower_components",
7− "output"
8− ],
9− "dependencies": {
10− "purescript-prelude": "^4.1.1",
11− "purescript-console": "^4.4.0",
12− "purescript-effect": "^2.0.1"
13− },
14− "devDependencies": {
15− "purescript-psci-support": "^4.0.0"
16− }
17−}
bun.locknew file+563
@@ -0,0 +1,563 @@
1+{
2+ "lockfileVersion": 1,
3+ "workspaces": {
4+ "": {
5+ "name": "purescript-playwright",
6+ "dependencies": {
7+ "@playwright/test": "~1.60.0",
8+ "playwright": "~1.60.0",
9+ },
10+ "devDependencies": {
11+ "purescript": "0.15.16",
12+ "spago": "^1.0.3",
13+ },
14+ },
15+ },
16+ "packages": {
17+ "@gar/promisify": ["@gar/promisify@1.1.3", "", {}, "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="],
18+
19+ "@isaacs/cliui": ["@isaacs/cliui@9.0.0", "", {}, "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg=="],
20+
21+ "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
22+
23+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@4.0.1", "", { "dependencies": { "@nodelib/fs.stat": "4.0.0", "run-parallel": "^1.2.0" } }, "sha512-vAkI715yhnmiPupY+dq+xenu5Tdf2TBQ66jLvBIcCddtz+5Q8LbMKaf9CIJJreez8fQ8fgaY+RaywQx8RJIWpw=="],
24+
25+ "@nodelib/fs.stat": ["@nodelib/fs.stat@4.0.0", "", {}, "sha512-ctr6bByzksKRCV0bavi8WoQevU6plSp2IkllIsEqaiKe2mwNNnaluhnRhcsgGZHrrHk57B3lf95MkLMO3STYcg=="],
26+
27+ "@nodelib/fs.walk": ["@nodelib/fs.walk@3.0.1", "", { "dependencies": { "@nodelib/fs.scandir": "4.0.1", "fastq": "^1.15.0" } }, "sha512-nIh/M6Kh3ZtOmlY00DaUYB4xeeV6F3/ts1l29iwl3/cfyY/OuCfUx+v08zgx8TKPTifXRcjjqVQ4KB2zOYSbyw=="],
28+
29+ "@npmcli/fs": ["@npmcli/fs@2.1.2", "", { "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" } }, "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ=="],
30+
31+ "@npmcli/move-file": ["@npmcli/move-file@2.0.1", "", { "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ=="],
32+
33+ "@playwright/test": ["@playwright/test@1.60.0", "", { "dependencies": { "playwright": "1.60.0" }, "bin": { "playwright": "cli.js" } }, "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag=="],
34+
35+ "@tootallnate/once": ["@tootallnate/once@2.0.1", "", {}, "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ=="],
36+
37+ "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
38+
39+ "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="],
40+
41+ "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="],
42+
43+ "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="],
44+
45+ "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
46+
47+ "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="],
48+
49+ "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="],
50+
51+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
52+
53+ "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="],
54+
55+ "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="],
56+
57+ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
58+
59+ "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="],
60+
61+ "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="],
62+
63+ "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="],
64+
65+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
66+
67+ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
68+
69+ "buildcheck": ["buildcheck@0.0.7", "", {}, "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA=="],
70+
71+ "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
72+
73+ "byline": ["byline@5.0.0", "", {}, "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q=="],
74+
75+ "cacache": ["cacache@11.3.3", "", { "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", "glob": "^7.1.4", "graceful-fs": "^4.1.15", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" } }, "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA=="],
76+
77+ "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],
78+
79+ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
80+
81+ "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="],
82+
83+ "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="],
84+
85+ "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
86+
87+ "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
88+
89+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
90+
91+ "concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="],
92+
93+ "copy-concurrently": ["copy-concurrently@1.0.5", "", { "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", "iferr": "^0.1.5", "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" } }, "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A=="],
94+
95+ "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="],
96+
97+ "cpu-features": ["cpu-features@0.0.10", "", { "dependencies": { "buildcheck": "~0.0.6", "nan": "^2.19.0" } }, "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA=="],
98+
99+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
100+
101+ "cyclist": ["cyclist@1.0.2", "", {}, "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA=="],
102+
103+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
104+
105+ "default-browser": ["default-browser@5.5.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw=="],
106+
107+ "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
108+
109+ "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
110+
111+ "duplexify": ["duplexify@3.7.1", "", { "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="],
112+
113+ "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
114+
115+ "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="],
116+
117+ "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="],
118+
119+ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
120+
121+ "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="],
122+
123+ "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="],
124+
125+ "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
126+
127+ "execa": ["execa@2.1.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^3.0.0", "onetime": "^5.1.0", "p-finally": "^2.0.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw=="],
128+
129+ "fastq": ["fastq@1.20.3", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw=="],
130+
131+ "figgy-pudding": ["figgy-pudding@3.5.2", "", {}, "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="],
132+
133+ "filesize": ["filesize@4.2.1", "", {}, "sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA=="],
134+
135+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
136+
137+ "flush-write-stream": ["flush-write-stream@1.1.1", "", { "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w=="],
138+
139+ "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
140+
141+ "from2": ["from2@2.3.0", "", { "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g=="],
142+
143+ "fs-extra": ["fs-extra@11.4.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA=="],
144+
145+ "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="],
146+
147+ "fs-write-stream-atomic": ["fs-write-stream-atomic@1.0.10", "", { "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" } }, "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA=="],
148+
149+ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="],
150+
151+ "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
152+
153+ "fuse.js": ["fuse.js@7.5.0", "", {}, "sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow=="],
154+
155+ "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
156+
157+ "glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="],
158+
159+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
160+
161+ "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="],
162+
163+ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
164+
165+ "http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="],
166+
167+ "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="],
168+
169+ "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="],
170+
171+ "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
172+
173+ "iferr": ["iferr@0.1.5", "", {}, "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA=="],
174+
175+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
176+
177+ "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="],
178+
179+ "infer-owner": ["infer-owner@1.0.4", "", {}, "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="],
180+
181+ "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="],
182+
183+ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
184+
185+ "ip-address": ["ip-address@10.7.0", "", {}, "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA=="],
186+
187+ "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
188+
189+ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
190+
191+ "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
192+
193+ "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="],
194+
195+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
196+
197+ "is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="],
198+
199+ "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
200+
201+ "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
202+
203+ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
204+
205+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
206+
207+ "jackspeak": ["jackspeak@4.2.3", "", { "dependencies": { "@isaacs/cliui": "^9.0.0" } }, "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg=="],
208+
209+ "jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
210+
211+ "linkify-it": ["linkify-it@5.0.2", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q=="],
212+
213+ "log-symbols": ["log-symbols@3.0.0", "", { "dependencies": { "chalk": "^2.4.2" } }, "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ=="],
214+
215+ "log-update": ["log-update@4.0.0", "", { "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", "slice-ansi": "^4.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg=="],
216+
217+ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
218+
219+ "make-fetch-happen": ["make-fetch-happen@10.2.1", "", { "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-fetch": "^2.0.3", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", "ssri": "^9.0.0" } }, "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w=="],
220+
221+ "markdown-it": ["markdown-it@14.3.2", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.5.0", "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-sHHjZ5fJKlgrG4qns2YwVcdNep35h5fERrfkD2YNsb9UFk0UIHarbiTaHKVMlPuWAoiilyK8Fv/jAm11slsY7Q=="],
222+
223+ "mdurl": ["mdurl@2.1.0", "", {}, "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg=="],
224+
225+ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
226+
227+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
228+
229+ "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
230+
231+ "minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="],
232+
233+ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
234+
235+ "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
236+
237+ "minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="],
238+
239+ "minipass-fetch": ["minipass-fetch@2.1.2", "", { "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA=="],
240+
241+ "minipass-flush": ["minipass-flush@1.0.7", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA=="],
242+
243+ "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="],
244+
245+ "minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="],
246+
247+ "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="],
248+
249+ "mississippi": ["mississippi@3.0.0", "", { "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", "end-of-stream": "^1.1.0", "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" } }, "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA=="],
250+
251+ "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="],
252+
253+ "move-concurrently": ["move-concurrently@1.0.1", "", { "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", "fs-write-stream-atomic": "^1.0.8", "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" } }, "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ=="],
254+
255+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
256+
257+ "nan": ["nan@2.28.0", "", {}, "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ=="],
258+
259+ "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="],
260+
261+ "npm-run-path": ["npm-run-path@3.1.0", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg=="],
262+
263+ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
264+
265+ "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
266+
267+ "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="],
268+
269+ "p-finally": ["p-finally@2.0.1", "", {}, "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw=="],
270+
271+ "p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="],
272+
273+ "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
274+
275+ "parallel-transform": ["parallel-transform@1.2.0", "", { "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg=="],
276+
277+ "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="],
278+
279+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
280+
281+ "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="],
282+
283+ "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="],
284+
285+ "playwright": ["playwright@1.60.0", "", { "dependencies": { "playwright-core": "1.60.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA=="],
286+
287+ "playwright-core": ["playwright-core@1.60.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA=="],
288+
289+ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
290+
291+ "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="],
292+
293+ "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="],
294+
295+ "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="],
296+
297+ "pumpify": ["pumpify@1.5.1", "", { "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" } }, "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ=="],
298+
299+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
300+
301+ "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
302+
303+ "purescript": ["purescript@0.15.16", "", { "dependencies": { "purescript-installer": "^0.3.5" }, "bin": { "purs": "purs.bin" } }, "sha512-3t936C7oUl/DT2n0U9SXO7TBG316EqywCUUuZ5naS9EhNc+Xpj+CUTjfNjlWffvN8oFDSWYdQGRFGJ73lXpCSQ=="],
304+
305+ "purescript-installer": ["purescript-installer@0.3.5", "", { "dependencies": { "byline": "^5.0.0", "cacache": "^11.3.2", "chalk": "^2.4.2", "env-paths": "^2.2.0", "execa": "^2.0.3", "filesize": "^4.1.2", "is-plain-obj": "^2.0.0", "log-symbols": "^3.0.0", "log-update": "^4.0.0", "make-fetch-happen": "^10.0.0", "minimist": "^1.2.0", "ms": "^2.1.2", "once": "^1.4.0", "rimraf": "^2.6.3", "semver": "^7.3.7", "tar": "^6.1.11", "which": "^1.3.1", "zen-observable": "^0.8.14" }, "bin": { "install-purescript": "index.js" } }, "sha512-w04BBvW4BSQlspLsZ9Bs5vtUBZqvC4bC+FizC5GUp2/rpmYvXJ0CTf79Q3MKo2A8p1ZjqbhCI+SqdTQ30UZUIQ=="],
306+
307+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
308+
309+ "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
310+
311+ "readline-sync": ["readline-sync@1.4.10", "", {}, "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="],
312+
313+ "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="],
314+
315+ "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
316+
317+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
318+
319+ "rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="],
320+
321+ "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
322+
323+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
324+
325+ "run-queue": ["run-queue@1.0.3", "", { "dependencies": { "aproba": "^1.1.1" } }, "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg=="],
326+
327+ "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
328+
329+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
330+
331+ "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="],
332+
333+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
334+
335+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
336+
337+ "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
338+
339+ "slice-ansi": ["slice-ansi@4.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="],
340+
341+ "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
342+
343+ "socks": ["socks@2.8.10", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ=="],
344+
345+ "socks-proxy-agent": ["socks-proxy-agent@7.0.0", "", { "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" } }, "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww=="],
346+
347+ "spago": ["spago@1.0.4", "", { "dependencies": { "@nodelib/fs.walk": "^3.0.1", "env-paths": "^3.0.0", "fs-extra": "^11.3.0", "fuse.js": "^7.1.0", "glob": "^11.0.1", "markdown-it": "^14.1.0", "micromatch": "^4.0.8", "open": "^10.1.0", "picomatch": "^4.0.2", "punycode": "^2.3.1", "readline-sync": "^1.4.10", "semver": "^7.7.1", "spdx-expression-parse": "^4.0.0", "ssh2": "^1.16.0", "supports-color": "^10.0.0", "tar": "^7.4.3", "tmp": "^0.2.3", "xhr2": "^0.2.1", "yaml": "^2.7.0" }, "bin": { "spago": "bin/bundle.js" } }, "sha512-iv1HBJppzGJRWWd/DZ32oselcKrhq/PboBdXy5VMX4GiwRqLCUUp3loZ6Yhm8zymNRKHkN/w52cxX6k521nwng=="],
348+
349+ "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
350+
351+ "spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="],
352+
353+ "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="],
354+
355+ "ssh2": ["ssh2@1.17.0", "", { "dependencies": { "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2" }, "optionalDependencies": { "cpu-features": "~0.0.10", "nan": "^2.23.0" } }, "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ=="],
356+
357+ "ssri": ["ssri@6.0.2", "", { "dependencies": { "figgy-pudding": "^3.5.1" } }, "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q=="],
358+
359+ "stream-each": ["stream-each@1.2.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" } }, "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw=="],
360+
361+ "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="],
362+
363+ "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
364+
365+ "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
366+
367+ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
368+
369+ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
370+
371+ "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
372+
373+ "tar": ["tar@7.5.22", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA=="],
374+
375+ "through2": ["through2@2.0.5", "", { "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="],
376+
377+ "tmp": ["tmp@0.2.7", "", {}, "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw=="],
378+
379+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
380+
381+ "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="],
382+
383+ "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="],
384+
385+ "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="],
386+
387+ "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
388+
389+ "unique-filename": ["unique-filename@1.1.1", "", { "dependencies": { "unique-slug": "^2.0.0" } }, "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="],
390+
391+ "unique-slug": ["unique-slug@2.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w=="],
392+
393+ "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
394+
395+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
396+
397+ "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="],
398+
399+ "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
400+
401+ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
402+
403+ "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="],
404+
405+ "xhr2": ["xhr2@0.2.1", "", {}, "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw=="],
406+
407+ "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="],
408+
409+ "y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="],
410+
411+ "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
412+
413+ "yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="],
414+
415+ "zen-observable": ["zen-observable@0.8.15", "", {}, "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="],
416+
417+ "@npmcli/move-file/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
418+
419+ "@npmcli/move-file/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="],
420+
421+ "cacache/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="],
422+
423+ "cacache/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
424+
425+ "chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="],
426+
427+ "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
428+
429+ "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
430+
431+ "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
432+
433+ "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
434+
435+ "make-fetch-happen/cacache": ["cacache@16.1.3", "", { "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "glob": "^8.0.1", "infer-owner": "^1.0.4", "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "mkdirp": "^1.0.4", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^9.0.0", "tar": "^6.1.11", "unique-filename": "^2.0.0" } }, "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ=="],
436+
437+ "make-fetch-happen/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
438+
439+ "make-fetch-happen/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
440+
441+ "make-fetch-happen/ssri": ["ssri@9.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q=="],
442+
443+ "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
444+
445+ "minipass-collect/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
446+
447+ "minipass-fetch/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
448+
449+ "minipass-fetch/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
450+
451+ "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
452+
453+ "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
454+
455+ "minipass-sized/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
456+
457+ "path-scurry/lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="],
458+
459+ "pumpify/pump": ["pump@2.0.1", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA=="],
460+
461+ "purescript-installer/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
462+
463+ "purescript-installer/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="],
464+
465+ "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
466+
467+ "slice-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
468+
469+ "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
470+
471+ "@npmcli/move-file/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
472+
473+ "cacache/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
474+
475+ "fs-minipass/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
476+
477+ "make-fetch-happen/cacache/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
478+
479+ "make-fetch-happen/cacache/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="],
480+
481+ "make-fetch-happen/cacache/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
482+
483+ "make-fetch-happen/cacache/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="],
484+
485+ "make-fetch-happen/cacache/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="],
486+
487+ "make-fetch-happen/cacache/unique-filename": ["unique-filename@2.0.1", "", { "dependencies": { "unique-slug": "^3.0.0" } }, "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A=="],
488+
489+ "make-fetch-happen/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
490+
491+ "minipass-collect/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
492+
493+ "minipass-fetch/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
494+
495+ "minipass-fetch/minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
496+
497+ "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
498+
499+ "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
500+
501+ "minipass-sized/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
502+
503+ "purescript-installer/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
504+
505+ "purescript-installer/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
506+
507+ "purescript-installer/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
508+
509+ "purescript-installer/tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
510+
511+ "purescript-installer/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
512+
513+ "rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
514+
515+ "slice-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
516+
517+ "wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
518+
519+ "@npmcli/move-file/rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
520+
521+ "cacache/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="],
522+
523+ "make-fetch-happen/cacache/glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="],
524+
525+ "make-fetch-happen/cacache/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
526+
527+ "make-fetch-happen/cacache/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
528+
529+ "make-fetch-happen/cacache/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
530+
531+ "make-fetch-happen/cacache/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
532+
533+ "make-fetch-happen/cacache/unique-filename/unique-slug": ["unique-slug@3.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w=="],
534+
535+ "purescript-installer/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
536+
537+ "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="],
538+
539+ "slice-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
540+
541+ "wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
542+
543+ "@npmcli/move-file/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="],
544+
545+ "cacache/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
546+
547+ "make-fetch-happen/cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="],
548+
549+ "make-fetch-happen/cacache/rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
550+
551+ "make-fetch-happen/cacache/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
552+
553+ "rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
554+
555+ "@npmcli/move-file/rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
556+
557+ "make-fetch-happen/cacache/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
558+
559+ "make-fetch-happen/cacache/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="],
560+
561+ "make-fetch-happen/cacache/rimraf/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
562+ }
563+}
package.json+13−12
@@ -2,22 +2,23 @@
22 "name": "purescript-playwright",
33 "version": "0.0.1",
44 "description": "PureScript bindings for Playwright",
5− "main": "index.js",
6− "directories": {
7− "test": "test"
8− },
5+ "type": "module",
96 "dependencies": {
10− "bower": "^1.8.8",
11− "playwright": "^1.3.0",
12− "pulp": "^15.0.0"
7+ "@playwright/test": "~1.60.0",
8+ "playwright": "~1.60.0"
9+ },
10+ "devDependencies": {
11+ "purescript": "0.15.16",
12+ "spago": "^1.0.3"
1313 },
14− "devDependencies": {},
1514 "scripts": {
16− "test": "pulp test"
15+ "build": "spago build",
16+ "test": "bun run build && playwright test",
17+ "test:install": "playwright install chromium"
1718 },
1819 "repository": {
1920 "type": "git",
20− "url": "git+https://github.com/klntsky/purescript-playwright.git"
21+ "url": "git+https://github.com/rowtype-yoga/purescript-playwright.git"
2122 },
2223 "keywords": [
2324 "purescript",
@@ -26,7 +27,7 @@
2627 "author": "Vladimir Kalnitsky <klntsky@gmail.com>",
2728 "license": "BSD-3-Clause",
2829 "bugs": {
29− "url": "https://github.com/klntsky/purescript-playwright/issues"
30+ "url": "https://github.com/rowtype-yoga/purescript-playwright/issues"
3031 },
31− "homepage": "https://github.com/klntsky/purescript-playwright#readme"
32+ "homepage": "https://github.com/rowtype-yoga/purescript-playwright#readme"
3233}
packages.dhalldeleted−43
@@ -1,43 +0,0 @@
1−let upstream =
2− https://github.com/purescript/package-sets/releases/download/psc-0.13.8-20200911-2/packages.dhall sha256:872c06349ed9c8210be43982dc6466c2ca7c5c441129826bcb9bf3672938f16e
3−
4−let overrides =
5− { untagged-union =
6− { dependencies =
7− [ "assert"
8− , "console"
9− , "effect"
10− , "foreign"
11− , "foreign-object"
12− , "literals"
13− , "maybe"
14− , "newtype"
15− , "proxy"
16− , "psci-support"
17− , "tuples"
18− , "unsafe-coerce"
19− ]
20− , repo = "https://github.com/jvliwanag/purescript-untagged-union.git"
21− , version = "edc091a1fde2cb6ac775865ee6e761b2fb99fc22"
22− }
23− }
24−
25−let additions =
26− { literals =
27− { dependencies =
28− [ "assert"
29− , "effect"
30− , "console"
31− , "integers"
32− , "numbers"
33− , "partial"
34− , "psci-support"
35− , "unsafe-coerce"
36− , "typelevel-prelude"
37− ]
38− , repo = "https://github.com/jvliwanag/purescript-literals.git"
39− , version = "7b2ae20f77c67b7e419a92fdd0dc7a09b447b18e"
40− }
41− }
42−
43−in upstream ⫽ overrides ⫽ additions
spago.dhalldeleted−16
@@ -1,16 +0,0 @@
1−{ name = "playwright"
2−, dependencies =
3− [ "console"
4− , "effect"
5− , "prelude"
6− , "psci-support"
7− , "aff-promise"
8− , "test-unit"
9− , "untagged-union"
10− , "node-buffer"
11− , "node-fs-aff"
12− , "undefined"
13− ]
14−, packages = ./packages.dhall
15−, sources = [ "src/**/*.purs", "test/**/*.purs" ]
16−}
spago.locknew file+1379
@@ -0,0 +1,1379 @@
1+{
2+ "workspace": {
3+ "packages": {
4+ "playwright": {
5+ "path": "./",
6+ "core": {
7+ "dependencies": [
8+ {
9+ "aff": ">=8.0.0 <9.0.0"
10+ },
11+ {
12+ "aff-promise": ">=4.0.0 <5.0.0"
13+ },
14+ {
15+ "argonaut-core": ">=7.0.0 <8.0.0"
16+ },
17+ {
18+ "datetime": ">=6.1.0 <7.0.0"
19+ },
20+ {
21+ "effect": ">=4.0.0 <5.0.0"
22+ },
23+ {
24+ "exceptions": ">=6.1.0 <7.0.0"
25+ },
26+ {
27+ "foreign": ">=7.0.0 <8.0.0"
28+ },
29+ {
30+ "foreign-object": ">=4.1.0 <5.0.0"
31+ },
32+ {
33+ "literals": ">=1.0.2 <2.0.0"
34+ },
35+ {
36+ "maybe": ">=6.0.0 <7.0.0"
37+ },
38+ {
39+ "node-buffer": ">=9.0.0 <10.0.0"
40+ },
41+ {
42+ "node-streams": ">=9.0.1 <10.0.0"
43+ },
44+ {
45+ "ordered-collections": ">=3.2.0 <4.0.0"
46+ },
47+ {
48+ "prelude": ">=6.0.2 <7.0.0"
49+ },
50+ {
51+ "strings": ">=6.0.1 <7.0.0"
52+ },
53+ {
54+ "typelevel-prelude": ">=7.0.0 <8.0.0"
55+ },
56+ {
57+ "untagged-union": ">=1.0.0 <2.0.0"
58+ }
59+ ]
60+ },
61+ "test": {
62+ "dependencies": [
63+ "either",
64+ "transformers"
65+ ]
66+ }
67+ }
68+ },
69+ "package_set": {
70+ "address": {
71+ "registry": "73.2.0"
72+ },
73+ "compiler": ">=0.15.15 <0.16.0",
74+ "content": {
75+ "abc-parser": "2.1.0",
76+ "ace": "9.1.0",
77+ "address-rfc2821": "0.1.1",
78+ "aff": "8.0.0",
79+ "aff-bus": "6.0.0",
80+ "aff-coroutines": "9.0.0",
81+ "aff-promise": "4.0.0",
82+ "aff-retry": "2.0.0",
83+ "affjax": "13.0.0",
84+ "affjax-node": "1.0.0",
85+ "affjax-web": "1.0.0",
86+ "ansi": "7.0.0",
87+ "apexcharts": "0.5.0",
88+ "applicative-phases": "1.0.0",
89+ "argonaut": "9.0.0",
90+ "argonaut-aeson-generic": "0.4.1",
91+ "argonaut-codecs": "9.1.0",
92+ "argonaut-core": "7.0.0",
93+ "argonaut-generic": "8.0.0",
94+ "argonaut-traversals": "10.0.0",
95+ "argparse-basic": "2.0.0",
96+ "array-builder": "0.1.2",
97+ "array-search": "0.6.0",
98+ "arraybuffer": "13.2.0",
99+ "arraybuffer-builder": "3.1.0",
100+ "arraybuffer-types": "3.0.2",
101+ "arrays": "7.3.0",
102+ "arrays-extra": "0.6.1",
103+ "arrays-zipper": "2.0.1",
104+ "ask": "1.0.0",
105+ "assert": "6.0.0",
106+ "assert-multiple": "0.4.0",
107+ "avar": "5.0.1",
108+ "axon": "0.0.3",
109+ "b64": "0.0.8",
110+ "barbies": "1.0.1",
111+ "barlow-lens": "0.9.0",
112+ "benchlib": "0.0.4",
113+ "bifunctors": "6.1.0",
114+ "bigints": "7.0.1",
115+ "blessed": "1.0.0",
116+ "bolson": "0.3.9",
117+ "bookhound": "0.1.7",
118+ "bower-json": "3.0.0",
119+ "call-by-name": "4.0.1",
120+ "canvas": "6.0.0",
121+ "canvas-action": "9.0.0",
122+ "cartesian": "1.0.6",
123+ "catenable-lists": "7.0.0",
124+ "cbor-stream": "1.3.0",
125+ "chameleon": "1.0.0",
126+ "chameleon-halogen": "1.0.3",
127+ "chameleon-react-basic": "1.1.0",
128+ "chameleon-styled": "2.5.0",
129+ "chameleon-transformers": "1.0.0",
130+ "channel": "1.0.0",
131+ "checked-exceptions": "3.1.1",
132+ "choku": "1.0.2",
133+ "classless": "0.1.1",
134+ "classless-arbitrary": "0.1.1",
135+ "classless-decode-json": "0.1.1",
136+ "classless-encode-json": "0.1.3",
137+ "classnames": "2.0.0",
138+ "codec": "6.1.0",
139+ "codec-argonaut": "10.0.0",
140+ "codec-json": "2.0.0",
141+ "colors": "7.0.1",
142+ "concur-core": "0.5.0",
143+ "concur-react": "0.5.0",
144+ "concurrent-queues": "3.0.0",
145+ "console": "6.1.0",
146+ "const": "6.0.0",
147+ "contravariant": "6.0.0",
148+ "control": "6.0.0",
149+ "convertable-options": "1.0.0",
150+ "coroutines": "7.0.0",
151+ "css": "6.0.0",
152+ "css-class-name-extractor": "0.0.4",
153+ "css-frameworks": "1.1.0",
154+ "csv-stream": "2.3.0",
155+ "data-mvc": "0.0.2",
156+ "datetime": "6.1.0",
157+ "datetime-parsing": "0.2.0",
158+ "debounce": "0.1.0",
159+ "debug": "6.0.2",
160+ "decimals": "7.1.0",
161+ "default-values": "1.0.1",
162+ "deku": "0.9.23",
163+ "deno": "0.0.5",
164+ "dissect": "1.0.0",
165+ "distributive": "6.0.0",
166+ "dodo-printer": "2.2.3",
167+ "dom-filereader": "7.0.0",
168+ "dom-indexed": "13.0.0",
169+ "dom-simple": "0.4.0",
170+ "dotenv": "4.0.3",
171+ "droplet": "0.6.0",
172+ "dts": "1.0.0",
173+ "dual-numbers": "1.0.3",
174+ "dynamic-buffer": "3.0.1",
175+ "echarts-simple": "0.0.1",
176+ "effect": "4.0.0",
177+ "either": "6.1.0",
178+ "elmish": "0.13.0",
179+ "elmish-enzyme": "0.1.1",
180+ "elmish-hooks": "0.11.0",
181+ "elmish-html": "0.10.0",
182+ "elmish-testing-library": "0.3.2",
183+ "elmish-time-machine": "0.4.2",
184+ "email-validate": "7.0.0",
185+ "encoding": "0.0.9",
186+ "enums": "6.0.1",
187+ "env-names": "0.4.0",
188+ "environment": "2.0.0",
189+ "error": "2.0.0",
190+ "eta-conversion": "0.3.2",
191+ "exceptions": "6.1.0",
192+ "exists": "6.0.0",
193+ "exitcodes": "4.0.0",
194+ "expect-inferred": "3.0.0",
195+ "express": "0.9.1",
196+ "ezfetch": "1.1.1",
197+ "fahrtwind": "2.0.0",
198+ "fakerjs": "0.0.1",
199+ "fallback": "0.1.0",
200+ "fast-vect": "1.2.0",
201+ "fetch": "4.1.0",
202+ "fetch-argonaut": "1.0.1",
203+ "fetch-core": "5.1.0",
204+ "fetch-yoga-json": "1.1.0",
205+ "ffi-simple": "0.5.1",
206+ "fft": "0.3.0",
207+ "fft-js": "0.1.0",
208+ "filterable": "5.0.0",
209+ "fix-functor": "0.1.0",
210+ "fixed-points": "7.0.0",
211+ "fixed-precision": "5.0.0",
212+ "flame": "1.6.0",
213+ "float32": "2.0.0",
214+ "fmt": "0.2.1",
215+ "foldable-traversable": "6.0.0",
216+ "foldable-traversable-extra": "0.0.6",
217+ "foreign": "7.0.0",
218+ "foreign-object": "4.1.0",
219+ "foreign-readwrite": "3.4.0",
220+ "forgetmenot": "0.1.0",
221+ "fork": "6.0.0",
222+ "form-urlencoded": "7.0.0",
223+ "formatters": "7.0.0",
224+ "framer-motion": "2.0.1",
225+ "free": "7.1.0",
226+ "freeap": "7.0.0",
227+ "freer-free": "0.0.1",
228+ "freet": "7.0.0",
229+ "functions": "6.0.0",
230+ "functor1": "3.0.0",
231+ "functors": "5.0.0",
232+ "fuzzy": "0.4.0",
233+ "gen": "4.0.0",
234+ "generate-values": "1.0.1",
235+ "generic-router": "0.0.1",
236+ "geojson": "0.0.5",
237+ "geometria": "2.2.0",
238+ "gesso": "1.0.1",
239+ "gojs": "0.1.1",
240+ "golem-fetch": "0.1.0",
241+ "grain": "3.0.0",
242+ "grain-router": "3.0.0",
243+ "grain-virtualized": "3.0.0",
244+ "graphql-client": "10.1.1",
245+ "graphs": "8.1.0",
246+ "group": "4.1.1",
247+ "halogen": "7.0.0",
248+ "halogen-bootstrap5": "5.3.2",
249+ "halogen-canvas": "1.0.0",
250+ "halogen-css": "10.0.0",
251+ "halogen-declarative-canvas": "0.0.8",
252+ "halogen-echarts-simple": "0.0.4",
253+ "halogen-formless": "4.0.3",
254+ "halogen-helix": "1.1.0",
255+ "halogen-hooks": "0.6.3",
256+ "halogen-hooks-extra": "0.9.0",
257+ "halogen-infinite-scroll": "1.1.0",
258+ "halogen-store": "0.5.4",
259+ "halogen-storybook": "2.0.0",
260+ "halogen-subscriptions": "2.0.0",
261+ "halogen-svg-elems": "8.0.0",
262+ "halogen-typewriter": "1.0.4",
263+ "halogen-use-trigger-hooks": "1.0.0",
264+ "halogen-vdom": "8.0.0",
265+ "halogen-vdom-string-renderer": "0.5.0",
266+ "halogen-xterm": "2.0.0",
267+ "heckin": "2.0.1",
268+ "heterogeneous": "0.7.0",
269+ "homogeneous": "0.4.0",
270+ "http-methods": "6.0.0",
271+ "httpurple": "4.0.0",
272+ "huffman": "0.4.0",
273+ "humdrum": "0.0.1",
274+ "hylograph-canvas": "0.1.0",
275+ "hylograph-d3-kernel": "0.1.0",
276+ "hylograph-graph": "0.1.0",
277+ "hylograph-layout": "0.1.0",
278+ "hylograph-music": "0.1.0",
279+ "hylograph-optics": "0.1.0",
280+ "hylograph-selection": "0.1.1",
281+ "hylograph-simulation": "0.1.0",
282+ "hylograph-simulation-core": "0.1.0",
283+ "hylograph-simulation-halogen": "0.1.0",
284+ "hylograph-transitions": "0.1.0",
285+ "hylograph-wasm-kernel": "0.1.0",
286+ "hyrule": "2.3.8",
287+ "identity": "6.0.0",
288+ "identy": "4.0.1",
289+ "indexed-db": "1.0.0",
290+ "indexed-monad": "3.0.0",
291+ "ink": "0.0.1",
292+ "int64": "3.0.0",
293+ "integers": "6.0.0",
294+ "interpolate": "5.0.2",
295+ "intersection-observer": "1.0.1",
296+ "invariant": "6.0.0",
297+ "jarilo": "1.0.1",
298+ "jelly": "0.10.0",
299+ "jelly-router": "0.3.0",
300+ "jelly-signal": "0.4.0",
301+ "jest": "1.0.0",
302+ "js-abort-controller": "1.0.0",
303+ "js-bigints": "2.2.1",
304+ "js-date": "8.0.0",
305+ "js-fetch": "0.2.1",
306+ "js-fileio": "3.0.0",
307+ "js-intl": "1.1.4",
308+ "js-iterators": "0.1.1",
309+ "js-maps": "0.1.2",
310+ "js-promise": "1.0.0",
311+ "js-promise-aff": "1.0.0",
312+ "js-timers": "6.1.0",
313+ "js-uri": "3.1.0",
314+ "jsdom": "1.0.0",
315+ "json": "1.1.0",
316+ "json-codecs": "5.0.0",
317+ "justifill": "0.5.0",
318+ "jwt": "0.0.9",
319+ "labeled-data": "0.2.0",
320+ "language-cst-parser": "0.14.1",
321+ "lazy": "6.0.0",
322+ "lazy-joe": "1.0.0",
323+ "lcg": "4.0.0",
324+ "leibniz": "5.0.0",
325+ "leveldb": "1.0.1",
326+ "liminal": "1.0.1",
327+ "linalg": "6.0.0",
328+ "lists": "7.0.0",
329+ "literals": "1.0.2",
330+ "logging": "3.0.0",
331+ "logging-journald": "0.4.0",
332+ "lumi-components": "18.0.0",
333+ "machines": "7.0.0",
334+ "maps-eager": "0.5.0",
335+ "marionette": "1.0.0",
336+ "marionette-react-basic-hooks": "0.1.1",
337+ "marked": "0.1.0",
338+ "matrices": "5.0.1",
339+ "matryoshka": "1.0.0",
340+ "maybe": "6.0.0",
341+ "media-types": "6.0.0",
342+ "meowclient": "1.0.0",
343+ "midi": "4.0.0",
344+ "milkis": "9.0.0",
345+ "mimetype": "0.0.1",
346+ "minibench": "4.0.1",
347+ "mmorph": "7.0.0",
348+ "monad-control": "5.0.0",
349+ "monad-logger": "1.3.1",
350+ "monad-loops": "0.5.0",
351+ "monad-unlift": "1.0.1",
352+ "monoid-extras": "0.0.1",
353+ "monoidal": "0.16.0",
354+ "morello": "0.4.0",
355+ "mote": "3.0.0",
356+ "motsunabe": "2.0.0",
357+ "mvc": "0.0.1",
358+ "mysql": "6.0.1",
359+ "n3": "0.1.0",
360+ "nano-id": "1.1.0",
361+ "nanoid": "0.1.0",
362+ "naturals": "3.0.0",
363+ "nested-functor": "0.2.1",
364+ "newtype": "5.0.0",
365+ "nextjs": "0.1.1",
366+ "nextui": "0.2.0",
367+ "node-buffer": "9.0.0",
368+ "node-child-process": "11.1.0",
369+ "node-event-emitter": "3.0.0",
370+ "node-execa": "5.0.0",
371+ "node-fs": "9.2.0",
372+ "node-glob-basic": "2.0.0",
373+ "node-http": "9.1.0",
374+ "node-http2": "1.1.1",
375+ "node-human-signals": "1.0.0",
376+ "node-net": "5.1.0",
377+ "node-os": "5.1.0",
378+ "node-path": "5.0.1",
379+ "node-process": "11.2.0",
380+ "node-readline": "8.1.1",
381+ "node-sqlite3": "8.0.0",
382+ "node-stream-pipes": "2.1.6",
383+ "node-streams": "9.0.1",
384+ "node-tls": "0.3.1",
385+ "node-url": "7.0.1",
386+ "node-workerbees": "0.3.1",
387+ "node-zlib": "0.4.0",
388+ "nonempty": "7.0.0",
389+ "now": "6.0.0",
390+ "npm-package-json": "2.0.0",
391+ "nullable": "6.0.0",
392+ "numberfield": "0.2.2",
393+ "numbers": "9.0.1",
394+ "oak": "3.1.1",
395+ "oak-debug": "1.2.2",
396+ "object-maps": "0.3.0",
397+ "ocarina": "1.5.4",
398+ "oooooooooorrrrrrrmm-lib": "0.0.1",
399+ "open-colors-scales-and-schemes": "1.0.0",
400+ "open-drawing": "6.0.4",
401+ "open-folds": "6.4.0",
402+ "open-foreign-generic": "11.0.3",
403+ "open-memoize": "6.2.0",
404+ "open-mkdirp-aff": "1.2.0",
405+ "open-pairing": "6.2.0",
406+ "open-smolder": "12.0.2",
407+ "options": "7.0.0",
408+ "optparse": "5.0.1",
409+ "ordered-collections": "3.2.0",
410+ "ordered-set": "0.5.0",
411+ "orders": "6.0.0",
412+ "org-doc": "0.1.0",
413+ "owoify": "1.2.0",
414+ "pairs": "9.0.1",
415+ "parallel": "7.0.0",
416+ "parsing": "11.0.0",
417+ "parsing-dataview": "3.2.4",
418+ "partial": "4.0.0",
419+ "pathy": "9.0.0",
420+ "pha": "0.13.0",
421+ "phaser": "0.7.0",
422+ "phylio": "1.1.2",
423+ "pipes": "8.0.0",
424+ "pirates-charm": "0.0.1",
425+ "play": "1.0.0",
426+ "pmock": "0.9.0",
427+ "point-free": "1.0.0",
428+ "pointed-list": "0.5.1",
429+ "polymorphic-vectors": "4.0.0",
430+ "posix-types": "6.0.0",
431+ "postgresql": "2.0.21",
432+ "precise": "6.0.0",
433+ "precise-datetime": "7.0.0",
434+ "prelude": "6.0.2",
435+ "prettier-printer": "3.0.0",
436+ "printf": "0.1.0",
437+ "priority-queue": "0.1.2",
438+ "profunctor": "6.0.1",
439+ "profunctor-lenses": "8.0.0",
440+ "protobuf": "4.4.0",
441+ "psa-utils": "8.0.0",
442+ "psci-support": "6.0.0",
443+ "punycode": "1.0.0",
444+ "pursfmt": "0.17.0",
445+ "qualified-do": "2.2.0",
446+ "quantities": "12.2.0",
447+ "quickcheck": "8.0.1",
448+ "quickcheck-combinators": "0.1.3",
449+ "quickcheck-laws": "7.0.0",
450+ "quickcheck-utf8": "0.0.0",
451+ "random": "6.0.0",
452+ "rationals": "6.0.0",
453+ "rdf": "0.1.0",
454+ "react": "11.0.0",
455+ "react-aria": "0.2.0",
456+ "react-basic": "17.0.0",
457+ "react-basic-classic": "3.0.0",
458+ "react-basic-dnd": "10.1.0",
459+ "react-basic-dom": "7.0.0",
460+ "react-basic-dom-beta": "0.1.1",
461+ "react-basic-emotion": "7.1.0",
462+ "react-basic-hooks": "9.0.0",
463+ "react-basic-storybook": "2.0.0",
464+ "react-dom": "8.0.0",
465+ "react-halo": "3.0.0",
466+ "react-icons": "1.1.5",
467+ "react-markdown": "0.1.0",
468+ "react-testing-library": "4.0.1",
469+ "react-virtuoso": "1.0.0",
470+ "reactix": "0.6.1",
471+ "read": "1.0.1",
472+ "recharts": "1.1.0",
473+ "record": "4.0.0",
474+ "record-extra": "5.0.1",
475+ "record-extra-srghma": "0.2.8",
476+ "record-ptional-fields": "0.1.2",
477+ "record-studio": "1.0.4",
478+ "refs": "6.0.0",
479+ "remotedata": "5.0.1",
480+ "repr": "0.5.0",
481+ "resize-arrays": "0.0.1",
482+ "resize-observer": "1.0.0",
483+ "resource": "2.0.1",
484+ "resourcet": "1.0.0",
485+ "result": "1.0.3",
486+ "return": "0.2.0",
487+ "ring-modules": "5.0.1",
488+ "rito": "0.3.4",
489+ "roman": "0.4.0",
490+ "rough-notation": "1.0.2",
491+ "routing": "11.0.0",
492+ "routing-duplex": "0.7.0",
493+ "run": "5.0.0",
494+ "safe-coerce": "2.0.0",
495+ "safely": "4.0.1",
496+ "school-of-music": "1.3.0",
497+ "selection-foldable": "0.2.0",
498+ "selective-functors": "1.0.1",
499+ "semirings": "7.0.0",
500+ "shuffle": "2.0.0",
501+ "sigil": "0.2.0",
502+ "signal": "13.0.0",
503+ "simple-emitter": "3.0.1",
504+ "simple-i18n": "2.0.1",
505+ "simple-json": "9.0.0",
506+ "simple-json-generics": "0.2.1",
507+ "simple-ulid": "3.0.0",
508+ "sized-matrices": "1.0.0",
509+ "sized-vectors": "5.0.2",
510+ "slug": "3.2.0",
511+ "small-ffi": "4.0.1",
512+ "soundfonts": "4.1.0",
513+ "sparse-matrices": "2.0.1",
514+ "sparse-polynomials": "3.0.1",
515+ "spec": "8.1.1",
516+ "spec-discovery": "8.4.1",
517+ "spec-mocha": "5.1.1",
518+ "spec-node": "0.0.3",
519+ "spec-quickcheck": "5.0.2",
520+ "spec-reporter-xunit": "0.7.1",
521+ "splitmix": "2.1.0",
522+ "ssrs": "1.0.0",
523+ "st": "6.2.0",
524+ "statistics": "0.3.2",
525+ "strictlypositiveint": "1.0.1",
526+ "string-parsers": "8.0.0",
527+ "strings": "6.0.1",
528+ "strings-extra": "4.0.0",
529+ "stringutils": "0.0.12",
530+ "structured-logging": "1.0.0",
531+ "substitute": "0.2.3",
532+ "supply": "0.2.0",
533+ "svg-parser": "3.0.0",
534+ "systemd-journald": "0.3.0",
535+ "tagged": "4.0.2",
536+ "tailrec": "6.1.0",
537+ "tanstack-query": "2.0.0",
538+ "tecton": "0.2.1",
539+ "tecton-halogen": "0.2.0",
540+ "test-unit": "17.0.0",
541+ "text-formatting": "0.1.0",
542+ "thermite": "6.3.1",
543+ "thermite-dom": "0.3.1",
544+ "these": "6.0.0",
545+ "threading": "0.0.3",
546+ "tidy": "0.11.1",
547+ "tidy-codegen": "4.0.1",
548+ "tldr": "0.0.0",
549+ "toestand": "0.9.0",
550+ "transformation-matrix": "1.0.1",
551+ "transformers": "6.1.0",
552+ "transit": "1.0.0",
553+ "tree-rose": "4.0.2",
554+ "trivial-unfold": "0.5.0",
555+ "ts-bridge": "4.0.0",
556+ "tuples": "7.0.0",
557+ "two-or-more": "1.0.0",
558+ "type-equality": "4.0.1",
559+ "typedenv": "2.0.1",
560+ "typelevel": "6.0.0",
561+ "typelevel-lists": "2.1.0",
562+ "typelevel-peano": "1.0.1",
563+ "typelevel-prelude": "7.0.0",
564+ "typelevel-regex": "0.0.3",
565+ "typelevel-rows": "0.1.0",
566+ "typisch": "0.4.0",
567+ "uint": "7.0.0",
568+ "ulid": "3.0.1",
569+ "uncurried-transformers": "1.1.0",
570+ "undefined": "2.0.0",
571+ "undefined-is-not-a-problem": "1.1.0",
572+ "unfoldable": "6.0.0",
573+ "unicode": "6.0.0",
574+ "unique": "0.6.1",
575+ "unlift": "1.0.1",
576+ "unordered-collections": "3.1.0",
577+ "unsafe-coerce": "6.0.0",
578+ "unsafe-reference": "5.0.0",
579+ "untagged-to-tagged": "0.1.4",
580+ "untagged-union": "1.0.0",
581+ "uri": "9.0.0",
582+ "url-immutable": "1.0.0",
583+ "url-regex-safe": "0.1.1",
584+ "uuid": "9.0.0",
585+ "uuidv4": "1.0.0",
586+ "validation": "6.0.0",
587+ "variant": "8.0.0",
588+ "variant-encodings": "2.0.0",
589+ "variant-gen": "1.0.0",
590+ "vectorfield": "1.0.1",
591+ "vectors": "2.1.0",
592+ "versions": "7.0.0",
593+ "visx": "0.0.2",
594+ "vitest": "2.0.0",
595+ "web-clipboard": "6.0.0",
596+ "web-cssom": "2.0.0",
597+ "web-cssom-view": "0.1.0",
598+ "web-dom": "6.0.0",
599+ "web-dom-parser": "8.0.0",
600+ "web-dom-xpath": "3.0.0",
601+ "web-encoding": "3.0.0",
602+ "web-events": "4.0.0",
603+ "web-fetch": "4.0.1",
604+ "web-file": "4.0.0",
605+ "web-geometry": "0.1.0",
606+ "web-html": "4.1.1",
607+ "web-pointerevents": "2.0.0",
608+ "web-proletarian": "1.0.0",
609+ "web-promise": "3.2.0",
610+ "web-resize-observer": "2.1.0",
611+ "web-router": "1.0.0",
612+ "web-socket": "4.0.0",
613+ "web-storage": "5.0.0",
614+ "web-streams": "4.0.0",
615+ "web-touchevents": "4.0.0",
616+ "web-uievents": "5.0.0",
617+ "web-url": "2.0.0",
618+ "web-workers": "1.1.0",
619+ "web-xhr": "5.0.1",
620+ "webb-aff-list": "0.0.2",
621+ "webb-array": "0.0.2",
622+ "webb-channel": "0.0.3",
623+ "webb-commandline": "0.0.3",
624+ "webb-directory": "0.0.7",
625+ "webb-file": "0.0.1",
626+ "webb-map": "0.0.1",
627+ "webb-monad": "0.0.2",
628+ "webb-mutex": "0.0.7",
629+ "webb-parsing": "0.0.5",
630+ "webb-random": "0.0.1",
631+ "webb-refer": "0.0.3",
632+ "webb-set": "0.0.1",
633+ "webb-slot": "0.0.1",
634+ "webb-stateful": "0.0.3",
635+ "webb-string": "0.0.1",
636+ "webb-test": "0.0.1",
637+ "webb-thread": "0.0.2",
638+ "webb-writer": "0.0.3",
639+ "webextension-polyfill": "0.1.0",
640+ "webgpu": "0.0.1",
641+ "which": "2.0.0",
642+ "whine-core": "0.0.33",
643+ "xterm": "1.0.0",
644+ "yaml-next": "3.1.1",
645+ "yoga-fetch": "1.0.1",
646+ "yoga-json": "5.1.0",
647+ "yoga-om": "0.1.0",
648+ "yoga-postgres": "6.0.0",
649+ "yoga-react-dom": "1.0.1",
650+ "yoga-redis": "0.1.0",
651+ "yoga-sql-types": "0.1.0",
652+ "yoga-subtlecrypto": "0.1.0",
653+ "yoga-test-docker": "0.1.0",
654+ "yoga-tree": "1.0.0",
655+ "yoga-tree-svg": "0.1.0",
656+ "yoga-tree-utils": "1.0.0",
657+ "z3": "0.0.2",
658+ "zipperarray": "2.0.0"
659+ }
660+ },
661+ "extra_packages": {}
662+ },
663+ "packages": {
664+ "aff": {
665+ "type": "registry",
666+ "version": "8.0.0",
667+ "integrity": "sha256-9BRIrSdRoYybfiUmBqgKJ66cPqxYHb277bVWQMn/9sg=",
668+ "dependencies": [
669+ "control",
670+ "datetime",
671+ "effect",
672+ "either",
673+ "exceptions",
674+ "functions",
675+ "newtype",
676+ "parallel",
677+ "partial",
678+ "prelude",
679+ "st",
680+ "tailrec",
681+ "transformers",
682+ "unsafe-coerce"
683+ ]
684+ },
685+ "aff-promise": {
686+ "type": "registry",
687+ "version": "4.0.0",
688+ "integrity": "sha256-Jgp3y+NWuuAmwz2V3LlWoX+AvxqfVglY77N5zTw8xnI=",
689+ "dependencies": [
690+ "aff",
691+ "control",
692+ "effect",
693+ "either",
694+ "exceptions",
695+ "foreign",
696+ "prelude",
697+ "transformers"
698+ ]
699+ },
700+ "argonaut-core": {
701+ "type": "registry",
702+ "version": "7.0.0",
703+ "integrity": "sha256-gYZihtBIKthVuXXoiPphMookSf8M5aHyFYkcIWqlxTM=",
704+ "dependencies": [
705+ "arrays",
706+ "control",
707+ "either",
708+ "foreign-object",
709+ "functions",
710+ "gen",
711+ "maybe",
712+ "nonempty",
713+ "prelude",
714+ "strings",
715+ "tailrec"
716+ ]
717+ },
718+ "arraybuffer-types": {
719+ "type": "registry",
720+ "version": "3.0.2",
721+ "integrity": "sha256-p05cJnSkyeoB7VHzMyc2Eb1RwUaB7Nl0sQSqEGNEUD8=",
722+ "dependencies": []
723+ },
724+ "arrays": {
725+ "type": "registry",
726+ "version": "7.3.0",
727+ "integrity": "sha256-GD4z7LCi9wzi7FCQqbWhvs8paoUK9NO+HwgXZ+KP8Rk=",
728+ "dependencies": [
729+ "bifunctors",
730+ "control",
731+ "foldable-traversable",
732+ "functions",
733+ "maybe",
734+ "nonempty",
735+ "partial",
736+ "prelude",
737+ "safe-coerce",
738+ "st",
739+ "tailrec",
740+ "tuples",
741+ "unfoldable",
742+ "unsafe-coerce"
743+ ]
744+ },
745+ "bifunctors": {
746+ "type": "registry",
747+ "version": "6.1.0",
748+ "integrity": "sha256-CvZRb8uI75eKIqiYntR+k05Wk6tKlMS5w8sCA2AFna0=",
749+ "dependencies": [
750+ "const",
751+ "either",
752+ "newtype",
753+ "prelude",
754+ "tuples"
755+ ]
756+ },
757+ "const": {
758+ "type": "registry",
759+ "version": "6.0.0",
760+ "integrity": "sha256-S+m0lQsxnji0z1XRUmkn+3RFuWJ5CXWuIr1u3i8Bfoc=",
761+ "dependencies": [
762+ "invariant",
763+ "newtype",
764+ "prelude"
765+ ]
766+ },
767+ "contravariant": {
768+ "type": "registry",
769+ "version": "6.0.0",
770+ "integrity": "sha256-nuckEWqL80NaPmR/l9AUyrfycNh18XcvlZV9PAamwqc=",
771+ "dependencies": [
772+ "const",
773+ "either",
774+ "newtype",
775+ "prelude",
776+ "tuples"
777+ ]
778+ },
779+ "control": {
780+ "type": "registry",
781+ "version": "6.0.0",
782+ "integrity": "sha256-0vxyYh5FL+ilxgLo954w1LqCUC0RSIivNNlb9CaNUQg=",
783+ "dependencies": [
784+ "newtype",
785+ "prelude"
786+ ]
787+ },
788+ "datetime": {
789+ "type": "registry",
790+ "version": "6.1.0",
791+ "integrity": "sha256-tbv6eDXy6QOD7YSknxYSbsDF32OC2JrNbSBpzMs7Doc=",
792+ "dependencies": [
793+ "bifunctors",
794+ "control",
795+ "either",
796+ "enums",
797+ "foldable-traversable",
798+ "functions",
799+ "gen",
800+ "integers",
801+ "lists",
802+ "maybe",
803+ "newtype",
804+ "numbers",
805+ "ordered-collections",
806+ "partial",
807+ "prelude",
808+ "tuples"
809+ ]
810+ },
811+ "distributive": {
812+ "type": "registry",
813+ "version": "6.0.0",
814+ "integrity": "sha256-netyJK4B32PDYHD0tF2AenKgo3urzbI770ycM0pArAo=",
815+ "dependencies": [
816+ "identity",
817+ "newtype",
818+ "prelude",
819+ "tuples",
820+ "type-equality"
821+ ]
822+ },
823+ "effect": {
824+ "type": "registry",
825+ "version": "4.0.0",
826+ "integrity": "sha256-DdqU3bncRTjgMVPPRlAuGHVeajSPEcRaRhNuio7if6s=",
827+ "dependencies": [
828+ "prelude"
829+ ]
830+ },
831+ "either": {
832+ "type": "registry",
833+ "version": "6.1.0",
834+ "integrity": "sha256-tBHx3PgtH4GZOApZCDkcM7szRTYJinrUrVGWazQCUUg=",
835+ "dependencies": [
836+ "control",
837+ "invariant",
838+ "maybe",
839+ "prelude"
840+ ]
841+ },
842+ "enums": {
843+ "type": "registry",
844+ "version": "6.0.1",
845+ "integrity": "sha256-sdZOmLX5+5pASGpvVyT0vSD5BBYQjZiayjV5XiPutso=",
846+ "dependencies": [
847+ "control",
848+ "either",
849+ "gen",
850+ "maybe",
851+ "newtype",
852+ "nonempty",
853+ "partial",
854+ "prelude",
855+ "tuples",
856+ "unfoldable"
857+ ]
858+ },
859+ "exceptions": {
860+ "type": "registry",
861+ "version": "6.1.0",
862+ "integrity": "sha256-nRrr+N0wk0TUFOWLR7e1n1oxcXo/X345bQUtoY9lW6A=",
863+ "dependencies": [
864+ "effect",
865+ "either",
866+ "maybe",
867+ "prelude"
868+ ]
869+ },
870+ "exists": {
871+ "type": "registry",
872+ "version": "6.0.0",
873+ "integrity": "sha256-vtLbrWNaI+pzx/2fw2AQnCovoLtcosClIhjO26QKkh8=",
874+ "dependencies": [
875+ "unsafe-coerce"
876+ ]
877+ },
878+ "foldable-traversable": {
879+ "type": "registry",
880+ "version": "6.0.0",
881+ "integrity": "sha256-NGGWyCio/xjce6fPP7y3wwg7CheqllID6aJudDxbWhA=",
882+ "dependencies": [
883+ "bifunctors",
884+ "const",
885+ "control",
886+ "either",
887+ "functors",
888+ "identity",
889+ "maybe",
890+ "newtype",
891+ "orders",
892+ "prelude",
893+ "tuples"
894+ ]
895+ },
896+ "foreign": {
897+ "type": "registry",
898+ "version": "7.0.0",
899+ "integrity": "sha256-jiDRMVQfovGsbbA/FzbzYf6iWk9i2b5gNrIjz+gFfsI=",
900+ "dependencies": [
901+ "either",
902+ "functions",
903+ "integers",
904+ "lists",
905+ "maybe",
906+ "prelude",
907+ "strings",
908+ "transformers",
909+ "unsafe-coerce"
910+ ]
911+ },
912+ "foreign-object": {
913+ "type": "registry",
914+ "version": "4.1.0",
915+ "integrity": "sha256-x/Q7r80z/vmHRKvPwhYmHP/DnJciPtsyGfRTMzayKIU=",
916+ "dependencies": [
917+ "arrays",
918+ "foldable-traversable",
919+ "functions",
920+ "gen",
921+ "lists",
922+ "maybe",
923+ "prelude",
924+ "st",
925+ "tailrec",
926+ "tuples",
927+ "typelevel-prelude",
928+ "unfoldable",
929+ "unsafe-coerce"
930+ ]
931+ },
932+ "functions": {
933+ "type": "registry",
934+ "version": "6.0.0",
935+ "integrity": "sha256-0jgtOr+SFO4UScKc40oA/9Vdcf2rLn3h3vZlY0KfqVo=",
936+ "dependencies": [
937+ "prelude"
938+ ]
939+ },
940+ "functors": {
941+ "type": "registry",
942+ "version": "5.0.0",
943+ "integrity": "sha256-W1o/4wcp6S3chodYL8uixlXK2mfr1L+SzM1R+whqUco=",
944+ "dependencies": [
945+ "bifunctors",
946+ "const",
947+ "contravariant",
948+ "control",
949+ "distributive",
950+ "either",
951+ "invariant",
952+ "maybe",
953+ "newtype",
954+ "prelude",
955+ "profunctor",
956+ "tuples",
957+ "unsafe-coerce"
958+ ]
959+ },
960+ "gen": {
961+ "type": "registry",
962+ "version": "4.0.0",
963+ "integrity": "sha256-kyOateeOtQa07vfTMYeSuCKdelgKE1R65fwKkZ10wsY=",
964+ "dependencies": [
965+ "either",
966+ "foldable-traversable",
967+ "identity",
968+ "maybe",
969+ "newtype",
970+ "nonempty",
971+ "prelude",
972+ "tailrec",
973+ "tuples",
974+ "unfoldable"
975+ ]
976+ },
977+ "identity": {
978+ "type": "registry",
979+ "version": "6.0.0",
980+ "integrity": "sha256-RY/iXPpxpqvKHYfJeFVNI1J06kohB9rbtWYuha8t0LE=",
981+ "dependencies": [
982+ "control",
983+ "invariant",
984+ "newtype",
985+ "prelude"
986+ ]
987+ },
988+ "integers": {
989+ "type": "registry",
990+ "version": "6.0.0",
991+ "integrity": "sha256-Y8yozC1uHRLcruobEyv5/bMKzE1BoKJ/olHv6o+bgm8=",
992+ "dependencies": [
993+ "maybe",
994+ "numbers",
995+ "prelude"
996+ ]
997+ },
998+ "invariant": {
999+ "type": "registry",
1000+ "version": "6.0.0",
1001+ "integrity": "sha256-HyoT1I5qIHRq8RSZji6zZDvqnpVjLw748utrKwZtqsw=",
1002+ "dependencies": [
1003+ "control",
1004+ "prelude"
1005+ ]
1006+ },
1007+ "lazy": {
1008+ "type": "registry",
1009+ "version": "6.0.0",
1010+ "integrity": "sha256-MHRC+1Pc+AjortBp4b/e1e6KpEpsDwaJBNBB7TOL+1I=",
1011+ "dependencies": [
1012+ "control",
1013+ "foldable-traversable",
1014+ "invariant",
1015+ "prelude"
1016+ ]
1017+ },
1018+ "lists": {
1019+ "type": "registry",
1020+ "version": "7.0.0",
1021+ "integrity": "sha256-/mGd7wLoU+wsTcqii7SSUByxsvwvjnu2PjwAD47yYb4=",
1022+ "dependencies": [
1023+ "bifunctors",
1024+ "control",
1025+ "foldable-traversable",
1026+ "lazy",
1027+ "maybe",
1028+ "newtype",
1029+ "nonempty",
1030+ "partial",
1031+ "prelude",
1032+ "tailrec",
1033+ "tuples",
1034+ "unfoldable"
1035+ ]
1036+ },
1037+ "literals": {
1038+ "type": "registry",
1039+ "version": "1.0.2",
1040+ "integrity": "sha256-ZkGRFD6gb8etYvyMYpX1Z7lx1Tql7R1VGnD1Dzinup8=",
1041+ "dependencies": [
1042+ "integers",
1043+ "maybe",
1044+ "numbers",
1045+ "partial",
1046+ "prelude",
1047+ "typelevel-prelude",
1048+ "unsafe-coerce"
1049+ ]
1050+ },
1051+ "maybe": {
1052+ "type": "registry",
1053+ "version": "6.0.0",
1054+ "integrity": "sha256-8X6XEgtZ5lqfkEuc1hWOofnL6mwhk8gSJTxwvbR/SbY=",
1055+ "dependencies": [
1056+ "control",
1057+ "invariant",
1058+ "newtype",
1059+ "prelude"
1060+ ]
1061+ },
1062+ "newtype": {
1063+ "type": "registry",
1064+ "version": "5.0.0",
1065+ "integrity": "sha256-dt6w0cty4OS+Pjt9fsh3iU6ottqSU83mdAZkaEEvo6c=",
1066+ "dependencies": [
1067+ "prelude",
1068+ "safe-coerce"
1069+ ]
1070+ },
1071+ "node-buffer": {
1072+ "type": "registry",
1073+ "version": "9.0.0",
1074+ "integrity": "sha256-RdQjilmEHqsT4fwpCr8Mavw8KTafYrS3ZM6zeAAVAl8=",
1075+ "dependencies": [
1076+ "arraybuffer-types",
1077+ "effect",
1078+ "functions",
1079+ "maybe",
1080+ "nullable",
1081+ "partial",
1082+ "prelude",
1083+ "st",
1084+ "unsafe-coerce"
1085+ ]
1086+ },
1087+ "node-event-emitter": {
1088+ "type": "registry",
1089+ "version": "3.0.0",
1090+ "integrity": "sha256-wodx71NxJBPXOaawFn01V1ByYB2vT+I3RuV2giOVKMg=",
1091+ "dependencies": [
1092+ "effect",
1093+ "either",
1094+ "functions",
1095+ "maybe",
1096+ "nullable",
1097+ "prelude",
1098+ "unsafe-coerce"
1099+ ]
1100+ },
1101+ "node-streams": {
1102+ "type": "registry",
1103+ "version": "9.0.1",
1104+ "integrity": "sha256-yuVGm/R/tBr4Nphi+a1a984Z0fkmN9Q5wWtSmbmJTpA=",
1105+ "dependencies": [
1106+ "aff",
1107+ "arrays",
1108+ "effect",
1109+ "either",
1110+ "exceptions",
1111+ "maybe",
1112+ "node-buffer",
1113+ "node-event-emitter",
1114+ "nullable",
1115+ "prelude",
1116+ "refs",
1117+ "st",
1118+ "tailrec",
1119+ "unsafe-coerce"
1120+ ]
1121+ },
1122+ "nonempty": {
1123+ "type": "registry",
1124+ "version": "7.0.0",
1125+ "integrity": "sha256-Ctkq8/+KiGqCE53Y/LvibA/coy7ev9HtRZU+GYS7yfQ=",
1126+ "dependencies": [
1127+ "control",
1128+ "foldable-traversable",
1129+ "maybe",
1130+ "prelude",
1131+ "tuples",
1132+ "unfoldable"
1133+ ]
1134+ },
1135+ "nullable": {
1136+ "type": "registry",
1137+ "version": "6.0.0",
1138+ "integrity": "sha256-CDAZk+L9Sc0GCFTkE8n+qdp4Ys8avvnkU+m2hVALt7M=",
1139+ "dependencies": [
1140+ "functions",
1141+ "maybe",
1142+ "prelude"
1143+ ]
1144+ },
1145+ "numbers": {
1146+ "type": "registry",
1147+ "version": "9.0.1",
1148+ "integrity": "sha256-ZydYckgwRAnRaFC7pu6fADhzdwX+UqHZrfJyet64zls=",
1149+ "dependencies": [
1150+ "functions",
1151+ "maybe",
1152+ "prelude"
1153+ ]
1154+ },
1155+ "ordered-collections": {
1156+ "type": "registry",
1157+ "version": "3.2.0",
1158+ "integrity": "sha256-NaEXc2cz/7lJfxPWEja4XlZbGxuRqJwFKQJjsJf51kQ=",
1159+ "dependencies": [
1160+ "arrays",
1161+ "control",
1162+ "foldable-traversable",
1163+ "functions",
1164+ "gen",
1165+ "lists",
1166+ "maybe",
1167+ "newtype",
1168+ "partial",
1169+ "prelude",
1170+ "safe-coerce",
1171+ "tailrec",
1172+ "tuples",
1173+ "unfoldable"
1174+ ]
1175+ },
1176+ "orders": {
1177+ "type": "registry",
1178+ "version": "6.0.0",
1179+ "integrity": "sha256-nSMxZK7wxyDULkjZqvMyB71mVo6b0AyLLHosDVbv1XM=",
1180+ "dependencies": [
1181+ "newtype",
1182+ "prelude"
1183+ ]
1184+ },
1185+ "parallel": {
1186+ "type": "registry",
1187+ "version": "7.0.0",
1188+ "integrity": "sha256-bAGpVhrFz2IyHkA4MR7+tE/19FZ7dzYBdYPgK5svkqw=",
1189+ "dependencies": [
1190+ "control",
1191+ "effect",
1192+ "either",
1193+ "foldable-traversable",
1194+ "functors",
1195+ "maybe",
1196+ "newtype",
1197+ "prelude",
1198+ "profunctor",
1199+ "refs",
1200+ "transformers"
1201+ ]
1202+ },
1203+ "partial": {
1204+ "type": "registry",
1205+ "version": "4.0.0",
1206+ "integrity": "sha256-mdrlJBAgFMh79hNRW39uv7c+BwnnaOrAMmdh7+VhEhs=",
1207+ "dependencies": []
1208+ },
1209+ "prelude": {
1210+ "type": "registry",
1211+ "version": "6.0.2",
1212+ "integrity": "sha256-IqykrDRquGUD/LRSad7y75hZv3bUsGQ4knc8tdez8Qw=",
1213+ "dependencies": []
1214+ },
1215+ "profunctor": {
1216+ "type": "registry",
1217+ "version": "6.0.1",
1218+ "integrity": "sha256-Ow0mJC+PIIRq/a3mzCWY5vxuTgR/e+Ee68+mWeSRnWY=",
1219+ "dependencies": [
1220+ "control",
1221+ "distributive",
1222+ "either",
1223+ "exists",
1224+ "invariant",
1225+ "newtype",
1226+ "prelude",
1227+ "tuples"
1228+ ]
1229+ },
1230+ "refs": {
1231+ "type": "registry",
1232+ "version": "6.0.0",
1233+ "integrity": "sha256-KKD5G9dR2SauuDGULUJsxjqDOEi1Jqm+2Sq5U2mY8YU=",
1234+ "dependencies": [
1235+ "effect",
1236+ "prelude"
1237+ ]
1238+ },
1239+ "safe-coerce": {
1240+ "type": "registry",
1241+ "version": "2.0.0",
1242+ "integrity": "sha256-EJrxtKt5xC7TYjBZrSBO/J7Aw3DmtilYjt4olpAXWVc=",
1243+ "dependencies": [
1244+ "unsafe-coerce"
1245+ ]
1246+ },
1247+ "st": {
1248+ "type": "registry",
1249+ "version": "6.2.0",
1250+ "integrity": "sha256-WI4MEkkwUd4pnwZQ3G8VKWgX5t1RSNJludm5e9boaRo=",
1251+ "dependencies": [
1252+ "effect",
1253+ "partial",
1254+ "prelude",
1255+ "tailrec",
1256+ "unsafe-coerce"
1257+ ]
1258+ },
1259+ "strings": {
1260+ "type": "registry",
1261+ "version": "6.0.1",
1262+ "integrity": "sha256-FNto2hoNW5Da6W6crIk77YXMagBvOGHZE1kO7eZ1vLM=",
1263+ "dependencies": [
1264+ "arrays",
1265+ "control",
1266+ "either",
1267+ "enums",
1268+ "foldable-traversable",
1269+ "gen",
1270+ "integers",
1271+ "maybe",
1272+ "newtype",
1273+ "nonempty",
1274+ "partial",
1275+ "prelude",
1276+ "tailrec",
1277+ "tuples",
1278+ "unfoldable",
1279+ "unsafe-coerce"
1280+ ]
1281+ },
1282+ "tailrec": {
1283+ "type": "registry",
1284+ "version": "6.1.0",
1285+ "integrity": "sha256-xrorCfP0xV1wubs27idQCHQqdvSUuqmmL/am7Ji1wVU=",
1286+ "dependencies": [
1287+ "bifunctors",
1288+ "effect",
1289+ "either",
1290+ "identity",
1291+ "maybe",
1292+ "partial",
1293+ "prelude",
1294+ "refs"
1295+ ]
1296+ },
1297+ "transformers": {
1298+ "type": "registry",
1299+ "version": "6.1.0",
1300+ "integrity": "sha256-QJmgNT/y7ljPHSsXaW4zxF/982BFiQ90KNL1g/NtEOQ=",
1301+ "dependencies": [
1302+ "control",
1303+ "distributive",
1304+ "effect",
1305+ "either",
1306+ "exceptions",
1307+ "foldable-traversable",
1308+ "identity",
1309+ "lazy",
1310+ "maybe",
1311+ "newtype",
1312+ "prelude",
1313+ "st",
1314+ "tailrec",
1315+ "tuples",
1316+ "unfoldable"
1317+ ]
1318+ },
1319+ "tuples": {
1320+ "type": "registry",
1321+ "version": "7.0.0",
1322+ "integrity": "sha256-BKy7EfK8S1KeTCwyWqyW1wwcpSAQuh3IsczSVgS6fzY=",
1323+ "dependencies": [
1324+ "control",
1325+ "invariant",
1326+ "prelude"
1327+ ]
1328+ },
1329+ "type-equality": {
1330+ "type": "registry",
1331+ "version": "4.0.1",
1332+ "integrity": "sha256-BBqYOSnAKmayRvR5mtZoCf4SlYs2ipatD/+5nQx73aw=",
1333+ "dependencies": []
1334+ },
1335+ "typelevel-prelude": {
1336+ "type": "registry",
1337+ "version": "7.0.0",
1338+ "integrity": "sha256-+pHi14/40mTj/+lmCWqL0T7iXIXD1+NSg/KItyyoB0A=",
1339+ "dependencies": [
1340+ "prelude",
1341+ "type-equality"
1342+ ]
1343+ },
1344+ "unfoldable": {
1345+ "type": "registry",
1346+ "version": "6.0.0",
1347+ "integrity": "sha256-BK/6By1sKp/ztk+9CF3q43SV0QDTLVdsGqFerKHSmbg=",
1348+ "dependencies": [
1349+ "foldable-traversable",
1350+ "maybe",
1351+ "partial",
1352+ "prelude",
1353+ "tuples"
1354+ ]
1355+ },
1356+ "unsafe-coerce": {
1357+ "type": "registry",
1358+ "version": "6.0.0",
1359+ "integrity": "sha256-0L1QsaY20OILjfU5TV72d3U/tSjhmL9hJ32WMp857Lk=",
1360+ "dependencies": []
1361+ },
1362+ "untagged-union": {
1363+ "type": "registry",
1364+ "version": "1.0.0",
1365+ "integrity": "sha256-MQvpb13TZEBoi9n/AoQ7ugniSQqbN6XQmAjii9pqJRk=",
1366+ "dependencies": [
1367+ "either",
1368+ "foreign",
1369+ "foreign-object",
1370+ "literals",
1371+ "maybe",
1372+ "newtype",
1373+ "prelude",
1374+ "tuples",
1375+ "unsafe-coerce"
1376+ ]
1377+ }
1378+ }
1379+}
spago.yamlnew file+34
@@ -0,0 +1,34 @@
1+package:
2+ name: playwright
3+ dependencies:
4+ - aff: ">=8.0.0 <9.0.0"
5+ - aff-promise: ">=4.0.0 <5.0.0"
6+ - argonaut-core: ">=7.0.0 <8.0.0"
7+ - datetime: ">=6.1.0 <7.0.0"
8+ - effect: ">=4.0.0 <5.0.0"
9+ - exceptions: ">=6.1.0 <7.0.0"
10+ - foreign: ">=7.0.0 <8.0.0"
11+ - foreign-object: ">=4.1.0 <5.0.0"
12+ - literals: ">=1.0.2 <2.0.0"
13+ - maybe: ">=6.0.0 <7.0.0"
14+ - node-buffer: ">=9.0.0 <10.0.0"
15+ - node-streams: ">=9.0.1 <10.0.0"
16+ - ordered-collections: ">=3.2.0 <4.0.0"
17+ - prelude: ">=6.0.2 <7.0.0"
18+ - strings: ">=6.0.1 <7.0.0"
19+ - typelevel-prelude: ">=7.0.0 <8.0.0"
20+ - untagged-union: ">=1.0.0 <2.0.0"
21+ test:
22+ main: Test.Main
23+ dependencies:
24+ - either
25+ - transformers
26+ publish:
27+ version: 0.0.1
28+ license: BSD-3-Clause
29+ location:
30+ githubOwner: rowtype-yoga
31+ githubRepo: purescript-playwright
32+workspace:
33+ packageSet:
34+ registry: 73.2.0
src/Playwright.jsnew file+25
@@ -0,0 +1,25 @@
1+/* global exports */
2+
3+export const exposeBinding_ = x => name => cb => opts => () => {
4+ return x.exposeBinding(
5+ name,
6+ function (info, arg) {
7+ return cb(info)(arg)()
8+ },
9+ opts
10+ )
11+}
12+
13+export const waitForGlobalFunction_ = page => name => async () => {
14+ const handle = await page.waitForFunction(
15+ name => typeof globalThis[name] === "function",
16+ name
17+ );
18+ await handle.dispose();
19+};
20+
21+export const evaluateEffect_ = page => name => argument => () =>
22+ page.evaluate(
23+ ({ name, argument }) => globalThis[name](argument)(),
24+ { name, argument }
25+ );
src/Playwright.purs+196−120
@@ -1,49 +1,52 @@
11module Playwright
2− ( launch
3− , close
4− , contexts
5− , isConnected
6− , version
7− , newPage
8− , goForward
9− , goBack
10− , goto
11− , addCookies
12− , hover
13− , innerHTML
14− , innerText
15− , isClosed
16− , keyboard
17− , mainFrame
18− , name
19− , query
20− , queryMany
21− , screenshot
22− , textContent
23− , url
24− , addInitScript
25− , clearCookies
26− , click
27− , content
28− , dblclick
29− , evaluate
30− , evaluateHandle
31− , waitForNavigation
32− , waitForRequest
33− , waitForResponse
34− , waitForSelector
35− , waitForFunction
36− , waitForLoadState
37− , waitForTimeout
38− , pdf
39− , setInputFiles
40− , setViewportSize
41− , title
42− , module Playwright.Data
43− , module Playwright.Options
44− )
45−where
46−
2+ ( launch
3+ , close
4+ , contexts
5+ , isConnected
6+ , version
7+ , newPage
8+ , goForward
9+ , goBack
10+ , goto
11+ , addCookies
12+ , hover
13+ , innerHTML
14+ , innerText
15+ , isClosed
16+ , keyboard
17+ , mainFrame
18+ , name
19+ , query
20+ , queryMany
21+ , screenshot
22+ , textContent
23+ , url
24+ , addInitScript
25+ , clearCookies
26+ , click
27+ , content
28+ , dblclick
29+ , evaluate
30+ , evaluateHandle
31+ , waitForNavigation
32+ , waitForRequest
33+ , waitForResponse
34+ , waitForSelector
35+ , waitForFunction
36+ , waitForGlobalFunction
37+ , evaluateEffect
38+ , waitForLoadState
39+ , waitForTimeout
40+ , pdf
41+ , setInputFiles
42+ , setViewportSize
43+ , title
44+ , exposeBinding
45+ , module Playwright.Data
46+ , module Playwright.Options
47+ ) where
48+
49+import Control.Promise (Promise, fromAff, toAffE)
4750import Data.String.Regex (Regex)
4851import Effect (Effect)
4952import Effect.Aff (Aff)
@@ -53,22 +56,25 @@ import Node.Buffer (Buffer)
5356import Playwright.Data
5457import Playwright.Internal (effCall, effProp, affCall)
5558import Playwright.Options
56−import Prelude (Unit)
57−import Untagged.Coercible (class Coercible)
59+import Prelude (Unit, ($))
60+import Untagged.Castable (class Castable)
5861import Untagged.Union (type (|+|), UndefinedOr)
59−import Undefined (undefined)
62+import Literals.Undefined (undefined)
6063
6164launch
6265 :: forall o
63− . Coercible o LaunchOptions
64− => BrowserType -> o -> Aff Browser
66+ . Castable o LaunchOptions
67+ => BrowserType
68+ -> o
69+ -> Aff Browser
6570launch =
6671 affCall "launch" \_ -> launch
6772
6873close
6974 :: forall x
70− . Coercible x (Browser |+| BrowserContext |+| Page)
71− => x -> Aff Unit
75+ . Castable x (Browser |+| BrowserContext |+| Page)
76+ => x
77+ -> Aff Unit
7278close =
7379 affCall "close" \_ -> close
7480
@@ -86,31 +92,40 @@ version =
8692
8793newPage
8894 :: forall x o
89− . Coercible x (Browser |+| BrowserContext)
90− => Coercible o NewpageOptions
91− => x -> o -> Aff Page
95+ . Castable x (Browser |+| BrowserContext)
96+ => Castable o NewpageOptions
97+ => x
98+ -> o
99+ -> Aff Page
92100newPage =
93101 affCall "newPage" \_ -> newPage
94102
95103goForward
96104 :: forall o
97− . Coercible o GoOptions
98− => Page -> o -> Aff (Null |+| Response)
105+ . Castable o GoOptions
106+ => Page
107+ -> o
108+ -> Aff (Null |+| Response)
99109goForward =
100110 affCall "goForward" \_ -> goForward
101111
102112goBack
103113 :: forall o
104− . Coercible o GoOptions
105− => Page -> o -> Aff (Null |+| Response)
106−goBack =
114+ . Castable o GoOptions
115+ => Page
116+ -> o
117+ -> Aff (Null |+| Response)
118+goBack =
107119 affCall "goBack" \_ -> goBack
108120
109121goto
110122 :: forall x o
111− . Coercible x (Page |+| Frame)
112− => Coercible o GotoOptions
113− => x -> URL -> o -> Aff (Null |+| Response)
123+ . Castable x (Page |+| Frame)
124+ => Castable o GotoOptions
125+ => x
126+ -> URL
127+ -> o
128+ -> Aff (Null |+| Response)
114129goto =
115130 affCall "goto" \_ -> goto
116131
@@ -129,29 +144,34 @@ addCookies =
129144
130145hover
131146 :: forall x o
132− . Coercible x (Page |+| Frame |+| ElementHandle)
133− => Coercible o HoverOptions
134− => x -> o -> Aff Unit
147+ . Castable x (Page |+| Frame |+| ElementHandle)
148+ => Castable o HoverOptions
149+ => x
150+ -> o
151+ -> Aff Unit
135152hover =
136153 affCall "hover" \_ -> hover
137154
138155innerHTML
139156 :: forall x o
140− . Coercible x (Page |+| Frame |+| ElementHandle)
141− => Coercible o InnerHTMLOptions
142− => x -> Selector -> o -> Aff String
157+ . Castable x (Page |+| Frame)
158+ => Castable o InnerHTMLOptions
159+ => x
160+ -> Selector
161+ -> o
162+ -> Aff String
143163innerHTML =
144164 affCall "innerHTML" \_ -> innerHTML
145165
146166innerText
147167 :: forall x o
148− . Coercible o InnerTextOptions
149− => Coercible x (Page |+| Frame |+| ElementHandle)
168+ . Castable o InnerTextOptions
169+ => Castable x (Page |+| Frame |+| ElementHandle)
150170 => x
151171 -> Selector
152172 -> o
153173 -> Aff String
154−innerText =
174+innerText =
155175 affCall "innerText" \_ -> innerText
156176
157177isClosed :: Page -> Effect Boolean
@@ -169,37 +189,45 @@ name = effCall "name" \_ -> name
169189-- | `sth.$(selector)`
170190query
171191 :: forall x
172− . Coercible x (ElementHandle |+| Page |+| Frame)
173− => x -> Selector -> Aff ElementHandle
192+ . Castable x (ElementHandle |+| Page |+| Frame)
193+ => x
194+ -> Selector
195+ -> Aff (Null |+| ElementHandle)
174196query =
175197 affCall "$" \_ -> query
176198
177199-- | `sth.$$(selector)`
178200queryMany
179201 :: forall x
180− . Coercible x (ElementHandle |+| Page |+| Frame)
181− => x -> Selector -> Aff (Array ElementHandle)
202+ . Castable x (ElementHandle |+| Page |+| Frame)
203+ => x
204+ -> Selector
205+ -> Aff (Array ElementHandle)
182206queryMany =
183207 affCall "$$" \_ -> queryMany
184208
185209screenshot
186210 :: forall x o
187− . Coercible x (ElementHandle |+| Page)
188− => Coercible o ScreenshotOptions
189− => x -> o -> Aff Buffer
211+ . Castable x (ElementHandle |+| Page)
212+ => Castable o ScreenshotOptions
213+ => x
214+ -> o
215+ -> Aff Buffer
190216screenshot =
191217 affCall "screenshot" \_ -> screenshot
192218
193219textContent
194220 :: forall x
195− . Coercible x (Page |+| Frame |+| ElementHandle)
196− => x -> Selector -> Aff (Null |+| String)
221+ . Castable x (Page |+| Frame |+| ElementHandle)
222+ => x
223+ -> Selector
224+ -> Aff (Null |+| String)
197225textContent =
198226 affCall "textContent" \_ -> textContent
199227
200228url
201229 :: forall x
202− . Coercible x (Page |+| Frame |+| Download |+| Request |+| Response |+| Worker)
230+ . Castable x (Page |+| Frame |+| Download |+| Request |+| Response |+| Worker)
203231 => x
204232 -> Effect URL
205233url =
@@ -207,8 +235,8 @@ url =
207235
208236addInitScript
209237 :: forall x o
210− . Coercible x (Page |+| BrowserContext)
211− => Coercible o AddInitScriptOptions
238+ . Castable x (Page |+| BrowserContext)
239+ => Castable o AddInitScriptOptions
212240 => x
213241 -> o
214242 -> Aff Unit
@@ -221,8 +249,8 @@ clearCookies =
221249
222250click
223251 :: forall x o
224− . Coercible x (Page |+| Frame |+| ElementHandle)
225− => Coercible o ClickOptions
252+ . Castable x (Page |+| Frame)
253+ => Castable o ClickOptions
226254 => x
227255 -> Selector
228256 -> o
@@ -232,7 +260,7 @@ click =
232260
233261content
234262 :: forall x
235− . Coercible x (Page |+| Frame)
263+ . Castable x (Page |+| Frame)
236264 => x
237265 -> Aff String
238266content =
@@ -240,8 +268,8 @@ content =
240268
241269dblclick
242270 :: forall x o
243− . Coercible x (Page |+| Frame |+| ElementHandle)
244− => Coercible o ClickOptions
271+ . Castable x (Page |+| Frame |+| ElementHandle)
272+ => Castable o ClickOptions
245273 => x
246274 -> Selector
247275 -> o
@@ -251,7 +279,7 @@ dblclick =
251279
252280evaluate
253281 :: forall x
254− . Coercible x (Page |+| Frame |+| Worker |+| JSHandle)
282+ . Castable x (Page |+| Frame |+| Worker |+| JSHandle)
255283 => x
256284 -> String
257285 -- ^ Function to be evaluated in browser context
@@ -261,7 +289,7 @@ evaluate =
261289
262290evaluateHandle
263291 :: forall x
264− . Coercible x (Page |+| Frame |+| Worker |+| JSHandle)
292+ . Castable x (Page |+| Frame |+| Worker |+| JSHandle)
265293 => x
266294 -> String
267295 -- ^ Function to be evaluated in browser context
@@ -271,8 +299,8 @@ evaluateHandle =
271299
272300waitForNavigation
273301 :: forall x o
274− . Coercible x (Page |+| Frame)
275− => Coercible o WaitForNavigationOptions
302+ . Castable x (Page |+| Frame)
303+ => Castable o WaitForNavigationOptions
276304 => x
277305 -> o
278306 -> Aff (Null |+| Response)
@@ -281,8 +309,8 @@ waitForNavigation =
281309
282310waitForRequest
283311 :: forall url o
284− . Coercible url (URL |+| Regex |+| URL -> Boolean)
285− => Coercible o WaitForRequestOptions
312+ . Castable url (URL |+| Regex |+| URL -> Boolean)
313+ => Castable o WaitForRequestOptions
286314 => Page
287315 -> url
288316 -> o
@@ -291,8 +319,8 @@ waitForRequest = affCall "waitForRequest" \_ -> waitForRequest
291319
292320waitForResponse
293321 :: forall url o
294− . Coercible url (URL |+| Regex |+| URL -> Boolean)
295− => Coercible o WaitForResponseOptions
322+ . Castable url (URL |+| Regex |+| URL -> Boolean)
323+ => Castable o WaitForResponseOptions
296324 => Page
297325 -> url
298326 -> o
@@ -301,8 +329,8 @@ waitForResponse = affCall "waitForResponse" \_ -> waitForResponse
301329
302330waitForSelector
303331 :: forall x o
304− . Coercible x (Page |+| Frame |+| ElementHandle)
305− => Coercible o WaitForSelectorOptions
332+ . Castable x (Page |+| Frame |+| ElementHandle)
333+ => Castable o WaitForSelectorOptions
306334 => x
307335 -> Selector
308336 -> o
@@ -311,8 +339,8 @@ waitForSelector = affCall "waitForSelector" \_ -> waitForSelector
311339
312340waitForFunction
313341 :: forall x o
314− . Coercible x (Page |+| Frame)
315− => Coercible o WaitForFunctionOptions
342+ . Castable x (Page |+| Frame)
343+ => Castable o WaitForFunctionOptions
316344 => x
317345 -> String
318346 -- ^ Function to be evaluated in browser context
@@ -320,12 +348,12 @@ waitForFunction
320348 -> Aff JSHandle
321349waitForFunction x s o = waitForFunction' x s (unsafeToForeign undefined) o
322350 where
323− waitForFunction' = affCall "waitForFunction" \_ -> waitForFunction'
351+ waitForFunction' = affCall "waitForFunction" \_ -> waitForFunction'
324352
325353waitForLoadState
326354 :: forall x o
327− . Coercible x (Page |+| Frame)
328− => Coercible o WaitForLoadStateOptions
355+ . Castable x (Page |+| Frame)
356+ => Castable o WaitForLoadStateOptions
329357 => x
330358 -> WaitUntil
331359 -> o
@@ -334,7 +362,7 @@ waitForLoadState = affCall "waitForLoadState" \_ -> waitForLoadState
334362
335363waitForTimeout
336364 :: forall x
337− . Coercible x (Page |+| Frame)
365+ . Castable x (Page |+| Frame)
338366 => x
339367 -> Int
340368 -> Aff Unit
@@ -342,7 +370,7 @@ waitForTimeout = affCall "waitForTimeout" \_ -> waitForTimeout
342370
343371pdf
344372 :: forall o
345− . Coercible o PdfOptions
373+ . Castable o PdfOptions
346374 => Page
347375 -> o
348376 -> Aff Buffer
@@ -350,20 +378,22 @@ pdf = affCall "pdf" \_ -> pdf
350378
351379setInputFiles
352380 :: forall x o f
353− . Coercible x (Page |+| Frame |+| ElementHandle)
354− => Coercible o SetInputFilesOptions
355− => Coercible f
356− ( String
357− |+| Array String
358− |+| { name :: String
359− , mimeType :: String
360− , buffer :: Buffer
361− }
362− |+| Array { name :: String
381+ . Castable x (Page |+| Frame |+| ElementHandle)
382+ => Castable o SetFilesOptions
383+ => Castable f
384+ ( String
385+ |+| Array String
386+ |+|
387+ { name :: String
363388 , mimeType :: String
364389 , buffer :: Buffer
365390 }
366− )
391+ |+| Array
392+ { name :: String
393+ , mimeType :: String
394+ , buffer :: Buffer
395+ }
396+ )
367397 => x
368398 -> Selector
369399 -> f
@@ -373,15 +403,61 @@ setInputFiles = affCall "setInputFiles" \_ -> setInputFiles
373403
374404setViewportSize
375405 :: Page
376− -> { width :: Number
406+ -> { width :: Number
377407 , height :: Number
378408 }
379− -> Aff Unit
409+ -> Aff Unit
380410setViewportSize = affCall "setViewportSize" \_ -> setViewportSize
381411
382412title
383413 :: forall x
384− . Coercible x (Page |+| Frame)
414+ . Castable x (Page |+| Frame)
385415 => x
386416 -> Aff String
387417title = affCall "title" \_ -> title
418+
419+exposeBinding
420+ :: forall x b
421+ . Castable x (Page |+| BrowserContext)
422+ => x
423+ -> String
424+ -- ^ Name of the function on the window object.
425+ -> ( { browserContext :: BrowserContext
426+ , page :: Page
427+ , frame :: Frame
428+ }
429+ -> Foreign
430+ -> Aff b
431+ )
432+ -> Aff Unit
433+exposeBinding x binding f =
434+ toAffE $ exposeBinding_ x binding (\d a -> fromAff $ f d a) { handle: false }
435+
436+-- | Wait until a named browser-global function is available.
437+waitForGlobalFunction :: Page -> String -> Aff Unit
438+waitForGlobalFunction page functionName =
439+ toAffE $ waitForGlobalFunction_ page functionName
440+
441+-- | Invoke a named, curried PureScript function and run its returned Effect.
442+-- | Playwright awaits a Promise returned by the Effect.
443+evaluateEffect :: Page -> String -> Foreign -> Aff Foreign
444+evaluateEffect page functionName argument =
445+ toAffE $ evaluateEffect_ page functionName argument
446+
447+foreign import waitForGlobalFunction_ :: Page -> String -> Effect (Promise Unit)
448+
449+foreign import evaluateEffect_ :: Page -> String -> Foreign -> Effect (Promise Foreign)
450+
451+foreign import exposeBinding_
452+ :: forall x a b
453+ . x
454+ -> String
455+ -> ( { browserContext :: BrowserContext
456+ , page :: Page
457+ , frame :: Frame
458+ }
459+ -> a
460+ -> Effect (Promise b)
461+ )
462+ -> { handle :: Boolean }
463+ -> Effect (Promise Unit)
src/Playwright/ConsoleMessage.purs+1−1
@@ -5,7 +5,7 @@ import Playwright.Data (ConsoleMessage, JSHandle, URL)
55import Effect (Effect)
66import Playwright.Internal (effCall)
77import Data.Generic.Rep (class Generic)
8−import Data.Generic.Rep.Show (genericShow)
8+import Data.Show.Generic (genericShow)
99import Data.String.Common (toLower)
1010
1111type ConsoleMessageLocation =
src/Playwright/Data.js+23−22
@@ -1,31 +1,32 @@
11/* global require exports */
2−var P = require('playwright');
2+import { chromium as pwChromium, firefox as pwFirefox, webkit as pwWebkit } from 'playwright';
33
4−exports.png = "png";
5−exports.jpg = "jpg";
4+export const png = "png";
5+export const jpg = "jpg";
66
7−exports.chromium = P.chromium;
8−exports.firefox = P.firefox;
9−exports.webkit = P.webkit;
7+export const chromium = pwChromium;
8+export const firefox = pwFirefox;
9+export const webkit = pwWebkit;
1010
11−exports.domcontentloaded = "domcontentloaded";
12−exports.load = "load";
13−exports.networkidle = "networkidle";
11+export const domcontentloaded = "domcontentloaded";
12+export const load = "load";
13+export const networkidle = "networkidle";
1414
15−exports.alt = "Alt";
16−exports.control = "Control";
17−exports.meta = "Meta";
18−exports.shift = "Shift";
15+export const alt = "Alt";
16+export const control = "Control";
17+export const meta = "Meta";
18+export const shift = "Shift";
1919
20−exports.null = null;
20+const _null = null;
21+export { _null as null };
2122
22−exports.left = "left";
23−exports.right = "right";
24−exports.middle = "middle";
23+export const left = "left";
24+export const right = "right";
25+export const middle = "middle";
2526
26−exports.attached = "attached";
27−exports.detached = "detached";
28−exports.visible = "visible";
29−exports.hidden = "hidden";
27+export const attached = "attached";
28+export const detached = "detached";
29+export const visible = "visible";
30+export const hidden = "hidden";
3031
31−exports.raf = "raf";
32+export const raf = "raf";
src/Playwright/Download.js+8−15
@@ -1,17 +1,10 @@
11/* global exports */
22
3−exports.createReadStream_ = function (Nothing) {
4− return function (Just) {
5− return function (Download) {
6− return function () {
7− return Download.createReadStream().then(function (result) {
8− if (result === null) {
9− return Nothing;
10− } else {
11− return Just(result);
12− }
13− });
14− };
15− };
16− };
17−};
3+export const createReadStream_ = Nothing => Just => Download => () =>
4+ Download.createReadStream().then(result => {
5+ if (result === null) {
6+ return Nothing
7+ } else {
8+ return Just(result)
9+ }
10+ })
src/Playwright/Download.purs+1−1
@@ -27,7 +27,7 @@ foreign import createReadStream_
2727 :: (forall a. Maybe a)
2828 -> (forall a. a -> Maybe a)
2929 -> Download
30− -> Effect (Promise (Maybe (Readable ())))
30+ -> Effect (Promise (Maybe (Readable ())))
3131
3232suggestedFilename :: Download -> Effect String
3333suggestedFilename = effCall "suggestedFilename" \_ -> suggestedFilename
src/Playwright/Event.js+5−11
@@ -1,13 +1,7 @@
11/* global exports */
22
3−exports.onForeign = function (obj) {
4− return function (eventName) {
5− return function (effCallback) {
6− return function () {
7− obj.on(eventName, function (argument) {
8− effCallback(argument)();
9− });
10− };
11− };
12− };
13−};
3+export const onForeign = (obj) => (eventName) => (effCallback) => () => {
4+ obj.on(eventName, (argument) => {
5+ effCallback(argument)()
6+ })
7+}
src/Playwright/Event.purs+72−8
@@ -3,9 +3,10 @@ where
33
44import Type.Proxy (Proxy(..))
55import Effect (Effect)
6−import Prelude (Unit)
7−import Playwright.Data
6+import Prelude
7+import Playwright.Data (Browser, BrowserContext, ConsoleMessage)
88import Playwright.Data as Data
9+import Effect.Exception (Error)
910
1011class Event e where
1112 getEventName :: Proxy e -> String
@@ -17,42 +18,105 @@ data EventName a = EventName
1718
1819foreign import data Close :: Type
1920instance eventClose :: Event Close where getEventName _ = "close"
20−instance eventPageClose :: OnEvent Page Close Unit
21+instance eventPageClose :: OnEvent Data.Page Close Unit
22+instance eventBrowserContextClose :: OnEvent BrowserContext Close Unit
23+instance eventBrowserClose :: OnEvent Browser Close Unit
24+instance eventWorkerClose :: OnEvent Worker Close Unit
2125close :: EventName Close
2226close = EventName
2327
2428foreign import data Console :: Type
2529instance eventConsole :: Event Console where getEventName _ = "console"
26−instance eventPageConsole :: OnEvent Page Console ConsoleMessage
30+instance eventPageConsole :: OnEvent Data.Page Console ConsoleMessage
2731console :: EventName Console
2832console = EventName
2933
3034foreign import data Crash :: Type
3135instance eventCrash :: Event Crash where getEventName _ = "crash"
32−instance eventPageCrash :: OnEvent Page Crash Unit
36+instance eventPageCrash :: OnEvent Data.Page Crash Unit
3337crash :: EventName Crash
3438crash = EventName
3539
3640foreign import data Dialog :: Type
3741instance eventDialog :: Event Dialog where getEventName _ = "dialog"
38−instance eventPageDialog :: OnEvent Page Dialog Data.Dialog
42+instance eventPageDialog :: OnEvent Data.Page Dialog Data.Dialog
3943dialog :: EventName Dialog
4044dialog = EventName
4145
4246foreign import data DomContentLoaded :: Type
4347instance eventDomContentLoaded :: Event DomContentLoaded where
4448 getEventName _ = "domcontentloaded"
45−instance eventPageDomContentLoaded :: OnEvent Page DomContentLoaded Unit
49+instance eventPageDomContentLoaded :: OnEvent Data.Page DomContentLoaded Unit
4650domcontentloaded :: EventName DomContentLoaded
4751domcontentloaded = EventName
4852
4953foreign import data Download :: Type
5054instance eventDownload :: Event Download where
5155 getEventName _ = "download"
52−instance eventPageDownload :: OnEvent Page Download Data.Download
56+instance eventPageDownload :: OnEvent Data.Page Download Data.Download
5357download :: EventName Download
5458download = EventName
5559
60+foreign import data FileChooser :: Type
61+instance eventFileChooser :: Event FileChooser where
62+ getEventName _ = "filechooser"
63+instance eventPageFileChooser :: OnEvent Data.Page FileChooser Data.FileChooser
64+filechooser :: EventName FileChooser
65+filechooser = EventName
66+
67+foreign import data PageError :: Type
68+instance eventPageError :: Event PageError where getEventName _ = "pageerror"
69+instance eventPagePageError :: OnEvent Data.Page PageError Error
70+pageerror :: EventName PageError
71+pageerror = EventName
72+
73+foreign import data Popup :: Type
74+instance eventPopup :: Event Popup where getEventName _ = "popup"
75+instance eventPagePopup :: OnEvent Data.Page Popup Page
76+popup :: EventName Popup
77+popup = EventName
78+
79+foreign import data Request :: Type
80+instance eventRequest :: Event Request where getEventName _ = "request"
81+instance eventPageRequest :: OnEvent Data.Page Request Data.Request
82+request :: EventName Request
83+request = EventName
84+
85+foreign import data RequestFailed :: Type
86+instance eventRequestFailed :: Event RequestFailed where
87+ getEventName _ = "requestfailed"
88+instance eventPageRequestFailed :: OnEvent Data.Page RequestFailed Data.Request
89+requestfailed :: EventName RequestFailed
90+requestfailed = EventName
91+
92+foreign import data RequestFinished :: Type
93+instance eventRequestFinished :: Event RequestFinished where
94+ getEventName _ = "requestfinished"
95+instance eventPageRequestFinished :: OnEvent Data.Page RequestFinished Data.Request
96+requestfinished :: EventName RequestFinished
97+requestfinished = EventName
98+
99+foreign import data Response :: Type
100+instance eventResponse :: Event Response where
101+ getEventName _ = "response"
102+instance eventPageResponse :: OnEvent Data.Page Response Data.Response
103+response :: EventName Response
104+response = EventName
105+
106+foreign import data Worker :: Type
107+instance eventWorker :: Event Worker where
108+ getEventName _ = "worker"
109+instance eventPageWorker :: OnEvent Data.Page Worker Data.Worker
110+worker :: EventName Worker
111+worker = EventName
112+
113+foreign import data Page :: Type
114+instance eventPage :: Event Page where
115+ getEventName _ = "page"
116+instance eventPagePage :: OnEvent BrowserContext Page Data.Page
117+page :: EventName Page
118+page = EventName
119+
56120on
57121 :: forall x e a r
58122 . OnEvent x e a
src/Playwright/FileChooser.pursnew file+41
@@ -0,0 +1,41 @@
1+module Playwright.FileChooser where
2+
3+import Effect (Effect)
4+import Effect.Aff (Aff)
5+import Node.Buffer (Buffer)
6+import Playwright.Data (ElementHandle, FileChooser, Page)
7+import Playwright.Internal (affCall, effCall)
8+import Playwright.Options (SetFilesOptions)
9+import Prelude
10+import Untagged.Castable (class Castable)
11+import Untagged.Union (type (|+|))
12+
13+element :: FileChooser -> Effect ElementHandle
14+element = effCall "element" \_ -> element
15+
16+isMultiple :: FileChooser -> Effect Boolean
17+isMultiple = effCall "isMultiple" \_ -> isMultiple
18+
19+page :: FileChooser -> Effect Page
20+page = effCall "page" \_ -> page
21+
22+setFiles
23+ :: forall o f
24+ . Castable o SetFilesOptions
25+ => Castable f
26+ ( String
27+ |+| Array String
28+ |+| { name :: String
29+ , mimeType :: String
30+ , buffer :: Buffer
31+ }
32+ |+| Array { name :: String
33+ , mimeType :: String
34+ , buffer :: Buffer
35+ }
36+ )
37+ => FileChooser
38+ -> f
39+ -> o
40+ -> Aff Unit
41+setFiles = affCall "setFiles" \_ -> setFiles
src/Playwright/Internal.js+20−45
@@ -18,55 +18,30 @@
1818 *
1919 * effectfulGetter('close', 0, identity);
2020 */
21−function effectfulGetter (property, argsCount, effectRunnerWrapper) {
22− var args = [];
23− return function (object) {
24− function effectRunner () {
25− return object[property].apply(object, args);
26− }
27−
28− var affectRunner = effectRunnerWrapper(effectRunner);
29−
30− function chooseNext () {
31− return argsCount > 0 ? argsConsumer : affectRunner;
32− }
33−
34− function argsConsumer (arg) {
35− if (argsCount == 0) {
36− return affectRunner;
37− } else {
38− args.push(arg);
39− argsCount--;
40− return chooseNext();
41− }
42− }
43−
44− return chooseNext();
45− };
21+function effectfulGetter(property, argsCount, effectRunnerWrapper) {
22+ return object => {
23+ function collect(args) {
24+ if (args.length === argsCount) {
25+ return effectRunnerWrapper(() => object[property].apply(object, args));
26+ }
27+ return argument => collect([...args, argument]);
28+ }
29+ return collect([]);
30+ };
4631}
4732
4833function identity (x) {
49− return x;
34+ return x;
5035}
5136
52−exports.unsafeEffCall = function (method) {
53− return function (argsCount) {
54− return effectfulGetter(method, argsCount, identity);
55− };
56−};
57−
58−exports.unsafeAffCall = function (toAffE) {
59− return function (method) {
60− return function (argsCount) {
61− return effectfulGetter(method, argsCount, toAffE);
62− };
63− };
64−};
37+export function unsafeEffCall(method) {
38+ return argsCount => effectfulGetter(method, argsCount, identity);
39+}
6540
66−exports.effProp = function (prop) {
67− return function (object) {
68− return function () {
69− return object[prop];
70− };
71− };
41+export function unsafeAffCall(toAffE) {
42+ return method => argsCount => effectfulGetter(method, argsCount, toAffE);
7243}
44+
45+export function effProp(prop) {
46+ return object => () => object[prop];
47+}
src/Playwright/Internal.purs+3−13
@@ -22,17 +22,7 @@ instance numberOfArgsFunction1 :: NumberOfArgs b => NumberOfArgs (a -> b) where
2222else instance numberOfArgsFunction0 :: NumberOfArgs a where
2323 numberOfArgs _ = 0
2424
25−-- | This function is used to prevent "The value of x is undefined here"
26−-- | errors.
27−-- |
28−-- | E.g.:
29−-- |
30−-- | ```purescript
31−-- | url = unsafeEffectfulGetter "url" (countArgs \_ -> url)
32−-- | ```
33−-- |
34−-- | Thus we can guarantee type safety at least in the number of arguments.
35−countArgs :: forall a. NumberOfArgs a => (Unit -> a) -> Int
25+countArgs :: forall a. NumberOfArgs a => (forall x. x -> a) -> Int
3626countArgs f = numberOfArgs (proxyOf f) - 2
3727 where
3828 proxyOf :: forall a. a -> Proxy a
@@ -51,10 +41,10 @@ foreign import unsafeAffCall
5141 -> Int
5242 -> r
5343
54−effCall :: forall f. NumberOfArgs f => String -> (Unit -> f) -> f
44+effCall :: forall f. NumberOfArgs f => String -> (forall x. x -> f) -> f
5545effCall p f = unsafeEffCall p (countArgs f)
5646
57−affCall :: forall f. NumberOfArgs f => String -> (Unit -> f) -> f
47+affCall :: forall f. NumberOfArgs f => String -> (forall x. x -> f) -> f
5848affCall prop f = unsafeAffCall toAffE prop (countArgs f)
5949
6050foreign import effProp :: forall obj r. String -> obj -> Effect r
src/Playwright/JSHandle.jsnew file+11
@@ -0,0 +1,11 @@
1+/* global exports */
2+
3+export function getProperties_(insert) {
4+ return emptyMap => jsHandle => () => jsHandle.getProperties().then(props => {
5+ let acc = emptyMap;
6+ props.entries().forEach(pair => {
7+ acc = insert(pair[0])(pair[1])(acc);
8+ });
9+ return acc;
10+ });
11+}
src/Playwright/JSHandle.pursnew file+34
@@ -0,0 +1,34 @@
1+module Playwright.JSHandle where
2+
3+import Playwright.Data (ElementHandle, JSHandle)
4+import Effect (Effect)
5+import Untagged.Union (type (|+|))
6+import Literals.Null (Null)
7+import Playwright.Internal (affCall)
8+import Effect.Aff (Aff)
9+import Prelude
10+import Data.Map (Map)
11+import Data.Map as Map
12+import Control.Promise (Promise, toAffE)
13+import Data.Argonaut.Core (Json)
14+
15+asElement :: JSHandle -> Effect (Null |+| ElementHandle)
16+asElement = affCall "asElement" \_ -> asElement
17+
18+dispose :: JSHandle -> Aff Unit
19+dispose = affCall "dispose" \_ -> dispose
20+
21+getProperties :: JSHandle -> Aff (Map String JSHandle)
22+getProperties = toAffE <<< getProperties_ Map.insert Map.empty
23+
24+getProperty :: JSHandle -> Aff JSHandle
25+getProperty = affCall "getProperty" \_ -> getProperty
26+
27+jsonValue :: JSHandle -> Aff Json
28+jsonValue = affCall "jsonValue" \_ -> jsonValue
29+
30+foreign import getProperties_
31+ :: (String -> JSHandle -> Map String JSHandle -> Map String JSHandle)
32+ -> (Map String JSHandle)
33+ -> JSHandle
34+ -> Effect (Promise (Map String JSHandle))
src/Playwright/Keyboard.purs+3−3
@@ -6,7 +6,7 @@ import Playwright.Data (Keyboard)
66import Playwright.Options (KeyboardPressOptions)
77import Effect.Aff (Aff)
88import Control.Promise (toAffE)
9−import Untagged.Coercible (class Coercible, coerce)
9+import Untagged.Castable (class Castable, cast)
1010
1111type Key = String
1212
@@ -20,14 +20,14 @@ insertText =
2020
2121press
2222 :: forall o
23− . Coercible o KeyboardPressOptions
23+ . Castable o KeyboardPressOptions
2424 => Keyboard -> Key -> o -> Aff Unit
2525press =
2626 affCall "press" \_ -> press
2727
2828type'
2929 :: forall o
30− . Coercible o KeyboardPressOptions
30+ . Castable o KeyboardPressOptions
3131 => Keyboard -> String -> o -> Aff Unit
3232type' =
3333 affCall "type" \_ -> type'
src/Playwright/Locator.jsnew file+9
@@ -0,0 +1,9 @@
1+export const setNativeProperty_ = target => constructorName => propertyName => value => () =>
2+ target.evaluate(
3+ (element, { constructorName, propertyName, value }) => {
4+ const prototype = globalThis[constructorName].prototype;
5+ const setter = Object.getOwnPropertyDescriptor(prototype, propertyName).set;
6+ setter.call(element, value);
7+ },
8+ { constructorName, propertyName, value }
9+ );
src/Playwright/Locator.pursnew file+49
@@ -0,0 +1,49 @@
1+module Playwright.Locator
2+ ( Locator
3+ , locator
4+ , getByRole
5+ , click
6+ , setChecked
7+ , selectOption
8+ , dispatchEvent
9+ , setNativeProperty
10+ ) where
11+
12+import Prelude
13+
14+import Control.Promise (Promise, toAffE)
15+import Effect (Effect)
16+import Effect.Aff (Aff)
17+import Foreign (Foreign)
18+import Playwright.Data (Page, Selector)
19+import Playwright.Internal (affCall, effCall)
20+import Playwright.Options (ClickOptions, RoleOptions, SelectOptionOptions, SetCheckedOptions)
21+import Untagged.Castable (class Castable)
22+
23+locator :: Page -> Selector -> Effect Locator
24+locator = effCall "locator" \_ -> locator
25+
26+getByRole :: forall o. Castable o RoleOptions => Page -> String -> o -> Effect Locator
27+getByRole = effCall "getByRole" \_ -> getByRole
28+
29+click :: forall o. Castable o ClickOptions => Locator -> o -> Aff Unit
30+click = affCall "click" \_ -> click
31+
32+setChecked :: forall o. Castable o SetCheckedOptions => Locator -> Boolean -> o -> Aff Unit
33+setChecked = affCall "setChecked" \_ -> setChecked
34+
35+selectOption :: forall o. Castable o SelectOptionOptions => Locator -> String -> o -> Aff (Array String)
36+selectOption = affCall "selectOption" \_ -> selectOption
37+
38+dispatchEvent :: forall r. Locator -> String -> { | r } -> Aff Unit
39+dispatchEvent = affCall "dispatchEvent" \_ -> dispatchEvent
40+
41+-- | Invoke the setter from a named DOM constructor's prototype, bypassing an
42+-- | element's own property descriptor. Event dispatch remains the caller's job.
43+setNativeProperty :: Locator -> String -> String -> Foreign -> Aff Unit
44+setNativeProperty target constructorName propertyName value =
45+ toAffE $ setNativeProperty_ target constructorName propertyName value
46+
47+foreign import data Locator :: Type
48+
49+foreign import setNativeProperty_ :: Locator -> String -> String -> Foreign -> Effect (Promise Unit)
src/Playwright/Mouse.purs+4−4
@@ -5,7 +5,7 @@ import Playwright.Data
55import Playwright.Internal
66import Playwright.Options
77import Prelude
8−import Untagged.Coercible (class Coercible)
8+import Untagged.Castable (class Castable)
99import Untagged.Union
1010
1111click
@@ -26,7 +26,7 @@ dblclick = affCall "dblclick" \_ -> dblclick
2626
2727down
2828 :: forall o
29− . Coercible o MouseUpDownOptions
29+ . Castable o MouseUpDownOptions
3030 => Mouse
3131 -> o
3232 -> Aff Unit
@@ -34,7 +34,7 @@ down = affCall "down" \_ -> down
3434
3535move
3636 :: forall o
37− . Coercible o MouseMoveOptions
37+ . Castable o MouseMoveOptions
3838 => Mouse
3939 -> o
4040 -> Aff Unit
@@ -42,7 +42,7 @@ move = affCall "move" \_ -> move
4242
4343up
4444 :: forall o
45− . Coercible o MouseUpDownOptions
45+ . Castable o MouseUpDownOptions
4646 => Mouse
4747 -> o
4848 -> Aff Unit
src/Playwright/Options.purs+94−68
@@ -3,6 +3,7 @@ module Playwright.Options where
33import Playwright.Data
44
55import Data.String.Regex (Regex)
6+import Data.Time.Duration (Milliseconds(..))
67import Foreign (Foreign)
78import Foreign.Object (Object)
89import Literals.Null (Null)
@@ -11,68 +12,69 @@ import Untagged.Union (UndefinedOr, type (|+|))
1112type Opt a = UndefinedOr a
1213
1314type LaunchOptions =
14− { headless :: Opt Boolean
15− , executablePath :: Opt String
16− , args :: Opt String
15+ { headless :: Opt Boolean
16+ , executablePath :: Opt String
17+ , args :: Opt (Array String)
1718 , ignoreDefaultArgs :: Opt (Array String)
18− , proxy :: Opt ProxyOptions
19− , downloadsPath :: Opt String
20− , chromiumSandbox :: Opt Boolean
21− , firefoxUserPrefs :: Opt Foreign
22− , handleSIGINT :: Opt Boolean
23− , handleSIGTERM :: Opt Boolean
24− , handleSIGHUP :: Opt Boolean
25− , timeout :: Opt Number
26− , env :: Opt (Object String)
27− , devtools :: Opt Boolean
28− , slowMo :: Opt Number
19+ , proxy :: Opt ProxyOptions
20+ , downloadsPath :: Opt String
21+ , chromiumSandbox :: Opt Boolean
22+ , firefoxUserPrefs :: Opt Foreign
23+ , handleSIGINT :: Opt Boolean
24+ , handleSIGTERM :: Opt Boolean
25+ , handleSIGHUP :: Opt Boolean
26+ , timeout :: Opt Milliseconds
27+ , env :: Opt (Object String)
28+ , devtools :: Opt Boolean
29+ , slowMo :: Opt Number
2930 }
3031
3132type ProxyOptions =
32− { server :: Opt String
33− , bypass :: Opt String
33+ { server :: Opt String
34+ , bypass :: Opt String
3435 , username :: Opt String
3536 , password :: Opt String
3637 }
3738
3839type ScreenshotOptions =
39− { path :: Opt String
40− , "type" :: Opt ScreenshotType
41− , quality :: Opt Number
40+ { path :: Opt String
41+ , "type" :: Opt ScreenshotType
42+ , quality :: Opt Number
4243 , omitBackground :: Opt Boolean
43− , timeout :: Opt Number
44+ , fullPage :: Opt Boolean
45+ , timeout :: Opt Milliseconds
4446 }
4547
4648type GotoOptions =
47− { timeout :: Opt Int
49+ { timeout :: Opt Milliseconds
4850 , waitUntil :: Opt WaitUntil
49− , referer :: Opt String
51+ , referer :: Opt String
5052 }
5153
5254type NewpageOptions =
53− { acceptDownloads :: Opt Boolean
55+ { acceptDownloads :: Opt Boolean
5456 , ignoreHTTPSErrors :: Opt Boolean
55− , bypassCSP :: Opt Boolean
56− , viewport :: Opt (Null |+| { width :: Int, height :: Int })
57+ , bypassCSP :: Opt Boolean
58+ , viewport :: Opt (Null |+| { width :: Int, height :: Int })
5759 }
5860
5961type GoOptions =
60− { timeout :: Opt Int
62+ { timeout :: Opt Milliseconds
6163 , waitUntil :: Opt WaitUntil
6264 }
6365
6466type HoverOptions =
6567 { position :: Opt Position
6668 , modifier :: Opt (Array Modifier)
67− , force :: Opt Boolean
69+ , force :: Opt Boolean
6870 }
6971
7072type InnerHTMLOptions =
71− { timeout :: Opt Number
73+ { timeout :: Opt Milliseconds
7274 }
7375
7476type InnerTextOptions =
75− { timeout :: Opt Number
77+ { timeout :: Opt Milliseconds
7678 }
7779
7880type KeyboardPressOptions =
@@ -85,29 +87,29 @@ type AddInitScriptOptions =
8587type Position = { x :: Int, y :: Int }
8688
8789type ClickOptions =
88− { button :: Opt MouseButton
89− , clickCount :: Opt Int
90− , delay :: Opt Int
91− , position :: Opt Position
92− , modifiers :: Opt (Array Modifier)
93− , force :: Opt Boolean
90+ { button :: Opt MouseButton
91+ , clickCount :: Opt Int
92+ , delay :: Opt Int
93+ , position :: Opt Position
94+ , modifiers :: Opt (Array Modifier)
95+ , force :: Opt Boolean
9496 , noWaitAfter :: Opt Boolean
95− , timeout :: Opt Int
97+ , timeout :: Opt Milliseconds
9698 }
9799
98100type MouseClickOptions =
99− { button :: Opt MouseButton
101+ { button :: Opt MouseButton
100102 , clickCount :: Opt Int
101− , delay :: Opt Int
103+ , delay :: Opt Int
102104 }
103105
104106type MouseDblClickOptions =
105− { button :: Opt MouseButton
106− , delay :: Opt Int
107+ { button :: Opt MouseButton
108+ , delay :: Opt Int
107109 }
108110
109111type MouseUpDownOptions =
110− { button :: Opt MouseButton
112+ { button :: Opt MouseButton
111113 , clickCount :: Opt Int
112114 }
113115
@@ -116,57 +118,81 @@ type MouseMoveOptions =
116118 }
117119
118120type WaitForNavigationOptions =
119− { timeout :: Opt Int
120− , url :: Opt (String |+| Regex |+| URL -> Boolean)
121+ { timeout :: Opt Milliseconds
122+ , url :: Opt (String |+| Regex |+| URL -> Boolean)
121123 , waitUntil :: Opt WaitUntil
122124 }
123125
124126type WaitForRequestOptions =
125− { timeout :: Opt Int
127+ { timeout :: Opt Milliseconds
126128 }
127129
128130type WaitForResponseOptions =
129− { timeout :: Opt Int
131+ { timeout :: Opt Milliseconds
130132 }
131133
132134type WaitForSelectorOptions =
133− { state :: Opt ElementState
134− , timeout :: Opt Int
135+ { state :: Opt ElementState
136+ , timeout :: Opt Milliseconds
135137 }
136138
137139type WaitForFunctionOptions =
138140 { polling :: Opt (Int |+| Raf)
139− , timeout :: Opt Int
141+ , timeout :: Opt Milliseconds
140142 }
141143
142144type WaitForLoadStateOptions =
143− { timeout :: Opt Int
145+ { timeout :: Opt Milliseconds
144146 }
145147
146148type Margin =
147− { top :: Opt (String |+| Number)
148− , right :: Opt (String |+| Number)
149+ { top :: Opt (String |+| Number)
150+ , right :: Opt (String |+| Number)
149151 , bottom :: Opt (String |+| Number)
150− , left :: Opt (String |+| Number)
152+ , left :: Opt (String |+| Number)
151153 }
152154
153155type PdfOptions =
154− { path :: String
155− , scale :: Opt Number
156+ { path :: String
157+ , scale :: Opt Number
156158 , displayHeaderFooter :: Opt Boolean
157− , headerTemplate :: Opt String
158− , footerTemplate :: Opt String
159− , printBackground :: Opt Boolean
160− , landscape :: Opt Boolean
161− , pageRanges :: Opt String
162− , format :: Opt String
163− , width :: Opt (String |+| Number)
164− , height :: Opt (String |+| Number)
165− , margin :: Opt Margin
166− , preferCSSPageSize :: Opt Boolean
167− }
168−
169−type SetInputFilesOptions =
159+ , headerTemplate :: Opt String
160+ , footerTemplate :: Opt String
161+ , printBackground :: Opt Boolean
162+ , landscape :: Opt Boolean
163+ , pageRanges :: Opt String
164+ , format :: Opt String
165+ , width :: Opt (String |+| Number)
166+ , height :: Opt (String |+| Number)
167+ , margin :: Opt Margin
168+ , preferCSSPageSize :: Opt Boolean
169+ }
170+
171+type SetFilesOptions =
170172 { noWaitAfter :: Opt Boolean
171− , timeout :: Opt Int
173+ , timeout :: Opt Milliseconds
174+ }
175+
176+type RoleOptions =
177+ { name :: Opt (String |+| Regex)
178+ , exact :: Opt Boolean
179+ , checked :: Opt Boolean
180+ , disabled :: Opt Boolean
181+ , expanded :: Opt Boolean
182+ , includeHidden :: Opt Boolean
183+ , level :: Opt Int
184+ , pressed :: Opt Boolean
185+ , selected :: Opt Boolean
186+ }
187+
188+type SetCheckedOptions =
189+ { force :: Opt Boolean
190+ , position :: Opt Position
191+ , timeout :: Opt Milliseconds
192+ , trial :: Opt Boolean
193+ }
194+
195+type SelectOptionOptions =
196+ { force :: Opt Boolean
197+ , timeout :: Opt Milliseconds
172198 }
src/Playwright/Response.jsnew file+10
@@ -0,0 +1,10 @@
1+/* global exports */
2+
3+export const finished_ = Nothing => Just => Response => () =>
4+ Response.finished().then((result) => {
5+ if (result === null) {
6+ return Nothing
7+ } else {
8+ return Just(result)
9+ }
10+ })
src/Playwright/Response.purs+57−14
@@ -1,22 +1,65 @@
1−module Playwright.Response where
1+module Playwright.Response
2+ ( body
3+ , finished
4+ , frame
5+ , headers
6+ , json
7+ , ok
8+ , request
9+ , status
10+ , statusText
11+ , text
12+ , url
13+ )
14+where
215
3−import Playwright.Data
4−import Playwright.Internal
16+import Control.Promise (Promise, toAffE)
17+import Data.Argonaut.Core (Json)
18+import Data.Maybe (Maybe(..))
19+import Effect (Effect)
520import Effect.Aff (Aff)
6−import Node.Buffer (Buffer)
721import Effect.Exception (Error)
8−import Effect (Effect)
9−import Untagged.Union
10−import Literals.Null
22+import Foreign.Object (Object)
23+import Node.Buffer (Buffer)
24+import Playwright.Data (Frame, Request, Response)
25+import Playwright.Internal (affCall, effCall)
26+import Prelude
1127
1228body :: Response -> Aff Buffer
13−body = affCall "body" typeInfo
14− where typeInfo _ = body
29+body = affCall "body" \_ -> body
1530
16−finished :: Response -> Aff (Null |+| Error)
17−finished = affCall "finished" typeInfo
18− where typeInfo _ = finished
31+finished :: Response -> Aff (Maybe Error)
32+finished = toAffE <<< finished_ Nothing Just
33+
34+foreign import finished_
35+ :: (forall a. Maybe a)
36+ -> (forall a. a -> Maybe a)
37+ -> Response
38+ -> Effect (Promise (Maybe Error))
1939
2040frame :: Response -> Effect Frame
21−frame = effCall "frame" typeInfo
22− where typeInfo _ = frame
41+frame = effCall "frame" \_ -> frame
42+
43+headers :: Response -> Effect (Object String)
44+headers = effCall "headers" \_ -> headers
45+
46+json :: Response -> Aff Json
47+json = affCall "json" \_ -> json
48+
49+ok :: Response -> Effect Boolean
50+ok = effCall "ok" \_ -> ok
51+
52+request :: Response -> Effect Request
53+request = effCall "request" \_ -> request
54+
55+status :: Response -> Effect Int
56+status = effCall "status" \_ -> status
57+
58+statusText :: Response -> Effect String
59+statusText = effCall "statusText" \_ -> statusText
60+
61+text :: Response -> Aff String
62+text = affCall "text" \_ -> text
63+
64+url :: Response -> Effect String
65+url = effCall "url" \_ -> url
src/Playwright/Test.jsnew file+7
@@ -0,0 +1,7 @@
1+import { test } from "@playwright/test";
2+
3+export const test_ = name => run => () => {
4+ test(name, async ({ page }) => {
5+ await run(page)();
6+ });
7+};
src/Playwright/Test.pursnew file+15
@@ -0,0 +1,15 @@
1+module Playwright.Test (test) where
2+
3+import Prelude
4+
5+import Control.Promise (Promise, fromAff)
6+import Effect (Effect)
7+import Effect.Aff (Aff)
8+import Playwright.Data (Page)
9+
10+-- | Register a Playwright test using its isolated page fixture. The runner
11+-- | awaits the Aff and reports rejected computations as test failures.
12+test :: String -> (Page -> Aff Unit) -> Effect Unit
13+test name run = test_ name (fromAff <<< run)
14+
15+foreign import test_ :: String -> (Page -> Effect (Promise Unit)) -> Effect Unit
test/Main.purs+121−153
@@ -1,160 +1,128 @@
11module Test.Main where
22
3−import Data.Either (isLeft)
4−import Data.Maybe (Maybe(..))
3+import Prelude
4+
5+import Control.Monad.Error.Class (throwError)
6+import Control.Monad.Except (runExcept)
7+import Data.Either (Either(..), isLeft)
58import Effect (Effect)
6−import Effect.Aff (launchAff_, try)
9+import Effect.Aff (Aff, bracket, try)
710import Effect.Class (liftEffect)
8−import Effect.Ref as Ref
9−import Node.Encoding as Encoding
10−import Node.FS.Aff as FS
11−import Node.Stream as Stream
12−import Playwright
13−import Playwright.ConsoleMessage as ConsoleMessage
14−import Playwright.Dialog as Dialog
15−import Playwright.Download as Download
16−import Playwright.Event (on)
17−import Playwright.Event as Event
18−import Prelude
19−import Test.Unit (suite, test)
20−import Test.Unit.Assert as Assert
21−import Test.Unit.Main (runTest)
22−import TestUtils (cwd, isNull, testClickEvent, withBrowser, withBrowserPage)
23−import Untagged.Union (fromOneOf)
11+import Effect.Exception (error)
12+import Foreign (readBoolean, readInt, unsafeToForeign)
13+import Playwright as Playwright
14+import Playwright.Locator as Locator
15+import Playwright.Test (test)
2416
25−static :: String -> URL
26−static file =
27− URL $ "file://" <> cwd <> "/test/static/" <> file
17+assert :: String -> Boolean -> Aff Unit
18+assert message condition = unless condition $ throwError $ error message
19+
20+assertBrowser :: Playwright.Page -> String -> Aff Unit
21+assertBrowser page expression = do
22+ result <- Playwright.evaluate page expression
23+ assert expression $ runExcept (readBoolean result) == Right true
2824
2925main :: Effect Unit
30−main = runTest do
31− let
32− hello = static "hello.html"
33− index = static "index.html"
34− suite "browser" do
35− test "launch, close" do
36− browser <- launch chromium {}
37− close browser
38− test "close/isClosed" do
39− withBrowserPage hello
40− \page -> do
41− Assert.assertFalse "new page is closed" =<<
42− liftEffect (isClosed page)
43− close page
44− Assert.assert "page is not closed" =<< liftEffect (isClosed page)
45− test "version" do
46− withBrowser
47− \browser -> do
48− v <- liftEffect $ version browser
49− Assert.assert "version is empty" (v /= "")
50− test "url" do
51− withBrowserPage hello
52− \page -> do
53− Assert.equal hello =<< liftEffect (url page)
54− test "screenshot" do
55− withBrowserPage hello
56− \page -> do
57− void $ screenshot page { path: "screenshot.png" }
58− FS.unlink "screenshot.png"
59− test "textContent" do
60− withBrowserPage hello
61− \page -> do
62− text <- textContent page (Selector "body")
63− Assert.equal (Just "hello\n") (fromOneOf text)
64− test "mainFrame" do
65− withBrowserPage hello
66− \page -> do
67− frame <- liftEffect $ mainFrame page
68− frameName <- liftEffect $ name frame
69− Assert.equal "" frameName
70− test "click" do
71− withBrowserPage index $ testClickEvent "click" click
72− test "dblclick" do
73− withBrowserPage index $ testClickEvent "dblclick" dblclick
74− test "waitForSelector" do
75− withBrowserPage hello
76− \page -> do
77− void $ waitForSelector page (Selector "body") {}
78− res <- try $ waitForSelector page (Selector "nonexistent") { timeout: 100 }
79− Assert.assert "waitForSelector fails when no element" $
80− isLeft res
81− test "waitForFunction" do
82− withBrowserPage hello
83− \page -> do
84− void $ evaluate page
85− "setTimeout(() => document.body.textContent += 'uniqstring', 1)"
86− void $ waitForFunction
87− page
88− "document.body.textContent.includes('uniqstring')"
89− { timeout: 5000, polling: 100 }
90− suite "events" do
91− test "console" do
92− withBrowserPage hello
93− \page -> do
94− messageRef <- liftEffect $ Ref.new Nothing
95− liftEffect $ on Event.console page $ \cslMessage -> do
96− realMessage <- ConsoleMessage.text cslMessage
97− Ref.write (Just realMessage) messageRef
98− void $ evaluate page
99− """
100− console.log('hi');
101− """
102− realMessage <- liftEffect $ Ref.read messageRef
103− Assert.equal (Just "hi") realMessage
104− test "console: ConsoleMessageType" do
105− withBrowserPage hello
106− \page -> do
107− typeRef <- liftEffect $ Ref.new Nothing
108− liftEffect $ on Event.console page $ \cslMessage -> do
109− realType <- ConsoleMessage.type' cslMessage
110− Ref.write (Just realType) typeRef
111− void $ evaluate page
112− """
113− console.debug('hi');
114− """
115− realType <- liftEffect $ Ref.read typeRef
116− Assert.equal (Just ConsoleMessage.Debug) realType
117− test "download" do
118− withBrowserPage hello
119− \page -> do
120− downloadRef <- liftEffect $ Ref.new Nothing
121− liftEffect $ on Event.download page $ \download -> launchAff_ do
122− fname <- liftEffect $ Download.suggestedFilename download
123− Assert.equal "hello.txt" fname
124− mbStream <- Download.createReadStream download
125− failureStatus <- Download.failure download
126− Assert.equal true (isNull failureStatus)
127− case mbStream of
128− Nothing -> Assert.assert "Unable to get stream" false
129− Just stream -> do
130− liftEffect $ Stream.onDataString stream Encoding.UTF8 $ \string -> do
131− Ref.write (Just string) downloadRef
132− void $ evaluate page
133− """
134− function download(filename, text) {
135− var element = document.createElement('a');
136− element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
137− element.setAttribute('download', filename);
138− document.body.appendChild(element);
139− element.click();
140− document.body.removeChild(element);
141− }
142− download("hello.txt","hiiii");
143− """
144− waitForTimeout page 100
145− downloadContent <- liftEffect $ Ref.read downloadRef
146− Assert.equal (Just "hiiii") downloadContent
147− test "dialog" do
148− withBrowserPage hello
149− \page -> do
150− downloadRef <- liftEffect $ Ref.new Nothing
151− liftEffect $ on Event.dialog page $ \dialog -> launchAff_ do
152− defaultValue <- liftEffect $ Dialog.defaultValue dialog
153− Assert.equal "hello" defaultValue
154− message <- liftEffect $ Dialog.message dialog
155− Assert.equal "hi" message
156− Dialog.dismiss dialog
157− void $ evaluate page
158− """
159− prompt("hi", "hello");
160− """
26+main = do
27+ test "method applications isolate arguments across pages and reusable prefixes" \first ->
28+ bracket (Playwright.launch Playwright.chromium { args: [] :: Array String }) Playwright.close \browser -> do
29+ second <- Playwright.newPage browser {}
30+ let
31+ firstURL = Playwright.URL "data:text/html,<title>First</title><button onclick=\"document.title='Clicked'\">Apply</button>"
32+ secondURL = Playwright.URL "data:text/html,<title>Second</title><button onclick=\"document.title='Changed'\">Apply</button>"
33+ navigateFirst = Playwright.goto first
34+ firstDestination = navigateFirst firstURL
35+ firstNavigation = firstDestination {}
36+ navigateSecond = Playwright.goto second
37+ void firstNavigation
38+ void $ navigateSecond secondURL {}
39+ assert "first page receiver" =<< (eq "First" <$> Playwright.title first)
40+ assert "second page receiver" =<< (eq "Second" <$> Playwright.title second)
41+ void $ navigateFirst secondURL {}
42+ assert "reused receiver prefix takes new arguments" =<< (eq "Second" <$> Playwright.title first)
43+ void $ firstDestination {}
44+ assert "reused destination prefix retains its arguments" =<< (eq "First" <$> Playwright.title first)
45+ let
46+ findFirst = Locator.locator first
47+ findSecond = Locator.locator second
48+ findButton = Locator.getByRole first "button"
49+ firstButton <- liftEffect $ findFirst (Playwright.Selector "button")
50+ secondButton <- liftEffect $ findSecond (Playwright.Selector "button")
51+ firstAgain <- liftEffect $ findFirst (Playwright.Selector "text=Apply")
52+ byRole <- liftEffect $ findButton { name: "Apply", exact: true }
53+ byRoleAgain <- liftEffect $ findButton { name: "Apply", exact: false }
54+ Locator.click firstButton {}
55+ Locator.click secondButton {}
56+ Locator.click firstAgain {}
57+ Locator.click byRole {}
58+ Locator.click byRoleAgain {}
59+ assert "locator keeps first receiver" =<< (eq "Clicked" <$> Playwright.title first)
60+ assert "locator keeps second receiver" =<< (eq "Changed" <$> Playwright.title second)
61+ void firstNavigation
62+ assert "repeated completed Aff retains its arguments" =<< (eq "First" <$> Playwright.title first)
63+ assert "Effect method keeps first receiver" =<< (eq firstURL <$> liftEffect (Playwright.url first))
64+ assert "Effect method keeps second receiver" =<< (eq secondURL <$> liftEffect (Playwright.url second))
65+
66+ test "native properties and events remain separately ordered locator actions" \page -> do
67+ void $ Playwright.goto page (Playwright.URL "data:text/html,<input id='text'><input id='check' type='checkbox'><select><option value='a'>A</option><option value='b'>B</option></select>") {}
68+ void $ Playwright.evaluate page
69+ """
70+ (() => {
71+ const input = document.querySelector('#text');
72+ globalThis.events = [];
73+ Object.defineProperty(input, 'value', {
74+ get() { return Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').get.call(this); },
75+ set() { throw new Error('own setter must not run'); }
76+ });
77+ document.body.addEventListener('input', event => globalThis.events.push(event.target.value));
78+ })()
79+ """
80+ input <- liftEffect $ Locator.locator page (Playwright.Selector "#text")
81+ checkbox <- liftEffect $ Locator.getByRole page "checkbox" {}
82+ select <- liftEffect $ Locator.getByRole page "combobox" {}
83+ let
84+ setValue = Locator.setNativeProperty input "HTMLInputElement" "value"
85+ setChecked = Locator.setChecked checkbox
86+ selectValue = Locator.selectOption select
87+ setValue $ unsafeToForeign "first"
88+ assertBrowser page "document.querySelector('#text').value === 'first' && events.length === 0"
89+ Locator.dispatchEvent input "input" { bubbles: true }
90+ setValue $ unsafeToForeign "second"
91+ assertBrowser page "document.querySelector('#text').value === 'second' && JSON.stringify(events) === '[\"first\"]'"
92+ Locator.dispatchEvent input "input" { bubbles: true }
93+ assertBrowser page "JSON.stringify(events) === '[\"first\",\"second\"]'"
94+ setChecked true {}
95+ assertBrowser page "document.querySelector('#check').checked"
96+ setChecked false {}
97+ assertBrowser page "!document.querySelector('#check').checked"
98+ selected <- selectValue "b" {}
99+ assert "selected option result" $ selected == [ "b" ]
100+ assertBrowser page "document.querySelector('select').value === 'b'"
101+ selectedAgain <- selectValue "a" {}
102+ assert "reused option selection" $ selectedAgain == [ "a" ]
103+ assertBrowser page "document.querySelector('select').value === 'a'"
104+
105+ test "named effects wait for readiness and await completion or rejection" \page -> do
106+ void $ Playwright.evaluate page
107+ """
108+ (() => {
109+ globalThis.runEffect = false;
110+ setTimeout(() => {
111+ globalThis.runEffect = value => () => new Promise(resolve => {
112+ setTimeout(() => { document.title = value; resolve(value.length); }, 0);
113+ });
114+ globalThis.failEffect = value => () => Promise.reject(new Error(value));
115+ }, 0);
116+ })()
117+ """
118+ Playwright.waitForGlobalFunction page "runEffect"
119+ let runEffect = Playwright.evaluateEffect page "runEffect"
120+ result <- runEffect $ unsafeToForeign "Completed"
121+ assert "Effect promise result is returned" $ runExcept (readInt result) == Right 9
122+ assert "Effect promise is awaited" =<< (eq "Completed" <$> Playwright.title page)
123+ void $ runEffect $ unsafeToForeign "Repeated"
124+ assert "named Effect prefix is reusable" =<< (eq "Repeated" <$> Playwright.title page)
125+ failure <- try $ Playwright.evaluateEffect page "failEffect" $ unsafeToForeign "expected rejection"
126+ assert "browser rejection reaches Aff" $ isLeft failure
127+ missing <- try $ Playwright.evaluateEffect page "missingEffect" $ unsafeToForeign {}
128+ assert "missing global reaches Aff" $ isLeft missing
test/TestUtils.jsdeleted−5
@@ -1,5 +0,0 @@
1−/* global exports __dirname */
2−
3−exports.cwd = process.cwd();
4−
5−exports.isNull = function (sth) { return sth === null; };
test/TestUtils.pursdeleted−53
@@ -1,53 +0,0 @@
1−module TestUtils
2− ( assertForeignTrue
3− , withBrowser
4− , withBrowserPage
5− , testClickEvent
6− , cwd
7− , isNull
8− )
9−where
10−
11−import Test.Unit.Assert as Assert
12−import Foreign (Foreign, readBoolean)
13−import Control.Monad.Except (runExcept)
14−import Data.Either (Either(..))
15−import Effect.Aff (Aff)
16−import Prelude (Unit, bind, discard, void, ($), (<>), (==))
17−import Playwright
18−import Control.Monad.Error.Class (withResource)
19−
20−assertForeignTrue :: Foreign -> Aff Unit
21−assertForeignTrue value = do
22− let
23− eiBool = runExcept $ readBoolean value
24− Assert.assert "Foreign value is boolean true" (eiBool == Right true)
25−
26−withBrowser :: forall a. (Browser -> Aff a) -> Aff a
27−withBrowser = withResource acquire release
28− where
29− acquire = launch chromium {}
30− release = close
31−
32−withBrowserPage :: forall a. URL -> (Page -> Aff a) -> Aff a
33−withBrowserPage url action = do
34− withBrowser
35− \browser -> do
36− let
37− acquire = newPage browser { acceptDownloads: true }
38− release = close
39− withResource acquire release
40− \page -> do
41− void $ goto page url {}
42− action page
43−
44−testClickEvent :: String -> (Page -> Selector -> {} -> Aff Unit) -> Page -> Aff Unit
45−testClickEvent event action page = do
46− void $ evaluate page ("setEventTester('" <> event <> "');")
47− action page (Selector $ "#event-" <> event) {}
48− result <- evaluate page $ "checkEventHappened('" <> event <> "');"
49− assertForeignTrue result
50−
51−foreign import isNull :: forall a. a -> Boolean
52−
53−foreign import cwd :: String
test/browser.spec.jsnew file+3
@@ -0,0 +1,3 @@
1+import { main } from "../output/Test.Main/index.js";
2+
3+main();