git.iko.soy/rowtype-yoga/purescript-yoga-om
on main help sign in
11 files changed+1608−171
since splitsnapshots
unifiedsplit
bun.lock+563 package.json+7−4 spago.lock+95−99 spago.yaml+19−18 src/Test/Main.purs−12 src/Yoga/Om.purs+207−7 src/Yoga/Om.test.purs−31 src/Yoga/Om/Ref.purs+39 src/Yoga/Om/Retry.purs+61 test/Test/Main.js+3 test/Test/Main.purs+614
bun.locknew file+563
@@ -0,0 +1,563 @@
1+{
2+ "lockfileVersion": 1,
3+ "workspaces": {
4+ "": {
5+ "name": "purescript-yoga-om-core",
6+ "devDependencies": {
7+ "purescript": "^0.15.15",
8+ "spago": "^1.0.3",
9+ },
10+ },
11+ },
12+ "packages": {
13+ "@gar/promisify": ["@gar/promisify@1.1.3", "", {}, "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="],
14+
15+ "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="],
16+
17+ "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.1", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ=="],
18+
19+ "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
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+ "@tootallnate/once": ["@tootallnate/once@2.0.0", "", {}, "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="],
34+
35+ "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="],
36+
37+ "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="],
38+
39+ "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="],
40+
41+ "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="],
42+
43+ "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
44+
45+ "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="],
46+
47+ "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="],
48+
49+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
50+
51+ "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="],
52+
53+ "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="],
54+
55+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
56+
57+ "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="],
58+
59+ "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="],
60+
61+ "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
62+
63+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
64+
65+ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
66+
67+ "buildcheck": ["buildcheck@0.0.7", "", {}, "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA=="],
68+
69+ "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
70+
71+ "byline": ["byline@5.0.0", "", {}, "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q=="],
72+
73+ "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=="],
74+
75+ "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=="],
76+
77+ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
78+
79+ "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="],
80+
81+ "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="],
82+
83+ "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
84+
85+ "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
86+
87+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
88+
89+ "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=="],
90+
91+ "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=="],
92+
93+ "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="],
94+
95+ "cpu-features": ["cpu-features@0.0.10", "", { "dependencies": { "buildcheck": "~0.0.6", "nan": "^2.19.0" } }, "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA=="],
96+
97+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
98+
99+ "cyclist": ["cyclist@1.0.2", "", {}, "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA=="],
100+
101+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
102+
103+ "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="],
104+
105+ "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
106+
107+ "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
108+
109+ "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=="],
110+
111+ "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
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.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
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.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="],
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+ "fuse.js": ["fuse.js@7.1.0", "", {}, "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="],
152+
153+ "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
154+
155+ "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=="],
156+
157+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
158+
159+ "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="],
160+
161+ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
162+
163+ "http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="],
164+
165+ "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="],
166+
167+ "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="],
168+
169+ "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
170+
171+ "iferr": ["iferr@0.1.5", "", {}, "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA=="],
172+
173+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
174+
175+ "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="],
176+
177+ "infer-owner": ["infer-owner@1.0.4", "", {}, "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="],
178+
179+ "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="],
180+
181+ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
182+
183+ "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="],
184+
185+ "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
186+
187+ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
188+
189+ "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=="],
190+
191+ "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="],
192+
193+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
194+
195+ "is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="],
196+
197+ "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
198+
199+ "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
200+
201+ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
202+
203+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
204+
205+ "jackspeak": ["jackspeak@4.1.1", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" } }, "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ=="],
206+
207+ "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
208+
209+ "linkify-it": ["linkify-it@5.0.0", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ=="],
210+
211+ "log-symbols": ["log-symbols@3.0.0", "", { "dependencies": { "chalk": "^2.4.2" } }, "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ=="],
212+
213+ "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=="],
214+
215+ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
216+
217+ "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=="],
218+
219+ "markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="],
220+
221+ "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="],
222+
223+ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
224+
225+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
226+
227+ "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
228+
229+ "minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],
230+
231+ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
232+
233+ "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
234+
235+ "minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="],
236+
237+ "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=="],
238+
239+ "minipass-flush": ["minipass-flush@1.0.5", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="],
240+
241+ "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="],
242+
243+ "minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="],
244+
245+ "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="],
246+
247+ "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=="],
248+
249+ "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="],
250+
251+ "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=="],
252+
253+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
254+
255+ "nan": ["nan@2.25.0", "", {}, "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g=="],
256+
257+ "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="],
258+
259+ "npm-run-path": ["npm-run-path@3.1.0", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg=="],
260+
261+ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
262+
263+ "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
264+
265+ "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=="],
266+
267+ "p-finally": ["p-finally@2.0.1", "", {}, "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw=="],
268+
269+ "p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="],
270+
271+ "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
272+
273+ "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=="],
274+
275+ "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="],
276+
277+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
278+
279+ "path-scurry": ["path-scurry@2.0.1", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA=="],
280+
281+ "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
282+
283+ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
284+
285+ "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="],
286+
287+ "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="],
288+
289+ "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="],
290+
291+ "pumpify": ["pumpify@1.5.1", "", { "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" } }, "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ=="],
292+
293+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
294+
295+ "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
296+
297+ "purescript": ["purescript@0.15.15", "", { "dependencies": { "purescript-installer": "^0.3.5" }, "bin": { "purs": "purs.bin" } }, "sha512-4gwLNJa4KRiV+Wl+lyMY4MUFM6cSnIqvz7MvSTdLdvXJN2P9CrABnNbSspaokkNRFd9soWHBFDlYsAtRchqHtg=="],
298+
299+ "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=="],
300+
301+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
302+
303+ "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=="],
304+
305+ "readline-sync": ["readline-sync@1.4.10", "", {}, "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="],
306+
307+ "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="],
308+
309+ "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
310+
311+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
312+
313+ "rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="],
314+
315+ "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
316+
317+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
318+
319+ "run-queue": ["run-queue@1.0.3", "", { "dependencies": { "aproba": "^1.1.1" } }, "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg=="],
320+
321+ "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
322+
323+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
324+
325+ "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
326+
327+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
328+
329+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
330+
331+ "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
332+
333+ "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=="],
334+
335+ "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
336+
337+ "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="],
338+
339+ "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=="],
340+
341+ "spago": ["spago@1.0.3", "", { "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-3JR6ExwLwaKIMYdc77e6fKqiBKXNentyVkcfhaQx4tGDnWjfHS2Td+zxJZ/28QaBx8s6RXfgFD1VjbALGtM89g=="],
342+
343+ "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
344+
345+ "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=="],
346+
347+ "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="],
348+
349+ "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=="],
350+
351+ "ssri": ["ssri@6.0.2", "", { "dependencies": { "figgy-pudding": "^3.5.1" } }, "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q=="],
352+
353+ "stream-each": ["stream-each@1.2.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" } }, "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw=="],
354+
355+ "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="],
356+
357+ "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=="],
358+
359+ "string-width-cjs": ["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=="],
360+
361+ "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
362+
363+ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
364+
365+ "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
366+
367+ "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
368+
369+ "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
370+
371+ "tar": ["tar@7.5.7", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ=="],
372+
373+ "through2": ["through2@2.0.5", "", { "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="],
374+
375+ "tmp": ["tmp@0.2.5", "", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="],
376+
377+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
378+
379+ "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="],
380+
381+ "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="],
382+
383+ "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="],
384+
385+ "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
386+
387+ "unique-filename": ["unique-filename@1.1.1", "", { "dependencies": { "unique-slug": "^2.0.0" } }, "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="],
388+
389+ "unique-slug": ["unique-slug@2.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w=="],
390+
391+ "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
392+
393+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
394+
395+ "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="],
396+
397+ "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=="],
398+
399+ "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
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.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="],
414+
415+ "zen-observable": ["zen-observable@0.8.15", "", {}, "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="],
416+
417+ "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
418+
419+ "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
420+
421+ "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
422+
423+ "@npmcli/move-file/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
424+
425+ "@npmcli/move-file/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="],
426+
427+ "cacache/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="],
428+
429+ "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=="],
430+
431+ "chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="],
432+
433+ "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
434+
435+ "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
436+
437+ "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
438+
439+ "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
440+
441+ "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=="],
442+
443+ "make-fetch-happen/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
444+
445+ "make-fetch-happen/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
446+
447+ "make-fetch-happen/ssri": ["ssri@9.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q=="],
448+
449+ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
450+
451+ "minipass-collect/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
452+
453+ "minipass-fetch/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
454+
455+ "minipass-fetch/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
456+
457+ "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
458+
459+ "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
460+
461+ "minipass-sized/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
462+
463+ "path-scurry/lru-cache": ["lru-cache@11.2.5", "", {}, "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw=="],
464+
465+ "pumpify/pump": ["pump@2.0.1", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA=="],
466+
467+ "purescript-installer/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
468+
469+ "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=="],
470+
471+ "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+ "slice-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
474+
475+ "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
476+
477+ "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
478+
479+ "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
480+
481+ "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
482+
483+ "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
484+
485+ "@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=="],
486+
487+ "cacache/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
488+
489+ "fs-minipass/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
490+
491+ "make-fetch-happen/cacache/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
492+
493+ "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=="],
494+
495+ "make-fetch-happen/cacache/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
496+
497+ "make-fetch-happen/cacache/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="],
498+
499+ "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=="],
500+
501+ "make-fetch-happen/cacache/unique-filename": ["unique-filename@2.0.1", "", { "dependencies": { "unique-slug": "^3.0.0" } }, "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A=="],
502+
503+ "make-fetch-happen/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
504+
505+ "minipass-collect/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
506+
507+ "minipass-fetch/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
508+
509+ "minipass-fetch/minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
510+
511+ "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
512+
513+ "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
514+
515+ "minipass-sized/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
516+
517+ "purescript-installer/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
518+
519+ "purescript-installer/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
520+
521+ "purescript-installer/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
522+
523+ "purescript-installer/tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
524+
525+ "purescript-installer/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
526+
527+ "rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
528+
529+ "slice-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
530+
531+ "wrap-ansi-cjs/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
532+
533+ "wrap-ansi/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
534+
535+ "@npmcli/move-file/rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
536+
537+ "make-fetch-happen/cacache/glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="],
538+
539+ "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=="],
540+
541+ "make-fetch-happen/cacache/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="],
542+
543+ "make-fetch-happen/cacache/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
544+
545+ "make-fetch-happen/cacache/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
546+
547+ "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=="],
548+
549+ "purescript-installer/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
550+
551+ "slice-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
552+
553+ "wrap-ansi-cjs/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
554+
555+ "wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
556+
557+ "make-fetch-happen/cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
558+
559+ "make-fetch-happen/cacache/rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
560+
561+ "make-fetch-happen/cacache/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
562+ }
563+}
package.json+7−4
@@ -1,11 +1,14 @@
11{
2− "name": "purescript-yoga-om-core",
2+ "name": "purescript-yoga-om",
33 "version": "1.0.0",
4− "description": "Core Om types and operations for writing applications with dependency injection and checked exceptions",
4+ "description": "Om types and operations for writing applications with dependency injection and checked exceptions",
55 "license": "MIT",
66 "repository": {
77 "type": "git",
8− "url": "https://github.com/rowtype-yoga/purescript-yoga-om.git",
9− "directory": "packages/yoga-om-core"
8+ "url": "https://github.com/rowtype-yoga/purescript-yoga-om.git"
9+ },
10+ "devDependencies": {
11+ "purescript": "^0.15.15",
12+ "spago": "^1.0.3"
1013 }
1114}
spago.lock+95−99
@@ -6,32 +6,38 @@
66 "core": {
77 "dependencies": [
88 {
9− "aff": ">=7.0.0 <8.0.0"
9+ "aff": ">=8.0.0 <9.0.0"
1010 },
1111 {
12− "avar": ">=5.0.0 <6.0.0"
12+ "aff-retry": ">=2.0.0 <3.0.0"
1313 },
1414 {
15− "console": ">=6.0.0 <7.0.0"
15+ "avar": ">=5.0.1 <6.0.0"
16+ },
17+ {
18+ "console": ">=6.1.0 <7.0.0"
1619 },
1720 {
1821 "control": ">=6.0.0 <7.0.0"
1922 },
2023 {
21− "datetime": ">=6.0.0 <7.0.0"
24+ "datetime": ">=6.1.0 <7.0.0"
2225 },
2326 {
2427 "effect": ">=4.0.0 <5.0.0"
2528 },
2629 {
27− "either": ">=6.0.0 <7.0.0"
30+ "either": ">=6.1.0 <7.0.0"
2831 },
2932 {
30− "exceptions": ">=6.0.0 <7.0.0"
33+ "exceptions": ">=6.1.0 <7.0.0"
3134 },
3235 {
3336 "functions": ">=6.0.0 <7.0.0"
3437 },
38+ {
39+ "heterogeneous": ">=0.7.0 <0.8.0"
40+ },
3541 {
3642 "maybe": ">=6.0.0 <7.0.0"
3743 },
@@ -39,28 +45,25 @@
3945 "newtype": ">=5.0.0 <6.0.0"
4046 },
4147 {
42− "parallel": ">=6.0.0 <8.0.0"
48+ "parallel": ">=7.0.0 <8.0.0"
4349 },
4450 {
45− "prelude": ">=6.0.0 <7.0.0"
51+ "prelude": ">=6.0.2 <7.0.0"
4652 },
4753 {
4854 "record": ">=4.0.0 <5.0.0"
4955 },
5056 {
51− "record-studio": ">=1.0.0 <2.0.0"
52− },
53− {
54− "spec": ">=7.0.0 <8.0.0"
57+ "record-studio": ">=1.0.4 <2.0.0"
5558 },
5659 {
57− "st": ">=6.0.0 <7.0.0"
60+ "refs": ">=6.0.0 <7.0.0"
5861 },
5962 {
60− "tailrec": ">=6.0.0 <7.0.0"
63+ "tailrec": ">=6.1.0 <7.0.0"
6164 },
6265 {
63− "transformers": ">=6.0.0 <7.0.0"
66+ "transformers": ">=6.1.0 <7.0.0"
6467 },
6568 {
6669 "tuples": ">=7.0.0 <8.0.0"
@@ -69,7 +72,7 @@
6972 "typelevel-prelude": ">=7.0.0 <8.0.0"
7073 },
7174 {
72− "uncurried-transformers": ">=1.0.0 <2.0.0"
75+ "uncurried-transformers": ">=1.1.0 <2.0.0"
7376 },
7477 {
7578 "unsafe-coerce": ">=6.0.0 <7.0.0"
@@ -77,75 +80,17 @@
7780 {
7881 "variant": ">=8.0.0 <9.0.0"
7982 }
80− ],
81− "build_plan": [
82− "aff",
83− "ansi",
84− "arrays",
85− "avar",
86− "bifunctors",
87− "catenable-lists",
88− "console",
89− "const",
90− "contravariant",
91− "control",
92− "datetime",
93− "distributive",
94− "effect",
95− "either",
96− "enums",
97− "exceptions",
98− "exists",
99− "foldable-traversable",
100− "fork",
101− "free",
102− "functions",
103− "functors",
104− "gen",
105− "heterogeneous",
106− "identity",
107− "integers",
108− "invariant",
109− "lazy",
110− "lists",
111− "maybe",
112− "mmorph",
113− "newtype",
114− "nonempty",
115− "now",
116− "numbers",
117− "ordered-collections",
118− "orders",
119− "parallel",
120− "partial",
121− "pipes",
122− "prelude",
123− "profunctor",
124− "record",
125− "record-studio",
126− "refs",
127− "safe-coerce",
128− "spec",
129− "st",
130− "strings",
131− "tailrec",
132− "transformers",
133− "tuples",
134− "type-equality",
135− "typelevel-prelude",
136− "uncurried-transformers",
137− "unfoldable",
138− "unsafe-coerce",
139− "variant"
14083 ]
14184 },
14285 "test": {
14386 "dependencies": [
14487 {
145− "spec": ">=7.0.0 <8.0.0"
88+ "refs": ">=6.0.0 <7.0.0"
89+ },
90+ {
91+ "spec": ">=7.0.0 <9.0.0"
14692 }
147− ],
148− "build_plan": []
93+ ]
14994 }
15095 }
15196 },
@@ -154,28 +99,45 @@
15499 "packages": {
155100 "aff": {
156101 "type": "registry",
157− "version": "7.1.0",
158− "integrity": "sha256-/nOpDQVnKIoP1pQ1ZZBYpadK0TuMlG4WwufGzJpsfD0=",
102+ "version": "8.0.0",
103+ "integrity": "sha256-9BRIrSdRoYybfiUmBqgKJ66cPqxYHb277bVWQMn/9sg=",
159104 "dependencies": [
160− "arrays",
161− "bifunctors",
162105 "control",
163106 "datetime",
164107 "effect",
165108 "either",
166109 "exceptions",
167− "foldable-traversable",
168110 "functions",
169− "maybe",
170111 "newtype",
171112 "parallel",
113+ "partial",
172114 "prelude",
173− "refs",
115+ "st",
174116 "tailrec",
175117 "transformers",
176118 "unsafe-coerce"
177119 ]
178120 },
121+ "aff-retry": {
122+ "type": "registry",
123+ "version": "2.0.0",
124+ "integrity": "sha256-rKZNcP4IKSyBFQBVzrCvE0ULoJt0N/uDLLJ0dPotr4k=",
125+ "dependencies": [
126+ "aff",
127+ "arrays",
128+ "datetime",
129+ "effect",
130+ "either",
131+ "exceptions",
132+ "integers",
133+ "maybe",
134+ "newtype",
135+ "numbers",
136+ "prelude",
137+ "random",
138+ "transformers"
139+ ]
140+ },
179141 "ansi": {
180142 "type": "registry",
181143 "version": "7.0.0",
@@ -183,7 +145,7 @@
183145 "dependencies": [
184146 "foldable-traversable",
185147 "lists",
186− "strings"
148+ "prelude"
187149 ]
188150 },
189151 "arrays": {
@@ -217,7 +179,8 @@
217179 "either",
218180 "exceptions",
219181 "functions",
220− "maybe"
182+ "maybe",
183+ "prelude"
221184 ]
222185 },
223186 "bifunctors": {
@@ -399,7 +362,9 @@
399362 "version": "6.0.0",
400363 "integrity": "sha256-0keBVeZZg1eCZEy/En1CohVW829gQUqKtqBNIRa93/A=",
401364 "dependencies": [
402− "aff"
365+ "aff",
366+ "prelude",
367+ "transformers"
403368 ]
404369 },
405370 "free": {
@@ -558,9 +523,16 @@
558523 "version": "7.0.0",
559524 "integrity": "sha256-Cfltaq+tfYjuSoSBN/b8cSQZbvZTqIRs6ebQewbIkGs=",
560525 "dependencies": [
526+ "bifunctors",
527+ "either",
561528 "free",
562529 "functors",
563− "transformers"
530+ "identity",
531+ "maybe",
532+ "newtype",
533+ "prelude",
534+ "transformers",
535+ "tuples"
564536 ]
565537 },
566538 "newtype": {
@@ -591,7 +563,8 @@
591563 "integrity": "sha256-mTyG4s8tps3XIf0jjV/lME2/QlwMzrQly2wqfSSUM3o=",
592564 "dependencies": [
593565 "datetime",
594− "effect"
566+ "effect",
567+ "prelude"
595568 ]
596569 },
597570 "numbers": {
@@ -600,7 +573,8 @@
600573 "integrity": "sha256-ZydYckgwRAnRaFC7pu6fADhzdwX+UqHZrfJyet64zls=",
601574 "dependencies": [
602575 "functions",
603− "maybe"
576+ "maybe",
577+ "prelude"
604578 ]
605579 },
606580 "ordered-collections": {
@@ -609,13 +583,16 @@
609583 "integrity": "sha256-NaEXc2cz/7lJfxPWEja4XlZbGxuRqJwFKQJjsJf51kQ=",
610584 "dependencies": [
611585 "arrays",
586+ "control",
612587 "foldable-traversable",
588+ "functions",
613589 "gen",
614590 "lists",
615591 "maybe",
592+ "newtype",
616593 "partial",
617594 "prelude",
618− "st",
595+ "safe-coerce",
619596 "tailrec",
620597 "tuples",
621598 "unfoldable"
@@ -632,8 +609,8 @@
632609 },
633610 "parallel": {
634611 "type": "registry",
635− "version": "6.0.0",
636− "integrity": "sha256-1dpN/7kBct/2aONnyk4TU0AFN71GvfoRxrqvFGRU4Os=",
612+ "version": "7.0.0",
613+ "integrity": "sha256-bAGpVhrFz2IyHkA4MR7+tE/19FZ7dzYBdYPgK5svkqw=",
637614 "dependencies": [
638615 "control",
639616 "effect",
@@ -660,8 +637,15 @@
660637 "integrity": "sha256-dtUNpG8BGVr7pu6mQZyAnUAftUHgNS7f0QH3Kw5UTpQ=",
661638 "dependencies": [
662639 "aff",
640+ "control",
641+ "effect",
642+ "either",
643+ "foldable-traversable",
644+ "identity",
663645 "lists",
646+ "maybe",
664647 "mmorph",
648+ "newtype",
665649 "prelude",
666650 "tailrec",
667651 "transformers",
@@ -689,6 +673,16 @@
689673 "tuples"
690674 ]
691675 },
676+ "random": {
677+ "type": "registry",
678+ "version": "6.0.0",
679+ "integrity": "sha256-7sZRo6P9UIiXDZ9s2QL9T8h3wlIwLdQrR4+oZKOijQw=",
680+ "dependencies": [
681+ "effect",
682+ "integers",
683+ "prelude"
684+ ]
685+ },
692686 "record": {
693687 "type": "registry",
694688 "version": "4.0.0",
@@ -731,8 +725,8 @@
731725 },
732726 "spec": {
733727 "type": "registry",
734− "version": "7.6.1",
735− "integrity": "sha256-5GysDOS1gVbbGX75YXUdhww3h2S246Ck0sS6yt+ig+0=",
728+ "version": "8.1.1",
729+ "integrity": "sha256-b6qjDb7lUJGLV+WEoywLu6BCXC4zGpfbN43mTL+vBeI=",
736730 "dependencies": [
737731 "aff",
738732 "ansi",
@@ -768,6 +762,7 @@
768762 "version": "6.2.0",
769763 "integrity": "sha256-WI4MEkkwUd4pnwZQ3G8VKWgX5t1RSNJludm5e9boaRo=",
770764 "dependencies": [
765+ "effect",
771766 "partial",
772767 "prelude",
773768 "tailrec",
@@ -899,13 +894,14 @@
899894 "version": "8.0.0",
900895 "integrity": "sha256-Ydrgl8liWEwYQOWW76PdZtg3vxKpoKgsnmFyTLgZkoU=",
901896 "dependencies": [
897+ "control",
902898 "enums",
899+ "foldable-traversable",
903900 "lists",
904901 "maybe",
905902 "partial",
906903 "prelude",
907− "record",
908− "tuples",
904+ "type-equality",
909905 "unsafe-coerce"
910906 ]
911907 }
spago.yaml+19−18
@@ -1,9 +1,8 @@
11workspace: {}
2−
32package:
43 name: yoga-om
54 publish:
6− version: 1.0.5
5+ version: 2.2.1
76 license: MIT
87 exclude:
98 - "src/**/*.test.purs"
@@ -12,31 +11,33 @@ package:
1211 githubOwner: rowtype-yoga
1312 githubRepo: purescript-yoga-om
1413 dependencies:
15− - aff: ">=7.0.0 <8.0.0"
16− - avar: ">=5.0.0 <6.0.0"
17− - console: ">=6.0.0 <7.0.0"
14+ - aff: ">=8.0.0 <9.0.0"
15+ - aff-retry: ">=2.0.0 <3.0.0"
16+ - avar: ">=5.0.1 <6.0.0"
17+ - console: ">=6.1.0 <7.0.0"
1818 - control: ">=6.0.0 <7.0.0"
19− - datetime: ">=6.0.0 <7.0.0"
19+ - datetime: ">=6.1.0 <7.0.0"
2020 - effect: ">=4.0.0 <5.0.0"
21− - either: ">=6.0.0 <7.0.0"
22− - exceptions: ">=6.0.0 <7.0.0"
21+ - either: ">=6.1.0 <7.0.0"
22+ - exceptions: ">=6.1.0 <7.0.0"
2323 - functions: ">=6.0.0 <7.0.0"
24+ - heterogeneous: ">=0.7.0 <0.8.0"
2425 - maybe: ">=6.0.0 <7.0.0"
2526 - newtype: ">=5.0.0 <6.0.0"
26− - parallel: ">=6.0.0 <8.0.0"
27− - prelude: ">=6.0.0 <7.0.0"
27+ - parallel: ">=7.0.0 <8.0.0"
28+ - prelude: ">=6.0.2 <7.0.0"
2829 - record: ">=4.0.0 <5.0.0"
29− - record-studio: ">=1.0.0 <2.0.0"
30− - spec: ">=7.0.0 <8.0.0"
31− - st: ">=6.0.0 <7.0.0"
32− - tailrec: ">=6.0.0 <7.0.0"
33− - transformers: ">=6.0.0 <7.0.0"
30+ - record-studio: ">=1.0.4 <2.0.0"
31+ - refs: ">=6.0.0 <7.0.0"
32+ - tailrec: ">=6.1.0 <7.0.0"
33+ - transformers: ">=6.1.0 <7.0.0"
3434 - tuples: ">=7.0.0 <8.0.0"
3535 - typelevel-prelude: ">=7.0.0 <8.0.0"
36− - uncurried-transformers: ">=1.0.0 <2.0.0"
36+ - uncurried-transformers: ">=1.1.0 <2.0.0"
3737 - unsafe-coerce: ">=6.0.0 <7.0.0"
3838 - variant: ">=8.0.0 <9.0.0"
3939 test:
40− main: Test.Main.Core
40+ main: Test.Main
4141 dependencies:
42− - spec: ">=7.0.0 <8.0.0"
42+ - spec: ">=7.0.0 <9.0.0"
43+ - refs: ">=6.0.0 <7.0.0"
src/Test/Main.pursdeleted−12
@@ -1,12 +0,0 @@
1−module Test.Main.Core where
2−
3−import Prelude
4−
5−import Effect (Effect)
6−import Effect.Aff (launchAff_)
7−import Yoga.Om.Test as OmTest
8−import Test.Spec.Reporter (consoleReporter)
9−import Test.Spec.Runner (runSpec)
10−
11−main :: Effect Unit
12−main = launchAff_ $ runSpec [ consoleReporter ] OmTest.spec
src/Yoga/Om.purs+207−7
@@ -3,6 +3,9 @@
33-- @inline export note arity=2
44-- @inline export fromAff arity=1
55-- @inline export runOm arity=2
6+-- @inline export toOm arity=1
7+-- @inline export onError arity=2
8+-- @inline export mapError arity=2
69module Yoga.Om
710 ( Om(..)
811 , ParOm(..)
@@ -13,22 +16,38 @@ module Yoga.Om
1316 , expandErr
1417 , fromAff
1518 , handleErrors
19+ , mapError
20+ , onError
1621 , handleErrors'
1722 , launchOm
1823 , launchOm_
1924 , note
2025 , noteM
26+ , orFail
2127 , parOmToAff
2228 , race
2329 , inParallel
2430 , readerT
2531 , runOm
32+ , runOmOrThrow
33+ , runOmRecord
34+ , sequenceOmRecord
35+ , runOms
36+ , runOmsInOm
37+ , ExpandAndRun(..)
38+ , SequenceOm(..)
39+ , CloseOmRows(..)
2640 , runReader
2741 , tap
2842 , tapM
43+ , fatal
2944 , throw
45+ , throwUnless
46+ , throwWhen
3047 , throwLeftAs
3148 , throwLeftAsM
49+ , class ToOm
50+ , toOm
3251 , unliftAff
3352 , unliftAffFn
3453 , widenCtx
@@ -52,6 +71,7 @@ import Data.Newtype (class Newtype)
5271import Data.Time.Duration (class Duration, fromDuration)
5372import Data.Tuple.Nested ((/\))
5473import Data.Variant (class VariantMatchCases, Variant, case_, match, on, onMatch)
74+import Data.Variant as Variant
5575import Effect (Effect)
5676import Effect.AVar (AVar)
5777import Effect.Aff (Aff, Fiber, ParAff, forkAff, launchAff, supervise)
@@ -60,16 +80,21 @@ import Effect.Aff.AVar as AVar
6080import Effect.Aff.Class (class MonadAff, liftAff)
6181import Effect.Class (class MonadEffect, liftEffect)
6282import Effect.Exception (Error)
63−import Prim.Row (class Nub, class Union)
83+import Effect.Exception as Exn
84+import Data.Symbol (class IsSymbol)
85+import Prim.Row (class Cons, class Lacks, class Nub, class Union)
86+import Type.Proxy (Proxy(..))
6487import Prim.RowList (class RowToList, RowList)
6588import Record (disjointUnion)
6689import Record.Studio (class Keys, shrink)
6790import Uncurried.RWSET (RWSET, hoistRWSET, runRWSET, rwseT, withRWSET)
6891import Unsafe.Coerce (unsafeCoerce)
6992import Yoga.Om.Error (Exception, OneOfTheseErrors, exception, getParallelError, newParallelError, parallelErrorToError, toParallelError, class SingletonVariantRecord, singletonRecordToVariant)
93+import Heterogeneous.Folding (class FoldingWithIndex, class HFoldlWithIndex, hfoldlWithIndex)
94+import Heterogeneous.Mapping (class HMap, class Mapping, hmap)
95+import Record.Builder (Builder)
96+import Record.Builder as Builder
7097
71−-- | A generic type for handling computations
72−-- | It combines asynchronous side-effecting computations with `Aff`,
7398-- | "dependency injection" via `ReaderT` which tracks a context, and
7499-- | checked exceptions and early return with `ExceptV`.
75100newtype Om ctx err a = Om
@@ -107,6 +132,29 @@ throw
107132 → m a
108133throw = throwError <<< error
109134
135+-- | Throw the supplied typed error when the condition is true.
136+throwWhen
137+ ∷ ∀ m err errors
138+ . SingletonVariantRecord err errors
139+ ⇒ MonadThrow (OneOfTheseErrors errors) m
140+ ⇒ Record err
141+ → Boolean
142+ → m Unit
143+throwWhen problem condition = when condition (throw problem)
144+
145+-- | Throw the supplied typed error when the condition is false.
146+throwUnless
147+ ∷ ∀ m err errors
148+ . SingletonVariantRecord err errors
149+ ⇒ MonadThrow (OneOfTheseErrors errors) m
150+ ⇒ Record err
151+ → Boolean
152+ → m Unit
153+throwUnless problem condition = unless condition (throw problem)
154+
155+fatal ∷ ∀ ctx err a. String → Om ctx err a
156+fatal msg = throw { exception: Exn.error msg }
157+
110158error
111159 ∷ ∀ err errors
112160 . SingletonVariantRecord err errors
@@ -114,14 +162,14 @@ error
114162 -> OneOfTheseErrors errors
115163error = singletonRecordToVariant
116164
117−-- | Run multiple `Om` computations in parallel, and return the fastest
165+-- | Run multiple computations in parallel, and return the fastest
118166-- | To collect all results, use `inParallel` instead
119−race :: forall ctx e a. Array (Om ctx e a) -> Om ctx e a
167+race :: forall f m a. Parallel f m => Alternative f => Array (m a) -> m a
120168race = parOneOf
121169
122−-- | Run multiple `Om`s in parallel, and collect all results
170+-- | Run multiple computations in parallel, and collect all results
123171-- | To only take the fastest result, use `race`
124−inParallel :: forall ctx e a. Array (Om ctx e a) -> Om ctx e (Array a)
172+inParallel :: forall f m a. Parallel f m => Applicative f => Array (m a) -> m (Array a)
125173inParallel = parSequence
126174
127175delay :: forall m d. MonadAff m => Duration d => d -> m Unit
@@ -164,6 +212,9 @@ note err = maybe (throw err) pure
164212noteM ∷ ∀ err m a. MonadThrow err m ⇒ m err → Maybe a → m a
165213noteM err = maybe (throwError =<< err) pure
166214
215+orFail ∷ ∀ m a. Monad m ⇒ m a → Maybe a → m a
216+orFail err = maybe err pure
217+
167218-- | Turns a `Left a` into an exception which reduces nesting
168219throwLeftAs
169220 ∷ ∀ err m left right
@@ -218,6 +269,30 @@ handleErrors cases (Om om) = do
218269 err ← liftAff ((\(_ /\ v /\ _) → v) <$> (runRWSET ctx unit om))
219270 err # either (onMatch cases throwError) pure
220271
272+mapError
273+ :: forall @from @to tyIn tyOut ctx errIn errMid errOut a
274+ . IsSymbol from
275+ => IsSymbol to
276+ => Cons from tyIn (exception :: Error | errMid) (exception :: Error | errIn)
277+ => Cons to tyOut (exception :: Error | errMid) (exception :: Error | errOut)
278+ => (tyIn -> tyOut)
279+ -> Om ctx errIn a
280+ -> Om ctx errOut a
281+mapError f = handleErrors' \variant ->
282+ variant # on (Proxy :: Proxy from)
283+ (throwError <<< Variant.inj (Proxy :: Proxy to) <<< f)
284+ (throwError <<< unsafeCoerce)
285+
286+onError
287+ :: forall @label ty ctx errIn errOut a
288+ . IsSymbol label
289+ => Cons label ty (exception :: Error | errOut) (exception :: Error | errIn)
290+ => (ty -> Om ctx errOut a)
291+ -> Om ctx errIn a
292+ -> Om ctx errOut a
293+onError handler = handleErrors' \variant ->
294+ variant # on (Proxy :: Proxy label) handler throwError
295+
221296-- | When you have a function that can throw a subset of the errors of the ones
222297-- | you could throw in a do block, `expand` allows to make them compatible
223298
@@ -347,6 +422,131 @@ runOm ctx errorHandlers (Om app) = do
347422 (_ /\ Right r /\ _) → pure r
348423 (_ /\ Left err /\ _) → err # match errorHandlers
349424
425+-- | Historical helper for running an error-free `Om`.
426+-- | Despite the name, this returns `Aff` because `Om` computations may contain
427+-- | asynchronous effects internally, and there is no sound synchronous runner.
428+runOmOrThrow
429+ ∷ ∀ ctx a
430+ . ctx
431+ → Om ctx () a
432+ → Aff a
433+runOmOrThrow ctx = runOm ctx { exception: throwError }
434+
435+-- | Run a record of `Om` actions and return the results as a record.
436+-- | Each field can be an `Om` with open context/error rows — they are
437+-- | automatically expanded to the target context and error types.
438+-- | ```purescript
439+-- | runOmRecord ctx handlers
440+-- | { hello: Om.query @Queries @"hello" <#> _.hello
441+-- | , users: Om.query @Queries @"users { name age }" <#> _.users
442+-- | }
443+-- | ```
444+runOmRecord
445+ :: forall ctxRow r rl err_ err rin closed rout
446+ . RowToList (exception :: Error -> Aff { | rout } | r) rl
447+ => VariantMatchCases rl err_ (Aff { | rout })
448+ => Union err_ () (exception :: Error | err)
449+ => HMap CloseOmRows { | rin } { | closed }
450+ => HFoldlWithIndex (SequenceOm ctxRow err) (Om { | ctxRow } err (Builder {} {})) { | closed } (Om { | ctxRow } err (Builder {} { | rout }))
451+ => { | ctxRow }
452+ -> { exception :: Error -> Aff { | rout } | r }
453+ -> { | rin }
454+ -> Aff { | rout }
455+runOmRecord ctx handleErrs actions = do
456+ let closed = hmap CloseOmRows actions
457+ runOm ctx handleErrs (map (flip Builder.build {}) (hfoldlWithIndex (SequenceOm :: SequenceOm ctxRow err) (pure identity :: Om { | ctxRow } err (Builder {} {})) closed))
458+
459+sequenceOmRecord
460+ :: forall ctxRow err rin closed rout
461+ . HMap CloseOmRows { | rin } { | closed }
462+ => HFoldlWithIndex (SequenceOm ctxRow err) (Om { | ctxRow } err (Builder {} {})) { | closed } (Om { | ctxRow } err (Builder {} { | rout }))
463+ => { | rin }
464+ -> Om { | ctxRow } err { | rout }
465+sequenceOmRecord actions = do
466+ let closed = hmap CloseOmRows actions
467+ map (flip Builder.build {}) (hfoldlWithIndex (SequenceOm :: SequenceOm ctxRow err) (pure identity :: Om { | ctxRow } err (Builder {} {})) closed)
468+
469+runOms
470+ :: forall ctxRow r rl err_ err rin closed rout
471+ . RowToList (exception :: Error -> Aff Unit | r) rl
472+ => VariantMatchCases rl err_ (Aff Unit)
473+ => Union err_ () (exception :: Error | err)
474+ => HMap CloseOmRows { | rin } { | closed }
475+ => HMap (ExpandAndRun ctxRow err) { | closed } { | rout }
476+ => { | ctxRow }
477+ -> { exception :: Error -> Aff Unit | r }
478+ -> { | rin }
479+ -> { | rout }
480+runOms ctx handleErrs actions = do
481+ let closed = hmap CloseOmRows actions
482+ let handleErr = match handleErrs
483+ hmap (ExpandAndRun ctx handleErr :: ExpandAndRun ctxRow err) closed
484+
485+runOmsInOm
486+ :: forall ctxRow r rl err_ err outerErr rin closed rout
487+ . RowToList (exception :: Error -> Aff Unit | r) rl
488+ => VariantMatchCases rl err_ (Aff Unit)
489+ => Union err_ () (exception :: Error | err)
490+ => HMap CloseOmRows { | rin } { | closed }
491+ => HMap (ExpandAndRun ctxRow err) { | closed } { | rout }
492+ => { exception :: Error -> Aff Unit | r }
493+ -> { | rin }
494+ -> Om { | ctxRow } outerErr { | rout }
495+runOmsInOm handleErrs actions = do
496+ ctx <- ask
497+ pure (runOms ctx handleErrs actions)
498+
499+data ExpandAndRun (ctxRow :: Row Type) (err :: Row Type) = ExpandAndRun { | ctxRow } (Variant (exception :: Error | err) -> Aff Unit)
500+
501+instance
502+ ( RowToList ctx ctxRL
503+ , RowToList err errRL
504+ , Union ctx _c ctxRow
505+ , Keys ctx
506+ , Union err _e errRow
507+ ) =>
508+ Mapping (ExpandAndRun ctxRow errRow) (Om { | ctx } err a) (Aff a) where
509+ mapping (ExpandAndRun ctx handleErr) om = do
510+ let Om app = expand om :: Om { | ctxRow } errRow a
511+ runRWSET ctx unit app >>= case _ of
512+ (_ /\ Right r /\ _) -> pure r
513+ (_ /\ Left err /\ _) -> unsafeCoerce (handleErr err)
514+
515+data SequenceOm (ctxRow :: Row Type) (err :: Row Type) = SequenceOm
516+
517+instance
518+ ( IsSymbol sym
519+ , Cons sym a rb rc
520+ , Lacks sym rb
521+ , RowToList cSmall _cRL
522+ , RowToList eSmall _eRL
523+ , Union cSmall _c ctxRow
524+ , Keys cSmall
525+ , Union eSmall _e err
526+ ) =>
527+ FoldingWithIndex (SequenceOm ctxRow err) (Proxy sym) (Om { | ctxRow } err (Builder { | ra } { | rb })) (Om { | cSmall } eSmall a) (Om { | ctxRow } err (Builder { | ra } { | rc })) where
528+ foldingWithIndex _ prop acc om = (>>>) <$> acc <*> (Builder.insert prop <$> expand om)
529+
530+-- Close open row tails so Union can solve in SequenceOm
531+data CloseOmRows = CloseOmRows
532+
533+instance
534+ ( RowToList ctx ctxRL
535+ , RowToList err errRL
536+ ) =>
537+ Mapping CloseOmRows (Om { | ctx } err a) (Om { | ctx } err a) where
538+ mapping _ = identity
539+
540+class ToOm :: (Type -> Type) -> Constraint
541+class ToOm f where
542+ toOm :: forall ctx err a. f a -> Om ctx err a
543+
544+instance ToOm Effect where
545+ toOm = liftEffect
546+
547+instance ToOm Aff where
548+ toOm = liftAff
549+
350550-- | Manually add some fields to the context of a computation.
351551-- | This function is useful when already inside a `do` block of an `Om`
352552-- | and you want to call a function that requires some `ctx` that you obtained
src/Yoga/Om.test.pursdeleted−31
@@ -1,31 +0,0 @@
1−module Yoga.Om.Test where
2−
3−import Prelude
4−
5−import Data.Maybe (Maybe(..))
6−import Effect.Class (liftEffect)
7−import Effect.Exception as JS
8−import Test.Spec (Spec, describe, it)
9−import Test.Spec.Assertions (shouldEqual)
10−import Yoga.Om (Om, runOm)
11−import Yoga.Om as Om
12−
13−spec :: Spec Unit
14−spec = do
15− describe "Yoga.Om (Core)" do
16−
17− describe "Basics" do
18−
19− it "Runs safely" do
20− let ctx = {}
21− let errorHandlers = { exception: \_ -> pure false }
22− let om = pure true
23− result <- om # runOm ctx errorHandlers
24− result `shouldEqual` true
25−
26− it "Catches exceptions as `exception`" do
27− let ctx = {}
28− let errorHandlers = { exception: \_ -> pure "exception" }
29− let om = Om.fromAff $ liftEffect $ JS.throw "Some random exception"
30− result <- om # runOm ctx errorHandlers
31− result `shouldEqual` "exception"
src/Yoga/Om/Ref.pursnew file+39
@@ -0,0 +1,39 @@
1+-- @inline export new arity=1
2+-- @inline export read arity=1
3+-- @inline export modify' arity=2
4+-- @inline export modify arity=2
5+-- @inline export modify_ arity=2
6+-- @inline export write arity=2
7+module Yoga.Om.Ref
8+ ( module Effect.Ref
9+ , new
10+ , read
11+ , modify'
12+ , modify
13+ , modify_
14+ , write
15+ ) where
16+
17+import Prelude
18+
19+import Effect.Class (class MonadEffect, liftEffect)
20+import Effect.Ref (Ref)
21+import Effect.Ref as Ref
22+
23+new :: forall m s. MonadEffect m => s -> m (Ref s)
24+new = liftEffect <<< Ref.new
25+
26+read :: forall m s. MonadEffect m => Ref s -> m s
27+read = liftEffect <<< Ref.read
28+
29+modify' :: forall m s b. MonadEffect m => (s -> { state :: s, value :: b }) -> Ref s -> m b
30+modify' f = liftEffect <<< Ref.modify' f
31+
32+modify :: forall m s. MonadEffect m => (s -> s) -> Ref s -> m s
33+modify f = liftEffect <<< Ref.modify f
34+
35+modify_ :: forall m s. MonadEffect m => (s -> s) -> Ref s -> m Unit
36+modify_ f = liftEffect <<< Ref.modify_ f
37+
38+write :: forall m s. MonadEffect m => s -> Ref s -> m Unit
39+write s = liftEffect <<< Ref.write s
src/Yoga/Om/Retry.pursnew file+61
@@ -0,0 +1,61 @@
1+module Yoga.Om.Retry
2+ ( recovering
3+ , repeating
4+ , module Effect.Aff.Retry
5+ ) where
6+
7+import Prelude
8+
9+import Control.Monad.Error.Class (catchError, throwError)
10+import Data.Maybe (maybe)
11+import Data.Variant (class VariantMatchCases, onMatch)
12+import Effect.Aff.Retry (RetryPolicyM, RetryStatus, applyAndDelay, defaultRetryStatus)
13+import Effect.Exception (Error)
14+import Prim.Row (class Union)
15+import Prim.RowList (class RowToList, RowList)
16+import Yoga.Om (Om)
17+
18+recovering
19+ :: forall ctx err rest a
20+ (handlersRL :: RowList Type)
21+ (handlers :: Row Type)
22+ (handled :: Row Type)
23+ . RowToList handlers handlersRL
24+ => VariantMatchCases handlersRL handled (Om ctx err Boolean)
25+ => Union handled rest (exception :: Error | err)
26+ => RetryPolicyM (Om ctx err)
27+ -> (RetryStatus -> Record handlers)
28+ -> (RetryStatus -> Om ctx err a)
29+ -> Om ctx err a
30+recovering policy mkChecks action = go defaultRetryStatus
31+ where
32+ go status =
33+ catchError (action status) (handleErr status)
34+
35+ handleErr status variant = do
36+ let shouldRetry = variant # onMatch (mkChecks status) (\_ -> pure false)
37+ ifM shouldRetry
38+ (applyAndDelay policy status >>= maybe (throwError variant) go)
39+ (throwError variant)
40+
41+-- | Repeat a successful action according to a policy while a condition holds.
42+-- | Returns the last result.
43+-- |
44+-- | ```purescript
45+-- | repeating (constantDelay (Milliseconds 1000.0) <> limitRetries 10)
46+-- | (\_ result -> pure (result < threshold))
47+-- | (\_ -> pollSensor)
48+-- | ```
49+repeating
50+ :: forall ctx err a
51+ . RetryPolicyM (Om ctx err)
52+ -> (RetryStatus -> a -> Om ctx err Boolean)
53+ -> (RetryStatus -> Om ctx err a)
54+ -> Om ctx err a
55+repeating policy shouldRepeat action = go defaultRetryStatus
56+ where
57+ go status = do
58+ result <- action status
59+ ifM (shouldRepeat status result)
60+ (applyAndDelay policy status >>= maybe (pure result) go)
61+ (pure result)
test/Test/Main.jsnew file+3
@@ -0,0 +1,3 @@
1+export const throwingEffect = () => {
2+ throw new Error("A nice JS error");
3+}
test/Test/Main.pursnew file+614
@@ -0,0 +1,614 @@
1+module Test.Main where
2+
3+import Prelude
4+
5+import Control.Monad.Error.Class as MonadThrow
6+import Control.Monad.Reader.Class (asks)
7+import Data.Array (intercalate)
8+import Data.Either (Either(..))
9+import Data.Maybe (Maybe(..))
10+import Data.Monoid (power)
11+import Data.Time.Duration (Milliseconds(..), Seconds(..))
12+import Data.Variant (match)
13+import Effect (Effect)
14+import Effect.Aff (Aff, launchAff_)
15+import Effect.Aff as Aff
16+import Effect.Aff.Class (liftAff)
17+import Effect.Aff.Retry (RetryStatus(..), limitRetries, constantDelay)
18+import Effect.Class (liftEffect)
19+import Effect.Class.Console as Console
20+import Effect.Exception as Exn
21+import Effect.Ref as Ref
22+import Test.Spec (describe, it)
23+import Test.Spec.Assertions (shouldEqual)
24+import Test.Spec.Reporter (consoleReporter)
25+import Test.Spec.Runner (runSpec)
26+import Yoga.Om (Om)
27+import Yoga.Om as Om
28+import Yoga.Om.Retry (recovering, repeating)
29+
30+main :: Effect Unit
31+main = launchAff_ $ runSpec [ consoleReporter ] do
32+
33+ describe "Yoga.Om - basics" do
34+
35+ it "pure values pass through" do
36+ result <- pure true
37+ # Om.runOm {} { exception: \_ -> pure false }
38+ # liftAff
39+ result `shouldEqual` true
40+
41+ it "launches safely" do
42+ let launch = Console.log "Hello from Om" # Om.launchOm_ {} { exception: \_ -> pure unit }
43+ liftEffect launch
44+
45+ it "reads context with ask" do
46+ result <- do
47+ ctx <- Om.ask
48+ pure ctx.name
49+ # Om.runOm { name: "Alice" } { exception: \_ -> pure "" }
50+ # liftAff
51+ result `shouldEqual` "Alice"
52+
53+ it "lifts Aff with fromAff" do
54+ ref <- Ref.new 0 # liftEffect
55+ result <- Om.fromAff (Ref.modify (_ + 1) ref # liftEffect)
56+ # Om.runOm {} { exception: \_ -> pure 0 }
57+ # liftAff
58+ result `shouldEqual` 1
59+
60+ it "runOmOrThrow runs Aff-backed Om safely" do
61+ result <- Om.runOmOrThrow {} do
62+ Om.delay (Milliseconds 0.0)
63+ pure 42
64+ result `shouldEqual` 42
65+
66+ it "runOmOrThrow still runs lifted Effect code" do
67+ ref <- Ref.new 0 # liftEffect
68+ result <- Om.runOmOrThrow {} do
69+ liftEffect $ Ref.modify_ (_ + 1) ref
70+ pure 7
71+ result `shouldEqual` 7
72+ final <- Ref.read ref # liftEffect
73+ final `shouldEqual` 1
74+
75+ describe "Yoga.Om - exception safety" do
76+
77+ it "fatal throws a string into the exception channel" do
78+ result <- do
79+ _ <- Om.fatal "something went wrong"
80+ pure "unreachable"
81+ # Om.runOm {} { exception: \e -> pure (Exn.message e) }
82+ # liftAff
83+ result `shouldEqual` "something went wrong"
84+
85+ it "catches Aff exceptions" do
86+ result <- do
87+ _ <- Om.fromAff (Aff.throwError (Exn.error "boom"))
88+ pure "ok"
89+ # Om.runOm {} { exception: \_ -> pure "caught" }
90+ # liftAff
91+ result `shouldEqual` "caught"
92+
93+ it "catches Effect exceptions" do
94+ result <- do
95+ liftEffect throwingEffect $> "never reached"
96+ # Om.runOm {} { exception: \_ -> pure "caught" }
97+ # liftAff
98+ result `shouldEqual` "caught"
99+
100+ describe "Yoga.Om - context composition" do
101+
102+ it "combines Oms with different contexts" do
103+ let askText = Om.ask <#> _.text
104+ let askHowOften = Om.asks _.howOften
105+ result <- do
106+ text <- askText
107+ times <- askHowOften
108+ pure (power text times)
109+ # Om.runOm { text: "!", howOften: 3 } { exception: \_ -> pure "" }
110+ # liftAff
111+ result `shouldEqual` "!!!"
112+
113+ it "expandCtx widens a closed context" do
114+ let appM1 = (asks _.x) :: Om { x :: String } () String
115+ let appM2 = (asks _.y) :: Om { y :: String } () String
116+ result <- do
117+ r1 <- Om.expandCtx appM1
118+ r2 <- Om.expandCtx appM2
119+ pure (r1 <> " " <> r2)
120+ # Om.runOm { x: "good", y: "food" } { exception: \_ -> pure "" }
121+ # liftAff
122+ result `shouldEqual` "good food"
123+
124+ it "expand widens both context and errors" do
125+ let appM1 = (asks _.x) :: Om { x :: String } (bad :: String) String
126+ let appM2 = (asks _.y) :: Om { y :: String } (realBad :: String) String
127+ result <- do
128+ r1 <- Om.expand appM1
129+ r2 <- Om.expand appM2
130+ pure (r1 <> " " <> r2)
131+ # Om.runOm { x: "good", y: "food" } { exception: \_ -> pure "", bad: pure, realBad: pure }
132+ # liftAff
133+ result `shouldEqual` "good food"
134+
135+ describe "Yoga.Om - errors" do
136+
137+ it "throw delivers error to handler" do
138+ result <- Om.throw { notFound: "missing" }
139+ # Om.runOm {} { exception: \_ -> pure "", notFound: \msg -> pure msg }
140+ # liftAff
141+ result `shouldEqual` "missing"
142+
143+ it "throw with error helper" do
144+ result <- (MonadThrow.throwError $ Om.error { badError: "bad" })
145+ # runExampleOm
146+ # liftAff
147+ result `shouldEqual` "bad"
148+
149+ it "expandErr widens closed error rows" do
150+ let appM1 = pure "good" :: Om {} (goodError :: Int) String
151+ let appM2 = Om.throw { badError: "bad" } :: Om {} (badError :: String) String
152+ result <- do
153+ _ <- Om.expandErr appM1
154+ Om.expandErr appM2
155+ # Om.runOm {} { exception: \_ -> pure "", goodError: pure <<< show, badError: pure }
156+ # liftAff
157+ result `shouldEqual` "bad"
158+
159+ it "handleErrors catches and recovers" do
160+ result <- Om.handleErrors { notFound: \_ -> pure "recovered" } do
161+ Om.throw { notFound: "oops" }
162+ # Om.runOm {} { exception: \_ -> pure "" }
163+ # liftAff
164+ result `shouldEqual` "recovered"
165+
166+ it "handleErrors eliminates handled error from row" do
167+ let
168+ getFromCache = do
169+ _ <- Om.throw { cacheError: "not found" }
170+ _ <- Om.throw { benignError: "harmless" }
171+ Om.throw { badError: "bad" }
172+ let
173+ appM :: Om {} (badError :: String) String
174+ appM = do
175+ _ <- getFromCache # Om.handleErrors
176+ { cacheError: \_ -> pure "cached"
177+ , benignError: \_ -> pure "ok"
178+ }
179+ pure "done"
180+ result <- appM # runExampleOm # liftAff
181+ result `shouldEqual` "done"
182+
183+ it "handleErrors can transform errors" do
184+ let
185+ getFromCache = do
186+ _ <- Om.throw { cacheError: "not found" }
187+ Om.throw { fatal: "horrible" }
188+ let
189+ appM :: Om {} (badError :: String) String
190+ appM = do
191+ _ <- getFromCache # Om.handleErrors
192+ { cacheError: \_ -> Om.throw { badError: "bad" }
193+ , fatal: \_ -> pure "fine"
194+ }
195+ pure "done"
196+ result <- appM # runExampleOm # liftAff
197+ result `shouldEqual` "bad"
198+
199+ it "mapError transforms error type" do
200+ result <- Om.mapError @"notFound" @"apiError" (\msg -> "mapped: " <> msg)
201+ (Om.throw { notFound: "gone" })
202+ # Om.runOm {} { exception: \_ -> pure "", apiError: \msg -> pure msg }
203+ # liftAff
204+ result `shouldEqual` "mapped: gone"
205+
206+ it "onError runs side effect then re-throws" do
207+ ref <- Ref.new "" # liftEffect
208+ result <- Om.onError @"notFound"
209+ (\msg -> do
210+ Ref.write ("saw: " <> msg) ref # liftEffect
211+ Om.throw { notFound: msg }
212+ )
213+ (Om.throw { notFound: "404" })
214+ # Om.runOm {} { exception: \_ -> pure "", notFound: \msg -> pure msg }
215+ # liftAff
216+ result `shouldEqual` "404"
217+ logged <- Ref.read ref # liftEffect
218+ logged `shouldEqual` "saw: 404"
219+
220+ it "combines Oms with different errors" do
221+ let readFromDisk = Om.throw { ioError: { reason: "Disk Exploded", code: -3 } }
222+ let readFromDB = Om.throw { dbError: "DB Dead" }
223+ result <- do
224+ _ <- readFromDisk
225+ _ <- readFromDB
226+ pure "unreachable"
227+ # Om.runOm {}
228+ { exception: \_ -> pure ""
229+ , dbError: pure
230+ , ioError: \err -> pure (err.reason <> " " <> show err.code)
231+ }
232+ # liftAff
233+ result `shouldEqual` "Disk Exploded -3"
234+
235+ describe "Yoga.Om - helpers" do
236+
237+ it "note converts Just to pure" do
238+ result <- Om.note { missing: unit } (Just 42)
239+ # Om.runOm {} { exception: \_ -> pure 0, missing: \(_ :: Unit) -> pure 0 }
240+ # liftAff
241+ result `shouldEqual` 42
242+
243+ it "note converts Nothing to throw" do
244+ result <- Om.note { missing: unit } (Nothing :: Maybe Int)
245+ # Om.runOm {} { exception: \_ -> pure 0, missing: \(_ :: Unit) -> pure 99 }
246+ # liftAff
247+ result `shouldEqual` 99
248+
249+ it "throwWhen throws only when its condition is true" do
250+ let
251+ run condition = do
252+ Om.throwWhen { rejected: "blocked" } condition
253+ pure "continued"
254+ handle =
255+ Om.runOm {}
256+ { exception: \_ -> pure "exception"
257+ , rejected: pure
258+ }
259+ whenTrue <- run true # handle # liftAff
260+ whenFalse <- run false # handle # liftAff
261+ whenTrue `shouldEqual` "blocked"
262+ whenFalse `shouldEqual` "continued"
263+
264+ it "throwUnless throws only when its condition is false" do
265+ let
266+ run condition = do
267+ Om.throwUnless { rejected: "blocked" } condition
268+ pure "continued"
269+ handle =
270+ Om.runOm {}
271+ { exception: \_ -> pure "exception"
272+ , rejected: pure
273+ }
274+ whenTrue <- run true # handle # liftAff
275+ whenFalse <- run false # handle # liftAff
276+ whenTrue `shouldEqual` "continued"
277+ whenFalse `shouldEqual` "blocked"
278+
279+ it "throwLeftAs converts Left to error" do
280+ result <- Left "bad" # Om.throwLeftAs (\badError -> Om.error { badError })
281+ # runExampleOm
282+ # liftAff
283+ result `shouldEqual` "bad"
284+
285+ it "noteM throws when Nothing with monadic error" do
286+ result <- (Nothing # Om.noteM do
287+ _ <- Om.throw { badError: "bad" }
288+ pure $ Om.error { badError: "unreachable" })
289+ # runExampleOm
290+ # liftAff
291+ result `shouldEqual` "bad"
292+
293+ it "throwLeftAsM converts Left with monadic transform" do
294+ result <- (Left "bad" # Om.throwLeftAsM \badError -> do
295+ _ <- Om.throw { badError }
296+ pure $ Om.error { badError: "unreachable" })
297+ # runExampleOm
298+ # liftAff
299+ result `shouldEqual` "bad"
300+
301+ it "tap runs side effect and returns value" do
302+ ref <- Ref.new "" # liftEffect
303+ result <- Om.tap (\s -> Ref.write s ref # liftEffect) "hello"
304+ # Om.runOm {} { exception: \_ -> pure "" }
305+ # liftAff
306+ result `shouldEqual` "hello"
307+ written <- Ref.read ref # liftEffect
308+ written `shouldEqual` "hello"
309+
310+ it "tapM runs side effect on monadic result" do
311+ ref <- Ref.new 0 # liftEffect
312+ result <- Om.tapM (\n -> Ref.write n ref # liftEffect) (pure 42)
313+ # Om.runOm {} { exception: \_ -> pure 0 }
314+ # liftAff
315+ result `shouldEqual` 42
316+ written <- Ref.read ref # liftEffect
317+ written `shouldEqual` 42
318+
319+ describe "Yoga.Om - parallel" do
320+
321+ it "race returns fastest result" do
322+ result <- Om.race
323+ [ Om.delay (1.0 # Seconds) *> pure "slow"
324+ , pure "fast"
325+ ]
326+ # runExampleOm
327+ # liftAff
328+ result `shouldEqual` "fast"
329+
330+ it "race prefers success over fast failure" do
331+ result <- Om.race
332+ [ Om.throw { badError: "fast but broken" }
333+ , Om.delay (8.0 # Milliseconds) *> pure "slow but works"
334+ ]
335+ # runExampleOm
336+ # liftAff
337+ result `shouldEqual` "slow but works"
338+
339+ it "inParallel collects all results" do
340+ result <- do
341+ strings <- Om.inParallel
342+ [ Om.delay (9.0 # Milliseconds) *> pure "1"
343+ , Om.delay (1.0 # Milliseconds) *> pure "2"
344+ ]
345+ pure $ intercalate "|" strings
346+ # runExampleOm
347+ # liftAff
348+ result `shouldEqual` "1|2"
349+
350+ it "inParallel fails fast" do
351+ result <- do
352+ strings <- Om.inParallel
353+ [ Om.throw { badError: "fast but broken" }
354+ , Om.delay (8.0 # Milliseconds) *> pure "slow but works"
355+ ]
356+ pure $ intercalate "|" strings
357+ # runExampleOm
358+ # liftAff
359+ result `shouldEqual` "fast but broken"
360+
361+ describe "Yoga.Om - runOmRecord" do
362+
363+ it "sequences a record of Oms and runs to Aff" do
364+ result <- Om.runOmRecord { greeting: "hi" }
365+ { exception: \_ -> pure { a: "", b: 0 } }
366+ { a: (Om.ask :: Om.Om { greeting :: String } () { greeting :: String }) <#> _.greeting
367+ , b: pure 42 :: Om.Om {} () Int
368+ }
369+ # liftAff
370+ result.a `shouldEqual` "hi"
371+ result.b `shouldEqual` 42
372+
373+ describe "Yoga.Om - sequenceOmRecord" do
374+
375+ it "sequences a record of Oms into one Om" do
376+ result <- Om.sequenceOmRecord
377+ { a: (Om.ask :: Om.Om { x :: Int } () { x :: Int }) <#> _.x
378+ , b: (Om.ask :: Om.Om { y :: String } () { y :: String }) <#> _.y
379+ }
380+ # Om.runOm { x: 1, y: "two" } { exception: \_ -> pure { a: 0, b: "" } }
381+ # liftAff
382+ result.a `shouldEqual` 1
383+ result.b `shouldEqual` "two"
384+
385+ describe "Yoga.Om - runOms" do
386+
387+ it "maps a record of Oms to a record of Affs" do
388+ let
389+ affs = Om.runOms { greeting: "hello" }
390+ { exception: \_ -> pure unit }
391+ { name: (Om.ask :: Om.Om { greeting :: String } () { greeting :: String }) <#> _.greeting
392+ , number: pure 42 :: Om.Om {} () Int
393+ }
394+ name <- affs.name # liftAff
395+ number <- affs.number # liftAff
396+ name `shouldEqual` "hello"
397+ number `shouldEqual` 42
398+
399+ it "runs each Aff independently" do
400+ ref <- Ref.new 0 # liftEffect
401+ let
402+ affs = Om.runOms {}
403+ { exception: \_ -> pure unit }
404+ { inc: Ref.modify (_ + 1) ref # liftEffect :: Om.Om {} () Int
405+ }
406+ _ <- affs.inc # liftAff
407+ _ <- affs.inc # liftAff
408+ _ <- affs.inc # liftAff
409+ result <- Ref.read ref # liftEffect
410+ result `shouldEqual` 3
411+
412+ it "expands different context rows to a shared context" do
413+ let
414+ affs = Om.runOms { foo: 1, bar: "hi" }
415+ { exception: \_ -> pure unit }
416+ { fromFoo: (Om.ask :: Om.Om { foo :: Int } () { foo :: Int }) <#> _.foo
417+ , fromBar: (Om.ask :: Om.Om { bar :: String } () { bar :: String }) <#> _.bar
418+ }
419+ foo <- affs.fromFoo # liftAff
420+ bar <- affs.fromBar # liftAff
421+ foo `shouldEqual` 1
422+ bar `shouldEqual` "hi"
423+
424+ describe "Yoga.Om - runOmsInOm" do
425+
426+ it "runs Oms using context from ask" do
427+ affs <- Om.runOmsInOm
428+ { exception: \_ -> pure unit }
429+ { name: (Om.ask :: Om.Om { greeting :: String } () { greeting :: String }) <#> _.greeting
430+ , number: pure 42 :: Om.Om {} () Int
431+ }
432+ # Om.runOm { greeting: "world" }
433+ { exception: \_ -> pure { name: pure "", number: pure 0 } }
434+ # liftAff
435+ name <- affs.name # liftAff
436+ number <- affs.number # liftAff
437+ name `shouldEqual` "world"
438+ number `shouldEqual` 42
439+
440+ describe "Yoga.Om.Retry - recovering" do
441+
442+ it "retries on matching errors up to the limit" do
443+ attemptsRef <- Ref.new 0 # liftEffect
444+ recovering (constantDelay (Milliseconds 0.0) <> limitRetries 3)
445+ (\_ -> { networkError: \(_ :: String) -> pure true })
446+ (\_ -> do
447+ attempts <- Ref.modify (_ + 1) attemptsRef # liftEffect
448+ Om.throw { networkError: "fail " <> show attempts }
449+ )
450+ # Om.runOm {}
451+ { exception: \_ -> pure unit
452+ , networkError: \_ -> pure unit
453+ }
454+ # liftAff
455+ attempts <- Ref.read attemptsRef # liftEffect
456+ attempts `shouldEqual` 4
457+
458+ it "does not retry on non-matching errors" do
459+ attemptsRef <- Ref.new 0 # liftEffect
460+ recovering (constantDelay (Milliseconds 0.0) <> limitRetries 3)
461+ (\_ -> { networkError: \(_ :: String) -> pure true })
462+ (\_ -> do
463+ Ref.modify_ (_ + 1) attemptsRef # liftEffect
464+ Om.throw { authError: "unauthorized" }
465+ )
466+ # Om.runOm {}
467+ { exception: \_ -> pure unit
468+ , networkError: \_ -> pure unit
469+ , authError: \_ -> pure unit
470+ }
471+ # liftAff
472+ attempts <- Ref.read attemptsRef # liftEffect
473+ attempts `shouldEqual` 1
474+
475+ it "succeeds after transient failures" do
476+ attemptsRef <- Ref.new 0 # liftEffect
477+ result <-
478+ recovering (constantDelay (Milliseconds 0.0) <> limitRetries 5)
479+ (\_ -> { networkError: \(_ :: String) -> pure true })
480+ (\_ -> do
481+ attempts <- Ref.modify (_ + 1) attemptsRef # liftEffect
482+ when (attempts < 3) do
483+ Om.throw { networkError: "transient" }
484+ pure "success"
485+ )
486+ # Om.runOm {}
487+ { exception: \_ -> pure "failed"
488+ , networkError: \_ -> pure "failed"
489+ }
490+ # liftAff
491+ result `shouldEqual` "success"
492+ attempts <- Ref.read attemptsRef # liftEffect
493+ attempts `shouldEqual` 3
494+
495+ it "preserves the error when retries are exhausted" do
496+ result <-
497+ recovering (constantDelay (Milliseconds 0.0) <> limitRetries 2)
498+ (\_ -> { networkError: \(_ :: String) -> pure true })
499+ (\_ -> Om.throw { networkError: "server down" })
500+ # Om.runReader {}
501+ # liftAff
502+ case result of
503+ Left err -> do
504+ let msg = err # match
505+ { exception: \_ -> "exception"
506+ , networkError: \e -> e
507+ }
508+ msg `shouldEqual` "server down"
509+ Right _ -> "should have failed" `shouldEqual` "but succeeded"
510+
511+ it "only retries the specified error in a multi-error layer" do
512+ attemptsRef <- Ref.new 0 # liftEffect
513+ result <-
514+ recovering (constantDelay (Milliseconds 0.0) <> limitRetries 5)
515+ (\_ -> { networkError: \(_ :: String) -> pure true })
516+ (\_ -> do
517+ attempts <- Ref.modify (_ + 1) attemptsRef # liftEffect
518+ if attempts <= 2
519+ then Om.throw { networkError: "timeout" }
520+ else Om.throw { authError: "forbidden" }
521+ )
522+ # Om.runReader {}
523+ # liftAff
524+ case result of
525+ Left err -> do
526+ let msg = err # match
527+ { exception: \_ -> "exception"
528+ , networkError: \e -> e
529+ , authError: \e -> e
530+ }
531+ msg `shouldEqual` "forbidden"
532+ Right _ -> "should have failed" `shouldEqual` "but succeeded"
533+ attempts <- Ref.read attemptsRef # liftEffect
534+ attempts `shouldEqual` 3
535+
536+ it "uses RetryStatus to decide whether to retry" do
537+ statusesRef <- Ref.new [] # liftEffect
538+ recovering (constantDelay (Milliseconds 0.0) <> limitRetries 3)
539+ (\(RetryStatus s) ->
540+ { networkError: \(_ :: Unit) -> do
541+ Ref.modify_ (_ <> [s.iterNumber]) statusesRef # liftEffect
542+ pure true
543+ })
544+ (\_ -> Om.throw { networkError: unit })
545+ # Om.runOm {}
546+ { exception: \_ -> pure unit
547+ , networkError: \_ -> pure unit
548+ }
549+ # liftAff
550+ statuses <- Ref.read statusesRef # liftEffect
551+ statuses `shouldEqual` [0, 1, 2, 3]
552+
553+ it "stops retrying when check returns false" do
554+ attemptsRef <- Ref.new 0 # liftEffect
555+ recovering (constantDelay (Milliseconds 0.0) <> limitRetries 10)
556+ (\(RetryStatus s) ->
557+ { networkError: \(_ :: Unit) -> pure (s.iterNumber < 2) })
558+ (\_ -> do
559+ Ref.modify_ (_ + 1) attemptsRef # liftEffect
560+ Om.throw { networkError: unit }
561+ )
562+ # Om.runOm {}
563+ { exception: \_ -> pure unit
564+ , networkError: \_ -> pure unit
565+ }
566+ # liftAff
567+ attempts <- Ref.read attemptsRef # liftEffect
568+ attempts `shouldEqual` 3
569+
570+ describe "Yoga.Om.Retry - repeating" do
571+
572+ it "repeats while condition holds" do
573+ counterRef <- Ref.new 0 # liftEffect
574+ result <-
575+ repeating (constantDelay (Milliseconds 0.0) <> limitRetries 10)
576+ (\_ n -> pure (n < 5))
577+ (\_ -> Ref.modify (_ + 1) counterRef # liftEffect)
578+ # Om.runOm {} { exception: \_ -> pure 0 }
579+ # liftAff
580+ result `shouldEqual` 5
581+
582+ it "stops when condition returns false" do
583+ counterRef <- Ref.new 0 # liftEffect
584+ result <-
585+ repeating (constantDelay (Milliseconds 0.0) <> limitRetries 100)
586+ (\_ n -> pure (n < 3))
587+ (\_ -> Ref.modify (_ + 1) counterRef # liftEffect)
588+ # Om.runOm {} { exception: \_ -> pure 0 }
589+ # liftAff
590+ result `shouldEqual` 3
591+
592+ it "stops when policy exhausted" do
593+ counterRef <- Ref.new 0 # liftEffect
594+ result <-
595+ repeating (constantDelay (Milliseconds 0.0) <> limitRetries 3)
596+ (\_ _ -> pure true)
597+ (\_ -> Ref.modify (_ + 1) counterRef # liftEffect)
598+ # Om.runOm {} { exception: \_ -> pure 0 }
599+ # liftAff
600+ result `shouldEqual` 4
601+
602+ it "returns last result" do
603+ result <-
604+ repeating (constantDelay (Milliseconds 0.0) <> limitRetries 2)
605+ (\_ _ -> pure true)
606+ (\(RetryStatus s) -> pure ("attempt-" <> show s.iterNumber))
607+ # Om.runOm {} { exception: \_ -> pure "" }
608+ # liftAff
609+ result `shouldEqual` "attempt-2"
610+
611+foreign import throwingEffect :: Effect Unit
612+
613+runExampleOm :: Om {} (badError :: String) String -> Aff String
614+runExampleOm = Om.runOm {} { exception: \_ -> pure "exception", badError: pure }