From fb9ac5deba12aa9240624c2f4bd2e1a0137b6a15 Mon Sep 17 00:00:00 2001 From: Owen Date: Sat, 7 Mar 2026 11:53:25 +0100 Subject: [PATCH 01/23] initial setup and Hello World exercise --- .gitignore | 4 + Makefile | 57 + config.json | 91 +- .../hello-world/.docs/instructions.md | 15 + .../practice/hello-world/.meta/HelloWorld.res | 1 + .../practice/hello-world/.meta/config.json | 19 + .../practice/hello-world/.meta/tests.toml | 13 + exercises/practice/hello-world/LICENSE | 21 + .../practice/hello-world/package-lock.json | 1549 ++++++++++++++++ exercises/practice/hello-world/package.json | 26 + exercises/practice/hello-world/rescript.json | 15 + .../practice/hello-world/src/HelloWorld.res | 1 + .../hello-world/tests/HelloWorld_test.res | 8 + lib/bs/.compiler.log | 2 + lib/bs/.sourcedirs.json | 1 + lib/bs/build.ninja | 0 lib/bs/compiler-info.json | 8 + lib/ocaml/.compiler.log | 2 + lib/ocaml/HelloWorld.ast | Bin 0 -> 252 bytes lib/ocaml/HelloWorld.cmi | Bin 0 -> 646 bytes lib/ocaml/HelloWorld.cmj | Bin 0 -> 95 bytes lib/ocaml/HelloWorld.cmt | Bin 0 -> 3481 bytes lib/ocaml/HelloWorld.res | 1 + lib/ocaml/HelloWorld_test.ast | Bin 0 -> 1377 bytes lib/ocaml/HelloWorld_test.cmi | Bin 0 -> 836 bytes lib/ocaml/HelloWorld_test.cmj | Bin 0 -> 103 bytes lib/ocaml/HelloWorld_test.cmt | Bin 0 -> 7186 bytes lib/ocaml/HelloWorld_test.res | 8 + lib/rescript.lock | 1 + package-lock.json | 1558 +++++++++++++++++ package.json | 26 + rescript.json | 15 + 32 files changed, 3432 insertions(+), 10 deletions(-) create mode 100644 Makefile create mode 100644 exercises/practice/hello-world/.docs/instructions.md create mode 100644 exercises/practice/hello-world/.meta/HelloWorld.res create mode 100644 exercises/practice/hello-world/.meta/config.json create mode 100644 exercises/practice/hello-world/.meta/tests.toml create mode 100644 exercises/practice/hello-world/LICENSE create mode 100644 exercises/practice/hello-world/package-lock.json create mode 100644 exercises/practice/hello-world/package.json create mode 100644 exercises/practice/hello-world/rescript.json create mode 100644 exercises/practice/hello-world/src/HelloWorld.res create mode 100644 exercises/practice/hello-world/tests/HelloWorld_test.res create mode 100644 lib/bs/.compiler.log create mode 100644 lib/bs/.sourcedirs.json create mode 100644 lib/bs/build.ninja create mode 100644 lib/bs/compiler-info.json create mode 100644 lib/ocaml/.compiler.log create mode 100644 lib/ocaml/HelloWorld.ast create mode 100644 lib/ocaml/HelloWorld.cmi create mode 100644 lib/ocaml/HelloWorld.cmj create mode 100644 lib/ocaml/HelloWorld.cmt create mode 100644 lib/ocaml/HelloWorld.res create mode 100644 lib/ocaml/HelloWorld_test.ast create mode 100644 lib/ocaml/HelloWorld_test.cmi create mode 100644 lib/ocaml/HelloWorld_test.cmj create mode 100644 lib/ocaml/HelloWorld_test.cmt create mode 100644 lib/ocaml/HelloWorld_test.res create mode 100644 lib/rescript.lock create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 rescript.json diff --git a/.gitignore b/.gitignore index f356949..2fd99d4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,7 @@ bin/configlet.exe bin/latest-configlet.tar.gz bin/latest-configlet.zip bin/configlet.zip +node_modules + +tmp +exercises/**/.gitignore diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5960dfc --- /dev/null +++ b/Makefile @@ -0,0 +1,57 @@ +.DEFAULT_GOAL := test + +EXERCISE ?= "" +EXERCISES = $(shell find ./exercises/practice -maxdepth 1 -mindepth 1 -type d | cut -s -d '/' -f4 | sort) +OUTDIR ?= "tmp" + +# check all package.json and package-lock.json are matching +check-package-files: + @echo "Validation package.json files..." + @for pkg in $(PKG_FILES); do \ + ! ./bin/md5-hash $$pkg | grep -qv $(SOURCE_PKG_MD5) || { echo "$$pkg does not match main package.json. Please run 'make sync-package-files' locally and commit the results."; exit 1; }; \ + done + @echo "Validation package-lock.json files..." + @for pkg in $(PKG_LOCK_FILES); do \ + ! ./bin/md5-hash $$pkg | grep -qv $(SOURCE_PKG_LOCK_MD5) || { echo "$$pkg does not match main package.json. Please run 'make sync-package-files' locally and commit the results."; exit 1; }; \ + done + @echo "package-file check complete..." + +# copy package.json and package-lock.json for single exercise +copy-package-file: + @cp package.json exercises/practice/$(EXERCISE)/package.json + @cp package-lock.json exercises/practice/$(EXERCISE)/package-lock.json + @cp rescript.json exercises/practice/$(EXERCISE)/rescript.json + +# copy package files to all exercise directories +sync-package-files: + @echo "Syncing package.json and package-lock.json..." + @for exercise in $(EXERCISES); do EXERCISE=$$exercise $(MAKE) -s copy-package-file || exit 1; done + +copy-exercise: + if [ -f exercises/practice/$(EXERCISE)/src/*.res ]; then \ + echo "Copying $(EXERCISE)"; \ + cp exercises/practice/$(EXERCISE)/.meta/*.res $(OUTDIR)/src/; \ + cp exercises/practice/$(EXERCISE)/tests/*.res $(OUTDIR)/tests/; \ + fi + +copy-all-exercises: + @echo "Copying exercises for testing..." + @mkdir -p $(OUTDIR)/src + @mkdir -p $(OUTDIR)/tests + @for exercise in $(EXERCISES); do EXERCISE=$$exercise $(MAKE) -s copy-exercise || exit 1; done + +# Remove the OUTDIR +clean: + @echo "Cleaning tmp directory..." + @rm -rf $(OUTDIR) + +# Format all ReScript files in the project +format: + @echo "Formatting ReScript files..." + @find . -name "node_modules" -prune -o -name "*.res" -print -o -name "*.resi" -print | xargs npx rescript format + +test: + $(MAKE) -s clean + $(MAKE) -s check-package-files + $(MAKE) -s copy-all-exercises + npm run ci \ No newline at end of file diff --git a/config.json b/config.json index 87ba39b..cb0de10 100644 --- a/config.json +++ b/config.json @@ -1,30 +1,101 @@ { + "track_id": "rescript", "language": "ReScript", "slug": "rescript", - "active": false, + "active": true, "status": { "concept_exercises": false, "test_runner": false, "representer": false, "analyzer": false }, - "blurb": "TODO: add blurb", + "blurb": "ReScript is a strongly typed functional language which compiles to both Javascript and native.", "version": 3, "online_editor": { "indent_style": "space", - "indent_size": 4 + "indent_size": 2, + "highlightjs_language": "reasonml" + }, + "test_runner": { + "average_run_time": 7.0 }, "files": { - "solution": [], - "test": [], - "example": [], - "exemplar": [] + "solution": [ + "src/%{pascal_slug}.re" + ], + "test": [ + "__tests__/%{pascal_slug}_test.re" + ], + "example": [ + "src/Example.re" + ], + "exemplar": [ + ".meta/src/Exemplar.re" + ], + "editor": [ + "src/%{pascal_slug}.rei" + ] }, "exercises": { "concept": [], - "practice": [] + "practice": [ + { + "slug": "hello-world", + "name": "Hello World", + "uuid": "63d72b81-c7a4-4a94-8224-69f4c68cc374", + "practices": [], + "prerequisites": [], + "difficulty": 1, + "topics": [ + "setting_up_reasonml_dev_environment", + "strings" + ] + } + ] }, "concepts": [], - "key_features": [], - "tags": [] + "key_features": [ + { + "icon": "stable", + "title": "OCaml's type system", + "content": "ReScript brings OCaml's battle-tested powerful type system to Javascript." + }, + { + "icon": "immutable", + "title": "Inferred types", + "content": "No need to specify types, types are inferred by ReScript compiler and are guaranteed to be correct." + }, + { + "icon": "functional", + "title": "Functional Programming", + "content": "Like OCaml, ReScript is a functional programming language with pattern matching, variants and more." + }, + { + "icon": "interop", + "title": "Easy javascript interop", + "content": "Javascript interop is easy allowing advatange of existing javascript packages and ecosystem." + }, + { + "icon": "fast", + "title": "Fast compiler", + "content": "ReScript compilation times are super fast which means fast iteration cycles." + }, + { + "icon": "fun", + "title": "Refactor with ease", + "content": "Compiler guides you through all places that need to be fixed during refactor until it just works." + } + ], + "tags": [ + "paradigm/functional", + "typing/static", + "typing/strong", + "execution_mode/compiled", + "platform/linux", + "platform/mac", + "platform/windows", + "platform/web", + "used_for/frontends", + "used_for/web_development" + ] } diff --git a/exercises/practice/hello-world/.docs/instructions.md b/exercises/practice/hello-world/.docs/instructions.md new file mode 100644 index 0000000..6e08ebb --- /dev/null +++ b/exercises/practice/hello-world/.docs/instructions.md @@ -0,0 +1,15 @@ +# Instructions + +The classical introductory exercise. Just say "Hello, World!". + +["Hello, World!"](http://en.wikipedia.org/wiki/%22Hello,_world!%22_program) is +the traditional first program for beginning programming in a new language +or environment. + +The objectives are simple: + +- Write a function that returns the string "Hello, World!". +- Run the test suite and make sure that it succeeds. +- Submit your solution and check it at the website. + +If everything goes well, you will be ready to fetch your first real exercise. diff --git a/exercises/practice/hello-world/.meta/HelloWorld.res b/exercises/practice/hello-world/.meta/HelloWorld.res new file mode 100644 index 0000000..1193fbd --- /dev/null +++ b/exercises/practice/hello-world/.meta/HelloWorld.res @@ -0,0 +1 @@ +let hello = () => "Hello, World!" diff --git a/exercises/practice/hello-world/.meta/config.json b/exercises/practice/hello-world/.meta/config.json new file mode 100644 index 0000000..4b53a4c --- /dev/null +++ b/exercises/practice/hello-world/.meta/config.json @@ -0,0 +1,19 @@ +{ + "blurb": "The classical introductory exercise. Just say \"Hello, World!\"", + "authors": [ + "tejasbubane" + ], + "contributors": [ + "naartjie", + "ohana54", + "son1112", + "stevejb71" + ], + "files": { + "solution": ["src/HelloWorld.res"], + "test": ["tests/HelloWorld_test.res"], + "example": [".meta/HelloWorld.res"] + }, + "source": "This is an exercise to introduce users to using Exercism", + "source_url": "http://en.wikipedia.org/wiki/%22Hello,_world!%22_program" +} diff --git a/exercises/practice/hello-world/.meta/tests.toml b/exercises/practice/hello-world/.meta/tests.toml new file mode 100644 index 0000000..73466d6 --- /dev/null +++ b/exercises/practice/hello-world/.meta/tests.toml @@ -0,0 +1,13 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[af9ffe10-dc13-42d8-a742-e7bdafac449d] +description = "Say Hi!" diff --git a/exercises/practice/hello-world/LICENSE b/exercises/practice/hello-world/LICENSE new file mode 100644 index 0000000..90e73be --- /dev/null +++ b/exercises/practice/hello-world/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Exercism + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/exercises/practice/hello-world/package-lock.json b/exercises/practice/hello-world/package-lock.json new file mode 100644 index 0000000..71e448c --- /dev/null +++ b/exercises/practice/hello-world/package-lock.json @@ -0,0 +1,1549 @@ +{ + "name": "@exercism/rescript", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@exercism/rescript", + "license": "MIT", + "dependencies": { + "rescript": "^12.1.0" + }, + "devDependencies": { + "rescript-test": "^8.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-2.0.2.tgz", + "integrity": "sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.3", + "css-tree": "^2.3.1", + "is-potential-custom-element-name": "^1.0.1" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rescript/darwin-arm64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-12.1.0.tgz", + "integrity": "sha512-OuJMT+2h2Lp60n8ONFx1oBAAePSVkM9zl7E/EX4VD2xkQoVTPklz0BpHYOICnFJSCOOdbOhbsTBXdLpo3yvllg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/darwin-x64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-12.1.0.tgz", + "integrity": "sha512-r5Iv4ga+LaNq+6g9LODwZG4bwydd9UDXACP/HKxOfrP9XQCITlF/XqB1ZDJWyJOgJLZSJCd7erlG38YtB0VZKA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/linux-arm64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-12.1.0.tgz", + "integrity": "sha512-UTZv4GTjbyQ/T5LQDfQiGcumK3SzE1K7+ug6gWpDcGZ7ALc7hCS6BVEFL/LDs8iWVwAwkK/6r456s2zRnvS7wQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/linux-x64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-12.1.0.tgz", + "integrity": "sha512-c0PXuBL09JRSA4nQusYbR4mW5QJrBPqxDrqvIX+M79fk3d6jQmj5x4NsBwk5BavxvmbR/JU1JjYBlSAa3h22Vg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/runtime": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-12.1.0.tgz", + "integrity": "sha512-bvr9RfvBD+JS/6foWCA4l2fLXmUXN0KGqylXQPHt09QxUghqgoCiaWVHaHSx5dOIk/jAPlGQ7zB5yVeMas/EFQ==" + }, + "node_modules/@rescript/win32-x64": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-12.1.0.tgz", + "integrity": "sha512-nQC42QByyAbryfkbyK67iskipUqXVwTPCFrqissY4jJoP0128gg0yG6DydJnV1stXphtFdMFHtmyYE1ffG7UBg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jsdom": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.2.0.tgz", + "integrity": "sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/dom-selector": "^2.0.1", + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.16.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/rescript": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.1.0.tgz", + "integrity": "sha512-n/B43wzIEKV4OmlrWbrlQOL4zZaz0RM/Cc8PG2YvhQvQDW7nscHJliDq1AGeVwHoMX68MeaKKzLDOMOMU9Z6FA==", + "license": "SEE LICENSE IN LICENSE", + "peer": true, + "workspaces": [ + "packages/playground", + "packages/@rescript/*", + "tests/dependencies/**", + "tests/analysis_tests/**", + "tests/docstring_tests", + "tests/gentype_tests/**", + "tests/tools_tests", + "scripts/res" + ], + "dependencies": { + "@rescript/runtime": "12.1.0" + }, + "bin": { + "bsc": "cli/bsc.js", + "bstracing": "cli/bstracing.js", + "rescript": "cli/rescript.js", + "rescript-legacy": "cli/rescript-legacy.js", + "rescript-tools": "cli/rescript-tools.js" + }, + "engines": { + "node": ">=20.11.0" + }, + "optionalDependencies": { + "@rescript/darwin-arm64": "12.1.0", + "@rescript/darwin-x64": "12.1.0", + "@rescript/linux-arm64": "12.1.0", + "@rescript/linux-x64": "12.1.0", + "@rescript/win32-x64": "12.1.0" + } + }, + "node_modules/rescript-test": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rescript-test/-/rescript-test-8.0.0.tgz", + "integrity": "sha512-b9RIpl7/YOCP1jl79j6LwRH8mj/5VAnkHaSLwJacMfzQGJL9nawiA53JrOyLNI6alYLrZBMNSWyHrt3QXF5jgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.12", + "jsdom": "^23.1.0" + }, + "bin": { + "retest": "bin/retest.mjs" + }, + "engines": { + "node": ">20.0.0" + }, + "peerDependencies": { + "rescript": "^12.0.1" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/exercises/practice/hello-world/package.json b/exercises/practice/hello-world/package.json new file mode 100644 index 0000000..e367d7a --- /dev/null +++ b/exercises/practice/hello-world/package.json @@ -0,0 +1,26 @@ +{ + "name": "@exercism/rescript", + "description": "Exercism exercises in ReScript.", + "contributors": [ + "Tejas Bubane (https://tejasbubane.github.io/)", + "Owen Rees (https://github.com/therealowenrees)" + ], + "private": true, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/exercism/rescript" + }, + "dependencies": { + "rescript": "^12.1.0" + }, + "devDependencies": { + "rescript-test": "^8.0.0" + }, + "scripts": { + "res:build": "rescript", + "res:start": "rescript build -w", + "test": "retest tmp/tests/*.js", + "ci": "npm run res:build && npm test" + } +} diff --git a/exercises/practice/hello-world/rescript.json b/exercises/practice/hello-world/rescript.json new file mode 100644 index 0000000..ab67515 --- /dev/null +++ b/exercises/practice/hello-world/rescript.json @@ -0,0 +1,15 @@ +{ + "name": "@exercism/rescript", + "sources": [ + { "dir": "tmp/src", "subdirs": true, "type": "dev" }, + { "dir": "tmp/tests", "subdirs": true, "type": "dev" } + ], + "package-specs": [ + { + "module": "esmodule", + "in-source": true + } + ], + "suffix": ".res.js", + "dependencies": ["rescript-test"] +} diff --git a/exercises/practice/hello-world/src/HelloWorld.res b/exercises/practice/hello-world/src/HelloWorld.res new file mode 100644 index 0000000..1503a69 --- /dev/null +++ b/exercises/practice/hello-world/src/HelloWorld.res @@ -0,0 +1 @@ +let hello = () => "Change this to make the tests pass" diff --git a/exercises/practice/hello-world/tests/HelloWorld_test.res b/exercises/practice/hello-world/tests/HelloWorld_test.res new file mode 100644 index 0000000..f9f1a71 --- /dev/null +++ b/exercises/practice/hello-world/tests/HelloWorld_test.res @@ -0,0 +1,8 @@ +open Test + +let stringEqual = (~message=?, a: string, b: string) => + assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b) + +test("Hello World", () => { + stringEqual(~message="Returns hello world", HelloWorld.hello(), "Hello, World!") +}) diff --git a/lib/bs/.compiler.log b/lib/bs/.compiler.log new file mode 100644 index 0000000..f88492a --- /dev/null +++ b/lib/bs/.compiler.log @@ -0,0 +1,2 @@ +#Start(1772880784619) +#Done(1772880784622) diff --git a/lib/bs/.sourcedirs.json b/lib/bs/.sourcedirs.json new file mode 100644 index 0000000..e04a751 --- /dev/null +++ b/lib/bs/.sourcedirs.json @@ -0,0 +1 @@ +{"cmt_scan":[{"also_scan_build_root":true,"build_root":"lib/bs","scan_dirs":["tmp/src","tmp/tests"]}],"dirs":["tmp/src","tmp/tests"],"generated":[],"pkgs":[["rescript-test","/home/owen/Desktop/rescript/node_modules/rescript-test"]],"version":2} \ No newline at end of file diff --git a/lib/bs/build.ninja b/lib/bs/build.ninja new file mode 100644 index 0000000..e69de29 diff --git a/lib/bs/compiler-info.json b/lib/bs/compiler-info.json new file mode 100644 index 0000000..e448368 --- /dev/null +++ b/lib/bs/compiler-info.json @@ -0,0 +1,8 @@ +{ + "version": "12.2.0", + "bsc_path": "/home/owen/Desktop/rescript/node_modules/@rescript/linux-x64/bin/bsc.exe", + "bsc_hash": "ca03c46847ff55e2a2115049975f546b655fceff6fc10e34645da2e812314070", + "rescript_config_hash": "3e1cc7045fb017ccc60b5b5d3292d68791734f3c2ec12676027af056bbacdc32", + "runtime_path": "/home/owen/Desktop/rescript/node_modules/@rescript/runtime", + "generated_at": "1772880784624" +} \ No newline at end of file diff --git a/lib/ocaml/.compiler.log b/lib/ocaml/.compiler.log new file mode 100644 index 0000000..f88492a --- /dev/null +++ b/lib/ocaml/.compiler.log @@ -0,0 +1,2 @@ +#Start(1772880784619) +#Done(1772880784622) diff --git a/lib/ocaml/HelloWorld.ast b/lib/ocaml/HelloWorld.ast new file mode 100644 index 0000000000000000000000000000000000000000..001131283d2a72c21af2ef50ef08f6d416698438 GIT binary patch literal 252 zcmZQzU|{6Z&&bbB)z2?a&C_>DEzT~^k zNznt!akWfcwvT~XIhaDdZ@bdwz&Tn?}>IXZYc zu&_96cv@3olSH(3}G-l8!))tUx9U6APPz0|4LnQ)K`E literal 0 HcmV?d00001 diff --git a/lib/ocaml/HelloWorld.cmi b/lib/ocaml/HelloWorld.cmi new file mode 100644 index 0000000000000000000000000000000000000000..1bb23c4e9010b96dded7a4557eb08fccc6b424c2 GIT binary patch literal 646 zcmZ=x%*`>hw6ydzFfwYHx@;c<1H*J6mImTXAdX+4<&m0`lOLX6l#{Yx!3IX=H>w#R z0fz${4lZ!muzA7;SC!Jd%n}EO2@XuGUmr3s`~eC2suhi-Gbj$RK6_6}UIKs&f3B_}f}KBTfB zb%Fug>~Gy+jo!AVUv_Uh(AJx@V1X`FKDaVBDL-d|0lU*H#kP2nGii$RJ=Zq-e^{_U zAF9H?C?yr-y$J@o-whKo6mys3^Z^g24m@&mWtzS55ss zzhtHU?w^MdE_KhzPf7&3v>`!SJ4CX6D*m<6Q%q>=VwC3T=b*C0AFb*in%*`yxEK7~gDvnRBC`l~> zx>F)FT1@QFyoeXBP4|o~XL$lcJ0P{FEU_4yU|_HYVm=_&17ghs6E>)3q~_%0PgtYZd;^d;tf|3Or9Mwy53-pVNlGXKqf_hoS4h{g=9w3(h literal 0 HcmV?d00001 diff --git a/lib/ocaml/HelloWorld.cmt b/lib/ocaml/HelloWorld.cmt new file mode 100644 index 0000000000000000000000000000000000000000..f6fb2001d0dff8cfb9f836f6754df8f4cf82b691 GIT binary patch literal 3481 zcmbtX32YQq7@jF_g^G%ZG#JG|PYUeLS_GwtzUe``z3BnSHO%hLwnJxUHZ!xOt$5%; zOgu6W1r;OD0|E+UP{c$cDHx0g#tUOK9uP>p&|pCD*8k1Xt=J;bZC_?~-uM6i_x|_2 zfBr2Olgc$SXU>d-OG@s3c=KL{Vb;UA5{3*zAd{;lMbYMKx)LYEW``Xw=%5d9pS_P@ z`vuFc%ulPbiLr&V0zV#MnBVBb`a;9hWwkx?_;+maF5nMr_hpxG9a>W2v=x%dRY*ps zsiinwGGe-%GC4Du;tV~;WkQEwj>i>!D2vAtjIm3V-3%0Y7~jL#PX=6v-@H||v!|chv%7Eg15rYP-h4|>GO8(7 zczD@26ITnDA52W#7}OFSL_>_L)=#fm6I6K<;zNUUi|WydzyAJ85R|y32W`$ z@!7{E$G+LJa#q88rxT;zC#28~Vud$OSa4(Ht)nAzdJe2S^5~8?37OWU%SqXkyCh+` zAxPb(qyx`!ZHsbp_CK-UtI9h+pEmQc2xPlS(z`?ha0cY+?Z-d(V$c2)b@gxDw0*;O z0YdUBw4@bQj`u!u@2`!=Ke_(~{>vLyZSi)FVPVJmKe*geVQaq%FFeUG>_LVZZZXUS z$44;CEM|Zb*Vx2<5|h5eRFPkMiX1X`v+Nm&#@Uvz zDPQU=d)j$$68KMJ2*!xb{NYWTc0TWacK-c??TY-UrYYDl#CQ#P*IrVP5EVm$a|Y+9 zP*62h5_rt~Nsk0fFU>dgv@?rFV9diAfh!L&vCZens_DCOr!K-gU2AzkLea#t=0<_( zaBSBVM&)*Dh=!qAFvQIB=wl5%Z}zZz)GE9#dMvq{1zx2*dpi>Fz0A| zax>h8VNAkyO(9f@wBjv^*l3JXbQZGK#i zWgOQ#$R^MOIc(1h(Ybk|l9miw3c;58Tu77Q`J9V-2owTHWyo<MvHZ?9KWL1g_x)e+6wDt%|EuK~+s?I#dLaQK2_F701dfRtY z<)rKh|0^aa;AUz1t_#a)KvkLtH@CDL`6u6CaryFJGu{2v?#ST77$$X&8?Frqy|ucT`(W0VKH0KAui z$D(~`BYXie`RR0i#tGZSE1L@X22~dZqR^_mR94Qw`*L~L5j*l@1X5~ zYAKrYH^$df9bHR<9-^=*=p*zZz~&b?ZzRtVrl1-M`jmpEp)b%Y0BR0L)Gkqx5?;;k|EW0nj zMtEEYml_^7P}kQn=#2eBfGzX&(FXPw6&@d8M^pKYzyY>8z+MM#*E|(;dXlLVoQ7zk zl{v5?d)PR!uo61>r<=WS9Pj7@h<0nvKuf+-DdxCBx*P zb93p0gHZ#R#5%=xDX5A`sRRRIJtiB;{uZ)iAVy1@skC{$WVofG)N3zGX;T?mZp;{@ z-4qSe`Y%0dcJ8@WN0$&apePVDl4Mt$3p&JJd3nqv14D~-=;8%;8aYhY;HF)RSC!*HDx=g "Hello, World!" diff --git a/lib/ocaml/HelloWorld_test.ast b/lib/ocaml/HelloWorld_test.ast new file mode 100644 index 0000000000000000000000000000000000000000..99cfada3b2b53eae443aef500c168909ebcee7e1 GIT binary patch literal 1377 zcmbVM-Afcv6ra^o>ZXuTP%oy7Jwy-2Y}cL z4N7{6tC5H=4M9W^cBB4)f(Yt0vgoDW`nJxwH$Td^Waa!g=XZYR+;iq$P1Ev&^=4n6 z)o9s$?ZKm_;|3#LR@{tO17;#pZ92WKm5kV?(`I)k-H01cMqDI0k>#uwa#SECICgb< zPSapP(*k?Yj^Ted=hp@Iib>fQIeY(GJgV0S$cX9(^r$ZYqPh;5y6!^;fX?}(&V}#s z?T%}ACpv5TQ?Wi|t!Ks|0r|{mBC`J`%}e5@X3nC^vjaKAUF(V~l zA2Uv_)~I2|pnzIt46V|5iamIxF~>1&x7$jf(2;75X*i4qvIj|w^S@4Zi~@%RG?8tj z!+DSmS&)T9kB6Jjn|2pA!{8imgYm>@f} zGD^~1CXEP~lwg$N_~%0&?SMdtJl=jC$AIvU4KJ3QkR=(Fe9VkyDoFSVGYrV4o-!Z@Tj0K&LNQ$(3_q(4Xyf=3 z@LVBpu@l^gylI8hw6ydzFfwYHx@;c<1ET~31A_$+UjX8R3-mowb8_;-^NVs);!9GCOBO8H zz{vbrySSt%GcVn>urx8p;lPH23nng5&rK~ZPE1eTaDdZNKO;XkRX@KxHBa9qwK%&Z zzd*kzwK%ybv!F!3B)32xWKc1>$$CH~&ff6{SeTr>(;PNzp0L4FEx({7Ge6H^0f^_T z2C>w^VS)n_>(_@24Bz3bA3!I7wO}gx36)~ugsc7qGR{?{G%vFRVc2g6sHuNojK2;O zoFNwdbJ%czMZ?+K{{V}ovv-t(g99|I9s|S38yIFnK>GdyjKG>;AQgFjmFfoHumC6K zI4I}+26Xu z8og~zzwF+2pshD)!2(^Vd~juMQhv?^19qoZif!>CXVMhsd#-Kv{{XZes=~i0B^4As z6AW~}GhdNgBUAOHTDG9*!{dhtTYM6$Dkm6ZXWBaSl_Y6rbLZu)`?l@#f(1HIGrWpj zEAl27tXX})&)|i@fzZp7rcZe&Yqns49zsD;QGU?`g9!?rKQ?8rn)-cy$x8j*KMx~Z z>YkIIln8WbLxQw=pmT!NM&4b*tpQsY5Uy}ZECKqpYTezNMo(U?sIm6D_$`h9(t-tQ z5KAT)%vXr8^E~~STdeYE&BK}NPAynq98i>*n^}@smKvW`9G_ZIl3E0Gr$lJ9nAo9t z5ieYu?ipLo@?5Y$D&8;3A$LBVUE1=QNzzB?PIB);}a7JB| literal 0 HcmV?d00001 diff --git a/lib/ocaml/HelloWorld_test.cmj b/lib/ocaml/HelloWorld_test.cmj new file mode 100644 index 0000000000000000000000000000000000000000..eeb6401af17211a03cfe60f4370a54fc42e50422 GIT binary patch literal 103 zcmd<+<5K!4J;_ZsEwSv*$xybIsmt~;Ffcd+F&_{c0I~Lg2^+MFONuh{(p?Kn6LTgk zSm5jc1Pdk@Iiyyk7A0pE=js=w7AF^F7L+X5;HX)WTcBT(T3k}Bt_Kv>%PMwo000Ow BBs%~A literal 0 HcmV?d00001 diff --git a/lib/ocaml/HelloWorld_test.cmt b/lib/ocaml/HelloWorld_test.cmt new file mode 100644 index 0000000000000000000000000000000000000000..4c6d464d79fb5a76b4f4072f51bbe85739902d76 GIT binary patch literal 7186 zcmbtZ3z!tum9DBjg*+4@3egpm8D>C&Gt&-1Wq^2lngNDp9z0ciG~F{b(9qL8R(JD? z#6?#U4Z1Z%@s-4q2r)jeUBY2iqRaC$7Kaa6i1n@FdG&0kHUT%kf( zLeoFpr6>mq)MrpZHaV8*pjSox3f!MFTth`JmB<#s4hawS3!nH>SYcPt--MH=^TUyr zJdFuQ76>6cTkVF8BCy$Dyx*~pF_snlhb#W=p-QJ|ertW8?W4)tme_X1Ty)+Fp8fG# zx4lq*Q(g?XeRcaE7tgcpv2(KR$wWLlcV(Ah1^e8)|NHaTL?(~_i3kbjh^|h9cA}5K6+!zUWoTNTFiEXhsO$59SFR7?jyriz5DIqUFP21 zyNXg~##XJgf=d&V#ckR6*rfwfsV)0=?6d6)Jd7Ech7~C*_{hWg=HUCm{JdAz-+BA4 z;TPFv*I;x9)Z3Wl2+`oG0b*~+^c0BjS>^YHHwmou6y3-0K zKV0>|_YSpu_@{M~LVupL=0R`R6&1r>_!D7o4$Uphp|iFq3VmBq2A3(y>5Y9AWuj8* z?cI*;+`ZFsg!G4yZBgLwnmHlSfSD5#jUohJrH~L55W*piNI-#cij5Mr_)l!wv~`>R zxAo{h;Y_KBr_)Kdp%C5nPUq^%j#x5dU=Cp}jEbhxDI*#Z%3+p?>T4>pW=_^pUm+k} z;2nZY;e`10#C3S<)^c3OD92HM2;)bwGVN#RsPg~g~SF>pO z`D0iu8s-Te2J|z9(>$J?Bb7k_iMFLv2p+k%Y}yp`HD~HbV@1kWDI~Qm1Hjp$7;;>j zIbNt~5+OE1yrLQXmcpvI*KHMZ5a@(u(?B#I$MWqfKz$Rx3xqRc6hc}q>2=U{=nNT7 zT0jkvRI{jO*tz8`OX~sBAI<6+cV1-!&n+%v;OQ=~gq|UJoYv7@X1X(h0r3>2F%oeO zRPdB&l`WlVl`+$dtt{}>NWK{^pK?8z=Hu5aoaq(GM5d_gc*z%WJHD{|%By9!W2|1R zysnNreHzDQ8e-F6)JgW4fa)xmA%!nQ@<>H{qOAzrBsp8*9d@rXznbgj$C5cC!+{TN z8FK*}!^50Kt8Gksn6g>|HN_Ss+NLIqWIL_Fu(LF(5_AKY#uS)nEn$+|=+ZKSZlQK) za)WSMM(0vXQ|aY}v1jYIkDlihS{RtL)NZ!0SdBrx4%6u#mID;LZ4k~?b@Ni~Mn@uL zv`0;&EoXA1iFT&jb4eqNF&U{?v<60U)=ML8@R6p;&!708!Y17{-Bl1kTcGpgbQ=On z_41gRio$i12}HP9GTIf(a;T$iv<^19vO1K>7-lxw5lbXcfL>rm47X_rJx?~6uNd2qYLBKnq8$mp zYc$s7LpZi+7`;S41>fakn$yrHolCWQXtgfa%gi;BUZpMInlpOpQ5sKRM;gyU-(wm4?`K|=_O=E5Dm z#P3r$i#TGr3E|UQz}RJM=YC=5dpU3V;HbRGCe6v~Y8~elx;l{)3&d<^LrFTNs|}nM z>FQLO7j1BQXp;@Dj-MgDEw!$#m z9=cdKy*3esk}Y<9IC2fu3DVsD6oa;nQcFk~Ps;y);7PhsS4$s3Ls$r;U^c6Pzm&xw zV{0!~H(mWfII;w<+ryEisO%v)sp}T1cCUxHURO&WthSX@mZx(B4VTa~$fiNmpZeR5 zwX=u9w&kU;EMrqR(uvpRa3mvTM2a%*qQMUJL0|yl+0+ME)QT0&SM|fPcv01#ha)+_ z>Vtm$4&hF|pJPRqwcDAM2Fd^X)02cCN?-IJ&Fg6@!>ix8c%dL4^ix2@tHRM+OPceUnqZ7vg+ z33>{_m0t6ZTXe1Tfu0Nqyd_re6SgIDJ6)?qi;ERq3vlGrhUnU0&yD6oJ3Z7bkUxfW z?GmgN7b0K95*RRao>o?QTJjDf_&c*_+JJHSZ$&(S^coU;*_c7M> zAZ!q-vPMqvBPWTnPI|;C$D0|-_kCYhZYj(R&B zwHn_KxE%>7Kq`4qi_L@ViLU0@2)eq}W7qUR>4VxXj~ycWha*>G)5tEMt1s#5I$eDn z92=ww-qKYh?XXW^P&g8yQ`yQIord}!*^ce{Z{WNNUP7jM9vm1xRaMsEL8EhB((;^` z)2G)k8{HVIO_W~8p2rpWVnv-Sc(z!893td3xAb@FUwggi8)kJ<7u*NEL9<1YDQ z48sPhPy>5a?E^$!Ib#siLI`RfS9ZnB7?$7O?Y4#8JtJh@W;V#2OK#*`9FaM2A)7NW z(eKSXC}P3w5S0V1pmFd=wKU2NRS4k`+d489Gx$x@ROLZcc?jfMm&6KI!!8bo(i#zj zwfC@4>e{8!m{9pMpEw}xj;c%ilKp;(yR3rwQ}lGU?CB?LVU+Ci-XFts7s!&oQX_1j zYYTbp(bYyhuu@m2@xn1~wvo-5smzGQd=fiiIUmL9>Lk|tVOQCwK|bP=uS&C)tAW3& z+84xU5poR)3_!@23Znc=y4p4Ov&hkS>ry-l3sp)X!oJ@korq=p)&+hY@-Pe*eOf5dcvmV+?5Yp{r?Pdk4wHUNUo7+{5ANU8t6lJ!etO4#>zN6knVCJ zx;IuyZ7y)Vx=dHU%ZU43m^~m5xa2`O01Kr8edz%gY#Hhgx%Ho8NFJljHclYGe~W^svJ@kB!)5`Qa3!2XG@+ZW#ClW>Z1MytbJWp-iAI&J*@ag2(`2w zTI<^Dc)K&0`sl|z0vm1qlN|k~f7O5-m2?Z}?H=VP6RF&asudS~vnHNM)xgpPKh*4E#=2F>2r%{E|i^cuw{vR?t0HF30C*9oF(A^i{P~BB0SQXDeleVR} zrl?BAI*nQZh0V4^rn9h>s6CP=oy&IRvUNtrJ=du#++EbMLsl=zOfHlh;jHqWq&kLE z{=efUq+j`0^_II7&)`7ErU7=plix5E$Ii2BO~E+A3O>GO!M*=J=DaH=n%BOuw{^9b zBhhgEm`CV*+6pH-{yDkK$&YiYuG6IBU5V&{zQ;SFKiQLhJuvWi7X|)(%8Bk6{QHy> w-%^~!RmcB%UE*tTqWhMUxwG*#J@L(tFXcpcM>^peru51QBVKwv6|%(t0;=kpxBvhE literal 0 HcmV?d00001 diff --git a/lib/ocaml/HelloWorld_test.res b/lib/ocaml/HelloWorld_test.res new file mode 100644 index 0000000..f9f1a71 --- /dev/null +++ b/lib/ocaml/HelloWorld_test.res @@ -0,0 +1,8 @@ +open Test + +let stringEqual = (~message=?, a: string, b: string) => + assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b) + +test("Hello World", () => { + stringEqual(~message="Returns hello world", HelloWorld.hello(), "Hello, World!") +}) diff --git a/lib/rescript.lock b/lib/rescript.lock new file mode 100644 index 0000000..ee6a30e --- /dev/null +++ b/lib/rescript.lock @@ -0,0 +1 @@ +59375 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bc30ff1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1558 @@ +{ + "name": "@exercism/rescript", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@exercism/rescript", + "license": "MIT", + "dependencies": { + "rescript": "^12.1.0" + }, + "devDependencies": { + "rescript-test": "^8.0.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-2.0.2.tgz", + "integrity": "sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.3", + "css-tree": "^2.3.1", + "is-potential-custom-element-name": "^1.0.1" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rescript/darwin-arm64": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-12.2.0.tgz", + "integrity": "sha512-xc3K/J7Ujl1vPiFY2009mRf3kWRlUe/VZyJWprseKxlcEtUQv89ter7r6pY+YFbtYvA/fcaEncL9CVGEdattAg==", + "cpu": [ + "arm64" + ], + "license": "(LGPL-3.0-or-later AND MIT)", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/darwin-x64": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-12.2.0.tgz", + "integrity": "sha512-qqcTvnlSeoKkywLjG7cXfYvKZ1e4Gz2kUKcD6SiqDgCqm8TF+spwlFAiM6sloRUOFsc0bpC/0R0B3yr01FCB1A==", + "cpu": [ + "x64" + ], + "license": "(LGPL-3.0-or-later AND MIT)", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/linux-arm64": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-12.2.0.tgz", + "integrity": "sha512-ODmpG3ji+Nj/8d5yvXkeHlfKkmbw1Q4t1iIjVuNwtmFpz7TiEa7n/sQqoYdE+WzbDX3DoJfmJNbp3Ob7qCUoOg==", + "cpu": [ + "arm64" + ], + "license": "(LGPL-3.0-or-later AND MIT)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/linux-x64": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-12.2.0.tgz", + "integrity": "sha512-2W9Y9/g19Y4F/subl8yV3T8QBG2oRaP+HciNRcBjptyEdw9LmCKH8+rhWO6sp3E+nZLwoE2IAkwH0WKV3wqlxQ==", + "cpu": [ + "x64" + ], + "license": "(LGPL-3.0-or-later AND MIT)", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@rescript/runtime": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-12.2.0.tgz", + "integrity": "sha512-NwfljDRq1rjFPHUaca1nzFz13xsa9ZGkBkLvMhvVgavJT5+A4rMcLu8XAaVTi/oAhO/tlHf9ZDoOTF1AfyAk9Q==", + "license": "MIT" + }, + "node_modules/@rescript/win32-x64": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-12.2.0.tgz", + "integrity": "sha512-fhf8CBj3p1lkIXPeNko3mVTKQfXXm4BoxJtR1xAXxUn43wDpd8Lox4w8/EPBbbW6C/YFQW6H7rtpY+2AKuNaDA==", + "cpu": [ + "x64" + ], + "license": "(LGPL-3.0-or-later AND MIT)", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jsdom": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.2.0.tgz", + "integrity": "sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/dom-selector": "^2.0.1", + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.16.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/rescript": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.2.0.tgz", + "integrity": "sha512-1Jf2cmNhyx5Mj2vwZ4XXPcXvNSjGj9D1jPBUcoqIOqRpLPo1ch2Ta/7eWh23xAHWHK5ow7BCDyYFjvZSjyjLzg==", + "license": "(LGPL-3.0-or-later AND MIT)", + "peer": true, + "workspaces": [ + "packages/playground", + "packages/@rescript/*", + "tests/dependencies/**", + "tests/analysis_tests/**", + "tests/docstring_tests", + "tests/gentype_tests/**", + "tests/tools_tests", + "tests/commonjs_tests", + "scripts/res" + ], + "dependencies": { + "@rescript/runtime": "12.2.0" + }, + "bin": { + "bsc": "cli/bsc.js", + "bstracing": "cli/bstracing.js", + "rescript": "cli/rescript.js", + "rescript-legacy": "cli/rescript-legacy.js", + "rescript-tools": "cli/rescript-tools.js" + }, + "engines": { + "node": ">=20.11.0" + }, + "optionalDependencies": { + "@rescript/darwin-arm64": "12.2.0", + "@rescript/darwin-x64": "12.2.0", + "@rescript/linux-arm64": "12.2.0", + "@rescript/linux-x64": "12.2.0", + "@rescript/win32-x64": "12.2.0" + } + }, + "node_modules/rescript-test": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rescript-test/-/rescript-test-8.0.0.tgz", + "integrity": "sha512-b9RIpl7/YOCP1jl79j6LwRH8mj/5VAnkHaSLwJacMfzQGJL9nawiA53JrOyLNI6alYLrZBMNSWyHrt3QXF5jgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.12", + "jsdom": "^23.1.0" + }, + "bin": { + "retest": "bin/retest.mjs" + }, + "engines": { + "node": ">20.0.0" + }, + "peerDependencies": { + "rescript": "^12.0.1" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e367d7a --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "@exercism/rescript", + "description": "Exercism exercises in ReScript.", + "contributors": [ + "Tejas Bubane (https://tejasbubane.github.io/)", + "Owen Rees (https://github.com/therealowenrees)" + ], + "private": true, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/exercism/rescript" + }, + "dependencies": { + "rescript": "^12.1.0" + }, + "devDependencies": { + "rescript-test": "^8.0.0" + }, + "scripts": { + "res:build": "rescript", + "res:start": "rescript build -w", + "test": "retest tmp/tests/*.js", + "ci": "npm run res:build && npm test" + } +} diff --git a/rescript.json b/rescript.json new file mode 100644 index 0000000..ab67515 --- /dev/null +++ b/rescript.json @@ -0,0 +1,15 @@ +{ + "name": "@exercism/rescript", + "sources": [ + { "dir": "tmp/src", "subdirs": true, "type": "dev" }, + { "dir": "tmp/tests", "subdirs": true, "type": "dev" } + ], + "package-specs": [ + { + "module": "esmodule", + "in-source": true + } + ], + "suffix": ".res.js", + "dependencies": ["rescript-test"] +} From 1562c3e5797c809b4eaa78fba3048cbb240bb400 Mon Sep 17 00:00:00 2001 From: Owen Date: Sat, 7 Mar 2026 12:09:44 +0100 Subject: [PATCH 02/23] update formatting --- config.json | 37 +++++++++---------- .../practice/hello-world/.meta/config.json | 14 +++++-- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/config.json b/config.json index cb0de10..fc82999 100644 --- a/config.json +++ b/config.json @@ -1,5 +1,4 @@ { - "track_id": "rescript", "language": "ReScript", "slug": "rescript", "active": true, @@ -17,7 +16,7 @@ "highlightjs_language": "reasonml" }, "test_runner": { - "average_run_time": 7.0 + "average_run_time": 7 }, "files": { "solution": [ @@ -37,7 +36,6 @@ ] }, "exercises": { - "concept": [], "practice": [ { "slug": "hello-world", @@ -53,48 +51,47 @@ } ] }, - "concepts": [], "key_features": [ { - "icon": "stable", "title": "OCaml's type system", - "content": "ReScript brings OCaml's battle-tested powerful type system to Javascript." + "content": "ReScript brings OCaml's battle-tested powerful type system to Javascript.", + "icon": "stable" }, { - "icon": "immutable", "title": "Inferred types", - "content": "No need to specify types, types are inferred by ReScript compiler and are guaranteed to be correct." + "content": "No need to specify types, types are inferred by ReScript compiler and are guaranteed to be correct.", + "icon": "immutable" }, { - "icon": "functional", "title": "Functional Programming", - "content": "Like OCaml, ReScript is a functional programming language with pattern matching, variants and more." + "content": "Like OCaml, ReScript is a functional programming language with pattern matching, variants and more.", + "icon": "functional" }, { - "icon": "interop", "title": "Easy javascript interop", - "content": "Javascript interop is easy allowing advatange of existing javascript packages and ecosystem." + "content": "Javascript interop is easy allowing advatange of existing javascript packages and ecosystem.", + "icon": "interop" }, { - "icon": "fast", "title": "Fast compiler", - "content": "ReScript compilation times are super fast which means fast iteration cycles." + "content": "ReScript compilation times are super fast which means fast iteration cycles.", + "icon": "fast" }, { - "icon": "fun", "title": "Refactor with ease", - "content": "Compiler guides you through all places that need to be fixed during refactor until it just works." + "content": "Compiler guides you through all places that need to be fixed during refactor until it just works.", + "icon": "fun" } ], "tags": [ - "paradigm/functional", - "typing/static", - "typing/strong", "execution_mode/compiled", + "paradigm/functional", "platform/linux", "platform/mac", - "platform/windows", "platform/web", + "platform/windows", + "typing/static", + "typing/strong", "used_for/frontends", "used_for/web_development" ] diff --git a/exercises/practice/hello-world/.meta/config.json b/exercises/practice/hello-world/.meta/config.json index 4b53a4c..2a56135 100644 --- a/exercises/practice/hello-world/.meta/config.json +++ b/exercises/practice/hello-world/.meta/config.json @@ -1,5 +1,4 @@ { - "blurb": "The classical introductory exercise. Just say \"Hello, World!\"", "authors": [ "tejasbubane" ], @@ -10,10 +9,17 @@ "stevejb71" ], "files": { - "solution": ["src/HelloWorld.res"], - "test": ["tests/HelloWorld_test.res"], - "example": [".meta/HelloWorld.res"] + "solution": [ + "src/HelloWorld.res" + ], + "test": [ + "tests/HelloWorld_test.res" + ], + "example": [ + ".meta/HelloWorld.res" + ] }, + "blurb": "The classical introductory exercise. Just say \"Hello, World!\"", "source": "This is an exercise to introduce users to using Exercism", "source_url": "http://en.wikipedia.org/wiki/%22Hello,_world!%22_program" } From 6761c64aec2daf22f2e3e4cfc92f6affb79ed798 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 15:30:40 +0100 Subject: [PATCH 03/23] update placement of dependencies to allow tests to run --- exercises/practice/hello-world/rescript.json | 2 +- rescript.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/practice/hello-world/rescript.json b/exercises/practice/hello-world/rescript.json index ab67515..957e8c1 100644 --- a/exercises/practice/hello-world/rescript.json +++ b/exercises/practice/hello-world/rescript.json @@ -11,5 +11,5 @@ } ], "suffix": ".res.js", - "dependencies": ["rescript-test"] + "dev-dependencies": ["rescript-test"] } diff --git a/rescript.json b/rescript.json index ab67515..957e8c1 100644 --- a/rescript.json +++ b/rescript.json @@ -11,5 +11,5 @@ } ], "suffix": ".res.js", - "dependencies": ["rescript-test"] + "dev-dependencies": ["rescript-test"] } From 2a15d8444b66cf6df4bf12486e9d87a1947cd9ae Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 15:32:58 +0100 Subject: [PATCH 04/23] remove ad ignore build artifacts --- .gitignore | 1 + lib/bs/.compiler.log | 2 -- lib/bs/.sourcedirs.json | 1 - lib/bs/build.ninja | 0 lib/bs/compiler-info.json | 8 -------- lib/ocaml/.compiler.log | 2 -- lib/ocaml/HelloWorld.ast | Bin 252 -> 0 bytes lib/ocaml/HelloWorld.cmi | Bin 646 -> 0 bytes lib/ocaml/HelloWorld.cmj | Bin 95 -> 0 bytes lib/ocaml/HelloWorld.cmt | Bin 3481 -> 0 bytes lib/ocaml/HelloWorld.res | 1 - lib/ocaml/HelloWorld_test.ast | Bin 1377 -> 0 bytes lib/ocaml/HelloWorld_test.cmi | Bin 836 -> 0 bytes lib/ocaml/HelloWorld_test.cmj | Bin 103 -> 0 bytes lib/ocaml/HelloWorld_test.cmt | Bin 7186 -> 0 bytes lib/ocaml/HelloWorld_test.res | 8 -------- lib/rescript.lock | 1 - 17 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 lib/bs/.compiler.log delete mode 100644 lib/bs/.sourcedirs.json delete mode 100644 lib/bs/build.ninja delete mode 100644 lib/bs/compiler-info.json delete mode 100644 lib/ocaml/.compiler.log delete mode 100644 lib/ocaml/HelloWorld.ast delete mode 100644 lib/ocaml/HelloWorld.cmi delete mode 100644 lib/ocaml/HelloWorld.cmj delete mode 100644 lib/ocaml/HelloWorld.cmt delete mode 100644 lib/ocaml/HelloWorld.res delete mode 100644 lib/ocaml/HelloWorld_test.ast delete mode 100644 lib/ocaml/HelloWorld_test.cmi delete mode 100644 lib/ocaml/HelloWorld_test.cmj delete mode 100644 lib/ocaml/HelloWorld_test.cmt delete mode 100644 lib/ocaml/HelloWorld_test.res delete mode 100644 lib/rescript.lock diff --git a/.gitignore b/.gitignore index 2fd99d4..786b71a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ node_modules tmp exercises/**/.gitignore +lib diff --git a/lib/bs/.compiler.log b/lib/bs/.compiler.log deleted file mode 100644 index f88492a..0000000 --- a/lib/bs/.compiler.log +++ /dev/null @@ -1,2 +0,0 @@ -#Start(1772880784619) -#Done(1772880784622) diff --git a/lib/bs/.sourcedirs.json b/lib/bs/.sourcedirs.json deleted file mode 100644 index e04a751..0000000 --- a/lib/bs/.sourcedirs.json +++ /dev/null @@ -1 +0,0 @@ -{"cmt_scan":[{"also_scan_build_root":true,"build_root":"lib/bs","scan_dirs":["tmp/src","tmp/tests"]}],"dirs":["tmp/src","tmp/tests"],"generated":[],"pkgs":[["rescript-test","/home/owen/Desktop/rescript/node_modules/rescript-test"]],"version":2} \ No newline at end of file diff --git a/lib/bs/build.ninja b/lib/bs/build.ninja deleted file mode 100644 index e69de29..0000000 diff --git a/lib/bs/compiler-info.json b/lib/bs/compiler-info.json deleted file mode 100644 index e448368..0000000 --- a/lib/bs/compiler-info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": "12.2.0", - "bsc_path": "/home/owen/Desktop/rescript/node_modules/@rescript/linux-x64/bin/bsc.exe", - "bsc_hash": "ca03c46847ff55e2a2115049975f546b655fceff6fc10e34645da2e812314070", - "rescript_config_hash": "3e1cc7045fb017ccc60b5b5d3292d68791734f3c2ec12676027af056bbacdc32", - "runtime_path": "/home/owen/Desktop/rescript/node_modules/@rescript/runtime", - "generated_at": "1772880784624" -} \ No newline at end of file diff --git a/lib/ocaml/.compiler.log b/lib/ocaml/.compiler.log deleted file mode 100644 index f88492a..0000000 --- a/lib/ocaml/.compiler.log +++ /dev/null @@ -1,2 +0,0 @@ -#Start(1772880784619) -#Done(1772880784622) diff --git a/lib/ocaml/HelloWorld.ast b/lib/ocaml/HelloWorld.ast deleted file mode 100644 index 001131283d2a72c21af2ef50ef08f6d416698438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmZQzU|{6Z&&bbB)z2?a&C_>DEzT~^k zNznt!akWfcwvT~XIhaDdZ@bdwz&Tn?}>IXZYc zu&_96cv@3olSH(3}G-l8!))tUx9U6APPz0|4LnQ)K`E diff --git a/lib/ocaml/HelloWorld.cmi b/lib/ocaml/HelloWorld.cmi deleted file mode 100644 index 1bb23c4e9010b96dded7a4557eb08fccc6b424c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmZ=x%*`>hw6ydzFfwYHx@;c<1H*J6mImTXAdX+4<&m0`lOLX6l#{Yx!3IX=H>w#R z0fz${4lZ!muzA7;SC!Jd%n}EO2@XuGUmr3s`~eC2suhi-Gbj$RK6_6}UIKs&f3B_}f}KBTfB zb%Fug>~Gy+jo!AVUv_Uh(AJx@V1X`FKDaVBDL-d|0lU*H#kP2nGii$RJ=Zq-e^{_U zAF9H?C?yr-y$J@o-whKo6mys3^Z^g24m@&mWtzS55ss zzhtHU?w^MdE_KhzPf7&3v>`!SJ4CX6D*m<6Q%q>=VwC3T=b*C0AFb*in%*`yxEK7~gDvnRBC`l~> zx>F)FT1@QFyoeXBP4|o~XL$lcJ0P{FEU_4yU|_HYVm=_&17ghs6E>)3q~_%0PgtYZd;^d;tf|3Or9Mwy53-pVNlGXKqf_hoS4h{g=9w3(h diff --git a/lib/ocaml/HelloWorld.cmt b/lib/ocaml/HelloWorld.cmt deleted file mode 100644 index f6fb2001d0dff8cfb9f836f6754df8f4cf82b691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3481 zcmbtX32YQq7@jF_g^G%ZG#JG|PYUeLS_GwtzUe``z3BnSHO%hLwnJxUHZ!xOt$5%; zOgu6W1r;OD0|E+UP{c$cDHx0g#tUOK9uP>p&|pCD*8k1Xt=J;bZC_?~-uM6i_x|_2 zfBr2Olgc$SXU>d-OG@s3c=KL{Vb;UA5{3*zAd{;lMbYMKx)LYEW``Xw=%5d9pS_P@ z`vuFc%ulPbiLr&V0zV#MnBVBb`a;9hWwkx?_;+maF5nMr_hpxG9a>W2v=x%dRY*ps zsiinwGGe-%GC4Du;tV~;WkQEwj>i>!D2vAtjIm3V-3%0Y7~jL#PX=6v-@H||v!|chv%7Eg15rYP-h4|>GO8(7 zczD@26ITnDA52W#7}OFSL_>_L)=#fm6I6K<;zNUUi|WydzyAJ85R|y32W`$ z@!7{E$G+LJa#q88rxT;zC#28~Vud$OSa4(Ht)nAzdJe2S^5~8?37OWU%SqXkyCh+` zAxPb(qyx`!ZHsbp_CK-UtI9h+pEmQc2xPlS(z`?ha0cY+?Z-d(V$c2)b@gxDw0*;O z0YdUBw4@bQj`u!u@2`!=Ke_(~{>vLyZSi)FVPVJmKe*geVQaq%FFeUG>_LVZZZXUS z$44;CEM|Zb*Vx2<5|h5eRFPkMiX1X`v+Nm&#@Uvz zDPQU=d)j$$68KMJ2*!xb{NYWTc0TWacK-c??TY-UrYYDl#CQ#P*IrVP5EVm$a|Y+9 zP*62h5_rt~Nsk0fFU>dgv@?rFV9diAfh!L&vCZens_DCOr!K-gU2AzkLea#t=0<_( zaBSBVM&)*Dh=!qAFvQIB=wl5%Z}zZz)GE9#dMvq{1zx2*dpi>Fz0A| zax>h8VNAkyO(9f@wBjv^*l3JXbQZGK#i zWgOQ#$R^MOIc(1h(Ybk|l9miw3c;58Tu77Q`J9V-2owTHWyo<MvHZ?9KWL1g_x)e+6wDt%|EuK~+s?I#dLaQK2_F701dfRtY z<)rKh|0^aa;AUz1t_#a)KvkLtH@CDL`6u6CaryFJGu{2v?#ST77$$X&8?Frqy|ucT`(W0VKH0KAui z$D(~`BYXie`RR0i#tGZSE1L@X22~dZqR^_mR94Qw`*L~L5j*l@1X5~ zYAKrYH^$df9bHR<9-^=*=p*zZz~&b?ZzRtVrl1-M`jmpEp)b%Y0BR0L)Gkqx5?;;k|EW0nj zMtEEYml_^7P}kQn=#2eBfGzX&(FXPw6&@d8M^pKYzyY>8z+MM#*E|(;dXlLVoQ7zk zl{v5?d)PR!uo61>r<=WS9Pj7@h<0nvKuf+-DdxCBx*P zb93p0gHZ#R#5%=xDX5A`sRRRIJtiB;{uZ)iAVy1@skC{$WVofG)N3zGX;T?mZp;{@ z-4qSe`Y%0dcJ8@WN0$&apePVDl4Mt$3p&JJd3nqv14D~-=;8%;8aYhY;HF)RSC!*HDx=g "Hello, World!" diff --git a/lib/ocaml/HelloWorld_test.ast b/lib/ocaml/HelloWorld_test.ast deleted file mode 100644 index 99cfada3b2b53eae443aef500c168909ebcee7e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1377 zcmbVM-Afcv6ra^o>ZXuTP%oy7Jwy-2Y}cL z4N7{6tC5H=4M9W^cBB4)f(Yt0vgoDW`nJxwH$Td^Waa!g=XZYR+;iq$P1Ev&^=4n6 z)o9s$?ZKm_;|3#LR@{tO17;#pZ92WKm5kV?(`I)k-H01cMqDI0k>#uwa#SECICgb< zPSapP(*k?Yj^Ted=hp@Iib>fQIeY(GJgV0S$cX9(^r$ZYqPh;5y6!^;fX?}(&V}#s z?T%}ACpv5TQ?Wi|t!Ks|0r|{mBC`J`%}e5@X3nC^vjaKAUF(V~l zA2Uv_)~I2|pnzIt46V|5iamIxF~>1&x7$jf(2;75X*i4qvIj|w^S@4Zi~@%RG?8tj z!+DSmS&)T9kB6Jjn|2pA!{8imgYm>@f} zGD^~1CXEP~lwg$N_~%0&?SMdtJl=jC$AIvU4KJ3QkR=(Fe9VkyDoFSVGYrV4o-!Z@Tj0K&LNQ$(3_q(4Xyf=3 z@LVBpu@l^gylI8hw6ydzFfwYHx@;c<1ET~31A_$+UjX8R3-mowb8_;-^NVs);!9GCOBO8H zz{vbrySSt%GcVn>urx8p;lPH23nng5&rK~ZPE1eTaDdZNKO;XkRX@KxHBa9qwK%&Z zzd*kzwK%ybv!F!3B)32xWKc1>$$CH~&ff6{SeTr>(;PNzp0L4FEx({7Ge6H^0f^_T z2C>w^VS)n_>(_@24Bz3bA3!I7wO}gx36)~ugsc7qGR{?{G%vFRVc2g6sHuNojK2;O zoFNwdbJ%czMZ?+K{{V}ovv-t(g99|I9s|S38yIFnK>GdyjKG>;AQgFjmFfoHumC6K zI4I}+26Xu z8og~zzwF+2pshD)!2(^Vd~juMQhv?^19qoZif!>CXVMhsd#-Kv{{XZes=~i0B^4As z6AW~}GhdNgBUAOHTDG9*!{dhtTYM6$Dkm6ZXWBaSl_Y6rbLZu)`?l@#f(1HIGrWpj zEAl27tXX})&)|i@fzZp7rcZe&Yqns49zsD;QGU?`g9!?rKQ?8rn)-cy$x8j*KMx~Z z>YkIIln8WbLxQw=pmT!NM&4b*tpQsY5Uy}ZECKqpYTezNMo(U?sIm6D_$`h9(t-tQ z5KAT)%vXr8^E~~STdeYE&BK}NPAynq98i>*n^}@smKvW`9G_ZIl3E0Gr$lJ9nAo9t z5ieYu?ipLo@?5Y$D&8;3A$LBVUE1=QNzzB?PIB);}a7JB| diff --git a/lib/ocaml/HelloWorld_test.cmj b/lib/ocaml/HelloWorld_test.cmj deleted file mode 100644 index eeb6401af17211a03cfe60f4370a54fc42e50422..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103 zcmd<+<5K!4J;_ZsEwSv*$xybIsmt~;Ffcd+F&_{c0I~Lg2^+MFONuh{(p?Kn6LTgk zSm5jc1Pdk@Iiyyk7A0pE=js=w7AF^F7L+X5;HX)WTcBT(T3k}Bt_Kv>%PMwo000Ow BBs%~A diff --git a/lib/ocaml/HelloWorld_test.cmt b/lib/ocaml/HelloWorld_test.cmt deleted file mode 100644 index 4c6d464d79fb5a76b4f4072f51bbe85739902d76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7186 zcmbtZ3z!tum9DBjg*+4@3egpm8D>C&Gt&-1Wq^2lngNDp9z0ciG~F{b(9qL8R(JD? z#6?#U4Z1Z%@s-4q2r)jeUBY2iqRaC$7Kaa6i1n@FdG&0kHUT%kf( zLeoFpr6>mq)MrpZHaV8*pjSox3f!MFTth`JmB<#s4hawS3!nH>SYcPt--MH=^TUyr zJdFuQ76>6cTkVF8BCy$Dyx*~pF_snlhb#W=p-QJ|ertW8?W4)tme_X1Ty)+Fp8fG# zx4lq*Q(g?XeRcaE7tgcpv2(KR$wWLlcV(Ah1^e8)|NHaTL?(~_i3kbjh^|h9cA}5K6+!zUWoTNTFiEXhsO$59SFR7?jyriz5DIqUFP21 zyNXg~##XJgf=d&V#ckR6*rfwfsV)0=?6d6)Jd7Ech7~C*_{hWg=HUCm{JdAz-+BA4 z;TPFv*I;x9)Z3Wl2+`oG0b*~+^c0BjS>^YHHwmou6y3-0K zKV0>|_YSpu_@{M~LVupL=0R`R6&1r>_!D7o4$Uphp|iFq3VmBq2A3(y>5Y9AWuj8* z?cI*;+`ZFsg!G4yZBgLwnmHlSfSD5#jUohJrH~L55W*piNI-#cij5Mr_)l!wv~`>R zxAo{h;Y_KBr_)Kdp%C5nPUq^%j#x5dU=Cp}jEbhxDI*#Z%3+p?>T4>pW=_^pUm+k} z;2nZY;e`10#C3S<)^c3OD92HM2;)bwGVN#RsPg~g~SF>pO z`D0iu8s-Te2J|z9(>$J?Bb7k_iMFLv2p+k%Y}yp`HD~HbV@1kWDI~Qm1Hjp$7;;>j zIbNt~5+OE1yrLQXmcpvI*KHMZ5a@(u(?B#I$MWqfKz$Rx3xqRc6hc}q>2=U{=nNT7 zT0jkvRI{jO*tz8`OX~sBAI<6+cV1-!&n+%v;OQ=~gq|UJoYv7@X1X(h0r3>2F%oeO zRPdB&l`WlVl`+$dtt{}>NWK{^pK?8z=Hu5aoaq(GM5d_gc*z%WJHD{|%By9!W2|1R zysnNreHzDQ8e-F6)JgW4fa)xmA%!nQ@<>H{qOAzrBsp8*9d@rXznbgj$C5cC!+{TN z8FK*}!^50Kt8Gksn6g>|HN_Ss+NLIqWIL_Fu(LF(5_AKY#uS)nEn$+|=+ZKSZlQK) za)WSMM(0vXQ|aY}v1jYIkDlihS{RtL)NZ!0SdBrx4%6u#mID;LZ4k~?b@Ni~Mn@uL zv`0;&EoXA1iFT&jb4eqNF&U{?v<60U)=ML8@R6p;&!708!Y17{-Bl1kTcGpgbQ=On z_41gRio$i12}HP9GTIf(a;T$iv<^19vO1K>7-lxw5lbXcfL>rm47X_rJx?~6uNd2qYLBKnq8$mp zYc$s7LpZi+7`;S41>fakn$yrHolCWQXtgfa%gi;BUZpMInlpOpQ5sKRM;gyU-(wm4?`K|=_O=E5Dm z#P3r$i#TGr3E|UQz}RJM=YC=5dpU3V;HbRGCe6v~Y8~elx;l{)3&d<^LrFTNs|}nM z>FQLO7j1BQXp;@Dj-MgDEw!$#m z9=cdKy*3esk}Y<9IC2fu3DVsD6oa;nQcFk~Ps;y);7PhsS4$s3Ls$r;U^c6Pzm&xw zV{0!~H(mWfII;w<+ryEisO%v)sp}T1cCUxHURO&WthSX@mZx(B4VTa~$fiNmpZeR5 zwX=u9w&kU;EMrqR(uvpRa3mvTM2a%*qQMUJL0|yl+0+ME)QT0&SM|fPcv01#ha)+_ z>Vtm$4&hF|pJPRqwcDAM2Fd^X)02cCN?-IJ&Fg6@!>ix8c%dL4^ix2@tHRM+OPceUnqZ7vg+ z33>{_m0t6ZTXe1Tfu0Nqyd_re6SgIDJ6)?qi;ERq3vlGrhUnU0&yD6oJ3Z7bkUxfW z?GmgN7b0K95*RRao>o?QTJjDf_&c*_+JJHSZ$&(S^coU;*_c7M> zAZ!q-vPMqvBPWTnPI|;C$D0|-_kCYhZYj(R&B zwHn_KxE%>7Kq`4qi_L@ViLU0@2)eq}W7qUR>4VxXj~ycWha*>G)5tEMt1s#5I$eDn z92=ww-qKYh?XXW^P&g8yQ`yQIord}!*^ce{Z{WNNUP7jM9vm1xRaMsEL8EhB((;^` z)2G)k8{HVIO_W~8p2rpWVnv-Sc(z!893td3xAb@FUwggi8)kJ<7u*NEL9<1YDQ z48sPhPy>5a?E^$!Ib#siLI`RfS9ZnB7?$7O?Y4#8JtJh@W;V#2OK#*`9FaM2A)7NW z(eKSXC}P3w5S0V1pmFd=wKU2NRS4k`+d489Gx$x@ROLZcc?jfMm&6KI!!8bo(i#zj zwfC@4>e{8!m{9pMpEw}xj;c%ilKp;(yR3rwQ}lGU?CB?LVU+Ci-XFts7s!&oQX_1j zYYTbp(bYyhuu@m2@xn1~wvo-5smzGQd=fiiIUmL9>Lk|tVOQCwK|bP=uS&C)tAW3& z+84xU5poR)3_!@23Znc=y4p4Ov&hkS>ry-l3sp)X!oJ@korq=p)&+hY@-Pe*eOf5dcvmV+?5Yp{r?Pdk4wHUNUo7+{5ANU8t6lJ!etO4#>zN6knVCJ zx;IuyZ7y)Vx=dHU%ZU43m^~m5xa2`O01Kr8edz%gY#Hhgx%Ho8NFJljHclYGe~W^svJ@kB!)5`Qa3!2XG@+ZW#ClW>Z1MytbJWp-iAI&J*@ag2(`2w zTI<^Dc)K&0`sl|z0vm1qlN|k~f7O5-m2?Z}?H=VP6RF&asudS~vnHNM)xgpPKh*4E#=2F>2r%{E|i^cuw{vR?t0HF30C*9oF(A^i{P~BB0SQXDeleVR} zrl?BAI*nQZh0V4^rn9h>s6CP=oy&IRvUNtrJ=du#++EbMLsl=zOfHlh;jHqWq&kLE z{=efUq+j`0^_II7&)`7ErU7=plix5E$Ii2BO~E+A3O>GO!M*=J=DaH=n%BOuw{^9b zBhhgEm`CV*+6pH-{yDkK$&YiYuG6IBU5V&{zQ;SFKiQLhJuvWi7X|)(%8Bk6{QHy> w-%^~!RmcB%UE*tTqWhMUxwG*#J@L(tFXcpcM>^peru51QBVKwv6|%(t0;=kpxBvhE diff --git a/lib/ocaml/HelloWorld_test.res b/lib/ocaml/HelloWorld_test.res deleted file mode 100644 index f9f1a71..0000000 --- a/lib/ocaml/HelloWorld_test.res +++ /dev/null @@ -1,8 +0,0 @@ -open Test - -let stringEqual = (~message=?, a: string, b: string) => - assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b) - -test("Hello World", () => { - stringEqual(~message="Returns hello world", HelloWorld.hello(), "Hello, World!") -}) diff --git a/lib/rescript.lock b/lib/rescript.lock deleted file mode 100644 index ee6a30e..0000000 --- a/lib/rescript.lock +++ /dev/null @@ -1 +0,0 @@ -59375 \ No newline at end of file From 093912194cca3cddc4600dbf0e1d8deeb4991dfb Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 16:13:31 +0100 Subject: [PATCH 05/23] pass verify_exercise script --- bin/verify-exercises | 12 ++++-------- config.json | 3 +++ exercises/practice/hello-world/rescript.json | 4 ++-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/bin/verify-exercises b/bin/verify-exercises index 269a608..b140f6a 100755 --- a/bin/verify-exercises +++ b/bin/verify-exercises @@ -42,13 +42,9 @@ unskip_tests() { } run_tests() { - noop # TODO: replace this with the command to run the tests for the exercise. - # Note: this function runs from within an exercise directory. - # Note: the exercise directory is a temporary directory, so feel - # free to modify its files as needed. - # Note: return a zero exit code if all tests pass, otherwise non-zero. - # Example: `npm test` - # Example: `python3 -m pytest two_fer_test.py` + npm i + ./node_modules/.bin/rescript build + ./node_modules/.bin/retest tests/*.res.js } verify_exercise() { @@ -68,7 +64,7 @@ verify_exercise() { cd "${tmp_dir}" copy_example_or_examplar_to_solution - unskip_tests + #unskip_tests run_tests ) } diff --git a/config.json b/config.json index fc82999..2e8ee75 100644 --- a/config.json +++ b/config.json @@ -33,6 +33,9 @@ ], "editor": [ "src/%{pascal_slug}.rei" + ], + "config": [ + "rescript.json" ] }, "exercises": { diff --git a/exercises/practice/hello-world/rescript.json b/exercises/practice/hello-world/rescript.json index 957e8c1..3db8c50 100644 --- a/exercises/practice/hello-world/rescript.json +++ b/exercises/practice/hello-world/rescript.json @@ -1,8 +1,8 @@ { "name": "@exercism/rescript", "sources": [ - { "dir": "tmp/src", "subdirs": true, "type": "dev" }, - { "dir": "tmp/tests", "subdirs": true, "type": "dev" } + { "dir": "src", "subdirs": true, "type": "dev" }, + { "dir": "tests", "subdirs": true, "type": "dev" } ], "package-specs": [ { From d592579c5ee0aad07234a7932e07d9e580e3e9f9 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 16:15:13 +0100 Subject: [PATCH 06/23] correct formatting --- config.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/config.json b/config.json index 2e8ee75..fc82999 100644 --- a/config.json +++ b/config.json @@ -33,9 +33,6 @@ ], "editor": [ "src/%{pascal_slug}.rei" - ], - "config": [ - "rescript.json" ] }, "exercises": { From 1953c966e0dd2f677c4793b22c1edfdf650a7da9 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 16:51:14 +0100 Subject: [PATCH 07/23] setup CI stage --- .github/workflows/test.yml | 21 +++++++-------------- bin/verify-exercises | 1 - 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1052627..952ab13 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,27 +13,20 @@ on: jobs: verify_exercises: - # TODO: replace with another image if required to run the tests (optional) runs-on: ubuntu-24.04 steps: - name: Checkout repository uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - # TODO: setup any tooling that is required to run the tests (optional) - # E.g. install a specific version of a programming language - # E.g. install packages via apt/apk/yum/etc. - # Find GitHub Actions to setup tooling here: - # - https://github.com/actions/?q=setup&type=&language= - # - https://github.com/actions/starter-workflows/tree/main/ci - # - https://github.com/marketplace?type=actions&query=setup - # - name: Use - # uses: + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24.x + cache: "npm" - # TODO: install any dependencies (optional) - # E.g. npm install, bundle install, etc. - # - name: Install project dependencies - # run: + - name: Install dependencies + run: npm ci - name: Verify all exercises run: bin/verify-exercises diff --git a/bin/verify-exercises b/bin/verify-exercises index b140f6a..ff325db 100755 --- a/bin/verify-exercises +++ b/bin/verify-exercises @@ -42,7 +42,6 @@ unskip_tests() { } run_tests() { - npm i ./node_modules/.bin/rescript build ./node_modules/.bin/retest tests/*.res.js } From 3a5d6cf583733227b6cff2a45012144788e4a878 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 16:53:19 +0100 Subject: [PATCH 08/23] change testing command --- bin/verify-exercises | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/verify-exercises b/bin/verify-exercises index ff325db..74cb6da 100755 --- a/bin/verify-exercises +++ b/bin/verify-exercises @@ -42,8 +42,7 @@ unskip_tests() { } run_tests() { - ./node_modules/.bin/rescript build - ./node_modules/.bin/retest tests/*.res.js + npm run ci } verify_exercise() { From 421ec24a48ab87a91a725103e94da18f050c0d71 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 17:17:25 +0100 Subject: [PATCH 09/23] update node_modules symlink --- bin/verify-exercises | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bin/verify-exercises b/bin/verify-exercises index 74cb6da..196f423 100755 --- a/bin/verify-exercises +++ b/bin/verify-exercises @@ -42,14 +42,17 @@ unskip_tests() { } run_tests() { - npm run ci + node_modules/.bin/rescript + node_modules/.bin/retest tests/*.js } verify_exercise() { local dir local slug local tmp_dir + local root_dir + root_dir=$(realpath .) # capture project root before cd-ing away dir=$(realpath "${1}") slug=$(basename "${dir}") tmp_dir=$(mktemp -d -t "exercism-verify-${slug}-XXXXX") @@ -57,10 +60,12 @@ verify_exercise() { echo "Verifying ${slug} exercise..." ( - trap 'rm -rf "$tmp_dir"' EXIT # remove tempdir when subshell ends + trap 'rm -rf "$tmp_dir"' EXIT cp -r "${dir}/." "${tmp_dir}" cd "${tmp_dir}" + ln -s "${root_dir}/node_modules" "${tmp_dir}/node_modules" + copy_example_or_examplar_to_solution #unskip_tests run_tests From bafa6a232902fa25fae47834a8bf1e884421596b Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 18:16:48 +0100 Subject: [PATCH 10/23] set track to inactive --- config.json | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/config.json b/config.json index fc82999..922dc82 100644 --- a/config.json +++ b/config.json @@ -1,7 +1,7 @@ { "language": "ReScript", "slug": "rescript", - "active": true, + "active": false, "status": { "concept_exercises": false, "test_runner": false, @@ -19,21 +19,11 @@ "average_run_time": 7 }, "files": { - "solution": [ - "src/%{pascal_slug}.re" - ], - "test": [ - "__tests__/%{pascal_slug}_test.re" - ], - "example": [ - "src/Example.re" - ], - "exemplar": [ - ".meta/src/Exemplar.re" - ], - "editor": [ - "src/%{pascal_slug}.rei" - ] + "solution": ["src/%{pascal_slug}.re"], + "test": ["__tests__/%{pascal_slug}_test.re"], + "example": ["src/Example.re"], + "exemplar": [".meta/src/Exemplar.re"], + "editor": ["src/%{pascal_slug}.rei"] }, "exercises": { "practice": [ @@ -44,10 +34,7 @@ "practices": [], "prerequisites": [], "difficulty": 1, - "topics": [ - "setting_up_reasonml_dev_environment", - "strings" - ] + "topics": ["setting_up_reasonml_dev_environment", "strings"] } ] }, From 90bb5fa21677d52a326f425296ab276590633ed1 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 18:34:27 +0100 Subject: [PATCH 11/23] update config with file slugs and interface file --- config.json | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/config.json b/config.json index 922dc82..575936e 100644 --- a/config.json +++ b/config.json @@ -19,11 +19,21 @@ "average_run_time": 7 }, "files": { - "solution": ["src/%{pascal_slug}.re"], - "test": ["__tests__/%{pascal_slug}_test.re"], - "example": ["src/Example.re"], - "exemplar": [".meta/src/Exemplar.re"], - "editor": ["src/%{pascal_slug}.rei"] + "solution": [ + "src/%{pascal_slug}.res" + ], + "test": [ + "tests/%{pascal_slug}_test.res" + ], + "example": [ + ".meta/%{pascal_slug}.res" + ], + "exemplar": [ + ".meta/src/%{pascal_slug}.res" + ], + "editor": [ + "src/%{pascal_slug}.resi" + ] }, "exercises": { "practice": [ @@ -33,8 +43,7 @@ "uuid": "63d72b81-c7a4-4a94-8224-69f4c68cc374", "practices": [], "prerequisites": [], - "difficulty": 1, - "topics": ["setting_up_reasonml_dev_environment", "strings"] + "difficulty": 1 } ] }, @@ -46,7 +55,7 @@ }, { "title": "Inferred types", - "content": "No need to specify types, types are inferred by ReScript compiler and are guaranteed to be correct.", + "content": "Types are inferred by the ReScript compiler and are guaranteed to be correct.", "icon": "immutable" }, { @@ -55,8 +64,8 @@ "icon": "functional" }, { - "title": "Easy javascript interop", - "content": "Javascript interop is easy allowing advatange of existing javascript packages and ecosystem.", + "title": "Easy JavaScript interoperability", + "content": "JavaScript interoperability is easy, allowing existing JavaScript packages to be used.", "icon": "interop" }, { From e03f731f2c6e64014e05bcd92ac80db170471161 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 18:36:09 +0100 Subject: [PATCH 12/23] update functions placeholder text and create interface file --- exercises/practice/hello-world/src/HelloWorld.res | 2 +- exercises/practice/hello-world/src/HelloWorld.resi | 1 + exercises/practice/hello-world/tests/HelloWorld_test.res | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 exercises/practice/hello-world/src/HelloWorld.resi diff --git a/exercises/practice/hello-world/src/HelloWorld.res b/exercises/practice/hello-world/src/HelloWorld.res index 1503a69..85b8e89 100644 --- a/exercises/practice/hello-world/src/HelloWorld.res +++ b/exercises/practice/hello-world/src/HelloWorld.res @@ -1 +1 @@ -let hello = () => "Change this to make the tests pass" +let hello = () => "Goodbye, Mars!" diff --git a/exercises/practice/hello-world/src/HelloWorld.resi b/exercises/practice/hello-world/src/HelloWorld.resi new file mode 100644 index 0000000..1d388cc --- /dev/null +++ b/exercises/practice/hello-world/src/HelloWorld.resi @@ -0,0 +1 @@ +let hello: unit => string diff --git a/exercises/practice/hello-world/tests/HelloWorld_test.res b/exercises/practice/hello-world/tests/HelloWorld_test.res index f9f1a71..d95c0a4 100644 --- a/exercises/practice/hello-world/tests/HelloWorld_test.res +++ b/exercises/practice/hello-world/tests/HelloWorld_test.res @@ -3,6 +3,6 @@ open Test let stringEqual = (~message=?, a: string, b: string) => assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b) -test("Hello World", () => { - stringEqual(~message="Returns hello world", HelloWorld.hello(), "Hello, World!") +test("Say Hi!", () => { + stringEqual(~message="Say Hi!", HelloWorld.hello(), "Hello, World!") }) From b37106e0e8b84328ccb1476ab7b3d887ac1d75f4 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 18:37:27 +0100 Subject: [PATCH 13/23] added therealowenrees as co-author --- exercises/practice/hello-world/.meta/config.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/practice/hello-world/.meta/config.json b/exercises/practice/hello-world/.meta/config.json index 2a56135..df96f29 100644 --- a/exercises/practice/hello-world/.meta/config.json +++ b/exercises/practice/hello-world/.meta/config.json @@ -1,6 +1,7 @@ { "authors": [ - "tejasbubane" + "tejasbubane", + "therealowenrees" ], "contributors": [ "naartjie", From 2229a385809ef50ba440fdd2366a4af3fffe39ed Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 18:43:36 +0100 Subject: [PATCH 14/23] set setup-nide action to a v4 commit --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 952ab13..69dcc18 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: 24.x cache: "npm" From e0e6464fb77bbc52bd4ef167b796bcf59a682648 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 18:46:02 +0100 Subject: [PATCH 15/23] interop used instead of interoperability in one title as the linter complained that it exceeded the number of characters allowed --- config.json | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/config.json b/config.json index 575936e..0d1ef57 100644 --- a/config.json +++ b/config.json @@ -19,21 +19,11 @@ "average_run_time": 7 }, "files": { - "solution": [ - "src/%{pascal_slug}.res" - ], - "test": [ - "tests/%{pascal_slug}_test.res" - ], - "example": [ - ".meta/%{pascal_slug}.res" - ], - "exemplar": [ - ".meta/src/%{pascal_slug}.res" - ], - "editor": [ - "src/%{pascal_slug}.resi" - ] + "solution": ["src/%{pascal_slug}.res"], + "test": ["tests/%{pascal_slug}_test.res"], + "example": [".meta/%{pascal_slug}.res"], + "exemplar": [".meta/src/%{pascal_slug}.res"], + "editor": ["src/%{pascal_slug}.resi"] }, "exercises": { "practice": [ @@ -64,7 +54,7 @@ "icon": "functional" }, { - "title": "Easy JavaScript interoperability", + "title": "JavaScript interop", "content": "JavaScript interoperability is easy, allowing existing JavaScript packages to be used.", "icon": "interop" }, From 2bea052881144ed61b866d62c11a1b12c5c24a82 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sat, 7 Mar 2026 18:46:50 +0100 Subject: [PATCH 16/23] reformat config --- config.json | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/config.json b/config.json index 0d1ef57..ef3b17e 100644 --- a/config.json +++ b/config.json @@ -19,11 +19,21 @@ "average_run_time": 7 }, "files": { - "solution": ["src/%{pascal_slug}.res"], - "test": ["tests/%{pascal_slug}_test.res"], - "example": [".meta/%{pascal_slug}.res"], - "exemplar": [".meta/src/%{pascal_slug}.res"], - "editor": ["src/%{pascal_slug}.resi"] + "solution": [ + "src/%{pascal_slug}.res" + ], + "test": [ + "tests/%{pascal_slug}_test.res" + ], + "example": [ + ".meta/%{pascal_slug}.res" + ], + "exemplar": [ + ".meta/src/%{pascal_slug}.res" + ], + "editor": [ + "src/%{pascal_slug}.resi" + ] }, "exercises": { "practice": [ From 378171838c74ce9f440f74c9f624212b5899f99e Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sun, 8 Mar 2026 11:01:43 +0100 Subject: [PATCH 17/23] fix typo in function name - exemplar --- bin/verify-exercises | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/verify-exercises b/bin/verify-exercises index 196f423..2012a26 100755 --- a/bin/verify-exercises +++ b/bin/verify-exercises @@ -21,7 +21,7 @@ required_tool() { required_tool jq -copy_example_or_examplar_to_solution() { +copy_example_or_exemplar_to_solution() { jq -c '[.files.solution, .files.exemplar // .files.example] | transpose | map({src: .[1], dst: .[0]}) | .[]' .meta/config.json \ | while read -r src_and_dst; do cp "$(jq -r '.src' <<< "${src_and_dst}")" "$(jq -r '.dst' <<< "${src_and_dst}")" @@ -66,7 +66,7 @@ verify_exercise() { ln -s "${root_dir}/node_modules" "${tmp_dir}/node_modules" - copy_example_or_examplar_to_solution + copy_example_or_exemplar_to_solution #unskip_tests run_tests ) From 7c0c5a14cb34c094ff3a01755a294529e83ccb8b Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sun, 8 Mar 2026 11:13:55 +0100 Subject: [PATCH 18/23] typo fix in JavaScript --- config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.json b/config.json index ef3b17e..d61f665 100644 --- a/config.json +++ b/config.json @@ -50,7 +50,7 @@ "key_features": [ { "title": "OCaml's type system", - "content": "ReScript brings OCaml's battle-tested powerful type system to Javascript.", + "content": "ReScript brings OCaml's battle-tested powerful type system to JavaScript.", "icon": "stable" }, { From 9bcb8cdd6afc47d3b47749505013b6a32610ba01 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sun, 8 Mar 2026 14:49:45 +0100 Subject: [PATCH 19/23] skip tests, unskip when verifying exercise --- bin/verify-exercises | 11 ++--------- .../practice/hello-world/tests/HelloWorld_test.res | 6 ++++++ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/bin/verify-exercises b/bin/verify-exercises index 2012a26..4977825 100755 --- a/bin/verify-exercises +++ b/bin/verify-exercises @@ -30,14 +30,7 @@ copy_example_or_exemplar_to_solution() { unskip_tests() { jq -r '.files.test[]' .meta/config.json | while read -r test_file; do - noop # TODO: replace this with the command to unskip the tests. - # Note: this function runs from within an exercise directory. - # Note: the exercise directory is a temporary directory, so feel - # free to modify its (test) files as needed. - # Note: ignore this function if either: - # - skipping tests is not supported, or - # - skipping tests does not require modifying the test files. - # Example: sed -i 's/test.skip/test/g' "${test_file}" + sed -i 's/skip(/test(/g' "${test_file}" # replace skip utility function name with test done } @@ -67,7 +60,7 @@ verify_exercise() { ln -s "${root_dir}/node_modules" "${tmp_dir}/node_modules" copy_example_or_exemplar_to_solution - #unskip_tests + unskip_tests run_tests ) } diff --git a/exercises/practice/hello-world/tests/HelloWorld_test.res b/exercises/practice/hello-world/tests/HelloWorld_test.res index d95c0a4..71cd843 100644 --- a/exercises/practice/hello-world/tests/HelloWorld_test.res +++ b/exercises/practice/hello-world/tests/HelloWorld_test.res @@ -3,6 +3,12 @@ open Test let stringEqual = (~message=?, a: string, b: string) => assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b) +let skip = (name, _cb) => Console.log("Skipped test: " ++ name) + test("Say Hi!", () => { stringEqual(~message="Say Hi!", HelloWorld.hello(), "Hello, World!") }) + +skip("Say Hi Again!", () => { + stringEqual(~message="Say Hi!", HelloWorld.hello(), "Hello, World!") +}) From 6381647cb1ef82904067360e596e09d9d86895f2 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sun, 8 Mar 2026 16:39:23 +0100 Subject: [PATCH 20/23] sync docs and config --- exercises/practice/hello-world/.docs/instructions.md | 11 ++++++----- exercises/practice/hello-world/.meta/config.json | 7 +++++-- .../practice/hello-world/tests/HelloWorld_test.res | 8 ++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/exercises/practice/hello-world/.docs/instructions.md b/exercises/practice/hello-world/.docs/instructions.md index 6e08ebb..c9570e4 100644 --- a/exercises/practice/hello-world/.docs/instructions.md +++ b/exercises/practice/hello-world/.docs/instructions.md @@ -1,15 +1,16 @@ # Instructions -The classical introductory exercise. Just say "Hello, World!". +The classical introductory exercise. +Just say "Hello, World!". -["Hello, World!"](http://en.wikipedia.org/wiki/%22Hello,_world!%22_program) is -the traditional first program for beginning programming in a new language -or environment. +["Hello, World!"][hello-world] is the traditional first program for beginning programming in a new language or environment. The objectives are simple: -- Write a function that returns the string "Hello, World!". +- Modify the provided code so that it produces the string "Hello, World!". - Run the test suite and make sure that it succeeds. - Submit your solution and check it at the website. If everything goes well, you will be ready to fetch your first real exercise. + +[hello-world]: https://en.wikipedia.org/wiki/%22Hello,_world!%22_program diff --git a/exercises/practice/hello-world/.meta/config.json b/exercises/practice/hello-world/.meta/config.json index df96f29..73ecb7a 100644 --- a/exercises/practice/hello-world/.meta/config.json +++ b/exercises/practice/hello-world/.meta/config.json @@ -18,9 +18,12 @@ ], "example": [ ".meta/HelloWorld.res" + ], + "editor": [ + "src/HelloWorld.resi" ] }, - "blurb": "The classical introductory exercise. Just say \"Hello, World!\"", + "blurb": "Exercism's classic introductory exercise. Just say \"Hello, World!\".", "source": "This is an exercise to introduce users to using Exercism", - "source_url": "http://en.wikipedia.org/wiki/%22Hello,_world!%22_program" + "source_url": "https://en.wikipedia.org/wiki/%22Hello,_world!%22_program" } diff --git a/exercises/practice/hello-world/tests/HelloWorld_test.res b/exercises/practice/hello-world/tests/HelloWorld_test.res index 71cd843..8f47a4e 100644 --- a/exercises/practice/hello-world/tests/HelloWorld_test.res +++ b/exercises/practice/hello-world/tests/HelloWorld_test.res @@ -1,14 +1,10 @@ open Test +let skip = (name, _cb) => Console.log("Skipped: " ++ name) + let stringEqual = (~message=?, a: string, b: string) => assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b) -let skip = (name, _cb) => Console.log("Skipped test: " ++ name) - test("Say Hi!", () => { stringEqual(~message="Say Hi!", HelloWorld.hello(), "Hello, World!") }) - -skip("Say Hi Again!", () => { - stringEqual(~message="Say Hi!", HelloWorld.hello(), "Hello, World!") -}) From 840ce52fd39e98d6d11668dee6eebdae3dbe5eea Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sun, 8 Mar 2026 16:48:18 +0100 Subject: [PATCH 21/23] basic test generator --- .gitmodules | 3 ++ Makefile | 18 +++++++++ .../hello-world/.meta/generateTests.js | 11 ++++++ .../hello-world/.meta/testTemplate.js | 15 ++++++++ exercises/practice/hello-world/package.json | 1 + .../hello-world/tests/HelloWorld_test.res | 1 + package-lock.json | 10 ++++- package.json | 4 +- test_generator/getCases.js | 38 +++++++++++++++++++ test_generator/testGenerator.js | 25 ++++++++++++ 10 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 .gitmodules create mode 100644 exercises/practice/hello-world/.meta/generateTests.js create mode 100644 exercises/practice/hello-world/.meta/testTemplate.js create mode 100644 test_generator/getCases.js create mode 100644 test_generator/testGenerator.js diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..ef11877 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "problem-specifications"] + path = problem-specifications + url = https://github.com/exercism/problem-specifications.git diff --git a/Makefile b/Makefile index 5960dfc..ab6cf62 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,24 @@ format: @echo "Formatting ReScript files..." @find . -name "node_modules" -prune -o -name "*.res" -print -o -name "*.resi" -print | xargs npx rescript format +generate-tests: + @echo "Generating tests for all exercises..." + @for exercise in $(EXERCISES); do \ + if [ -f exercises/practice/$$exercise/.meta/generateTests.js ]; then \ + echo "-> Generating: $$exercise"; \ + node exercises/practice/$$exercise/.meta/generateTests.js || exit 1; \ + else \ + echo "-> Skipping: $$exercise (no generator found)"; \ + fi \ + done + @echo "All tests generated successfully." + +generate-test: +ifeq ($(EXERCISE),"") + $(error EXERCISE variable is required. usage: make generate_test EXERCISE=hello-world) +endif + @node exercises/practice/$(EXERCISE)/.meta/generateTests.js + test: $(MAKE) -s clean $(MAKE) -s check-package-files diff --git a/exercises/practice/hello-world/.meta/generateTests.js b/exercises/practice/hello-world/.meta/generateTests.js new file mode 100644 index 0000000..620c69a --- /dev/null +++ b/exercises/practice/hello-world/.meta/generateTests.js @@ -0,0 +1,11 @@ +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; +import getValidCases from '../../../../test_generator/getCases.js'; +import { generate, toPascalCase } from '../../../../test_generator/testGenerator.js'; +import * as template from './testTemplate.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const cases = getValidCases(template.slug); +const outputPath = path.resolve(__dirname, '..', 'tests', `${toPascalCase(template.slug)}_test.res`); + +generate(outputPath, template.slug, cases, template); \ No newline at end of file diff --git a/exercises/practice/hello-world/.meta/testTemplate.js b/exercises/practice/hello-world/.meta/testTemplate.js new file mode 100644 index 0000000..1719205 --- /dev/null +++ b/exercises/practice/hello-world/.meta/testTemplate.js @@ -0,0 +1,15 @@ +export const slug = 'hello-world'; + +export const assertionFunctions = `let stringEqual = (~message=?, a: string, b: string) => + assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b)`; + +/** + * @param {string} testMethod - 'test' or 'skip' + * @param {object} c - The canonical test case object + * @param {string} moduleName - The PascalCase version of the slug + */ +export const template = (testMethod, c, moduleName) => { + return `${testMethod}("${c.description}", () => { + stringEqual(~message="${c.description}", ${moduleName}.hello(), "${c.expected}") +})\n\n`; +}; \ No newline at end of file diff --git a/exercises/practice/hello-world/package.json b/exercises/practice/hello-world/package.json index e367d7a..24f2749 100644 --- a/exercises/practice/hello-world/package.json +++ b/exercises/practice/hello-world/package.json @@ -7,6 +7,7 @@ ], "private": true, "license": "MIT", + "type": "module", "repository": { "type": "git", "url": "https://github.com/exercism/rescript" diff --git a/exercises/practice/hello-world/tests/HelloWorld_test.res b/exercises/practice/hello-world/tests/HelloWorld_test.res index 8f47a4e..525e3bb 100644 --- a/exercises/practice/hello-world/tests/HelloWorld_test.res +++ b/exercises/practice/hello-world/tests/HelloWorld_test.res @@ -8,3 +8,4 @@ let stringEqual = (~message=?, a: string, b: string) => test("Say Hi!", () => { stringEqual(~message="Say Hi!", HelloWorld.hello(), "Hello, World!") }) + diff --git a/package-lock.json b/package-lock.json index bc30ff1..c9362ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "rescript": "^12.1.0" }, "devDependencies": { - "rescript-test": "^8.0.0" + "rescript-test": "^8.0.0", + "toml": "^3.0.0" } }, "node_modules/@asamuzakjp/css-color": { @@ -1290,6 +1291,13 @@ "dev": true, "license": "MIT" }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true, + "license": "MIT" + }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", diff --git a/package.json b/package.json index e367d7a..aeae432 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ ], "private": true, "license": "MIT", + "type": "module", "repository": { "type": "git", "url": "https://github.com/exercism/rescript" @@ -15,7 +16,8 @@ "rescript": "^12.1.0" }, "devDependencies": { - "rescript-test": "^8.0.0" + "rescript-test": "^8.0.0", + "toml": "^3.0.0" }, "scripts": { "res:build": "rescript", diff --git a/test_generator/getCases.js b/test_generator/getCases.js new file mode 100644 index 0000000..7edb49a --- /dev/null +++ b/test_generator/getCases.js @@ -0,0 +1,38 @@ +import { readFileSync } from 'node:fs'; +import { join, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import toml from 'toml'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +/** + * Retrieves and filters test cases based on the Exercism TOML config. + * @param {string} slug - The exercise name (e.g., 'hello-world') + */ +export default function getValidCases(slug) { + const tomlPath = join(__dirname, '..', 'exercises', 'practice', slug, '.meta', 'tests.toml'); + const jsonPath = join(__dirname, '..', 'problem-specifications', 'exercises', slug, 'canonical-data.json'); + + const testMeta = toml.parse(readFileSync(tomlPath, 'utf-8')); + const canonicalData = JSON.parse(readFileSync(jsonPath, 'utf-8')); + + const validCases = []; + + const extract = (cases) => { + for (const testCase of cases) { + if (testCase.cases) { + extract(testCase.cases); + } else { + const { uuid } = testCase; + const meta = testMeta[uuid]; + if (uuid && meta && meta.include !== false) { + validCases.push(testCase); + } + } + } + }; + + extract(canonicalData.cases); + + return validCases; +} \ No newline at end of file diff --git a/test_generator/testGenerator.js b/test_generator/testGenerator.js new file mode 100644 index 0000000..7479aec --- /dev/null +++ b/test_generator/testGenerator.js @@ -0,0 +1,25 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +export const toPascalCase = (slug) => + slug.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(''); + +export const generate = (outputPath, slug, cases, config) => { + const moduleName = toPascalCase(slug); + + let output = `open Test\n\n`; + output += `let skip = (name, _cb) => Console.log("Skipped: " ++ name)\n\n`; + output += `${config.assertionFunctions}\n\n`; + + cases.forEach((c, index) => { + const method = index === 0 ? "test" : "skip"; + output += config.template(method, c, moduleName); + }); + + if (!fs.existsSync(path.dirname(outputPath))) { + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + } + + fs.writeFileSync(outputPath, output, 'utf-8'); + console.log(`Generated: ${path.basename(outputPath)}`); +}; \ No newline at end of file From cf1f8fc08dade3fdda1e2d6d70e6e20cd70752fa Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sun, 8 Mar 2026 19:53:56 +0100 Subject: [PATCH 22/23] remove skipping of tests for now --- bin/verify-exercises | 2 +- exercises/practice/hello-world/.meta/testTemplate.js | 5 ++--- exercises/practice/hello-world/tests/HelloWorld_test.res | 2 -- test_generator/testGenerator.js | 6 ++---- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/bin/verify-exercises b/bin/verify-exercises index 4977825..05fdf98 100755 --- a/bin/verify-exercises +++ b/bin/verify-exercises @@ -60,7 +60,7 @@ verify_exercise() { ln -s "${root_dir}/node_modules" "${tmp_dir}/node_modules" copy_example_or_exemplar_to_solution - unskip_tests + # unskip_tests run_tests ) } diff --git a/exercises/practice/hello-world/.meta/testTemplate.js b/exercises/practice/hello-world/.meta/testTemplate.js index 1719205..48b71af 100644 --- a/exercises/practice/hello-world/.meta/testTemplate.js +++ b/exercises/practice/hello-world/.meta/testTemplate.js @@ -4,12 +4,11 @@ export const assertionFunctions = `let stringEqual = (~message=?, a: string, b: assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b)`; /** - * @param {string} testMethod - 'test' or 'skip' * @param {object} c - The canonical test case object * @param {string} moduleName - The PascalCase version of the slug */ -export const template = (testMethod, c, moduleName) => { - return `${testMethod}("${c.description}", () => { +export const template = (c, moduleName) => { + return `test("${c.description}", () => { stringEqual(~message="${c.description}", ${moduleName}.hello(), "${c.expected}") })\n\n`; }; \ No newline at end of file diff --git a/exercises/practice/hello-world/tests/HelloWorld_test.res b/exercises/practice/hello-world/tests/HelloWorld_test.res index 525e3bb..2fd202d 100644 --- a/exercises/practice/hello-world/tests/HelloWorld_test.res +++ b/exercises/practice/hello-world/tests/HelloWorld_test.res @@ -1,7 +1,5 @@ open Test -let skip = (name, _cb) => Console.log("Skipped: " ++ name) - let stringEqual = (~message=?, a: string, b: string) => assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b) diff --git a/test_generator/testGenerator.js b/test_generator/testGenerator.js index 7479aec..0b936c3 100644 --- a/test_generator/testGenerator.js +++ b/test_generator/testGenerator.js @@ -8,12 +8,10 @@ export const generate = (outputPath, slug, cases, config) => { const moduleName = toPascalCase(slug); let output = `open Test\n\n`; - output += `let skip = (name, _cb) => Console.log("Skipped: " ++ name)\n\n`; output += `${config.assertionFunctions}\n\n`; - cases.forEach((c, index) => { - const method = index === 0 ? "test" : "skip"; - output += config.template(method, c, moduleName); + cases.forEach((c) => { + output += config.template(c, moduleName); }); if (!fs.existsSync(path.dirname(outputPath))) { From a808ea7b876646033866c706af5714569e389078 Mon Sep 17 00:00:00 2001 From: Owen Rees Date: Sun, 8 Mar 2026 21:17:44 +0100 Subject: [PATCH 23/23] write test in generator, leaving template for a template string --- exercises/practice/hello-world/.meta/testTemplate.js | 10 ++-------- .../practice/hello-world/tests/HelloWorld_test.res | 3 +-- test_generator/testGenerator.js | 5 ++++- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/exercises/practice/hello-world/.meta/testTemplate.js b/exercises/practice/hello-world/.meta/testTemplate.js index 48b71af..4767482 100644 --- a/exercises/practice/hello-world/.meta/testTemplate.js +++ b/exercises/practice/hello-world/.meta/testTemplate.js @@ -3,12 +3,6 @@ export const slug = 'hello-world'; export const assertionFunctions = `let stringEqual = (~message=?, a: string, b: string) => assertion(~message?, ~operator="stringEqual", (a, b) => a == b, a, b)`; -/** - * @param {object} c - The canonical test case object - * @param {string} moduleName - The PascalCase version of the slug - */ export const template = (c, moduleName) => { - return `test("${c.description}", () => { - stringEqual(~message="${c.description}", ${moduleName}.hello(), "${c.expected}") -})\n\n`; -}; \ No newline at end of file + return `stringEqual(~message="${c.description}", ${moduleName}.hello(), "${c.expected}")` +} \ No newline at end of file diff --git a/exercises/practice/hello-world/tests/HelloWorld_test.res b/exercises/practice/hello-world/tests/HelloWorld_test.res index 2fd202d..0192f17 100644 --- a/exercises/practice/hello-world/tests/HelloWorld_test.res +++ b/exercises/practice/hello-world/tests/HelloWorld_test.res @@ -5,5 +5,4 @@ let stringEqual = (~message=?, a: string, b: string) => test("Say Hi!", () => { stringEqual(~message="Say Hi!", HelloWorld.hello(), "Hello, World!") -}) - +}) \ No newline at end of file diff --git a/test_generator/testGenerator.js b/test_generator/testGenerator.js index 0b936c3..55c9417 100644 --- a/test_generator/testGenerator.js +++ b/test_generator/testGenerator.js @@ -1,5 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; +import { template } from '../exercises/practice/hello-world/.meta/testTemplate.js'; export const toPascalCase = (slug) => slug.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(''); @@ -11,7 +12,9 @@ export const generate = (outputPath, slug, cases, config) => { output += `${config.assertionFunctions}\n\n`; cases.forEach((c) => { - output += config.template(c, moduleName); + output += `test("${c.description}", () => { + ${template(c, moduleName)} +})` }); if (!fs.existsSync(path.dirname(outputPath))) {