git.iko.soy/rowtype-yoga/purescript-playwright
on main help sign in
.github/workflows/ci.ymlnew file+24
since splitsnapshots
unifiedsplit
@@ -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 @@
7/.psc*
7/.psc*
8/.purs*
8/.purs*
9/.psa*
9/.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 @@
2 "name": "purescript-playwright",
2 "name": "purescript-playwright",
3 "version": "0.0.1",
3 "version": "0.0.1",
4 "description": "PureScript bindings for Playwright",
4 "description": "PureScript bindings for Playwright",
5− "main": "index.js",
5+ "type": "module",
6− "directories": {
7− "test": "test"
8− },
9 "dependencies": {
6 "dependencies": {
10− "bower": "^1.8.8",
7+ "@playwright/test": "~1.60.0",
11− "playwright": "^1.3.0",
8+ "playwright": "~1.60.0"
12− "pulp": "^15.0.0"
9+ },
10+ "devDependencies": {
11+ "purescript": "0.15.16",
12+ "spago": "^1.0.3"
13 },
13 },
14− "devDependencies": {},
15 "scripts": {
14 "scripts": {
16− "test": "pulp test"
15+ "build": "spago build",
16+ "test": "bun run build && playwright test",
17+ "test:install": "playwright install chromium"
17 },
18 },
18 "repository": {
19 "repository": {
19 "type": "git",
20 "type": "git",
20− "url": "git+https://github.com/klntsky/purescript-playwright.git"
21+ "url": "git+https://github.com/rowtype-yoga/purescript-playwright.git"
21 },
22 },
22 "keywords": [
23 "keywords": [
23 "purescript",
24 "purescript",
@@ -26,7 +27,7 @@
26 "author": "Vladimir Kalnitsky <klntsky@gmail.com>",
27 "author": "Vladimir Kalnitsky <klntsky@gmail.com>",
27 "license": "BSD-3-Clause",
28 "license": "BSD-3-Clause",
28 "bugs": {
29 "bugs": {
29− "url": "https://github.com/klntsky/purescript-playwright/issues"
30+ "url": "https://github.com/rowtype-yoga/purescript-playwright/issues"
30 },
31 },
31− "homepage": "https://github.com/klntsky/purescript-playwright#readme"
32+ "homepage": "https://github.com/rowtype-yoga/purescript-playwright#readme"
32}
33}
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−15
@@ -1,15 +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− ]
13−, packages = ./packages.dhall
14−, sources = [ "src/**/*.purs", "test/**/*.purs" ]
15−}
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+258−101
@@ -1,66 +1,80 @@
1module Playwright
1module Playwright
2− ( launch
2+ ( launch
3− , close
3+ , close
4− , contexts
4+ , contexts
5− , isConnected
5+ , isConnected
6− , version
6+ , version
7− , newPage
7+ , newPage
8− , goForward
8+ , goForward
9− , goBack
9+ , goBack
10− , goto
10+ , goto
11− , addCookies
11+ , addCookies
12− , hover
12+ , hover
13− , innerHTML
13+ , innerHTML
14− , innerText
14+ , innerText
15− , isClosed
15+ , isClosed
16− , keyboard
16+ , keyboard
17− , mainFrame
17+ , mainFrame
18− , name
18+ , name
19− , query
19+ , query
20− , queryMany
20+ , queryMany
21− , screenshot
21+ , screenshot
22− , textContent
22+ , textContent
23− , url
23+ , url
24− , addInitScript
24+ , addInitScript
25− , clearCookies
25+ , clearCookies
26− , click
26+ , click
27− , content
27+ , content
28− , dblclick
28+ , dblclick
29− , evaluate
29+ , evaluate
30− , evaluateHandle
30+ , evaluateHandle
31− , waitForNavigation
31+ , waitForNavigation
32− , waitForRequest
32+ , waitForRequest
33− , waitForResponse
33+ , waitForResponse
34− , waitForSelector
34+ , waitForSelector
35+ , waitForFunction
36+ , waitForGlobalFunction
37+ , evaluateEffect
38+ , waitForLoadState
39+ , waitForTimeout
40+ , pdf
41+ , setInputFiles
42+ , setViewportSize
43+ , title
44+ , exposeBinding
35− , module Playwright.Data
45+ , module Playwright.Data
36− , module Playwright.Options
46+ , module Playwright.Options
37− )
38−where
47+ ) where
39−
48+
49+import Control.Promise (Promise, fromAff, toAffE)
50+import Data.String.Regex (Regex)
40import Effect (Effect)
51import Effect (Effect)
41import Effect.Aff (Aff)
52import Effect.Aff (Aff)
53+import Foreign (Foreign, unsafeToForeign)
42import Literals.Null (Null)
54import Literals.Null (Null)
43import Node.Buffer (Buffer)
55import Node.Buffer (Buffer)
44import Playwright.Data
56import Playwright.Data
45import Playwright.Internal (effCall, effProp, affCall)
57import Playwright.Internal (effCall, effProp, affCall)
46import Playwright.Options
58import Playwright.Options
47−import Prelude
59+import Prelude (Unit, ($))
48−import Untagged.Coercible (class Coercible)
60+import Untagged.Castable (class Castable)
49import Untagged.Union (type (|+|), UndefinedOr)
61import Untagged.Union (type (|+|), UndefinedOr)
50−import Foreign (Foreign)
62+import Literals.Undefined (undefined)
51−import Data.String.Regex (Regex)
52
63
53launch
64launch
54 :: forall o
65 :: forall o
55− . Coercible o LaunchOptions
66+ . Castable o LaunchOptions
56− => BrowserType -> o -> Aff Browser
67+ => BrowserType
68+ -> o
69+ -> Aff Browser
57launch =
70launch =
58 affCall "launch" \_ -> launch
71 affCall "launch" \_ -> launch
59
72
60close
73close
61 :: forall x
74 :: forall x
62− . Coercible x (Browser |+| BrowserContext |+| Page)
75+ . Castable x (Browser |+| BrowserContext |+| Page)
76+ => x
63− => x -> Aff Unit
77+ -> Aff Unit
64close =
78close =
65 affCall "close" \_ -> close
79 affCall "close" \_ -> close
66
80
@@ -78,37 +92,42 @@ version =
78
92
79newPage
93newPage
80 :: forall x o
94 :: forall x o
81− . Coercible x (Browser |+| BrowserContext)
95+ . Castable x (Browser |+| BrowserContext)
82− => Coercible o NewpageOptions
96+ => Castable o NewpageOptions
97+ => x
98+ -> o
83− => x -> o -> Aff Page
99+ -> Aff Page
84newPage =
100newPage =
85− affCall "newPage" typeInfo
101+ affCall "newPage" \_ -> newPage
86− where typeInfo _ = newPage
87
102
88goForward
103goForward
89 :: forall o
104 :: forall o
90− . Coercible o GoOptions
105+ . Castable o GoOptions
106+ => Page
107+ -> o
91− => Page -> o -> Aff (Null |+| Response)
108+ -> Aff (Null |+| Response)
92goForward =
109goForward =
93− affCall "goForward" typeInfo
110+ affCall "goForward" \_ -> goForward
94− where typeInfo _ = goForward
95
111
96goBack
112goBack
97 :: forall o
113 :: forall o
98− . Coercible o GoOptions
114+ . Castable o GoOptions
115+ => Page
116+ -> o
99− => Page -> o -> Aff (Null |+| Response)
117+ -> Aff (Null |+| Response)
100−goBack =
118+goBack =
101− affCall "goBack" typeInfo
119+ affCall "goBack" \_ -> goBack
102− where typeInfo _ = goBack
103
120
104goto
121goto
105 :: forall x o
122 :: forall x o
106− . Coercible x (Page |+| Frame)
123+ . Castable x (Page |+| Frame)
107− => Coercible o GotoOptions
124+ => Castable o GotoOptions
125+ => x
126+ -> URL
127+ -> o
108− => x -> URL -> o -> Aff (Null |+| Response)
128+ -> Aff (Null |+| Response)
109goto =
129goto =
110− affCall "goto" typeInfo
130+ affCall "goto" \_ -> goto
111− where typeInfo _ = goto
112
131
113type Cookie =
132type Cookie =
114 { name :: String
133 { name :: String
@@ -125,29 +144,34 @@ addCookies =
125
144
126hover
145hover
127 :: forall x o
146 :: forall x o
128− . Coercible x (Page |+| Frame |+| ElementHandle)
147+ . Castable x (Page |+| Frame |+| ElementHandle)
129− => Coercible o HoverOptions
148+ => Castable o HoverOptions
149+ => x
150+ -> o
130− => x -> o -> Aff Unit
151+ -> Aff Unit
131hover =
152hover =
132 affCall "hover" \_ -> hover
153 affCall "hover" \_ -> hover
133
154
134innerHTML
155innerHTML
135 :: forall x o
156 :: forall x o
136− . Coercible x (Page |+| Frame |+| ElementHandle)
157+ . Castable x (Page |+| Frame)
137− => Coercible o InnerHTMLOptions
158+ => Castable o InnerHTMLOptions
159+ => x
160+ -> Selector
161+ -> o
138− => x -> Selector -> o -> Aff String
162+ -> Aff String
139innerHTML =
163innerHTML =
140 affCall "innerHTML" \_ -> innerHTML
164 affCall "innerHTML" \_ -> innerHTML
141
165
142innerText
166innerText
143 :: forall x o
167 :: forall x o
144− . Coercible o InnerTextOptions
168+ . Castable o InnerTextOptions
145− => Coercible x (Page |+| Frame |+| ElementHandle)
169+ => Castable x (Page |+| Frame |+| ElementHandle)
146 => x
170 => x
147 -> Selector
171 -> Selector
148 -> o
172 -> o
149 -> Aff String
173 -> Aff String
150−innerText =
174+innerText =
151 affCall "innerText" \_ -> innerText
175 affCall "innerText" \_ -> innerText
152
176
153isClosed :: Page -> Effect Boolean
177isClosed :: Page -> Effect Boolean
@@ -165,37 +189,45 @@ name = effCall "name" \_ -> name
165-- | `sth.$(selector)`
189-- | `sth.$(selector)`
166query
190query
167 :: forall x
191 :: forall x
168− . Coercible x (ElementHandle |+| Page |+| Frame)
192+ . Castable x (ElementHandle |+| Page |+| Frame)
193+ => x
194+ -> Selector
169− => x -> Selector -> Aff ElementHandle
195+ -> Aff (Null |+| ElementHandle)
170query =
196query =
171 affCall "$" \_ -> query
197 affCall "$" \_ -> query
172
198
173-- | `sth.$$(selector)`
199-- | `sth.$$(selector)`
174queryMany
200queryMany
175 :: forall x
201 :: forall x
176− . Coercible x (ElementHandle |+| Page |+| Frame)
202+ . Castable x (ElementHandle |+| Page |+| Frame)
203+ => x
204+ -> Selector
177− => x -> Selector -> Aff (Array ElementHandle)
205+ -> Aff (Array ElementHandle)
178queryMany =
206queryMany =
179 affCall "$$" \_ -> queryMany
207 affCall "$$" \_ -> queryMany
180
208
181screenshot
209screenshot
182 :: forall x o
210 :: forall x o
183− . Coercible x (ElementHandle |+| Page)
211+ . Castable x (ElementHandle |+| Page)
184− => Coercible o ScreenshotOptions
212+ => Castable o ScreenshotOptions
213+ => x
214+ -> o
185− => x -> o -> Aff Buffer
215+ -> Aff Buffer
186screenshot =
216screenshot =
187 affCall "screenshot" \_ -> screenshot
217 affCall "screenshot" \_ -> screenshot
188
218
189textContent
219textContent
190 :: forall x
220 :: forall x
191− . Coercible x (Page |+| Frame |+| ElementHandle)
221+ . Castable x (Page |+| Frame |+| ElementHandle)
222+ => x
223+ -> Selector
192− => x -> Selector -> Aff (Null |+| String)
224+ -> Aff (Null |+| String)
193textContent =
225textContent =
194 affCall "textContent" \_ -> textContent
226 affCall "textContent" \_ -> textContent
195
227
196url
228url
197 :: forall x
229 :: forall x
198− . Coercible x (Page |+| Frame |+| Download |+| Request |+| Response |+| Worker)
230+ . Castable x (Page |+| Frame |+| Download |+| Request |+| Response |+| Worker)
199 => x
231 => x
200 -> Effect URL
232 -> Effect URL
201url =
233url =
@@ -203,8 +235,8 @@ url =
203
235
204addInitScript
236addInitScript
205 :: forall x o
237 :: forall x o
206− . Coercible x (Page |+| BrowserContext)
238+ . Castable x (Page |+| BrowserContext)
207− => Coercible o AddInitScriptOptions
239+ => Castable o AddInitScriptOptions
208 => x
240 => x
209 -> o
241 -> o
210 -> Aff Unit
242 -> Aff Unit
@@ -217,8 +249,8 @@ clearCookies =
217
249
218click
250click
219 :: forall x o
251 :: forall x o
220− . Coercible x (Page |+| Frame |+| ElementHandle)
252+ . Castable x (Page |+| Frame)
221− => Coercible o ClickOptions
253+ => Castable o ClickOptions
222 => x
254 => x
223 -> Selector
255 -> Selector
224 -> o
256 -> o
@@ -228,7 +260,7 @@ click =
228
260
229content
261content
230 :: forall x
262 :: forall x
231− . Coercible x (Page |+| Frame)
263+ . Castable x (Page |+| Frame)
232 => x
264 => x
233 -> Aff String
265 -> Aff String
234content =
266content =
@@ -236,8 +268,8 @@ content =
236
268
237dblclick
269dblclick
238 :: forall x o
270 :: forall x o
239− . Coercible x (Page |+| Frame |+| ElementHandle)
271+ . Castable x (Page |+| Frame |+| ElementHandle)
240− => Coercible o ClickOptions
272+ => Castable o ClickOptions
241 => x
273 => x
242 -> Selector
274 -> Selector
243 -> o
275 -> o
@@ -247,7 +279,7 @@ dblclick =
247
279
248evaluate
280evaluate
249 :: forall x
281 :: forall x
250− . Coercible x (Page |+| Frame |+| Worker |+| JSHandle)
282+ . Castable x (Page |+| Frame |+| Worker |+| JSHandle)
251 => x
283 => x
252 -> String
284 -> String
253 -- ^ Function to be evaluated in browser context
285 -- ^ Function to be evaluated in browser context
@@ -257,7 +289,7 @@ evaluate =
257
289
258evaluateHandle
290evaluateHandle
259 :: forall x
291 :: forall x
260− . Coercible x (Page |+| Frame |+| Worker |+| JSHandle)
292+ . Castable x (Page |+| Frame |+| Worker |+| JSHandle)
261 => x
293 => x
262 -> String
294 -> String
263 -- ^ Function to be evaluated in browser context
295 -- ^ Function to be evaluated in browser context
@@ -267,8 +299,8 @@ evaluateHandle =
267
299
268waitForNavigation
300waitForNavigation
269 :: forall x o
301 :: forall x o
270− . Coercible x (Page |+| Frame)
302+ . Castable x (Page |+| Frame)
271− => Coercible o WaitForNavigationOptions
303+ => Castable o WaitForNavigationOptions
272 => x
304 => x
273 -> o
305 -> o
274 -> Aff (Null |+| Response)
306 -> Aff (Null |+| Response)
@@ -277,8 +309,8 @@ waitForNavigation =
277
309
278waitForRequest
310waitForRequest
279 :: forall url o
311 :: forall url o
280− . Coercible url (URL |+| Regex |+| URL -> Boolean)
312+ . Castable url (URL |+| Regex |+| URL -> Boolean)
281− => Coercible o WaitForRequestOptions
313+ => Castable o WaitForRequestOptions
282 => Page
314 => Page
283 -> url
315 -> url
284 -> o
316 -> o
@@ -287,8 +319,8 @@ waitForRequest = affCall "waitForRequest" \_ -> waitForRequest
287
319
288waitForResponse
320waitForResponse
289 :: forall url o
321 :: forall url o
290− . Coercible url (URL |+| Regex |+| URL -> Boolean)
322+ . Castable url (URL |+| Regex |+| URL -> Boolean)
291− => Coercible o WaitForResponseOptions
323+ => Castable o WaitForResponseOptions
292 => Page
324 => Page
293 -> url
325 -> url
294 -> o
326 -> o
@@ -297,10 +329,135 @@ waitForResponse = affCall "waitForResponse" \_ -> waitForResponse
297
329
298waitForSelector
330waitForSelector
299 :: forall x o
331 :: forall x o
300− . Coercible x (Page |+| Frame |+| ElementHandle)
332+ . Castable x (Page |+| Frame |+| ElementHandle)
301− => Coercible o WaitForSelectorOptions
333+ => Castable o WaitForSelectorOptions
302 => x
334 => x
303 -> Selector
335 -> Selector
304 -> o
336 -> o
305 -> Aff (Null |+| ElementHandle)
337 -> Aff (Null |+| ElementHandle)
306waitForSelector = affCall "waitForSelector" \_ -> waitForSelector
338waitForSelector = affCall "waitForSelector" \_ -> waitForSelector
339+
340+waitForFunction
341+ :: forall x o
342+ . Castable x (Page |+| Frame)
343+ => Castable o WaitForFunctionOptions
344+ => x
345+ -> String
346+ -- ^ Function to be evaluated in browser context
347+ -> o
348+ -> Aff JSHandle
349+waitForFunction x s o = waitForFunction' x s (unsafeToForeign undefined) o
350+ where
351+ waitForFunction' = affCall "waitForFunction" \_ -> waitForFunction'
352+
353+waitForLoadState
354+ :: forall x o
355+ . Castable x (Page |+| Frame)
356+ => Castable o WaitForLoadStateOptions
357+ => x
358+ -> WaitUntil
359+ -> o
360+ -> Aff Unit
361+waitForLoadState = affCall "waitForLoadState" \_ -> waitForLoadState
362+
363+waitForTimeout
364+ :: forall x
365+ . Castable x (Page |+| Frame)
366+ => x
367+ -> Int
368+ -> Aff Unit
369+waitForTimeout = affCall "waitForTimeout" \_ -> waitForTimeout
370+
371+pdf
372+ :: forall o
373+ . Castable o PdfOptions
374+ => Page
375+ -> o
376+ -> Aff Buffer
377+pdf = affCall "pdf" \_ -> pdf
378+
379+setInputFiles
380+ :: forall x o f
381+ . Castable x (Page |+| Frame |+| ElementHandle)
382+ => Castable o SetFilesOptions
383+ => Castable f
384+ ( String
385+ |+| Array String
386+ |+|
387+ { name :: String
388+ , mimeType :: String
389+ , buffer :: Buffer
390+ }
391+ |+| Array
392+ { name :: String
393+ , mimeType :: String
394+ , buffer :: Buffer
395+ }
396+ )
397+ => x
398+ -> Selector
399+ -> f
400+ -> o
401+ -> Aff Unit
402+setInputFiles = affCall "setInputFiles" \_ -> setInputFiles
403+
404+setViewportSize
405+ :: Page
406+ -> { width :: Number
407+ , height :: Number
408+ }
409+ -> Aff Unit
410+setViewportSize = affCall "setViewportSize" \_ -> setViewportSize
411+
412+title
413+ :: forall x
414+ . Castable x (Page |+| Frame)
415+ => x
416+ -> Aff String
417+title = 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.pursnew file+61
@@ -0,0 +1,61 @@
1+module Playwright.ConsoleMessage where
2+
3+import Prelude
4+import Playwright.Data (ConsoleMessage, JSHandle, URL)
5+import Effect (Effect)
6+import Playwright.Internal (effCall)
7+import Data.Generic.Rep (class Generic)
8+import Data.Show.Generic (genericShow)
9+import Data.String.Common (toLower)
10+
11+type ConsoleMessageLocation =
12+ { url :: URL
13+ , lineNumber :: Int
14+ , columnNumber :: Int
15+ }
16+
17+data ConsoleMessageType
18+ = Log | Debug | Info | Error | Warning | Dir | Dirxml | Table | Trace | Clear
19+ | StartGroup | StartGroupCollapsed | EndGroup | Assert | Profile | ProfileEnd
20+ | Count | TimeEnd
21+
22+derive instance genericConsoleMessageType :: Generic ConsoleMessageType _
23+derive instance eqConsoleMessageType :: Eq ConsoleMessageType
24+
25+instance showConsoleMessageType :: Show ConsoleMessageType where
26+ show = toLower <<< genericShow
27+
28+args :: ConsoleMessage -> Effect (Array JSHandle)
29+args = effCall "args" \_ -> args
30+
31+location :: ConsoleMessage -> Effect (ConsoleMessageLocation)
32+location = effCall "location" \_ -> location
33+
34+text :: ConsoleMessage -> Effect String
35+text = effCall "text" \_ -> text
36+
37+type' :: ConsoleMessage -> Effect ConsoleMessageType
38+type' = map convert <<< type''
39+ where
40+ type'' :: ConsoleMessage -> Effect String
41+ type'' = effCall "type" \_ -> type''
42+ convert = case _ of
43+ "log" -> Log
44+ "debug" -> Debug
45+ "info" -> Info
46+ "error" -> Error
47+ "warning" -> Warning
48+ "dir" -> Dir
49+ "dirxml" -> Dirxml
50+ "table" -> Table
51+ "trace" -> Trace
52+ "clear" -> Clear
53+ "startGroup" -> StartGroup
54+ "startGroupCollapsed" -> StartGroupCollapsed
55+ "endGroup" -> EndGroup
56+ "assert" -> Assert
57+ "profile" -> Profile
58+ "profileEnd" -> ProfileEnd
59+ "count" -> Count
60+ "timeEnd" -> TimeEnd
61+ _ -> Log -- impossible
src/Playwright/Data.js+24−21
@@ -1,29 +1,32 @@
1/* global require exports */
1/* global require exports */
2−var P = require('playwright');
2+import { chromium as pwChromium, firefox as pwFirefox, webkit as pwWebkit } from 'playwright';
3
3
4−exports.png = "png";
4+export const png = "png";
5−exports.jpg = "jpg";
5+export const jpg = "jpg";
6
6
7−exports.chromium = P.chromium;
7+export const chromium = pwChromium;
8−exports.firefox = P.firefox;
8+export const firefox = pwFirefox;
9−exports.webkit = P.webkit;
9+export const webkit = pwWebkit;
10
10
11−exports.domcontentloaded = "domcontentloaded";
11+export const domcontentloaded = "domcontentloaded";
12−exports.load = "load";
12+export const load = "load";
13−exports.networkidle = "networkidle";
13+export const networkidle = "networkidle";
14
14
15−exports.alt = "Alt";
15+export const alt = "Alt";
16−exports.control = "Control";
16+export const control = "Control";
17−exports.meta = "Meta";
17+export const meta = "Meta";
18−exports.shift = "Shift";
18+export const shift = "Shift";
19
19
20−exports.null = null;
20+const _null = null;
21+export { _null as null };
21
22
22−exports.left = "left";
23+export const left = "left";
23−exports.right = "right";
24+export const right = "right";
24−exports.middle = "middle";
25+export const middle = "middle";
25
26
26−exports.attached = "attached";
27+export const attached = "attached";
27−exports.detached = "detached";
28+export const detached = "detached";
28−exports.visible = "visible";
29+export const visible = "visible";
29−exports.hidden = "hidden";
30+export const hidden = "hidden";
31+
32+export const raf = "raf";
src/Playwright/Data.purs+4
@@ -2,6 +2,7 @@ module Playwright.Data where
2
2
3import Prelude
3import Prelude
4import Untagged.TypeCheck (class HasRuntimeType)
4import Untagged.TypeCheck (class HasRuntimeType)
5+import Foreign (Foreign)
5
6
6foreign import data BrowserType :: Type
7foreign import data BrowserType :: Type
7foreign import data Browser :: Type
8foreign import data Browser :: Type
@@ -63,3 +64,6 @@ foreign import attached :: ElementState
63foreign import detached :: ElementState
64foreign import detached :: ElementState
64foreign import visible :: ElementState
65foreign import visible :: ElementState
65foreign import hidden :: ElementState
66foreign import hidden :: ElementState
67+
68+foreign import data Raf :: Type
69+foreign import raf :: Raf
src/Playwright/Dialog.pursnew file+32
@@ -0,0 +1,32 @@
1+module Playwright.Dialog where
2+
3+import Prelude
4+import Playwright.Internal (affCall, effCall)
5+import Playwright.Data (Dialog)
6+import Effect (Effect)
7+import Effect.Aff (Aff)
8+
9+accept :: Dialog -> String -> Aff Unit
10+accept = affCall "accept" \_ -> accept
11+
12+defaultValue :: Dialog -> Effect String
13+defaultValue = effCall "defaultValue" \_ -> defaultValue
14+
15+dismiss :: Dialog -> Aff Unit
16+dismiss = affCall "dismiss" \_ -> dismiss
17+
18+message :: Dialog -> Effect String
19+message = effCall "message" \_ -> message
20+
21+data DialogType = Alert | Beforeunload | Confirm | Prompt
22+
23+type' :: Dialog -> Effect DialogType
24+type' = map convert <<< type''
25+ where
26+ type'' = effCall "type" \_ -> type''
27+ convert = case _ of
28+ "alert" -> Alert
29+ "beforeunload" -> Beforeunload
30+ "confirm" -> Confirm
31+ "prompt" -> Prompt
32+ _ -> Alert -- impossible
src/Playwright/Download.jsnew file+10
@@ -0,0 +1,10 @@
1+/* global exports */
2+
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.pursnew file+48
@@ -0,0 +1,48 @@
1+module Playwright.Download
2+ ( createReadStream
3+ , suggestedFilename
4+ , saveAs
5+ , path
6+ , url
7+ , failure
8+ , delete
9+ )
10+where
11+
12+import Control.Promise (Promise, toAffE)
13+import Data.Maybe (Maybe(..))
14+import Effect (Effect)
15+import Effect.Aff (Aff)
16+import Literals.Null (Null)
17+import Node.Stream (Readable)
18+import Playwright.Data (Download, URL)
19+import Playwright.Internal (affCall, effCall)
20+import Prelude
21+import Untagged.Union (type (|+|))
22+
23+createReadStream :: Download -> Aff (Maybe (Readable ()))
24+createReadStream = toAffE <<< createReadStream_ Nothing Just
25+
26+foreign import createReadStream_
27+ :: (forall a. Maybe a)
28+ -> (forall a. a -> Maybe a)
29+ -> Download
30+ -> Effect (Promise (Maybe (Readable ())))
31+
32+suggestedFilename :: Download -> Effect String
33+suggestedFilename = effCall "suggestedFilename" \_ -> suggestedFilename
34+
35+saveAs :: Download -> String -> Aff Unit
36+saveAs = affCall "saveAs" \_ -> saveAs
37+
38+path :: Download -> Effect (Null |+| String)
39+path = effCall "path" \_ -> path
40+
41+url :: Download -> Effect URL
42+url = effCall "url" \_ -> url
43+
44+failure :: Download -> Aff (Null |+| String)
45+failure = affCall "failure" \_ -> failure
46+
47+delete :: Download -> Aff Unit
48+delete = affCall "delete" \_ -> delete
src/Playwright/Event.jsnew file+7
@@ -0,0 +1,7 @@
1+/* global exports */
2+
3+export const onForeign = (obj) => (eventName) => (effCallback) => () => {
4+ obj.on(eventName, (argument) => {
5+ effCallback(argument)()
6+ })
7+}
src/Playwright/Event.pursnew file+129
@@ -0,0 +1,129 @@
1+module Playwright.Event
2+where
3+
4+import Type.Proxy (Proxy(..))
5+import Effect (Effect)
6+import Prelude
7+import Playwright.Data (Browser, BrowserContext, ConsoleMessage)
8+import Playwright.Data as Data
9+import Effect.Exception (Error)
10+
11+class Event e where
12+ getEventName :: Proxy e -> String
13+
14+class Event e <= OnEvent x e a | x e -> a
15+
16+-- | Our own `Proxy` for event names.
17+data EventName a = EventName
18+
19+foreign import data Close :: Type
20+instance eventClose :: Event Close where getEventName _ = "close"
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
25+close :: EventName Close
26+close = EventName
27+
28+foreign import data Console :: Type
29+instance eventConsole :: Event Console where getEventName _ = "console"
30+instance eventPageConsole :: OnEvent Data.Page Console ConsoleMessage
31+console :: EventName Console
32+console = EventName
33+
34+foreign import data Crash :: Type
35+instance eventCrash :: Event Crash where getEventName _ = "crash"
36+instance eventPageCrash :: OnEvent Data.Page Crash Unit
37+crash :: EventName Crash
38+crash = EventName
39+
40+foreign import data Dialog :: Type
41+instance eventDialog :: Event Dialog where getEventName _ = "dialog"
42+instance eventPageDialog :: OnEvent Data.Page Dialog Data.Dialog
43+dialog :: EventName Dialog
44+dialog = EventName
45+
46+foreign import data DomContentLoaded :: Type
47+instance eventDomContentLoaded :: Event DomContentLoaded where
48+ getEventName _ = "domcontentloaded"
49+instance eventPageDomContentLoaded :: OnEvent Data.Page DomContentLoaded Unit
50+domcontentloaded :: EventName DomContentLoaded
51+domcontentloaded = EventName
52+
53+foreign import data Download :: Type
54+instance eventDownload :: Event Download where
55+ getEventName _ = "download"
56+instance eventPageDownload :: OnEvent Data.Page Download Data.Download
57+download :: EventName Download
58+download = EventName
59+
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+
120+on
121+ :: forall x e a r
122+ . OnEvent x e a
123+ => EventName e
124+ -> x
125+ -> (a -> Effect r)
126+ -> Effect Unit
127+on event obj callback = onForeign obj (getEventName (Proxy :: Proxy e)) callback
128+
129+foreign import onForeign :: forall x a r. x -> String -> (a -> Effect r) -> Effect Unit
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 @@
18 *
18 *
19 * effectfulGetter('close', 0, identity);
19 * effectfulGetter('close', 0, identity);
20 */
20 */
21−function effectfulGetter (property, argsCount, effectRunnerWrapper) {
21+function effectfulGetter(property, argsCount, effectRunnerWrapper) {
22− var args = [];
22+ return object => {
23− return function (object) {
23+ function collect(args) {
24− function effectRunner () {
24+ if (args.length === argsCount) {
25− return object[property].apply(object, args);
25+ return effectRunnerWrapper(() => object[property].apply(object, args));
26− }
26+ }
27−
27+ return argument => collect([...args, argument]);
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− }
28+ }
43−
44− return chooseNext();
29+ return collect([]);
45− };
30+ };
46}
31}
47
32
48function identity (x) {
33function identity (x) {
49− return x;
34+ return x;
50}
35}
51
36
52−exports.unsafeEffCall = function (method) {
37+export function unsafeEffCall(method) {
53− return function (argsCount) {
54− return effectfulGetter(method, argsCount, identity);
38+ return argsCount => 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− };
39+}
63− };
64−};
65
40
66−exports.effProp = function (prop) {
41+export function unsafeAffCall(toAffE) {
67− return function (object) {
42+ return method => argsCount => effectfulGetter(method, argsCount, toAffE);
68− return function () {
69− return object[prop];
70− };
71− };
72}
43}
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
22else instance numberOfArgsFunction0 :: NumberOfArgs a where
22else instance numberOfArgsFunction0 :: NumberOfArgs a where
23 numberOfArgs _ = 0
23 numberOfArgs _ = 0
24
24
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
36countArgs f = numberOfArgs (proxyOf f) - 2
26countArgs f = numberOfArgs (proxyOf f) - 2
37 where
27 where
38 proxyOf :: forall a. a -> Proxy a
28 proxyOf :: forall a. a -> Proxy a
@@ -51,10 +41,10 @@ foreign import unsafeAffCall
51 -> Int
41 -> Int
52 -> r
42 -> r
53
43
54−effCall :: forall f. NumberOfArgs f => String -> (Unit -> f) -> f
44+effCall :: forall f. NumberOfArgs f => String -> (forall x. x -> f) -> f
55effCall p f = unsafeEffCall p (countArgs f)
45effCall p f = unsafeEffCall p (countArgs f)
56
46
57−affCall :: forall f. NumberOfArgs f => String -> (Unit -> f) -> f
47+affCall :: forall f. NumberOfArgs f => String -> (forall x. x -> f) -> f
58affCall prop f = unsafeAffCall toAffE prop (countArgs f)
48affCall prop f = unsafeAffCall toAffE prop (countArgs f)
59
49
60foreign import effProp :: forall obj r. String -> obj -> Effect r
50foreign 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)
6import Playwright.Options (KeyboardPressOptions)
6import Playwright.Options (KeyboardPressOptions)
7import Effect.Aff (Aff)
7import Effect.Aff (Aff)
8import Control.Promise (toAffE)
8import Control.Promise (toAffE)
9−import Untagged.Coercible (class Coercible, coerce)
9+import Untagged.Castable (class Castable, cast)
10
10
11type Key = String
11type Key = String
12
12
@@ -20,14 +20,14 @@ insertText =
20
20
21press
21press
22 :: forall o
22 :: forall o
23− . Coercible o KeyboardPressOptions
23+ . Castable o KeyboardPressOptions
24 => Keyboard -> Key -> o -> Aff Unit
24 => Keyboard -> Key -> o -> Aff Unit
25press =
25press =
26 affCall "press" \_ -> press
26 affCall "press" \_ -> press
27
27
28type'
28type'
29 :: forall o
29 :: forall o
30− . Coercible o KeyboardPressOptions
30+ . Castable o KeyboardPressOptions
31 => Keyboard -> String -> o -> Aff Unit
31 => Keyboard -> String -> o -> Aff Unit
32type' =
32type' =
33 affCall "type" \_ -> type'
33 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
5import Playwright.Internal
5import Playwright.Internal
6import Playwright.Options
6import Playwright.Options
7import Prelude
7import Prelude
8−import Untagged.Coercible (class Coercible)
8+import Untagged.Castable (class Castable)
9import Untagged.Union
9import Untagged.Union
10
10
11click
11click
@@ -26,7 +26,7 @@ dblclick = affCall "dblclick" \_ -> dblclick
26
26
27down
27down
28 :: forall o
28 :: forall o
29− . Coercible o MouseUpDownOptions
29+ . Castable o MouseUpDownOptions
30 => Mouse
30 => Mouse
31 -> o
31 -> o
32 -> Aff Unit
32 -> Aff Unit
@@ -34,7 +34,7 @@ down = affCall "down" \_ -> down
34
34
35move
35move
36 :: forall o
36 :: forall o
37− . Coercible o MouseMoveOptions
37+ . Castable o MouseMoveOptions
38 => Mouse
38 => Mouse
39 -> o
39 -> o
40 -> Aff Unit
40 -> Aff Unit
@@ -42,7 +42,7 @@ move = affCall "move" \_ -> move
42
42
43up
43up
44 :: forall o
44 :: forall o
45− . Coercible o MouseUpDownOptions
45+ . Castable o MouseUpDownOptions
46 => Mouse
46 => Mouse
47 -> o
47 -> o
48 -> Aff Unit
48 -> Aff Unit
src/Playwright/Options.purs+110−47
@@ -3,6 +3,7 @@ module Playwright.Options where
3import Playwright.Data
3import Playwright.Data
4
4
5import Data.String.Regex (Regex)
5import Data.String.Regex (Regex)
6+import Data.Time.Duration (Milliseconds(..))
6import Foreign (Foreign)
7import Foreign (Foreign)
7import Foreign.Object (Object)
8import Foreign.Object (Object)
8import Literals.Null (Null)
9import Literals.Null (Null)
@@ -11,68 +12,69 @@ import Untagged.Union (UndefinedOr, type (|+|))
11type Opt a = UndefinedOr a
12type Opt a = UndefinedOr a
12
13
13type LaunchOptions =
14type LaunchOptions =
14− { headless :: Opt Boolean
15+ { headless :: Opt Boolean
15− , executablePath :: Opt String
16+ , executablePath :: Opt String
16− , args :: Opt String
17+ , args :: Opt (Array String)
17 , ignoreDefaultArgs :: Opt (Array String)
18 , ignoreDefaultArgs :: Opt (Array String)
18− , proxy :: Opt ProxyOptions
19+ , proxy :: Opt ProxyOptions
19− , downloadsPath :: Opt String
20+ , downloadsPath :: Opt String
20− , chromiumSandbox :: Opt Boolean
21+ , chromiumSandbox :: Opt Boolean
21− , firefoxUserPrefs :: Opt Foreign
22+ , firefoxUserPrefs :: Opt Foreign
22− , handleSIGINT :: Opt Boolean
23+ , handleSIGINT :: Opt Boolean
23− , handleSIGTERM :: Opt Boolean
24+ , handleSIGTERM :: Opt Boolean
24− , handleSIGHUP :: Opt Boolean
25+ , handleSIGHUP :: Opt Boolean
25− , timeout :: Opt Number
26+ , timeout :: Opt Milliseconds
26− , env :: Opt (Object String)
27+ , env :: Opt (Object String)
27− , devtools :: Opt Boolean
28+ , devtools :: Opt Boolean
28− , slowMo :: Opt Number
29+ , slowMo :: Opt Number
29 }
30 }
30
31
31type ProxyOptions =
32type ProxyOptions =
32− { server :: Opt String
33+ { server :: Opt String
33− , bypass :: Opt String
34+ , bypass :: Opt String
34 , username :: Opt String
35 , username :: Opt String
35 , password :: Opt String
36 , password :: Opt String
36 }
37 }
37
38
38type ScreenshotOptions =
39type ScreenshotOptions =
39− { path :: Opt String
40+ { path :: Opt String
40− , "type" :: Opt ScreenshotType
41+ , "type" :: Opt ScreenshotType
41− , quality :: Opt Number
42+ , quality :: Opt Number
42 , omitBackground :: Opt Boolean
43 , omitBackground :: Opt Boolean
44+ , fullPage :: Opt Boolean
43− , timeout :: Opt Number
45+ , timeout :: Opt Milliseconds
44 }
46 }
45
47
46type GotoOptions =
48type GotoOptions =
47− { timeout :: Opt Int
49+ { timeout :: Opt Milliseconds
48 , waitUntil :: Opt WaitUntil
50 , waitUntil :: Opt WaitUntil
49− , referer :: Opt String
51+ , referer :: Opt String
50 }
52 }
51
53
52type NewpageOptions =
54type NewpageOptions =
53− { acceptDownloads :: Opt Boolean
55+ { acceptDownloads :: Opt Boolean
54 , ignoreHTTPSErrors :: Opt Boolean
56 , ignoreHTTPSErrors :: Opt Boolean
55− , bypassCSP :: Opt Boolean
57+ , bypassCSP :: Opt Boolean
56− , viewport :: Opt (Null |+| { width :: Int, height :: Int })
58+ , viewport :: Opt (Null |+| { width :: Int, height :: Int })
57 }
59 }
58
60
59type GoOptions =
61type GoOptions =
60− { timeout :: Opt Int
62+ { timeout :: Opt Milliseconds
61 , waitUntil :: Opt WaitUntil
63 , waitUntil :: Opt WaitUntil
62 }
64 }
63
65
64type HoverOptions =
66type HoverOptions =
65 { position :: Opt Position
67 { position :: Opt Position
66 , modifier :: Opt (Array Modifier)
68 , modifier :: Opt (Array Modifier)
67− , force :: Opt Boolean
69+ , force :: Opt Boolean
68 }
70 }
69
71
70type InnerHTMLOptions =
72type InnerHTMLOptions =
71− { timeout :: Opt Number
73+ { timeout :: Opt Milliseconds
72 }
74 }
73
75
74type InnerTextOptions =
76type InnerTextOptions =
75− { timeout :: Opt Number
77+ { timeout :: Opt Milliseconds
76 }
78 }
77
79
78type KeyboardPressOptions =
80type KeyboardPressOptions =
@@ -85,29 +87,29 @@ type AddInitScriptOptions =
85type Position = { x :: Int, y :: Int }
87type Position = { x :: Int, y :: Int }
86
88
87type ClickOptions =
89type ClickOptions =
88− { button :: Opt MouseButton
90+ { button :: Opt MouseButton
89− , clickCount :: Opt Int
91+ , clickCount :: Opt Int
90− , delay :: Opt Int
92+ , delay :: Opt Int
91− , position :: Opt Position
93+ , position :: Opt Position
92− , modifiers :: Opt (Array Modifier)
94+ , modifiers :: Opt (Array Modifier)
93− , force :: Opt Boolean
95+ , force :: Opt Boolean
94 , noWaitAfter :: Opt Boolean
96 , noWaitAfter :: Opt Boolean
95− , timeout :: Opt Int
97+ , timeout :: Opt Milliseconds
96 }
98 }
97
99
98type MouseClickOptions =
100type MouseClickOptions =
99− { button :: Opt MouseButton
101+ { button :: Opt MouseButton
100 , clickCount :: Opt Int
102 , clickCount :: Opt Int
101− , delay :: Opt Int
103+ , delay :: Opt Int
102 }
104 }
103
105
104type MouseDblClickOptions =
106type MouseDblClickOptions =
105− { button :: Opt MouseButton
107+ { button :: Opt MouseButton
106− , delay :: Opt Int
108+ , delay :: Opt Int
107 }
109 }
108
110
109type MouseUpDownOptions =
111type MouseUpDownOptions =
110− { button :: Opt MouseButton
112+ { button :: Opt MouseButton
111 , clickCount :: Opt Int
113 , clickCount :: Opt Int
112 }
114 }
113
115
@@ -116,20 +118,81 @@ type MouseMoveOptions =
116 }
118 }
117
119
118type WaitForNavigationOptions =
120type WaitForNavigationOptions =
119− { timeout :: Opt Int
121+ { timeout :: Opt Milliseconds
120− , url :: Opt (String |+| Regex |+| URL -> Boolean)
122+ , url :: Opt (String |+| Regex |+| URL -> Boolean)
121 , waitUntil :: Opt WaitUntil
123 , waitUntil :: Opt WaitUntil
122 }
124 }
123
125
124type WaitForRequestOptions =
126type WaitForRequestOptions =
125− { timeout :: Opt Int
127+ { timeout :: Opt Milliseconds
126 }
128 }
127
129
128type WaitForResponseOptions =
130type WaitForResponseOptions =
129− { timeout :: Opt Int
131+ { timeout :: Opt Milliseconds
130 }
132 }
131
133
132type WaitForSelectorOptions =
134type WaitForSelectorOptions =
133− { state :: Opt ElementState
135+ { state :: Opt ElementState
134− , timeout :: Opt Int
136+ , timeout :: Opt Milliseconds
137+ }
138+
139+type WaitForFunctionOptions =
140+ { polling :: Opt (Int |+| Raf)
141+ , timeout :: Opt Milliseconds
142+ }
143+
144+type WaitForLoadStateOptions =
145+ { timeout :: Opt Milliseconds
146+ }
147+
148+type Margin =
149+ { top :: Opt (String |+| Number)
150+ , right :: Opt (String |+| Number)
151+ , bottom :: Opt (String |+| Number)
152+ , left :: Opt (String |+| Number)
153+ }
154+
155+type PdfOptions =
156+ { path :: String
157+ , scale :: Opt Number
158+ , displayHeaderFooter :: Opt Boolean
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 =
172+ { noWaitAfter :: Opt Boolean
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
135 }
198 }
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
2
15
3−import Playwright.Data
16+import Control.Promise (Promise, toAffE)
4−import Playwright.Internal
17+import Data.Argonaut.Core (Json)
18+import Data.Maybe (Maybe(..))
19+import Effect (Effect)
5import Effect.Aff (Aff)
20import Effect.Aff (Aff)
6−import Node.Buffer (Buffer)
7import Effect.Exception (Error)
21import Effect.Exception (Error)
8−import Effect (Effect)
22+import Foreign.Object (Object)
9−import Untagged.Union
23+import Node.Buffer (Buffer)
10−import Literals.Null
24+import Playwright.Data (Frame, Request, Response)
25+import Playwright.Internal (affCall, effCall)
26+import Prelude
11
27
12body :: Response -> Aff Buffer
28body :: Response -> Aff Buffer
13−body = affCall "body" typeInfo
29+body = affCall "body" \_ -> body
14− where typeInfo _ = body
15
30
16−finished :: Response -> Aff (Null |+| Error)
31+finished :: Response -> Aff (Maybe Error)
17−finished = affCall "finished" typeInfo
32+finished = toAffE <<< finished_ Nothing Just
18− where typeInfo _ = finished
33+
34+foreign import finished_
35+ :: (forall a. Maybe a)
36+ -> (forall a. a -> Maybe a)
37+ -> Response
38+ -> Effect (Promise (Maybe Error))
19
39
20frame :: Response -> Effect Frame
40frame :: Response -> Effect Frame
21−frame = effCall "frame" typeInfo
41+frame = effCall "frame" \_ -> frame
22− where typeInfo _ = 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+120−65
@@ -1,73 +1,128 @@
1module Test.Main where
1module Test.Main where
2
2
3import Prelude
3import Prelude
4−import Playwright
4+
5+import Control.Monad.Error.Class (throwError)
6+import Control.Monad.Except (runExcept)
7+import Data.Either (Either(..), isLeft)
5import Effect (Effect)
8import Effect (Effect)
6−import Test.Unit (suite, test)
7−import Test.Unit.Main (runTest)
8−import Untagged.Union (fromOneOf)
9−import Test.Unit.Assert as Assert
10−import Data.Maybe (Maybe(..))
11−import Node.FS.Aff as FS
12−import Effect.Aff (Aff)
9+import Effect.Aff (Aff, bracket, try)
13import Effect.Class (liftEffect)
10import Effect.Class (liftEffect)
14−import TestUtils
11+import Effect.Exception (error)
15−import Data.Either
12+import Foreign (readBoolean, readInt, unsafeToForeign)
16−import Control.Monad.Error.Class
13+import Playwright as Playwright
14+import Playwright.Locator as Locator
15+import Playwright.Test (test)
16+
17+assert :: String -> Boolean -> Aff Unit
18+assert message condition = unless condition $ throwError $ error message
17
19
18−static :: String -> URL
20+assertBrowser :: Playwright.Page -> String -> Aff Unit
19−static file =
21+assertBrowser page expression = do
20− URL $ "file://" <> cwd <> "/test/static/" <> file
22+ result <- Playwright.evaluate page expression
23+ assert expression $ runExcept (readBoolean result) == Right true
21
24
22main :: Effect Unit
25main :: Effect Unit
23−main = runTest do
26+main = do
24− let
27+ test "method applications isolate arguments across pages and reusable prefixes" \first ->
25− hello = static "hello.html"
28+ bracket (Playwright.launch Playwright.chromium { args: [] :: Array String }) Playwright.close \browser -> do
26− index = static "index.html"
29+ second <- Playwright.newPage browser {}
27− suite "browser" do
30+ let
28− test "launch, close" do
31+ firstURL = Playwright.URL "data:text/html,<title>First</title><button onclick=\"document.title='Clicked'\">Apply</button>"
29− browser <- launch chromium {}
32+ secondURL = Playwright.URL "data:text/html,<title>Second</title><button onclick=\"document.title='Changed'\">Apply</button>"
30− close browser
33+ navigateFirst = Playwright.goto first
31− test "close/isClosed" do
34+ firstDestination = navigateFirst firstURL
32− withBrowserPage hello
35+ firstNavigation = firstDestination {}
33− \page -> do
36+ navigateSecond = Playwright.goto second
34− Assert.assertFalse "new page is closed" =<<
37+ void firstNavigation
35− liftEffect (isClosed page)
38+ void $ navigateSecond secondURL {}
36− close page
39+ assert "first page receiver" =<< (eq "First" <$> Playwright.title first)
37− Assert.assert "page is not closed" =<< liftEffect (isClosed page)
40+ assert "second page receiver" =<< (eq "Second" <$> Playwright.title second)
38− test "version" do
41+ void $ navigateFirst secondURL {}
39− withBrowser
42+ assert "reused receiver prefix takes new arguments" =<< (eq "Second" <$> Playwright.title first)
40− \browser -> do
43+ void $ firstDestination {}
41− v <- liftEffect $ version browser
44+ assert "reused destination prefix retains its arguments" =<< (eq "First" <$> Playwright.title first)
42− Assert.assert "version is empty" (v /= "")
45+ let
43− test "url" do
46+ findFirst = Locator.locator first
44− withBrowserPage hello
47+ findSecond = Locator.locator second
45− \page -> do
48+ findButton = Locator.getByRole first "button"
46− Assert.equal hello =<< liftEffect (url page)
49+ firstButton <- liftEffect $ findFirst (Playwright.Selector "button")
47− test "screenshot" do
50+ secondButton <- liftEffect $ findSecond (Playwright.Selector "button")
48− withBrowserPage hello
51+ firstAgain <- liftEffect $ findFirst (Playwright.Selector "text=Apply")
49− \page -> do
52+ byRole <- liftEffect $ findButton { name: "Apply", exact: true }
50− void $ screenshot page { path: "screenshot.png" }
53+ byRoleAgain <- liftEffect $ findButton { name: "Apply", exact: false }
51− FS.unlink "screenshot.png"
54+ Locator.click firstButton {}
52− test "textContent" do
55+ Locator.click secondButton {}
53− withBrowserPage hello
56+ Locator.click firstAgain {}
54− \page -> do
57+ Locator.click byRole {}
55− text <- textContent page (Selector "body")
58+ Locator.click byRoleAgain {}
56− Assert.equal (Just "hello\n") (fromOneOf text)
59+ assert "locator keeps first receiver" =<< (eq "Clicked" <$> Playwright.title first)
57− test "mainFrame" do
60+ assert "locator keeps second receiver" =<< (eq "Changed" <$> Playwright.title second)
58− withBrowserPage hello
61+ void firstNavigation
59− \page -> do
62+ assert "repeated completed Aff retains its arguments" =<< (eq "First" <$> Playwright.title first)
60− frame <- liftEffect $ mainFrame page
63+ assert "Effect method keeps first receiver" =<< (eq firstURL <$> liftEffect (Playwright.url first))
61− frameName <- liftEffect $ name frame
64+ assert "Effect method keeps second receiver" =<< (eq secondURL <$> liftEffect (Playwright.url second))
62− Assert.equal "" frameName
65+
63− test "click" do
66+ test "native properties and events remain separately ordered locator actions" \page -> do
64− withBrowserPage index $ testClickEvent "click" click
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>") {}
65− test "dblclick" do
68+ void $ Playwright.evaluate page
66− withBrowserPage index $ testClickEvent "dblclick" dblclick
69+ """
67− test "waitForSelector" do
70+ (() => {
68− withBrowserPage hello
71+ const input = document.querySelector('#text');
69− \page -> do
72+ globalThis.events = [];
70− void $ waitForSelector page (Selector "body") {}
73+ Object.defineProperty(input, 'value', {
71− res <- try $ waitForSelector page (Selector "nonexistent") { timeout: 100 }
74+ get() { return Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').get.call(this); },
72− Assert.assert "waitForSelector fails when no element" $
75+ set() { throw new Error('own setter must not run'); }
73− isLeft res
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−3
@@ -1,3 +0,0 @@
1−/* global exports __dirname */
2−
3−exports.cwd = process.cwd();
test/TestUtils.pursdeleted−43
@@ -1,43 +0,0 @@
1−module TestUtils where
2−
3−import Test.Unit.Assert as Assert
4−import Foreign
5−import Control.Monad.Except
6−import Data.Either
7−import Effect.Aff
8−import Prelude
9−import Playwright
10−import Control.Monad.Error.Class (withResource)
11−
12−assertForeignTrue :: Foreign -> Aff Unit
13−assertForeignTrue value = do
14− let
15− eiBool = runExcept $ readBoolean value
16− Assert.assert "Foreign value is boolean true" (eiBool == Right true)
17−
18−withBrowser :: forall a. (Browser -> Aff a) -> Aff a
19−withBrowser = withResource acquire release
20− where
21− acquire = launch chromium {}
22− release = close
23−
24−withBrowserPage :: forall a. URL -> (Page -> Aff a) -> Aff a
25−withBrowserPage url action = do
26− withBrowser
27− \browser -> do
28− let
29− acquire = newPage browser {}
30− release = close
31− withResource acquire release
32− \page -> do
33− void $ goto page url {}
34− action page
35−
36−testClickEvent :: String -> (Page -> Selector -> {} -> Aff Unit) -> Page -> Aff Unit
37−testClickEvent event action page = do
38− void $ evaluate page ("setEventTester('" <> event <> "');")
39− action page (Selector $ "#event-" <> event) {}
40− result <- evaluate page $ "checkEventHappened('" <> event <> "');"
41− assertForeignTrue result
42−
43−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();