diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml
index 68ddcfdf..dada58f2 100644
--- a/.github/workflows/analyze.yml
+++ b/.github/workflows/analyze.yml
@@ -73,4 +73,4 @@ jobs:
- name: Testing...
run: |
- make command-analyze
+ npm run test-unsafe test/jest/analyze.test.js
diff --git a/.github/workflows/config.yml b/.github/workflows/config.yml
index 12afb128..f8d55034 100644
--- a/.github/workflows/config.yml
+++ b/.github/workflows/config.yml
@@ -5,7 +5,7 @@ on:
branches:
- master
paths:
- - 'eask'
+ - 'eask'
- '**.yml'
- lisp/**
- cmds/**
@@ -73,4 +73,4 @@ jobs:
- name: Testing...
run: |
- make command-config
+ npm run test-unsafe test/jest/config.test.js
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 0914f887..256010f1 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -29,7 +29,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- os:
+ os:
- ubuntu-latest
# XXX: `macos-latest` on arm64 is not possible as well!?
# See https://stackoverflow.com/questions/77675906/github-actions-build-docker-image-on-arm64-macos-latest-xlarge
@@ -67,4 +67,4 @@ jobs:
- name: Testing...
run: |
- make command-docker
+ npm run test-unsafe test/jest/docker.test.js
diff --git a/.github/workflows/emacs.yml b/.github/workflows/emacs.yml
index dacf340d..095f7371 100644
--- a/.github/workflows/emacs.yml
+++ b/.github/workflows/emacs.yml
@@ -73,4 +73,4 @@ jobs:
- name: Testing...
run: |
- make command-emacs
+ npm run test-unsafe test/jest/emacs.test.js
diff --git a/.github/workflows/exec.yml b/.github/workflows/exec.yml
index 21d1c64b..9284d298 100644
--- a/.github/workflows/exec.yml
+++ b/.github/workflows/exec.yml
@@ -70,4 +70,4 @@ jobs:
- name: Testing...
run: |
- make command-exec
+ npm run test-unsafe test/jest/exec.test.js
diff --git a/.github/workflows/exit_status.yml b/.github/workflows/exit_status.yml
index 3c0f96e0..6876bf04 100644
--- a/.github/workflows/exit_status.yml
+++ b/.github/workflows/exit_status.yml
@@ -50,4 +50,4 @@ jobs:
- name: Testing...
run: |
- make command-exit-status
+ npm run test-unsafe test/jest/exit-status.test.js
diff --git a/.github/workflows/global.yml b/.github/workflows/global.yml
index a9087a02..ef5f199a 100644
--- a/.github/workflows/global.yml
+++ b/.github/workflows/global.yml
@@ -73,4 +73,4 @@ jobs:
- name: Testing...
run: |
- make command-global
+ npm run test-unsafe test/jest/global.test.js
diff --git a/.github/workflows/install.yml b/.github/workflows/install.yml
index 64345cf9..66fff457 100644
--- a/.github/workflows/install.yml
+++ b/.github/workflows/install.yml
@@ -73,4 +73,4 @@ jobs:
- name: Testing...
run: |
- make command-install
+ npm run test-unsafe test/jest/install.test.js
diff --git a/.github/workflows/link.yml b/.github/workflows/link.yml
index 7a575d9a..2ea8a3e2 100644
--- a/.github/workflows/link.yml
+++ b/.github/workflows/link.yml
@@ -70,4 +70,4 @@ jobs:
- name: Testing...
run: |
- make command-link
+ npm run test-unsafe test/jest/link.test.js
diff --git a/.github/workflows/local.yml b/.github/workflows/local.yml
index ac56b500..ee3527e1 100644
--- a/.github/workflows/local.yml
+++ b/.github/workflows/local.yml
@@ -73,4 +73,4 @@ jobs:
- name: Testing...
run: |
- make command-local
+ npm run test-unsafe test/jest/local.test.js
diff --git a/.github/workflows/options.yml b/.github/workflows/options.yml
index 35e18ed1..9bdf4ab1 100644
--- a/.github/workflows/options.yml
+++ b/.github/workflows/options.yml
@@ -52,4 +52,4 @@ jobs:
- name: Testing...
run: |
- make test-options
+ npm run test-unsafe test/jest/options.test.js
diff --git a/.github/workflows/outdated_upgrade.yml b/.github/workflows/outdated_upgrade.yml
index 2654c941..ce5360cc 100644
--- a/.github/workflows/outdated_upgrade.yml
+++ b/.github/workflows/outdated_upgrade.yml
@@ -52,4 +52,4 @@ jobs:
- name: Testing...
run: |
- make command-outdated-upgrade
+ npm run test-unsafe test/jest/outdated-upgrade.test.js
diff --git a/.github/workflows/search.yml b/.github/workflows/search.yml
index a79a86f5..b3a9336a 100644
--- a/.github/workflows/search.yml
+++ b/.github/workflows/search.yml
@@ -52,4 +52,4 @@ jobs:
- name: Testing...
run: |
- make command-search
+ npm run test-unsafe test/jest/search.test.js
diff --git a/.github/workflows/test_buttercup.yml b/.github/workflows/test_buttercup.yml
index d8a8dca0..cb78bc39 100644
--- a/.github/workflows/test_buttercup.yml
+++ b/.github/workflows/test_buttercup.yml
@@ -52,4 +52,4 @@ jobs:
- name: Testing...
run: |
- make test-buttercup
+ npm run test-unsafe test/jest/test-buttercup.test.js
diff --git a/.github/workflows/test_ecukes.yml b/.github/workflows/test_ecukes.yml
index 5633087f..13c93001 100644
--- a/.github/workflows/test_ecukes.yml
+++ b/.github/workflows/test_ecukes.yml
@@ -52,4 +52,4 @@ jobs:
- name: Testing...
run: |
- make test-ecukes
+ npm run test-unsafe test/jest/test-ecukes.test.js
diff --git a/.github/workflows/test_ert-runner.yml b/.github/workflows/test_ert-runner.yml
index 7decd111..9ac6c49a 100644
--- a/.github/workflows/test_ert-runner.yml
+++ b/.github/workflows/test_ert-runner.yml
@@ -52,4 +52,4 @@ jobs:
- name: Testing...
run: |
- make test-ert-runner
+ npm run test-unsafe test/jest/test-ert-runner.test.js
diff --git a/.github/workflows/test_ert.yml b/.github/workflows/test_ert.yml
index 9b652994..a5c60fb1 100644
--- a/.github/workflows/test_ert.yml
+++ b/.github/workflows/test_ert.yml
@@ -52,4 +52,4 @@ jobs:
- name: Testing...
run: |
- make test-ert
+ npm run test-unsafe test/jest/test-ert.test.js
diff --git a/.github/workflows/upgrade-eask.yml b/.github/workflows/upgrade-eask.yml
new file mode 100644
index 00000000..7eb95625
--- /dev/null
+++ b/.github/workflows/upgrade-eask.yml
@@ -0,0 +1,55 @@
+name: Upgrade Eask
+
+on:
+ push:
+ branches:
+ - master
+ paths:
+ - 'eask'
+ - '**.yml'
+ - lisp/**
+ - cmds/**
+ - src/**
+ - test/**
+ pull_request:
+ branches:
+ - master
+ paths-ignore:
+ - '**/docs.yml'
+ - '**.md'
+ workflow_dispatch:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ test:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ emacs-version:
+ - 30.1
+
+ steps:
+ - uses: jcs090218/setup-emacs@master
+ with:
+ version: ${{ matrix.emacs-version }}
+
+ - uses: actions/checkout@v4
+
+ - name: Prepare Eask (Unix)
+ if: matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest'
+ run: |
+ chmod -R 777 ./
+ .github/scripts/setup-eask
+
+ - name: Prepare Eask (Windows)
+ if: matrix.os == 'windows-latest'
+ run: .github/scripts/setup-eask.ps1
+
+ - name: Testing...
+ run: |
+ npm run test-unsafe test/jest/upgrade-eask.test.js
diff --git a/Makefile b/Makefile
index 4a984bcc..84b5233e 100644
--- a/Makefile
+++ b/Makefile
@@ -14,97 +14,8 @@ test-compat:
@echo "Test compatibility..."
$(EASK) load ./test/development/compat.el --allow-error
-test-options:
- ./test/options/run.sh
-
color:
./test/color/run.sh
error:
./test/error/run.sh
-
-command-global:
- ./test/commands/global/run.sh
-
-command-config:
- ./test/commands/config/run.sh
-
-command-local:
- ./test/commands/local/run.sh
-
-# new tests which check missing args not covered by existing tests
-command-exit-status: command-bump command-concat command-docs command-eval command-format command-info command-init command-lint command-recipe command-run command-source
-
-command-analyze:
- ./test/commands/analyze/dsl/run.sh
- ./test/commands/analyze/metadata/run.sh
- ./test/commands/analyze/error/run.sh
-
-command-bump:
- ./test/commands/bump/run.sh
-
-command-compile:
- ./test/commands/compile/run.sh
-
-command-concat:
- ./test/commands/concat/run.sh
-
-command-docker:
- ./test/commands/docker/run.sh
-
-command-docs:
- ./test/commands/docs/run.sh
-
-command-eval:
- ./test/commands/eval/run.sh
-
-command-exec:
- ./test/commands/exec/run.sh
-
-command-emacs:
- ./test/commands/emacs/run.sh
-
-command-format:
- ./test/commands/format/run.sh
-
-command-info:
- ./test/commands/info/run.sh
-
-command-init:
- ./test/commands/init/run.sh
-
-command-install:
- ./test/commands/install/run.sh
-
-command-link:
- ./test/commands/link/run.sh
-
-command-lint:
- ./test/commands/lint/run.sh
-
-command-outdated-upgrade:
- ./test/commands/outdated_upgrade/run.sh
-
-command-recipe:
- ./test/commands/recipe/run.sh
-
-command-run:
- ./test/commands/run/run.sh
-
-command-search:
- ./test/commands/search/run.sh
-
-command-source:
- ./test/commands/source/run.sh
-
-test-ert:
- ./test/commands/test/ert/run.sh
-
-test-ert-runner:
- ./test/commands/test/ert-runner/run.sh
-
-test-buttercup:
- ./test/commands/test/buttercup/run.sh
-
-test-ecukes:
- ./test/commands/test/ecukes/run.sh
diff --git a/docs/content/Contributing/Developing-Eask/_index.en.md b/docs/content/Contributing/Developing-Eask/_index.en.md
index 772909c6..ab3d70e1 100644
--- a/docs/content/Contributing/Developing-Eask/_index.en.md
+++ b/docs/content/Contributing/Developing-Eask/_index.en.md
@@ -5,19 +5,18 @@ weight: 20
{{< toc >}}
-### 🚩 Prerequisites
+## 🚩 Prerequisites
To make changes to Eask, you should have:
1. [Node.js][] for the development environment.
2. [npm][] for the package manager.
-3. [yargs][] for CLI parser.
-4. [Emacs][], 26.1 or above!
+3. [Emacs][], 26.1 or above!
-### 📝 Building
+## 📝 Building
To build the development environment, you would have to install Eask using
-the [build from source](https://emacs-eask.github.io/Getting-Started/Install-Eask/#-build-from-source)
+the [build from source][Build from source]
method. Make sure you have set up the environment PATH variable, so you can call
`eask` from the terminal.
@@ -31,20 +30,357 @@ It should print out the location of the `eask` executable.
You should be able to identify the Eask executable's location,
even you have multiple Eask versions installed!
-### 📈 Testing
+## 🧪 Testing
-Eask does not offer local testing, all our tests are accomplished using GitHub
-Actions. Please fork our repository, and push your changes to your fork. GitHub
-Actions should pick up the test for you!
+Local testing for Eask is done using the [Jest][] testing framework.
+Jest is a mature and well supported testing framework written in Javascript.
+Jest was chosen for much the [same reasons as Javascript][Why JS?] was chosen for this project.
+In addition, Jest is easy to learn and has built in support for snapshot based testing.
-Make sure you have GitHub Actions enabled in your repository (forked). Got to
-**Settings** -> **Actions** -> **General** -> **Actions Permissions**; make sure
-you have checked the correct options.
+### ⚗️ Running Tests
+
+If you have not done so already, run `npm install --dev`
+
+Always run from the project root (i.e. same directory as `package.json`)
+
+- run all tests `npm run test`
+- run a single test `npm run test path/to/test.js`
+- run tests with full output `npm run test-debug`
+- remove files created during test `npm run test-reset`
+
+Since `npm run test` just runs Jest, you can also pass Jest options to the
+commands above. For example:
+
+- run tests whose names (in `test()` blocks) match `npm run test -t 'eask lint .*'`
+- re-run failed tests `npm run test -f`
+
+### 🌍 Environment Vars
+
+| Name | Type | Default | Meaning |
+|:---------------|:--------|:--------|:--------------------------------------------------------------------------------------------------|
+| `ALLOW_UNSAFE` | `bool*` | false | Run tests in `testUnsafe` blocks. These can **overwrite** your personal emacs config or settings. |
+| `DEBUG` | `bool*` | false | Print full output from commands in test. |
+| `EASK_COMMAND` | path | "eask" | Path to Eask. Usually either `eask` or `$PWD/bin/eask` to use local changes. |
+| `TIMEOUT` | number | 25000 | Command timeout in ms. Note this is different than Jest's timeout, which should be greater. |
+
+{{< hint info >}}
+💡 Node.js handles environment variables as strings. That means that `DEBUG=0`, `DEBUG=false` all _enable_ `DEBUG`.
+The only setting which disables a boolean flag is null, for example `DEBUG=`.
+{{< /hint >}}
+
+### 🔬 How to Write a Test
+
+**Folder structure**
+
+Tests should be in `test/js`.
+Related tests should be in the same file with the suffix `.test.js` and are usually named after the
+feature or command that they test, for example `link.test.js` tests the `eask link` command.
+
+If the test needs some specific project files, put them in a new folder within `test/js`
+For example, files in `test/js/foo` would be expected to be for `foo.test.js`.
+
+The exception is `test/js/empty`, which is simply an empty folder.
+If you use it, make sure to run `eask clean all` before your tests.
+
+**Test File structure**
+
+``` javascript
+const { TestContext } = require("./helpers");
+
+describe("emacs", () => {
+ const ctx = new TestContext("./test/jest/empty");
+
+ beforeAll(async () => await ctx.runEask("clean all"));
+ afterAll(() => ctx.cleanUp);
+
+ test("eask emacs --version", async () => {
+ await ctx.runEask("emacs --version");
+ });
+
+ test("eask emacs --batch --eval", async () => {
+ await ctx.runEask(
+ 'emacs --batch --eval "(require (quote ert))" --eval "(ert-deftest mytest () (should-not (display-graphic-p)))" -f ert-run-tests-batch',
+ );
+ });
+});
+```
+
+In Jest, you group related tests using `describe`. Tests in the same `describe` block can share setup/teardown code,
+can be disabled as a group and are grouped under the same heading in output.
+
+`describe` blocks can be nested within other `describe` blocks.
+It's a good idea to add a nested `describe` when tests run in different directories, or to match a "given, when, then" style of testing.
+
+For each test directory you should create a new `TestContext` object.
+All `runEask` commands will use the `TestContext`'s working directory.
+
+Jest's tests are in `test` blocks. Note that `it` is an alias for `test`.
+Tests can be selectively disabled in code, like so:
+
+- `test.only(name, fn)` runs only that test in the file
+- `test.skip(name, fn)` skips running the test but still prints its name
+- `test.failing(name, fn)` invert the meaning of the test: it *should* fail.
+
+The `expect` API matches values in different ways and usually prints a diff as part of the failure report.
+See Jest's [expect()](https://jestjs.io/docs/expect) API for more info.
+
+Uncaught errors thrown in a `test` block will fail it and report the error.
+That's why many tests don't have an `expect` call, they simply check that the command succeeds.
+
+Output from `runEask` is wrapped in a helper class `CommandOutput` which provides some transformation methods.
+For example, if you have `const out = await ctx.runEask("analyze");`, then
+
+- `out.combined()` concatenates both stdout and stderr as a string,
+- `out.raw()` returns a plain object with just `stdout` and `stderr` as properties,
+- `out.sanitized()` replaces all absolute paths that match the context's path
+
+Since the class wraps the output of Node's `exec()` method you can still access `stdout` and `stderr`:
+
+``` javascript
+const { stderr, stdout } = await ctx.runEask("analyze");
+```
+
+Some commands create files or directories which should be removed after the test runs.
+For example, `eask generate ignore elisp` creates a `.gitignore` file.
+You can use the context's `removeFiles` method to remove files and directories relative
+to the context's path:
+
+``` javascript
+ describe("Generating", () => {
+ beforeAll(async () => await ctx.removeFiles(".gitignore"));
+ afterAll(async () => await ctx.removeFiles(".gitignore"));
+
+ it("eask generate ignore elisp", async () => {
+ await ctx.runEask("generate ignore elisp");
+ });
+ });
+```
+
+Note that `removeFiles()` will recursively remove directories, but does not accept patterns.
+So, to remove all files in `./test` just call `ctx.remove("test")`.
+You can pass multiple files or directory names in single call: `ctx.remove("test", ".gitignore")`.
+
+Use `TestContext.cleanUp()` to immediately abort any still-running commands that were called in that context.
+Use this if Jest reports "open handles were detected" after a test run.
+Note that `cleanUp` sends a signal to *all* processes started using the context's `runEask` command.
+If used in an `afterEach` hook (i.e. after every test) it may result in failures.
+
+### 🪧 Snapshots
+
+[Snapshot tests](https://jestjs.io/docs/snapshot-testing) match the output of a test against a saved copy of the expected output.
+For example:
+
+``` javascript
+test("eask analyze", async () => {
+ const res = await ctx.runEask("analyze");
+ expect(res.raw()).toMatchSnapshot();
+});
+```
+
+The first time you run this Jest will create a new snapshot saved in an adjacent `__snapshot__` directory.
+
+You should check this file in to version control as it forms a critical part of the test.
+If the snapshot changes, you can update the snapshot by running Jest with option `-u`, for example,
+`npm run test -- -u` will update all changed snapshots.
+
+Any type of output can be used for a snapshot test. You could snapshot the contents of a file after changing it
+
+``` javascript
+test("eask analyze", async () => {
+ await ctx.runEask("foo");
+ const file = ctx.fileContents("Easkfile"); // file as a string
+ expect(file).toMatchSnapshot();
+});
+```
+
+Often snapshots will include data that varies with time or environment, for example timestamps or file paths.
+The snapshot of `eask analyze` contains absolute file paths that will be different on every machine.
+
+Output from `runEask` is wrapped in a helper class `CommandOutput` which provides some transformation methods.
+The simplest just removes the absolute file paths:
+
+``` javascript
+it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res.sanitized() // a CommandOutput object with absolute paths replaced by "~"
+ .raw(); // an object { stderr, stdout } suitable for snapshotting
+ expect(resClean).toMatchSnapshot();
+});
+```
+
+You can include custom replacement functions. Here, numbers will be replaced by `"x"`.
+Then strings `"x:x"` will be replaced by `"y"`.
+
+``` javascript
+it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res
+ .sanitized(
+ (x) => x.replace(/[0-9]+/g, "x"),
+ (x) => x.replaceAll("x:x", "y"),
+ )
+ .raw();
+ expect(resClean).toMatchSnapshot();
+});
+```
+
+It's important to use the `g` regex flag so all occurrences of the match are replaced, or you could use `replaceAll`.
+User provided functions run in addition to the default sanitize function and run in the order they were given.
+
+### ⏱️ Timeouts
+
+There are two timeout settings, one for Jest and one for Node's `exec()`.
+All timeout values are in milliseconds.
+
+Since the `exec()` timeout immediately terminates the running command and reports output, it is much better to
+use that instead of Jest's timeout.
+
+To change a timeout for a single command
+
+``` javascript
+ctx.runEask("analyze", { timeout: 10000})
+```
+
+To change the global timeout for a single run, use the env var
+
+``` shell
+env TIMEOUT=30000 npm run test
+```
+
+To change the global timeout permanently, set the default in `./helpers.js`.
+
+If you change either global timeout, **make sure the global Jest timeout is greater** by setting it in `package.json`
+
+``` json
+"jest": {
+ "rootDir": "./test/jest",
+ "testTimeout": 40000
+}
+```
+
+### 📜 Patterns
+
+Here are some common patterns for testing commands.
+Each of these assumes that `ctx` is a `TestContext` object.
+
+**Check a command succeeds:**
+
+``` javascript
+test("eask analyze", async () => {
+ await ctx.runEask("analyze");
+});
+```
+
+Uncaught errors thrown in a `test` block will fail the test and report the error.
+Failed commands will include stderr and stdout.
+
+**Check a command fails:**
+
+``` javascript
+test("eask analyze", async () => {
+ await expect(ctx.runEask("analyze")).rejects.toThrow();
+});
+```
+
+**Check a command fails with a specific code:**
+
+``` javascript
+test("eask link add should error", async () => {
+ // the error object should have property code = 1
+ await expect(ctx.runEask("link add")).rejects.toMatchObject({
+ code: 1,
+ });
+});
+```
+
+**Check a command produces some output:**
+
+``` javascript
+test("eask analyze", async () => {
+ const out = await ctx.runEask("analyze");
+ expect(out.stderr).toMatch("success"); // should apppear as a substring
+ // If you want to check both `stderr` and `stdout`, just concatenate them
+ expect(out.stdout + "/n" + out.stderr).toMatch("success");
+ // Same thing using helper methods
+ expect(out.combined()).toMatch("success");
+});
+```
+
+**Check command output against a snapshot:**
+
+Simple output matching
+
+``` javascript
+test("eask analyze", async () => {
+ const res = await ctx.runEask("analyze");
+ expect(res).toMatchSnapshot();
+});
+```
+
+Update all changed snapshots: `npm run test -- -u`
+
+Remove absolute file paths from output:
+
+``` javascript
+it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res.sanitized() // a CommandOutput object with absolute paths replaced by "~"
+ .raw(); // an object { stderr, stdout } suitable for snapshotting
+ expect(resClean).toMatchSnapshot();
+});
+```
+
+Apply custom transformations for sanitizing output:
+
+``` javascript
+it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res
+ .sanitized(
+ (x) => x.replace(/[0-9]+/g, "x"),
+ (x) => x.replace(/x:x/g, "y"),
+ )
+ .raw();
+ expect(resClean).toMatchSnapshot();
+});
+```
+
+User provided functions run in addition to the default sanitize function and run in the order they were given.
+
+**Commands which modify the user's environment:**
+
+For example, commands which use `-c` or `-g` options.
+
+``` javascript
+const { testUnsafe } = require('./helpers');
+
+// this will only run if ALLOW_UNSAFE is != 0
+testUnsafe("global install", async () => {
+ // this installs in ~/.eask and changes ~/Eask
+ await ctx.runEask("install -g foo");
+});
+```
+
+### 🩺 Common Problems
+
+- When using `runEask()`, pass only the Eask *arguments*, not the `eask` command itself.
+- Always `await` any expressions that trigger commands.
+- When using `expect(...).rejects` it should be awaited so that the promise rejects before the test completes.
+- The folder argument to `TestContext` should be relative to project root, if it doesn't exist you may get an error `ENOENT`
+- If you get an error from Jest reporting open handles, then try using `afterAll(() => ctx.cleanUp())`
+- There are two timeout values: one used for Jest (set in `package.json`), and one used for `node.exec`, set via env var in `./helpers.js`.
+The `node.exec` timeout is set lower than the Jest one, so changing timeout values for tests or by `jest.setTimeout` usually won't
+have an effect. Instead set the timeout on the command itself `runEask("eask emacs", { timeout: 100000 })`
+[Build from source]: https://emacs-eask.github.io/Getting-Started/Install-Eask/#-build-from-source
+[Why JS?]: https://emacs-eask.github.io/FAQ/#-why-javascript
+
[Node.js]: https://nodejs.org/en/
[npm]: https://www.npmjs.com/
[yargs]: https://github.com/yargs/yargs
[Emacs]: https://www.gnu.org/software/emacs/
+
+[Jest]: https://jestjs.io
diff --git a/docs/content/Contributing/Developing-Eask/_index.zh-tw.md b/docs/content/Contributing/Developing-Eask/_index.zh-tw.md
index deb8d9b7..6801db4a 100644
--- a/docs/content/Contributing/Developing-Eask/_index.zh-tw.md
+++ b/docs/content/Contributing/Developing-Eask/_index.zh-tw.md
@@ -11,12 +11,11 @@ weight: 20
1. [Node.js][] 開發環境。
2. [npm][] 包管理器。
-3. [yargs][] 用於 CLI 解析器。
-4. [Emacs][], 26.1 以上!
+3. [Emacs][], 26.1 以上!
### 📝 建構
-要構建開發環境,您必須使用安裝 Eask [從源代碼建構](https://emacs-eask.github.io/Getting-Started/Install-Eask/#-build-from-source)
+要構建開發環境,您必須使用安裝 Eask [從源代碼建構][Build from source]
的方法。 確保你已經設置了環境 `PATH` 變量,這樣你就可以調用來自終端的`eask`。
完成安裝後,嘗試:
@@ -27,18 +26,349 @@ eask locate
它應該會列印出 `eask` 可執行檔的位置。即使您已安裝多個 Eask 版本,也應該可以辨識 Eask 可執行檔的位置!
-### 📈 測試
+### 🧪 測試
-Eask 不提供本地測試,我們所有的測試都是使用 GitHub 完成的動作。 請 fork 我們的存儲庫
-並將您的更改推送到您的 fork。 GitHub 行動應該為你拿起測試!
+Eask 的本地測試使用 [Jest][] 測試框架完成。Jest 是用 Javascript 寫成的成熟且支援良好的測試框架。
+選擇 Jest 的原因與本專案[選擇 Javascript 的原因大致相同][Why JS?]。此外,Jest 容易學習,而且內建了對快照測試的支援。
-確保您的存儲庫(分叉)中啟用了 GitHub Actions。 必須 **設置** -> **操作** -> **常規**
--> **操作權限**; 確保您已經檢查了正確的選項。
+### ⚗️ 執行測試
+
+如果尚未執行,請執行 `npm install --dev` 。
+
+永遠從專案根目錄執行 (即與 `package.json` 相同的目錄)
+
+- 執行所有測試 `npm run test`
+- 執行單次測試 `npm run test path/to/test.js`
+- 以完整輸出執行測試 `npm run test-debug`
+- 移除測試時建立的檔案 `npm run test-reset`
+
+由於 `npm run test` 只會執行 Jest,您也可以將 Jest 選項傳給上面的指令。例如
+
+- 執行名稱 (在 `test()` 區塊中) 符合`npm run test -t 'eask lint .*'` 的測試
+- 重新執行失敗的測試 `npm run test -f`
+
+### 🌍 環境變數
+
+| Name | Type | Default | Meaning |
+|:---------------|:--------|:--------|:---------------------------------------------------------------------|
+| `ALLOW_UNSAFE` | `bool*` | false | 在 `testUnsafe` 區塊中執行測試。這些區塊可能**覆寫**您個人的 emacs 配置或設定。 |
+| `DEBUG` | `bool*` | false | 列印測試中指令的完整輸出。 |
+| `EASK_COMMAND` | path | "eask" | Eask 的路徑。通常是 `eask` 或 `$PWD/bin/eask` 來使用本機變更。 |
+| `TIMEOUT` | number | 25000 | 命令超時,以毫秒為單位。請注意這與 Jest 的逾時時間不同,Jest 的逾時時間應該更長。 |
+
+{{< hint info >}}
+💡 Node.js 將環境變數當成字串來處理。這表示 `DEBUG=0`、`DEBUG=false` 都 _enable_ `DEBUG`。
+唯一禁用布林旗標的設定是 null,例如 `DEBUG=`。
+{{< /hint >}}
+
+### 🔬 如何撰寫測試
+
+**資料夾結構**
+
+測試應該放在 `test/js` 中。
+相關的測試應該在同一個檔案中,後綴為 `.test.js`,通常以測試的功能或指令命名,例如 `link.test.js` 測試 `eask link` 指令。
+
+如果測試需要一些特定的專案檔案,請將它們放在 `test/js` 中的新資料夾。
+例如,在 `test/js/foo` 中的檔案預計會用於 `foo.test.js`。
+
+例外的是 `test/js/empty`,它只是一個空的資料夾。
+如果您使用它,請務必在測試前執行 `eask clean all`。
+
+** 測試檔案結構**
+
+``` javascript
+const { TestContext } = require("./helpers");
+
+describe("emacs", () => {
+ const ctx = new TestContext("./test/jest/empty");
+
+ beforeAll(async () => await ctx.runEask("clean all"));
+ afterAll(() => ctx.cleanUp);
+
+ test("eask emacs --version", async () => {
+ await ctx.runEask("emacs --version");
+ });
+
+ test("eask emacs --batch --eval", async () => {
+ await ctx.runEask(
+ 'emacs --batch --eval "(require (quote ert))" --eval "(ert-deftest mytest () (should-not (display-graphic-p)))" -f ert-run-tests-batch',
+ );
+ });
+});
+```
+
+在 Jest 中,您可以使用 `describe` 將相關的測試分組。在相同的 `describe` 區塊中的測試可以共用設定/停用程式碼,可以作為一個群組停用,並在輸出中被歸類在相同的標題下。
+
+`describe` 區塊可以嵌套在其他的 `describe` 區塊中。
+當測試在不同目錄中執行時,或配合 "given, when, then" 的測試風格時,加入巢狀的 `describe` 是個好主意。
+
+您應該為每個測試目錄建立新的 `TestContext` 物件。
+所有的 `runEask` 指令都會使用 `TestContext` 的工作目錄。
+
+Jest 的測試在 `test` 區塊中。請注意 `it` 是 `test` 的別名。
+測試可以在程式碼中選擇性地停用,就像這樣:
+
+- `test.only(name,fn)` 只執行檔案中的測試
+- `test.skip(name,fn)` 跳過執行測試,但仍會列印其名稱
+- `test.failing(name, fn)` 反轉測試的意義:它*應該*失敗。
+
+`expect` API 以不同的方式匹配值,通常會列印差異作為失敗報告的一部分。
+更多資訊請參閱 Jest 的 [expect()](https://jestjs.io/docs/expect) API。
+
+在 `test` 區塊中拋出的未捕獲錯誤會使它失敗並報告錯誤。
+這就是為什麼許多測試沒有 `expect` 呼叫,它們只是檢查指令是否成功。
+
+來自 `runEask` 的輸出會包裝在提供一些轉換方法的輔助類 `CommandOutput` 中。
+例如,如果您有 `const out = await ctx.runEask("analyze");`,那麼
+
+- `out.combined()` 將 stdout 和 stderr 匯整為一個字串、
+- `out.raw()` 返回一個只有`stdout`和`stderr`屬性的純物件、
+- `out.sanitized()` 會取代所有符合上下文路徑的絕對路徑。
+
+由於這個類別包覆了 Node 的 `exec()` 方法的輸出,你仍然可以存取 `stdout` 和 `stderr`:
+
+``` javascript
+const { stderr, stdout } = await ctx.runEask("analyze");
+```
+
+有些指令會建立檔案或目錄,這些檔案或目錄應該在測試執行後移除。
+例如,`eask generate ignore elisp` 會建立一個 `.gitignore` 檔案。
+您可以使用 context 的 `removeFiles` 方法來移除相對於 context 路徑的檔案和目錄:
+
+``` javascript
+ describe("Generating", () => {
+ beforeAll(async () => await ctx.removeFiles(".gitignore"));
+ afterAll(async () => await ctx.removeFiles(".gitignore"));
+
+ it("eask generate ignore elisp", async () => {
+ await ctx.runEask("generate ignore elisp");
+ });
+ });
+```
+
+請注意,`removeFiles()` 會遞迴移除目錄,但不接受模式。
+因此,要移除 `./test` 中的所有檔案,只需呼叫 `ctx.remove("test")`。
+您可以在一次呼叫中傳入多個檔案或目錄名稱: `ctx.remove("test", ".gitignore")`.
+
+使用 `TestContext.cleanUp()` 立即中止在該上下文中呼叫的任何仍在執行的指令。
+如果 Jest 在測試執行後報告"偵測到開啟的句柄",請使用此功能。
+請注意,`cleanUp` 會傳送一個信號給所有使用上下文的 `runEask` 指令啟動的進程。
+如果在 `afterEach` 鈎結中使用 (即每次測試後),可能會導致失敗。
+
+### 🪧 快照
+
+[快照測試](https://jestjs.io/docs/snapshot-testing) 將測試的輸出與預期輸出的儲存副本進行比對。
+例如:
+
+``` javascript
+test("eask analyze", async () => {
+ const res = await ctx.runEask("analyze");
+ expect(res.raw()).toMatchSnapshot();
+});
+```
+
+第一次執行時,Jest 會建立一個新的快照,儲存在鄰近的 `__snapshot__` 目錄中。
+
+您應該將此檔案加入版本控制,因為它是測試的關鍵部分。
+如果快照變更,您可以使用選項 `-u` 執行 Jest 來更新快照,例如 `npm run test -- -u` 會更新所有變更的快照。
+
+任何類型的輸出都可以用於快照測試。您可以在變更檔案後快照檔案內容
+
+``` javascript
+test("eask analyze", async () => {
+ await ctx.runEask("foo");
+ const file = ctx.fileContents("Easkfile"); // 檔案為字串
+ expect(file).toMatchSnapshot();
+});
+```
+
+通常快照會包含會隨時間或環境改變的資料,例如時間戳記或檔案路徑。
+`eask analyze` 的快照包含絕對檔案路徑,這些路徑在每台機器上都會不同。
+
+從 `runEask` 輸出的內容會包裝在提供一些轉換方法的輔助類 `CommandOutput` 中。
+最簡單的只是移除絕對檔案路徑:
+
+``` javascript
+it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res.sanitized() // 以 "~" 取代絕對路徑的 CommandOutput 物件
+ .raw(); // 適合快照的物件 { stderr、stdout }
+ expect(resClean).toMatchSnapshot();
+});
+```
+
+您可以加入自訂的取代函數。在這裡,數字會被 `"x"` 取代。
+字串 `"x:x"` 將被 `"y"` 取代。
+
+``` javascript
+it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res
+ .sanitized(
+ (x) => x.replace(/[0-9]+/g, "x"),
+ (x) => x.replaceAll("x:x", "y"),
+ )
+ .raw();
+ expect(resClean).toMatchSnapshot();
+});
+```
+
+請務必使用 `g` regex 標記,這樣所有匹配的出現都會被取代,或者您也可以使用 `replaceAll`。
+使用者提供的函數會在預設的 sanitize 函數之外執行,並且會依給定的順序執行。
+
+### ⏱️ 超時
+
+T這裡有兩個超時設定,一個用於 Jest,另一個用於 Node 的 `exec()`。
+所有逾時值的單位都是毫秒。
+
+由於 `exec()` 超時會立即終止執行中的指令並報告輸出,因此使用它來代替 Jest 的超時會更好。
+
+若要變更單一指令的逾時時間
+
+``` javascript
+ctx.runEask("analyze", { timeout: 10000})
+```
+
+若要變更單次執行的全局逾時,請使用 env var
+
+``` shell
+env TIMEOUT=30000 npm run test
+```
+
+若要永久變更全局超時,請在 `./helpers.js` 中設定預設值。
+
+如果您變更任一全域逾時時間,**請在 `package.json` 中設定全域逾時時間,以確保全域 Jest 逾時時間較長**。
+
+``` json
+"jest": {
+ "rootDir": "./test/jest",
+ "testTimeout": 40000
+}
+```
+
+### 📜 樣式
+
+以下是一些測試指令的常見模式。
+每種模式都假設 `ctx` 是一個 `TestContext` 物件。
+
+**檢查指令是否成功:**
+
+``` javascript
+test("eask analyze", async () => {
+ await ctx.runEask("analyze");
+});
+```
+
+在 `test` 區塊中拋出的未捕獲錯誤將使測試失敗,並會報告錯誤。
+失敗的指令會包含 stderr 和 stdout。
+
+**檢查命令失敗:**
+
+``` javascript
+test("eask analyze", async () => {
+ await expect(ctx.runEask("analyze")).rejects.toThrow();
+});
+```
+
+**檢查指令是否以特定代碼失敗:**
+
+``` javascript
+test("eask link add should error", async () => {
+ // 錯誤物件的屬性代碼應該是 1
+ await expect(ctx.runEask("link add")).rejects.toMatchObject({
+ code: 1,
+ });
+});
+```
+
+** 檢查指令是否產生某些輸出:**
+
+``` javascript
+test("eask analyze", async () => {
+ const out = await ctx.runEask("analyze");
+ expect(out.stderr).toMatch("success"); // 應顯示為子字串
+ // 如果您要同時檢查 `stderr` 和 `stdout`,只要將它們串連即可
+ expect(out.stdout + "/n" + out.stderr).toMatch("success");
+ // 使用輔助方法也是一樣
+ expect(out.combined()).toMatch("success");
+});
+```
+
+**根據快照檢查指令輸出:**
+
+簡單的輸出比對
+
+``` javascript
+test("eask analyze", async () => {
+ const res = await ctx.runEask("analyze");
+ expect(res).toMatchSnapshot();
+});
+```
+
+更新所有已變更的快照: `npm run test -- -u`
+
+移除輸出中的絕對檔案路徑:
+
+``` javascript
+it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res.sanitized() // 以 "~" 取代絕對路徑的 CommandOutput 物件
+ .raw(); // 適合快照的物件 { stderr、stdout }
+ expect(resClean).toMatchSnapshot();
+});
+```
+
+套用自訂的轉換來消毒輸出:
+
+``` javascript
+it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res
+ .sanitized(
+ (x) => x.replace(/[0-9]+/g, "x"),
+ (x) => x.replace(/x:x/g, "y"),
+ )
+ .raw();
+ expect(resClean).toMatchSnapshot();
+});
+```
+
+使用者提供的函數會在預設的 sanitize 函數之外執行,並且會按照所給予的順序執行。
+
+** 修改使用者環境的指令:**
+
+例如,使用 `-c` 或 `-g` 選項的指令。
+
+``` javascript
+const { testUnsafe } = require('./helpers');
+
+// 只有當 ALLOW_UNSAFE 為 != 0 時,才會執行此指令。
+testUnsafe("global install", async () => {
+ // 這會安裝在 ~/.eask 中,並變更 ~/Eask
+ await ctx.runEask("install -g foo");
+});
+```
+
+### 🩺 常見問題
+
+- 使用 `runEask()` 時,只傳 Eask *arguments*,不傳 `eask` 指令本身。
+- 總是 `await` 任何觸發指令的表達式。
+- 當使用`expect(...).rejects`時,它應該被 awaited,以便承諾在測試完成前拒絕。
+- `TestContext` 的資料夾參數應該相對於專案根目錄,如果它不存在,您可能會得到一個錯誤`ENOENT`。
+- 如果您收到 Jest 回報打開句柄的錯誤,那麼請嘗試使用 `afterAll(() => ctx.cleanUp())`
+- 有兩個逾時值:一個用於 Jest (在 `package.json` 中設定),另一個用於 `node.exec`,在 `./helpers.js` 中透過 env var 設定。
+`node.exec` 的逾時設定比 Jest 的低,所以改變測試的逾時值或 `jest.setTimeout` 通常不會有影響。
+取而代之,在指令本身設定超時 `runEask("eask emacs", { timeout: 100000 })`。
+[Build from source]: https://emacs-eask.github.io/zh-tw/Getting-Started/Install-Eask/#-%e5%be%9e%e5%8e%9f%e5%a7%8b%e7%a2%bc%e6%a7%8b%e5%bb%ba
+[Why JS?]: https://emacs-eask.github.io/zh-tw/FAQ/#-%E7%82%BA%E4%BB%80%E9%BA%BC%E9%81%B8%E6%93%87-javascript
+
[Node.js]: https://nodejs.org/en/
[npm]: https://www.npmjs.com/
[yargs]: https://github.com/yargs/yargs
[Emacs]: https://www.gnu.org/software/emacs/
+
+[Jest]: https://jestjs.io
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index d71ad929..d801a52c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,824 +16,3284 @@
"eask": "eask"
},
"devDependencies": {
- "@yao-pkg/pkg": "^6.0.0"
+ "@yao-pkg/pkg": "^6.0.0",
+ "jest": "^29.7.0"
}
},
- "node_modules/@babel/helper-string-parser": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
- "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": ">=6.0.0"
}
},
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
- "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "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"
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=6.9.0"
}
},
- "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+ "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ "node": ">=6.9.0"
}
},
- "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "node_modules/@babel/core": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.10",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.10",
+ "@babel/parser": "^7.26.10",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.10",
+ "@babel/types": "^7.26.10",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=6.9.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
}
},
- "node_modules/@isaacs/cliui/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==",
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "license": "MIT"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
},
- "node_modules/@isaacs/cliui/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==",
+ "node_modules/@babel/generator": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz",
+ "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==",
"dev": true,
"license": "MIT",
"dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
+ "@babel/parser": "^7.26.10",
+ "@babel/types": "^7.26.10",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
},
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=6.9.0"
}
},
- "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
},
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ "node": ">=6.9.0"
}
},
- "node_modules/@isaacs/cliui/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==",
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"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"
+ "yallist": "^3.0.2"
}
},
- "node_modules/@isaacs/fs-minipass": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
- "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "minipass": "^7.0.4"
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "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==",
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
"dev": true,
"license": "MIT",
- "optional": true,
"engines": {
- "node": ">=14"
+ "node": ">=6.9.0"
}
},
- "node_modules/@yao-pkg/pkg": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.2.0.tgz",
- "integrity": "sha512-kq1aDs9aa+fEtKQQ2AsxcL4Z82LsYw9ZQIwD3Q/wDq8ZPN69wCf2+OQp271lnqMybYInXwwBJ3swIb/nvaXS/g==",
+ "node_modules/@babel/helpers": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz",
+ "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/generator": "^7.23.0",
- "@babel/parser": "^7.23.0",
- "@babel/types": "^7.23.0",
- "@yao-pkg/pkg-fetch": "3.5.18",
- "into-stream": "^6.0.0",
- "minimist": "^1.2.6",
- "multistream": "^4.1.0",
- "picocolors": "^1.1.0",
- "picomatch": "^4.0.2",
- "prebuild-install": "^7.1.1",
- "resolve": "^1.22.0",
- "stream-meter": "^1.0.4",
- "tar": "^7.4.3",
- "tinyglobby": "^0.2.9",
- "unzipper": "^0.12.3"
- },
- "bin": {
- "pkg": "lib-es5/bin.js"
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.10"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@yao-pkg/pkg-fetch": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.18.tgz",
- "integrity": "sha512-tdUT7zS2lyXeJwkA8lDI4aVxHwauAc5lKj6Xui3/BtDe6vDsQ8KP+f66u07AI28DuTzKxjRJKNNXVdyGv2Ndsg==",
+ "node_modules/@babel/parser": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
+ "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.6",
- "picocolors": "^1.1.0",
- "progress": "^2.0.3",
- "semver": "^7.3.5",
- "tar-fs": "^2.1.1",
- "yargs": "^16.2.0"
+ "@babel/types": "^7.26.10"
},
"bin": {
- "pkg-fetch": "lib-es5/bin.js"
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/@yao-pkg/pkg-fetch/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
+ "@babel/helper-plugin-utils": "^7.8.0"
},
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@yao-pkg/pkg-fetch/node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@yao-pkg/pkg/node_modules/@babel/generator": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
- "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.26.3",
- "@babel/types": "^7.26.3",
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25",
- "jsesc": "^3.0.2"
+ "@babel/helper-plugin-utils": "^7.12.13"
},
- "engines": {
- "node": ">=6.9.0"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@yao-pkg/pkg/node_modules/@babel/parser": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
- "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.3"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
+ "@babel/helper-plugin-utils": "^7.14.5"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@yao-pkg/pkg/node_modules/@babel/types": {
- "version": "7.26.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
- "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@yao-pkg/pkg/node_modules/jsesc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
"dev": true,
"license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
},
- "engines": {
- "node": ">=6"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@yao-pkg/pkg/node_modules/picomatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=12"
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
},
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "debug": "4"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "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==",
- "engines": {
- "node": ">=8"
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "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==",
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
+ "@babel/helper-plugin-utils": "^7.8.0"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "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==",
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
},
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
},
- "node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/bl/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "@babel/helper-plugin-utils": "^7.8.0"
},
- "engines": {
- "node": ">= 6"
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
},
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
+ "license": "MIT",
"dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
- "dev": true
- },
- "node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "node_modules/@babel/template": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+ "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
+ "@babel/code-frame": "^7.26.2",
+ "@babel/parser": "^7.26.9",
+ "@babel/types": "^7.26.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "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==",
+ "node_modules/@babel/traverse": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz",
+ "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.10",
+ "@babel/parser": "^7.26.10",
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.10",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=6.9.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=="
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "node_modules/@babel/types": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
+ "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
},
"engines": {
- "node": ">= 8"
+ "node": ">=6.9.0"
}
},
- "node_modules/cross-spawn/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
"dev": true,
- "license": "ISC"
+ "license": "MIT"
},
- "node_modules/cross-spawn/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "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": {
- "isexe": "^2.0.0"
+ "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"
},
- "bin": {
- "node-which": "bin/node-which"
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "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/@isaacs/cliui/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/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/reporters": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^29.7.0",
+ "jest-config": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-resolve-dependencies": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expect": "^29.7.0",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "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/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "22.13.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz",
+ "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@yao-pkg/pkg": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@yao-pkg/pkg/-/pkg-6.2.0.tgz",
+ "integrity": "sha512-kq1aDs9aa+fEtKQQ2AsxcL4Z82LsYw9ZQIwD3Q/wDq8ZPN69wCf2+OQp271lnqMybYInXwwBJ3swIb/nvaXS/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/generator": "^7.23.0",
+ "@babel/parser": "^7.23.0",
+ "@babel/types": "^7.23.0",
+ "@yao-pkg/pkg-fetch": "3.5.18",
+ "into-stream": "^6.0.0",
+ "minimist": "^1.2.6",
+ "multistream": "^4.1.0",
+ "picocolors": "^1.1.0",
+ "picomatch": "^4.0.2",
+ "prebuild-install": "^7.1.1",
+ "resolve": "^1.22.0",
+ "stream-meter": "^1.0.4",
+ "tar": "^7.4.3",
+ "tinyglobby": "^0.2.9",
+ "unzipper": "^0.12.3"
+ },
+ "bin": {
+ "pkg": "lib-es5/bin.js"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@yao-pkg/pkg-fetch": {
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@yao-pkg/pkg-fetch/-/pkg-fetch-3.5.18.tgz",
+ "integrity": "sha512-tdUT7zS2lyXeJwkA8lDI4aVxHwauAc5lKj6Xui3/BtDe6vDsQ8KP+f66u07AI28DuTzKxjRJKNNXVdyGv2Ndsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "https-proxy-agent": "^5.0.0",
+ "node-fetch": "^2.6.6",
+ "picocolors": "^1.1.0",
+ "progress": "^2.0.3",
+ "semver": "^7.3.5",
+ "tar-fs": "^2.1.1",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "pkg-fetch": "lib-es5/bin.js"
+ }
+ },
+ "node_modules/@yao-pkg/pkg-fetch/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@yao-pkg/pkg-fetch/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@yao-pkg/pkg/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "^29.7.0",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^29.6.3",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-istanbul/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.1.14",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
+ "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "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/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/bl/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001706",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz",
+ "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "dev": true
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "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=="
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ },
+ "bin": {
+ "create-jest": "bin/create-jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "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/cross-spawn/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/cross-spawn/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/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "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/electron-to-chromium": {
+ "version": "1.5.120",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.120.tgz",
+ "integrity": "sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "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=="
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true
+ },
+ "node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "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,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "dev": true
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "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/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "node_modules/into-stream": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
+ "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==",
+ "dev": true,
+ "dependencies": {
+ "from2": "^2.3.0",
+ "p-is-promise": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^29.7.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "execa": "^5.0.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^1.0.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^29.7.0",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "^29.7.0",
+ "pure-rand": "^6.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "create-jest": "^29.7.0",
+ "exit": "^0.1.2",
+ "import-local": "^3.0.2",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "yargs": "^17.3.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
},
- "engines": {
- "node": ">= 8"
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
}
},
- "node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ms": "^2.1.3"
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": ">=6.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
- "supports-color": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
"optional": true
}
}
},
- "node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "node_modules/jest-config/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "mimic-response": "^3.1.0"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/jest-config/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "*"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "node_modules/jest-config/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
"engines": {
- "node": ">=4.0.0"
+ "node": "*"
}
},
- "node_modules/detect-libc": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
- "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "node_modules/jest-config/node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/duplexer2": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
- "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"dependencies": {
- "readable-stream": "^2.0.2"
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "node_modules/jest-docblock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
"dev": true,
- "license": "MIT"
- },
- "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=="
+ "license": "MIT",
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
},
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "node_modules/jest-each": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "once": "^1.4.0"
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "node_modules/jest-environment-node": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
"engines": {
- "node": ">=6"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/expand-template": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
- "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/foreground-child": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
- "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "node_modules/jest-haste-map": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
+ "@jest/types": "^29.6.3",
+ "@types/graceful-fs": "^4.1.3",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
},
"engines": {
- "node": ">=14"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
}
},
- "node_modules/from2": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
- "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+ "node_modules/jest-leak-detector": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0"
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true
+ "node_modules/jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
},
- "node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "node_modules/jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
},
"engines": {
- "node": ">=14.14"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "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==",
+ "node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
"dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": "6.* || 8.* || >= 10.*"
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
}
},
- "node_modules/github-from-package": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
- "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
- "dev": true
+ "node_modules/jest-regex-util": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
},
- "node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "node_modules/jest-resolve": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"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"
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^2.0.0",
+ "slash": "^3.0.0"
},
- "bin": {
- "glob": "dist/esm/bin.mjs"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.7.0"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "node_modules/jest-runner": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
"dev": true,
- "license": "ISC"
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/environment": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-leak-detector": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-resolve": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "node_modules/jest-runtime": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "function-bind": "^1.1.2"
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "node_modules/jest-runtime/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "agent-base": "6",
- "debug": "4"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/jest-runtime/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">= 6"
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "node_modules/jest-runtime/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "node_modules/jest-snapshot": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-jsx": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/types": "^7.3.3",
+ "@jest/expect-utils": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^29.7.0",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
},
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
},
- "node_modules/into-stream": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
- "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==",
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "from2": "^2.3.0",
- "p-is-promise": "^3.0.0"
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
},
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -841,42 +3301,110 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
+ "node_modules/jest-watcher": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "jest-util": "^29.7.0",
+ "string-length": "^4.0.1"
+ },
"engines": {
- "node": ">=8"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/isexe": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
- "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
"engines": {
- "node": ">=16"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "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==",
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "MIT",
"dependencies": {
- "@isaacs/cliui": "^8.0.2"
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
},
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
}
},
"node_modules/jsonfile": {
@@ -892,6 +3420,46 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/lru-cache": {
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
@@ -899,6 +3467,63 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
@@ -1033,6 +3658,13 @@
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
"dev": true
},
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-abi": {
"version": "3.63.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.63.0.tgz",
@@ -1073,6 +3705,36 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1082,6 +3744,22 @@
"wrappy": "1"
}
},
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/p-is-promise": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
@@ -1091,6 +3769,61 @@
"node": ">=8"
}
},
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"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",
@@ -1098,6 +3831,45 @@
"dev": true,
"license": "BlueOak-1.0.0"
},
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -1138,6 +3910,42 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/prebuild-install": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
@@ -1164,6 +3972,34 @@
"node": ">=10"
}
},
+ "node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -1180,6 +4016,20 @@
"node": ">=0.4.0"
}
},
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@@ -1190,6 +4040,23 @@
"once": "^1.3.1"
}
},
+ "node_modules/pure-rand": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
@@ -1205,6 +4072,13 @@
"rc": "cli.js"
}
},
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
@@ -1245,6 +4119,39 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
+ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/resolve/node_modules/is-core-module": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
@@ -1372,6 +4279,64 @@
"simple-concat": "^1.0.0"
}
},
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/stream-meter": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz",
@@ -1390,6 +4355,20 @@
"safe-buffer": "~5.1.0"
}
},
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -1444,6 +4423,26 @@
"node": ">=8"
}
},
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
@@ -1453,6 +4452,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -1535,6 +4547,67 @@
"node": ">=18"
}
},
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/test-exclude/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/test-exclude/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/tinyglobby": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz",
@@ -1577,6 +4650,26 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -1596,6 +4689,36 @@
"node": "*"
}
},
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
@@ -1620,12 +4743,68 @@
"node-int64": "^0.4.0"
}
},
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -1699,6 +4878,27 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/write-file-atomic/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -1741,6 +4941,19 @@
"engines": {
"node": ">=12"
}
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
}
}
diff --git a/package.json b/package.json
index 746a528c..6e7efa65 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,10 @@
"description": "A set of command-line tools to build Emacs packages",
"main": "eask",
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
+ "test-unsafe": "env ALLOW_UNSAFE=1 jest",
+ "test-debug": "env DEBUG=1 jest",
+ "test": "jest",
+ "test-reset": "rm -rf ./test/jest/.eask ./test/jest/*/.eask; git restore ./test/jest/*/",
"pkg-all": "pkg package.json",
"pkg-linux-arm64": "pkg package.json -t node*-linuxstatic-arm64 --output dist/eask --public",
"pkg-linux-x64": "pkg package.json -t node*-linuxstatic-x64 --output dist/eask --public",
@@ -33,7 +36,12 @@
"yargs": "^17.0.0"
},
"devDependencies": {
- "@yao-pkg/pkg": "^6.0.0"
+ "@yao-pkg/pkg": "^6.0.0",
+ "jest": "^29.7.0"
+ },
+ "jest": {
+ "rootDir": "./test/jest",
+ "testTimeout": 40000
},
"files": [
"cmds",
diff --git a/test/commands/analyze/dsl/run.sh b/test/commands/analyze/dsl/run.sh
deleted file mode 100644
index 420452ed..00000000
--- a/test/commands/analyze/dsl/run.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/analyze `analyze`
-#
-
-set -e
-
-# Naviate to the test package
-cd $(dirname "$0")
-
-echo "Testing analyze command... (Plain text)"
-eask analyze
-eask analyze Eask
-
-echo "Testing analyze command... (JSON format)"
-eask analyze --json
-eask analyze Eask --json
diff --git a/test/commands/analyze/error/run.sh b/test/commands/analyze/error/run.sh
deleted file mode 100755
index 6cb90c21..00000000
--- a/test/commands/analyze/error/run.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/analyze `analyze` errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-# Naviate to the test package
-cd $(dirname "$0")
-
-echo "Testing analyze command... no files"
-should_error eask analyze
diff --git a/test/commands/analyze/metadata/run.sh b/test/commands/analyze/metadata/run.sh
deleted file mode 100644
index 21fc672b..00000000
--- a/test/commands/analyze/metadata/run.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/checker `analyze`
-#
-
-set -e
-
-# Naviate to the test package
-cd $(dirname "$0")
-
-echo "Testing analyze command... (Plain text)"
-eask analyze
-eask analyze Eask
-
-echo "Testing analyze command... (JSON format)"
-eask analyze --json
-eask analyze Eask --json
diff --git a/test/commands/bump/run.sh b/test/commands/bump/run.sh
deleted file mode 100755
index fabac56e..00000000
--- a/test/commands/bump/run.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/bump `bump` errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-# Naviate to the test package
-cd $(dirname "$0")
-
-echo "Testing bump command... no files"
-should_error eask bump
diff --git a/test/commands/compile/run.sh b/test/commands/compile/run.sh
deleted file mode 100755
index 45fc58ef..00000000
--- a/test/commands/compile/run.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/compile `compile` errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-cd $(dirname "$0")
-
-echo "Testing compile command... no files"
-should_error eask compile
diff --git a/test/commands/concat/run.sh b/test/commands/concat/run.sh
deleted file mode 100755
index 6c4031bb..00000000
--- a/test/commands/concat/run.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/concat `concat` errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-# Naviate to the test package
-cd $(dirname "$0")
-
-echo "Testing concat command... no files"
-should_error eask concat
diff --git a/test/commands/config/run.sh b/test/commands/config/run.sh
deleted file mode 100644
index 13bdc61f..00000000
--- a/test/commands/config/run.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Here we test all config (~/.emacs.d/) that the Emacser can be use daily!
-#
-# Notice, to make config commands work; we need a minimum configuration
-# (home/.emacs.d), and place it under to the default Emacs directory!
-#
-
-set -e
-
-echo "Copy test configuration"
-./test/fixtures/home/scripts/setup.sh
-
-echo "Testing config (~/.emacs.d/) commands..."
-eask archives -c
-
-eask install -c spinner ivy beacon company fuzzy
-eask uninstall -c ivy fuzzy
-
-eask list -c --depth=0
-eask outdated -c
diff --git a/test/commands/docker/run.sh b/test/commands/docker/run.sh
deleted file mode 100644
index 5d74d1b9..00000000
--- a/test/commands/docker/run.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2023-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `docker`
-#
-
-set -e
-
-# Naviate to the test package
-cd "./test/fixtures/mini.pkg.1/"
-
-eask docker 27.1 info
diff --git a/test/commands/docs/run.sh b/test/commands/docs/run.sh
deleted file mode 100755
index 0d72878c..00000000
--- a/test/commands/docs/run.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/docs `docs` errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-# Naviate to the test package
-cd $(dirname "$0")
-
-echo "Testing docs command... no files"
-should_error eask docs
diff --git a/test/commands/emacs/run.sh b/test/commands/emacs/run.sh
deleted file mode 100644
index c99dabee..00000000
--- a/test/commands/emacs/run.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `emacs`
-#
-
-set -e
-
-echo "Test command 'emacs'..."
-cd $(dirname "$0")
-
-eask emacs --version
-eask emacs --batch --eval "(require (quote ert))" --eval "(ert-deftest mytest () (should-not (display-graphic-p)))" -f ert-run-tests-batch
diff --git a/test/commands/eval/run.sh b/test/commands/eval/run.sh
deleted file mode 100755
index 238a89b7..00000000
--- a/test/commands/eval/run.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/eval `eval` errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-cd $(dirname "$0")
-
-echo "Testing eval command... no arg"
-should_error eask eval
diff --git a/test/commands/exec/run.sh b/test/commands/exec/run.sh
deleted file mode 100755
index 472e1155..00000000
--- a/test/commands/exec/run.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `exec`
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-echo "Test command 'exec'..."
-cd $(dirname "$0")
-
-eask install-deps
-eask exec ert-runner -h
-eask exec github-elpa -h
-eask exec echo hello world
-
-eask exec buttercup -L .
-eask exec buttercup -L . --pattern 'pattern 1'
-
-echo "Testing exec command... no files"
-should_error eask exec
diff --git a/test/commands/format/run.sh b/test/commands/format/run.sh
deleted file mode 100755
index f62fbeb4..00000000
--- a/test/commands/format/run.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/format errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-cd $(dirname "$0")
-
-echo "Testing elfmt command... no files"
-should_error eask format elfmt
-
-echo "Testing elisp-autofmt command... no files"
-should_error eask format elisp-autofmt
diff --git a/test/commands/global/run.sh b/test/commands/global/run.sh
deleted file mode 100644
index afdb54f8..00000000
--- a/test/commands/global/run.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2023-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Here we test all global (~/.eask/) that the Emacser can be use daily!
-#
-# Notice, to make config commands work; we need a minimum configuration
-# (home/.emacs.d), and place it under to the default Emacs directory!
-#
-
-set -e
-
-echo "Copy test configuration"
-./test/fixtures/home/scripts/setup.sh
-
-echo "Testing global (~/) commands..."
-eask archives -g
-
-eask install -g spinner ivy beacon company fuzzy
-eask uninstall -g ivy fuzzy
-
-eask list -g --depth=0
-eask outdated -g
diff --git a/test/commands/info/run.sh b/test/commands/info/run.sh
deleted file mode 100755
index 47bf52bb..00000000
--- a/test/commands/info/run.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/info errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-echo "Testing info command... no files"
-should_error eask -g info
-# When run in the current directory this sees the eask file from the main project
diff --git a/test/commands/init/run.sh b/test/commands/init/run.sh
deleted file mode 100755
index 039e6eb7..00000000
--- a/test/commands/init/run.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test eask init errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-cd $(dirname "$0")
-
-echo "Testing init --from cask command... no files"
-should_error eask init --from cask
-
-echo "Testing init --from keg command... no files"
-should_error eask init --from keg
-
-echo "Testing init --from eldev command... no files"
-should_error eask init --from eldev
-
-echo "Testing init --from source command... no files"
-should_error eask init --from source
diff --git a/test/commands/install/run.sh b/test/commands/install/run.sh
deleted file mode 100755
index 02bd31c2..00000000
--- a/test/commands/install/run.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test commands related to install, and uninstall
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-echo "Test commands related to install, and uninstall"
-
-# Naviate to the test package
-cd "./test/fixtures/mini.pkg.1/"
-
-echo "Install dependencies"
-eask install-deps
-
-echo "Install project package"
-eask package
-eask install
-
-echo "Install by sepcifying packages"
-eask install beacon company-fuzzy transwin
-
-echo "Uninstall by sepcifying packages"
-eask uninstall beacon transwin
-
-echo "Uninstall project package"
-eask uninstall
-
-echo "Test eask install ... no files"
-cd -
-cd $(dirname "$0")
-should_error eask install
-
-echo "Test eask uninstall ... no files"
-should_error eask uninstall
-
-echo "Test eask reinstall ... no files"
-should_error eask reinstall
diff --git a/test/commands/link/run.sh b/test/commands/link/run.sh
deleted file mode 100755
index 8b457087..00000000
--- a/test/commands/link/run.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2023-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Here we test all local (workspace) commands by simulating a Emacs
-# pacakge development environment!
-#
-# Notice, below we clone a random packae (repo) that uses Eask as the
-# dependencies management tool.
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-eask link add "mini.pkg.1" "./test/fixtures/mini.pkg.1/"
-eask link list
-eask link delete mini.pkg.1-0.0.1
-
-cd $(dirname "$0")
-
-echo "Testing link command... no files"
-should_error eask link add # not enough args
-should_error eask link add foo . # missing package, prints help
-should_error eask link delete
diff --git a/test/commands/lint/run.sh b/test/commands/lint/run.sh
deleted file mode 100755
index 467c5918..00000000
--- a/test/commands/lint/run.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/lint errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-# Naviate to the test package
-cd $(dirname "$0")
-
-echo "Testing lint checkdoc command... no files"
-should_error eask lint checkdoc
-
-echo "Testing lint declare command... no files"
-should_error eask lint declare
-
-echo "Testing lint elint command... no files"
-should_error eask lint elint
-
-echo "Testing lint elisp-lint command... no files"
-should_error eask lint elisp-lint
-
-echo "Testing lint elsa command... no files"
-should_error eask lint elsa
-
-echo "Testing lint indent command... no files"
-should_error eask lint indent
-
-echo "Testing lint keywords command... no files"
-should_error eask lint keywords
-
-echo "Testing lint regexps command... no files"
-should_error eask lint regexps
diff --git a/test/commands/local/run.sh b/test/commands/local/run.sh
deleted file mode 100644
index 228cb59b..00000000
--- a/test/commands/local/run.sh
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Here we test all local (workspace) commands by simulating a Emacs
-# pacakge development environment!
-#
-# Notice, below we clone a random packae (repo) that uses Eask as the
-# dependencies management tool.
-#
-
-set -e
-
-# Naviate to the test package
-cd "./test/fixtures/mini.pkg.1/"
-
-echo "Testing local commands..."
-eask info
-eask status
-eask archives
-eask archives --all
-eask list --depth=0
-eask bump major minor patch
-eask cat package.json --insecure
-eask cat package.json --number --insecure
-eask concat
-#eask loc # Only 27.1+
-#eask loc Eask # Only 27.1+
-
-# Documentation
-#eask docs # Only 28.1+
-#eask docs *.el # Only 28.1+
-
-# PATH environment
-eask path
-eask path bin
-eask load-path
-eask load-path bin
-
-# Preparation
-eask prepare --dev
-eask package
-
-# Development
-eask compile
-eask compile --clean
-eask recompile
-eask recompile --clean
-eask recipe
-eask keywords
-eask run script
-eask run script test
-eask run script extra -- Extra arguments!
-eask run script --all
-eask run command
-eask run command test
-eask run command mini-test-3 -- Extra arguments!
-eask run command --all
-
-# Exection
-eask eval "(progn (require 'mini.pkg.1))"
-
-# Generating
-eask generate autoloads
-eask generate pkg-file
-eask generate recipe -y
-#eask generate license gpl-3.0 # XXX: Avoid API rate limit exceeded error
-eask generate ignore elisp
-
-# Generating tests
-eask generate test ert
-rm -rf test
-eask generate test ert-runner
-eask generate test buttercup
-eask generate test ecukes
-
-# Generating workflow
-eask generate workflow circle-ci
-eask generate workflow github
-eask generate workflow gitlab
-eask generate workflow travis-ci
-
-# Linting
-eask lint checkdoc
-eask lint declare
-eask lint elint
-eask lint elisp-lint
-#eask lint elsa # XXX: Elsa is not stable, ignore it for now
-eask lint indent
-eask lint keywords
-eask lint license
-eask lint package
-#eask lint regexps # Only 27.1+
-
-# Testing
-eask test activate
-
-# Formatting
-#eask format elisp-autofmt # Only 29.1+
-eask format elfmt
-
-# Cleaning
-eask clean .eask
-eask clean elc
-eask clean dist
-eask clean autoloads
-eask clean pkg-file
-eask clean log-file
-eask clean all
-
-# Control DSL
-eask source add test "https://test.elpa.com"
-eask source delete test
-eask source list
-
-# Util
-eask locate
-eask upgrade-eask
-eask refresh
diff --git a/test/commands/outdated_upgrade/run.sh b/test/commands/outdated_upgrade/run.sh
deleted file mode 100644
index 779792fe..00000000
--- a/test/commands/outdated_upgrade/run.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `exec`
-#
-
-set -e
-
-echo "Test command 'search'..."
-cd $(dirname "$0")
-
-eask prepare
-eask load make-outdate.el
-
-eask outdated
-eask outdated --depth 0
-
-eask upgrade
diff --git a/test/commands/recipe/run.sh b/test/commands/recipe/run.sh
deleted file mode 100755
index ba9373bc..00000000
--- a/test/commands/recipe/run.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/recipe `recipe` errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-# Naviate to the test package
-cd $(dirname "$0")
-
-echo "Testing recipe command... no files"
-should_error eask recipe
diff --git a/test/commands/run/run.sh b/test/commands/run/run.sh
deleted file mode 100755
index 56596557..00000000
--- a/test/commands/run/run.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/run errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-cd $(dirname "$0")
-
-echo "Testing 'run command' command... no files"
-should_error eask run command
-
-echo "Testing 'run script' command... no files"
-should_error eask run script -g # needs to avoid parent Eask file
diff --git a/test/commands/search/run.sh b/test/commands/search/run.sh
deleted file mode 100755
index a3962e59..00000000
--- a/test/commands/search/run.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2023 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `search`
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-echo "Test command 'search'..."
-cd $(dirname "$0")
-
-should_error eask search
-eask search company
-eask search company dash --depth 0
-eask search company dash f s --depth 0 -g
diff --git a/test/commands/source/run.sh b/test/commands/source/run.sh
deleted file mode 100755
index 61365006..00000000
--- a/test/commands/source/run.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command/source errors
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-cd $(dirname "$0")
-
-echo "Testing source command... errors"
-should_error eask source
-should_error eask source add
-should_error eask source add foo # name not found, show help
-
-should_error eask source delete
-should_error eask source delete foo # name not found, show help
diff --git a/test/commands/test/buttercup/run.sh b/test/commands/test/buttercup/run.sh
deleted file mode 100755
index 10a2400f..00000000
--- a/test/commands/test/buttercup/run.sh
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `buttercup`
-#
-
-set -e
-
-echo "Test command 'buttercup'..."
-cd $(dirname "$0")
-
-eask install-deps --dev
-if eask test buttercup; then
- # this runs all tests, so should error
- echo "expected error"
- exit 1
-fi
-
-# buttercup takes directories as arguments
-eask test buttercup ./test-ok
-if eask test buttercup ./test-ok ./test-fail; then
- echo "expected error"
- exit 1
-fi
-
-# buttercup does not take options
-eask test buttercup --no-color ./test-ok
-
-# Because load-path is manually set, cannot refer to parent directories.
-# Note this does work if you do ../buttercup/test-ok/, but not for any other directory.
-if eask test buttercup ../ert/ 2>&1 | grep 'No suites defined'; then
- echo "expected error"
- exit 1
-fi
diff --git a/test/commands/test/ecukes/run.sh b/test/commands/test/ecukes/run.sh
deleted file mode 100644
index 4db00b88..00000000
--- a/test/commands/test/ecukes/run.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2024-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `ecukes`
-#
-
-set -e
-
-echo "Test command 'ecukes'..."
-cd $(dirname "$0")
-
-eask test ecukes
-eask test ecukes ./features/foo.feature
diff --git a/test/commands/test/ert-runner/run.sh b/test/commands/test/ert-runner/run.sh
deleted file mode 100644
index 2310af2e..00000000
--- a/test/commands/test/ert-runner/run.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `ert-runner`
-#
-
-set -e
-
-echo "Test command 'ert-runner'..."
-cd $(dirname "$0")
-
-eask test ert-runner ./test/*.el
diff --git a/test/commands/test/ert/run.sh b/test/commands/test/ert/run.sh
deleted file mode 100755
index 1d829364..00000000
--- a/test/commands/test/ert/run.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test command `ert`
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-echo "Test command 'ert'..."
-cd $(dirname "$0")
-
-eask test ert ./test/*.el
-
-# regression
-echo "Test ert: nil message"
-eask test ert ./test-nil-message/*.el
-
-echo "Testing ert command... no files"
-should_error eask test ert
diff --git a/test/jest/__snapshots__/analyze.test.js.snap b/test/jest/__snapshots__/analyze.test.js.snap
new file mode 100644
index 00000000..c7ecd818
--- /dev/null
+++ b/test/jest/__snapshots__/analyze.test.js.snap
@@ -0,0 +1,23 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`analyze in ./dsl matches snapshot 1`] = `
+{
+ "stderr": "
+~/Eask:7:18 Error: Multiple definition of \`package'
+~/Eask:10:55 Error: Multiple definition of \`website-url'
+~/Eask:12:16 Error: Multiple definition of \`keywords'
+~/Eask:15:15 Warning: Warning regarding duplicate author name, name
+~/Eask:18:17 Warning: Warning regarding duplicate license name, GPLv3
+~/Eask:21:29 Error: Multiple definition of \`package-file'
+~/Eask:23:35 Warning: Pkg-file seems to be missing \`check-pkg.el'
+~/Eask:24:35 Error: Multiple definition of \`package-descriptor'
+~/Eask:28:61 Error: Run-script with the same key name is not allowed: \`test\`
+~/Eask:31:13 Error: Multiple definition of source \`gnu'
+~/Eask:33:24 Error: Unknown package archive \`magic-archive'
+~/Eask:36:20 Error: Define dependencies with the same name \`emacs'
+~/Eask:39:19 Error: Define dependencies with the same name \`dash'
+~/Eask:44:2 Error: Define dependencies with the same name \`f'
+",
+ "stdout": "",
+}
+`;
diff --git a/test/jest/analyze.test.js b/test/jest/analyze.test.js
new file mode 100644
index 00000000..cef00035
--- /dev/null
+++ b/test/jest/analyze.test.js
@@ -0,0 +1,54 @@
+const { TestContext } = require("./helpers");
+
+describe("analyze", () => {
+ describe("in ./dsl", () => {
+ const ctx = new TestContext("./test/jest/dsl");
+
+ it("handles plain text", async () => {
+ await ctx.runEask("analyze");
+ await ctx.runEask("analyze Eask");
+ });
+
+ it("handles json option", async () => {
+ const { stderr } = await ctx.runEask("analyze --json");
+ await ctx.runEask("analyze Eask --json");
+
+ // try to parse output, errors if not valid
+ JSON.parse(stderr);
+ });
+
+ it("matches snapshot", async () => {
+ const res = await ctx.runEask("analyze");
+ const resClean = res.sanitized().raw();
+ expect(resClean).toMatchSnapshot();
+ });
+
+ it("should report multiple definitions", async () => {
+ const { stderr } = await ctx.runEask("analyze");
+ // expect this substring
+ expect(stderr).toMatch("Multiple definition of `package'");
+ });
+ });
+
+ describe("in ./empty", () => {
+ const ctx = new TestContext("./test/jest/empty");
+
+ it("should error", async () => {
+ await expect(ctx.runEask("analyze")).rejects.toThrow();
+ });
+ });
+
+ describe("in ./metadata", () => {
+ const ctx = new TestContext("./test/jest/metadata");
+
+ it("handles plain text", async () => {
+ await ctx.runEask("analyze");
+ await ctx.runEask("analyze Eask");
+ });
+
+ it("handles json", async () => {
+ await ctx.runEask("analyze --json");
+ await ctx.runEask("analyze Eask --json");
+ });
+ });
+});
diff --git a/test/commands/analyze/dsl/.gitignore b/test/jest/buttercup/.gitignore
similarity index 100%
rename from test/commands/analyze/dsl/.gitignore
rename to test/jest/buttercup/.gitignore
diff --git a/test/commands/test/buttercup/Eask b/test/jest/buttercup/Eask
similarity index 100%
rename from test/commands/test/buttercup/Eask
rename to test/jest/buttercup/Eask
diff --git a/test/commands/test/buttercup/test-fail/buttercup-test.el b/test/jest/buttercup/test-fail/buttercup-test.el
similarity index 100%
rename from test/commands/test/buttercup/test-fail/buttercup-test.el
rename to test/jest/buttercup/test-fail/buttercup-test.el
diff --git a/test/commands/test/buttercup/test-ok/buttercup-test.el b/test/jest/buttercup/test-ok/buttercup-test.el
similarity index 100%
rename from test/commands/test/buttercup/test-ok/buttercup-test.el
rename to test/jest/buttercup/test-ok/buttercup-test.el
diff --git a/test/jest/config.test.js b/test/jest/config.test.js
new file mode 100644
index 00000000..7b782c4b
--- /dev/null
+++ b/test/jest/config.test.js
@@ -0,0 +1,55 @@
+const { testUnsafe, TestContext } = require("./helpers");
+const fs = require("node:fs/promises");
+const path = require("node:path");
+const process = require("node:process");
+
+describe("config param", () => {
+ const ctx = new TestContext();
+
+ afterAll(() => ctx.cleanUp());
+
+ describe("informational", () => {
+ /*
+ * Note that these tests will run against your ~/.emacs.d if run locally.
+ * If you have a complicated set up, they may timeout.
+ */
+
+ test("eask archives -c", async () => {
+ await ctx.runEask("archives -c");
+ });
+
+ test("eask list -c", async () => {
+ await ctx.runEask("list -c --depth=0");
+ });
+
+ test("eask outdated -c", async () => {
+ await ctx.runEask("outdated -c");
+ });
+ });
+
+ describe("install", () => {
+ /*
+ * This test modifies ~/.emacs.d/init.el and installs packages there when run with ALLOW_UNSAFE
+ */
+ testUnsafe("eask install -c", async () => {
+ // create ~/.emacs.d
+ await fs.mkdir(path.join(process.env.HOME, "/.emacs.d/"), {
+ recursive: true,
+ });
+ // copy init.el from fixtures
+ // it must enable sources for the installed packages
+ await fs.copyFile(
+ "./test/jest/config/init.el",
+ path.join(process.env.HOME, "/.emacs.d/init.el"),
+ fs.constants.COPYFILE_EXCL, // throw if init.el already exists
+ );
+ await ctx.runEask("install -c spinner ivy beacon company-fuzzy", {
+ timeout: 35000,
+ });
+ });
+
+ testUnsafe("eask uninstall -c", async () => {
+ await ctx.runEask("uninstall -c ivy company-fuzzy");
+ });
+ });
+});
diff --git a/test/jest/config/init.el b/test/jest/config/init.el
new file mode 100644
index 00000000..08777729
--- /dev/null
+++ b/test/jest/config/init.el
@@ -0,0 +1,27 @@
+;;; init.el --- Load the full configuration -*- lexical-binding: t -*-
+;;; Commentary:
+
+;; Author: Shen, Jen-Chieh
+;; URL: https://github.com/emacs-eask/cli
+
+(setq package-archives
+ '(("gnu" . "http://elpa.gnu.org/packages/")
+ ("nongnu" . "http://elpa.nongnu.org/nongnu/")
+ ("melpa" . "http://melpa.org/packages/")
+ ("jcs-elpa" . "https://jcs-emacs.github.io/jcs-elpa/packages/"))
+ package-archive-priorities
+ '(("gnu" . 0)
+ ("nongnu" . 0)
+ ("melpa" . 5)
+ ("jcs-elpa" . 10)))
+
+(setq package-enable-at-startup nil ; To avoid initializing twice
+ package-check-signature nil)
+
+(require 'package)
+
+;; Local Variables:
+;; coding: utf-8
+;; no-byte-compile: t
+;; End:
+;;; init.el ends here
diff --git a/test/jest/docker.test.js b/test/jest/docker.test.js
new file mode 100644
index 00000000..3d122a76
--- /dev/null
+++ b/test/jest/docker.test.js
@@ -0,0 +1,14 @@
+const { TestContext } = require("./helpers");
+
+jest.setTimeout(60000);
+
+describe("docker", () => {
+ const ctx = new TestContext("./test/jest/docker");
+
+ afterAll(() => ctx.cleanUp());
+
+ test("eask docker 27.1 info", async () => {
+ // this can take a long time to pull and build the image
+ await ctx.runEask("docker 27.1 info", { timeout: 40000 });
+ });
+});
diff --git a/test/jest/docker/Eask b/test/jest/docker/Eask
new file mode 100644
index 00000000..480eef12
--- /dev/null
+++ b/test/jest/docker/Eask
@@ -0,0 +1,37 @@
+(package "mini.pkg.1"
+ "0.0.1"
+ "Minimal test package")
+
+(website-url "https://github.com/emacs-eask/cli/tree/master/test/fixtures/mini.pkg.1")
+(keywords "test" "local")
+
+(package-file "mini.pkg.1.el")
+
+(files "files/*.el")
+
+(script "test" "echo \"Have a nice day!~ ;)\"")
+(script "extra" "echo :")
+(script "info" "eask info")
+
+(eask-defcommand mini-test-1 "Test command 1." (message "Test 1"))
+(eask-defcommand mini-test-2 "Test command 2." (message "Test 2"))
+(eask-defcommand mini-test-3
+ "Test command 3."
+ (message "Test 3: %s" eask-rest))
+
+(source 'gnu)
+(source 'melpa)
+(source 'jcs-elpa)
+
+(depends-on "emacs" "26.1")
+(depends-on "f")
+(depends-on "s")
+(depends-on "fringe-helper")
+(depends-on "watch-cursor"
+ :repo "jcs-elpa/watch-cursor" :fetcher 'github)
+(depends-on "organize-imports-java"
+ :repo "jcs-elpa/organize-imports-java"
+ :fetcher 'github
+ :files '(:defaults "sdk" "default"))
+
+(setq network-security-level 'low) ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432
diff --git a/test/jest/docker/RADME.md b/test/jest/docker/RADME.md
new file mode 100644
index 00000000..441cfd06
--- /dev/null
+++ b/test/jest/docker/RADME.md
@@ -0,0 +1 @@
+Minimal Emacs package to simulate development environment; only for testing purposes!
diff --git a/test/jest/docker/files/mini.pkg.1-1.el b/test/jest/docker/files/mini.pkg.1-1.el
new file mode 100644
index 00000000..1c7e7c73
--- /dev/null
+++ b/test/jest/docker/files/mini.pkg.1-1.el
@@ -0,0 +1,32 @@
+;;; mini.pkg.1-1.el --- Extern file 1 -*- lexical-binding: t; -*-
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; files/mini.pkg.1-1.el
+;;
+
+;;; Code:
+
+
+(defun mini.pkg.1-1 ()
+ "Test function 1."
+ (interactive)
+ )
+
+(provide 'mini.pkg.1-1)
+;;; mini.pkg.1-1.el ends here
diff --git a/test/jest/docker/files/mini.pkg.1-2.el b/test/jest/docker/files/mini.pkg.1-2.el
new file mode 100644
index 00000000..09d7eb8c
--- /dev/null
+++ b/test/jest/docker/files/mini.pkg.1-2.el
@@ -0,0 +1,31 @@
+;;; mini.pkg.1-2.el --- Extern file 2 -*- lexical-binding: t; -*-
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; files/mini.pkg.1-2.el
+;;
+
+;;; Code:
+
+(defun mini.pkg.1-2 ()
+ "Test function 2."
+ (interactive)
+ )
+
+(provide 'mini.pkg.1-2)
+;;; mini.pkg.1-2.el ends here
diff --git a/test/jest/docker/mini.pkg.1.el b/test/jest/docker/mini.pkg.1.el
new file mode 100644
index 00000000..1db1a166
--- /dev/null
+++ b/test/jest/docker/mini.pkg.1.el
@@ -0,0 +1,39 @@
+;;; mini.pkg.1.el --- Minimal test package -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022-2025 the Eask authors.
+;; Created date 2022-03-29 01:52:58
+
+;; Author: Shen, Jen-Chieh
+;; URL: https://github.com/emacs-eask/cli/tree/master/test/fixtures/mini.pkg.1
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "24.3") (s "1.12.0") (fringe-helper "1.0.1"))
+;; Keywords: test local
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; Minimal Emacs package to simulate development environment; only for testing
+;; purposes!
+;;
+
+;;; Code:
+
+(require 's)
+(require 'fringe-helper)
+
+(provide 'mini.pkg.1)
+;;; mini.pkg.1.el ends here
diff --git a/test/commands/analyze/metadata/.gitignore b/test/jest/dsl/.gitignore
similarity index 100%
rename from test/commands/analyze/metadata/.gitignore
rename to test/jest/dsl/.gitignore
diff --git a/test/commands/analyze/dsl/Eask b/test/jest/dsl/Eask
similarity index 100%
rename from test/commands/analyze/dsl/Eask
rename to test/jest/dsl/Eask
diff --git a/test/commands/analyze/dsl/check-dsl.el b/test/jest/dsl/check-dsl.el
similarity index 100%
rename from test/commands/analyze/dsl/check-dsl.el
rename to test/jest/dsl/check-dsl.el
diff --git a/test/commands/test/ecukes/Eask b/test/jest/ecukes/Eask
similarity index 100%
rename from test/commands/test/ecukes/Eask
rename to test/jest/ecukes/Eask
diff --git a/test/commands/test/ecukes/features/foo.feature b/test/jest/ecukes/features/foo.feature
similarity index 100%
rename from test/commands/test/ecukes/features/foo.feature
rename to test/jest/ecukes/features/foo.feature
diff --git a/test/commands/test/ecukes/features/step-definitions/ecukes-steps.el b/test/jest/ecukes/features/step-definitions/ecukes-steps.el
similarity index 100%
rename from test/commands/test/ecukes/features/step-definitions/ecukes-steps.el
rename to test/jest/ecukes/features/step-definitions/ecukes-steps.el
diff --git a/test/commands/test/ecukes/features/support/env.el b/test/jest/ecukes/features/support/env.el
similarity index 100%
rename from test/commands/test/ecukes/features/support/env.el
rename to test/jest/ecukes/features/support/env.el
diff --git a/test/jest/emacs.test.js b/test/jest/emacs.test.js
new file mode 100644
index 00000000..d35d9252
--- /dev/null
+++ b/test/jest/emacs.test.js
@@ -0,0 +1,17 @@
+const { TestContext } = require("./helpers");
+
+describe("emacs", () => {
+ const ctx = new TestContext("./test/jest/empty");
+
+ beforeAll(async () => await ctx.runEask("clean all"));
+
+ test("eask emacs --version", async () => {
+ await ctx.runEask("emacs --version");
+ });
+
+ test("eask emacs --batch --eval", async () => {
+ await ctx.runEask(
+ 'emacs --batch --eval "(require (quote ert))" --eval "(ert-deftest mytest () (should-not (display-graphic-p)))" -f ert-run-tests-batch',
+ );
+ });
+});
diff --git a/test/jest/empty/.gitkeep b/test/jest/empty/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/test/commands/exec/.gitignore b/test/jest/ert-runner/.gitignore
similarity index 100%
rename from test/commands/exec/.gitignore
rename to test/jest/ert-runner/.gitignore
diff --git a/test/commands/test/ert-runner/Eask b/test/jest/ert-runner/Eask
similarity index 100%
rename from test/commands/test/ert-runner/Eask
rename to test/jest/ert-runner/Eask
diff --git a/test/commands/test/ert-runner/test/ert-runner-test.el b/test/jest/ert-runner/test/ert-runner-test.el
similarity index 100%
rename from test/commands/test/ert-runner/test/ert-runner-test.el
rename to test/jest/ert-runner/test/ert-runner-test.el
diff --git a/test/commands/outdated_upgrade/.gitignore b/test/jest/ert/.gitignore
similarity index 100%
rename from test/commands/outdated_upgrade/.gitignore
rename to test/jest/ert/.gitignore
diff --git a/test/commands/test/ert/Eask b/test/jest/ert/Eask
similarity index 100%
rename from test/commands/test/ert/Eask
rename to test/jest/ert/Eask
diff --git a/test/commands/test/ert/test-nil-message/ert-test.el b/test/jest/ert/test-nil-message/ert-test.el
similarity index 100%
rename from test/commands/test/ert/test-nil-message/ert-test.el
rename to test/jest/ert/test-nil-message/ert-test.el
diff --git a/test/commands/test/ert/test/ert-test.el b/test/jest/ert/test/ert-test.el
similarity index 100%
rename from test/commands/test/ert/test/ert-test.el
rename to test/jest/ert/test/ert-test.el
diff --git a/test/jest/exec.test.js b/test/jest/exec.test.js
new file mode 100644
index 00000000..2ff26bf3
--- /dev/null
+++ b/test/jest/exec.test.js
@@ -0,0 +1,33 @@
+const { TestContext } = require("./helpers");
+
+describe("exec", () => {
+ const ctx = new TestContext("./test/jest/exec");
+
+ beforeAll(async () => await ctx.runEask("install-deps"));
+
+ afterAll(() => ctx.cleanUp());
+
+ test("eask exec ert-runner", async () => {
+ await ctx.runEask("exec ert-runner -h");
+ });
+
+ test("eask exec github-elpa", async () => {
+ await ctx.runEask("exec github-elpa -h");
+ });
+
+ test("eask exec echo", async () => {
+ await ctx.runEask("exec echo hello world");
+ });
+
+ test("eask exec buttercup -L .", async () => {
+ await ctx.runEask("exec buttercup -L .");
+ });
+
+ test("eask exec buttercup -L . --pattern 'pattern 1'", async () => {
+ await ctx.runEask('exec buttercup -L . --pattern "pattern 1"');
+ });
+
+ test("should error with no args", async () => {
+ await expect(ctx.runEask("exec")).rejects.toThrow();
+ });
+});
diff --git a/test/commands/search/.gitignore b/test/jest/exec/.gitignore
similarity index 100%
rename from test/commands/search/.gitignore
rename to test/jest/exec/.gitignore
diff --git a/test/commands/exec/Eask b/test/jest/exec/Eask
similarity index 100%
rename from test/commands/exec/Eask
rename to test/jest/exec/Eask
diff --git a/test/commands/exec/bin/github-elpa.bat b/test/jest/exec/bin/github-elpa.bat
similarity index 100%
rename from test/commands/exec/bin/github-elpa.bat
rename to test/jest/exec/bin/github-elpa.bat
diff --git a/test/commands/exec/exec.el b/test/jest/exec/exec.el
similarity index 100%
rename from test/commands/exec/exec.el
rename to test/jest/exec/exec.el
diff --git a/test/commands/exec/test/test-dummy.el b/test/jest/exec/test/test-dummy.el
similarity index 100%
rename from test/commands/exec/test/test-dummy.el
rename to test/jest/exec/test/test-dummy.el
diff --git a/test/jest/exit-status.test.js b/test/jest/exit-status.test.js
new file mode 100644
index 00000000..f028d0af
--- /dev/null
+++ b/test/jest/exit-status.test.js
@@ -0,0 +1,144 @@
+const { TestContext } = require("./helpers");
+
+describe("exit-status", () => {
+ const ctx = new TestContext("./test/jest/empty");
+
+ afterAll(() => ctx.cleanUp());
+
+ describe("bump", () => {
+ it("should error with no files", async () => {
+ await expect(ctx.runEask("bump")).rejects.toThrow();
+ });
+ });
+
+ describe("concat", () => {
+ it("should error with no files", async () => {
+ await expect(ctx.runEask("concat")).rejects.toThrow();
+ });
+ });
+
+ describe("docs", () => {
+ it("should error with no files", async () => {
+ await expect(ctx.runEask("docs")).rejects.toThrow();
+ });
+ });
+
+ describe("eval", () => {
+ it("should error with no files", async () => {
+ await expect(ctx.runEask("eval")).rejects.toThrow();
+ });
+ });
+
+ describe("format", () => {
+ it("elfmt should error with no files", async () => {
+ await expect(ctx.runEask("format elfmt")).rejects.toThrow();
+ });
+
+ it("elisp-autofmt should error with no files", async () => {
+ await expect(ctx.runEask("format elisp-autofmt")).rejects.toThrow();
+ });
+ });
+
+ describe("info", () => {
+ it("should error with no files", async () => {
+ // When run in the current directory this sees the eask file from the main project
+ await expect(ctx.runEask("info -g")).rejects.toThrow();
+ });
+ });
+
+ describe("init", () => {
+ it("should error with no files", async () => {
+ await expect(ctx.runEask("concat")).rejects.toThrow();
+ });
+ });
+ describe("concat", () => {
+ it("--from cask should error with no files", async () => {
+ await expect(ctx.runEask("init --from cask")).rejects.toThrow();
+ });
+
+ it("--from keg should error with no files", async () => {
+ await expect(ctx.runEask("init --from keg")).rejects.toThrow();
+ });
+
+ it("--from eldev should error with no files", async () => {
+ await expect(ctx.runEask("init --from eldev")).rejects.toThrow();
+ });
+
+ it("--from source should error with no files", async () => {
+ await expect(ctx.runEask("init --from source")).rejects.toThrow();
+ });
+ });
+
+ describe("lint", () => {
+ it("checkdoc should error with no files", async () => {
+ await expect(ctx.runEask("lint checkdoc")).rejects.toThrow();
+ });
+
+ it("declare should error with no files", async () => {
+ await expect(ctx.runEask("lint declare")).rejects.toThrow();
+ });
+
+ it("elint should error with no files", async () => {
+ await expect(ctx.runEask("lint elint")).rejects.toThrow();
+ });
+
+ it("elisp-lint should error with no files", async () => {
+ await expect(ctx.runEask("lint elisp-lint")).rejects.toThrow();
+ });
+
+ // takes a while to install elsa
+ it("elsa should error with no files", async () => {
+ await expect(ctx.runEask("lint elsa")).rejects.toThrow();
+ });
+
+ it("indent should error with no files", async () => {
+ await expect(ctx.runEask("lint indent")).rejects.toThrow();
+ });
+
+ it("keywords should error with no files", async () => {
+ await expect(ctx.runEask("lint keywords")).rejects.toThrow();
+ });
+
+ it("regexps should error with no files", async () => {
+ await expect(ctx.runEask("lint regexps")).rejects.toThrow();
+ });
+ });
+
+ describe("recipe", () => {
+ it("should error with no files", async () => {
+ await expect(ctx.runEask("recipe")).rejects.toThrow();
+ });
+ });
+
+ describe("run", () => {
+ it("run command should error with no files", async () => {
+ await expect(ctx.runEask("run command")).rejects.toThrow();
+ });
+
+ it("run script should error with no files", async () => {
+ await expect(ctx.runEask("run script -g")).rejects.toThrow();
+ });
+ });
+
+ describe("source", () => {
+ it("should error with no files", async () => {
+ await expect(ctx.runEask("source")).rejects.toThrow();
+ });
+
+ it("add should error with no files", async () => {
+ await expect(ctx.runEask("source add")).rejects.toThrow();
+ });
+
+ it("add should error with unknown package", async () => {
+ await expect(ctx.runEask("source add foo")).rejects.toThrow();
+ });
+
+ it("delete should error with no files", async () => {
+ await expect(ctx.runEask("source delete")).rejects.toThrow();
+ });
+
+ it("delete should error with unknown package", async () => {
+ await expect(ctx.runEask("source delete foo")).rejects.toThrow();
+ });
+ });
+});
diff --git a/test/jest/global.test.js b/test/jest/global.test.js
new file mode 100644
index 00000000..3b7bda06
--- /dev/null
+++ b/test/jest/global.test.js
@@ -0,0 +1,56 @@
+const fs = require("node:fs/promises");
+const path = require("node:path");
+const process = require("node:process");
+
+const { testUnsafe, TestContext } = require("./helpers");
+
+describe("global", () => {
+ // global => install to ~/.eask
+
+ const ctx = new TestContext();
+
+ describe("informational", () => {
+ test("eask archives -g", async () => {
+ await ctx.runEask("archives -g");
+ });
+
+ test("eask list -g --depth=0", async () => {
+ await ctx.runEask("list -g --depth=0");
+ });
+
+ test("eask outdated -g", async () => {
+ await ctx.runEask("outdated -g");
+ });
+ });
+
+ describe("install", () => {
+ /*
+ * This test modifies ~/.eask and ~/Eask
+ */
+ beforeAll(async () => {
+ // add a global Easkfile
+ if (process.env.ALLOW_UNSAFE) {
+ await fs.copyFile(
+ "./test/jest/global/Eask",
+ path.join(process.env.HOME, "Eask"),
+ );
+ }
+ });
+
+ afterAll(async () => {
+ if (process.env.ALLOW_UNSAFE) {
+ // remove test changes
+ await ctx.runEask("uninstall -g spinner ivy beacon company-fuzzy");
+ await fs.rm(path.join(process.env.HOME, "Eask"));
+ }
+ });
+
+ testUnsafe("eask install -g", async () => {
+ await ctx.runEask("install -g spinner ivy beacon company-fuzzy");
+ });
+
+ testUnsafe("eask uninstall -g", async () => {
+ await ctx.runEask("uninstall -g ivy company-fuzzy");
+ });
+ });
+});
diff --git a/test/jest/global/Eask b/test/jest/global/Eask
new file mode 100644
index 00000000..f0b6d57e
--- /dev/null
+++ b/test/jest/global/Eask
@@ -0,0 +1,14 @@
+(package "home"
+ "0.0.1"
+ "Minimal test for global config")
+
+(website-url "https://github.com/emacs-eask/mini.eask")
+(keywords "test")
+
+(source 'gnu)
+(source 'melpa)
+
+(depends-on "emacs" "26.1")
+(depends-on "yaml-mode")
+
+(setq network-security-level 'low) ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432
diff --git a/test/jest/helpers.js b/test/jest/helpers.js
new file mode 100644
index 00000000..efda9ddb
--- /dev/null
+++ b/test/jest/helpers.js
@@ -0,0 +1,235 @@
+const util = require("node:util");
+const exec = util.promisify(require("node:child_process").exec);
+const fs = require("node:fs/promises");
+const path = require("node:path");
+
+/*
+ * This file uses JsDoc syntax.
+ * Documentation for type helpers like @param: https://jsdoc.app/tags-type
+ * Documentation for types in braces:
+ * https://github.com/google/closure-compiler/wiki/Types-in-the-Closure-Type-System
+ */
+
+/**
+ * As for jest.test but skips running if the ALLOW_UNSAFE env var is set.
+ * @param {string} name
+ * @param {function({ fail: function }): void | function(): PromiseLike.} fn
+ * @param {number} [timeout]
+ */
+function testUnsafe(name, fn, timeout) {
+ if (process.env.ALLOW_UNSAFE) {
+ return test(name, fn, timeout);
+ } else {
+ return test.skip(name, fn, timeout);
+ }
+}
+
+/**
+ * Global timeout in ms, set by TIMEOUT env var.
+ * This is used in TestContext to limit `exec`.
+ * @returns {number}
+ */
+function getTimeout() {
+ // parseInt returns NaN if it fails
+ // TIMEOUT <= 0 will be ignored too
+ return Number.parseInt(process.env.TIMEOUT) || 25000;
+}
+
+/**
+ * The version string for system emacs, e.g. "30.0.50".
+ * You can compare lexicographically, e.g. if ((await emacsVersion()) > "27") { ... }
+ * @returns {Promise.} emacs version string.
+ */
+async function emacsVersion() {
+ const text = await exec("emacs --version");
+ const version = text.stdout.match("Emacs ([^ ]+)")?.[1];
+ if (!version) {
+ throw Error("Couldn't extract Emacs version. Text was:\n" + text);
+ }
+ return version;
+}
+
+/** Provides transformations on output of node.exec(). */
+class CommandOutput {
+ constructor(output, cwd) {
+ this.stderr = output.stderr;
+ this.stdout = output.stdout;
+ this.cwd = cwd;
+ this.cwdAbsolute = path.resolve(cwd || ".");
+ }
+
+ /**
+ * Both stdout and stderr concatenated as a string.
+ * @returns {string}
+ */
+ combined() {
+ return this.stdout + "\n" + this.stderr;
+ }
+
+ /**
+ * Output as a plain object.
+ * @returns {{ sdout: string, stderr: string }}
+ */
+ raw() {
+ return {
+ stderr: this.stderr,
+ stdout: this.stdout,
+ };
+ }
+
+ /**
+ * Attempt to make `s` safe for snapshotting by replacing local data.
+ * @param {string} s
+ * @returns {string}
+ */
+ sanitizeString(s) {
+ let working = s;
+ // windows paths
+ if (this.cwdAbsolute.startsWith(":", 1)) {
+ // cwdAbsolute is a windows path e.g. C:\foo\bar
+ // Eask outputs windows paths like d:/a/cli/Eask
+ let cwdTranslated = this.cwdAbsolute.replaceAll("\\", "/");
+ // lowercase the drive letter
+ cwdTranslated =
+ cwdTranslated[0].toLowerCase() + cwdTranslated.substring(1);
+ working = working.replaceAll(cwdTranslated, "~");
+ }
+
+ // replace absolute path
+ working = working.replaceAll(this.cwdAbsolute, "~");
+ // replace relative path
+ working = working.replaceAll(this.cwd, "~");
+ return working;
+ }
+
+ /**
+ * Create a copy of this object with output safe for snapshotting.
+ * @param {...function(string):string[]} sanitizeFns functions to apply to the output.
+ * These apply after the default sanitize functions.
+ * @returns {CommandOutput}
+ */
+ sanitized(...sanitizeFns) {
+ let sani = (s) =>
+ sanitizeFns.reduce((s1, f) => f.call({}, s1), this.sanitizeString(s));
+
+ return new CommandOutput(
+ {
+ stdout: sani(this.stdout),
+ stderr: sani(this.stderr),
+ },
+ this.cwd,
+ );
+ }
+}
+
+class TestContext {
+ /**
+ * @param {string} cwd Current Working Directory, used for all commands.
+ */
+ constructor(cwd) {
+ this.cwd = cwd;
+ this.easkCommand = process.env.EASK_COMMAND || "eask";
+ this.controller = new AbortController();
+ }
+
+ /**
+ * Runs command with "eask" prefix.
+ * See https://nodejs.org/docs/latest-v20.x/api/child_process.html#child_processexeccommand-options-callback
+ * for additional config options.
+ * @param {string} command
+ * @param {any} config
+ * @returns {Promise.}
+ */
+ runEask(command, config) {
+ return this.run(this.easkCommand + " " + command, config);
+ }
+
+ /**
+ * Runs a command in the context's directory.
+ * Prefer using Node APIs for commands like copy, delete etc.
+ * See https://nodejs.org/docs/latest-v20.x/api/child_process.html#child_processexeccommand-options-callback
+ * for additional config options.
+ * @param {string} command
+ * @param {any} config
+ * @returns {Promise.}
+ */
+ run(command, config) {
+ return exec(command, {
+ cwd: this.cwd,
+ signal: this.controller.signal,
+ timeout: getTimeout(),
+ ...config,
+ })
+ .then((obj) => {
+ if (process.env.DEBUG) {
+ console.log(
+ `--> ${command}\n` +
+ (obj.stdout ? obj.stdout : "") +
+ (obj.stderr ? obj.stderr : ""),
+ );
+ }
+ return new CommandOutput(obj, this.cwd);
+ })
+ .catch((err) => {
+ if (!err.code) err.message += "\nexec: TIMEOUT";
+ throw err;
+ });
+ }
+
+ /**
+ * Abort any processes created using `runEask` or `run`.
+ * @returns {void}
+ */
+ cleanUp() {
+ this.controller.abort();
+ }
+
+ /**
+ * Test if a file exists using a path relative to this context's directory.
+ * Throws if file does not exist, to provide an explanation when used with
+ * expect().
+ * @param {string} relativePath
+ * @returns {Promise.}
+ */
+ fileExists(relativePath) {
+ const fullPath = path.resolve(this.cwd, relativePath);
+ return fs
+ .stat(fullPath)
+ .then((_) => true)
+ .catch((_) => {
+ throw Error("File does not exist, or is not readable: " + fullPath);
+ });
+ }
+
+ /**
+ * Get file contents as a string, relative to the context's directory.
+ * @param {string} relativePath
+ * @returns {Promise.}
+ */
+ fileContents(relativePath) {
+ const fullPath = path.resolve(this.cwd, relativePath);
+ return fs.readFile(fullPath);
+ }
+
+ /**
+ * Removes files or directories under the context's directory.
+ * Errors are silently ignored.
+ * @param {...string} filesOrDirs files or directories to remove
+ * @returns {Promise.}
+ */
+ async removeFiles(...filesOrDirs) {
+ for (let f of filesOrDirs) {
+ await fs
+ .rm(path.join(this.cwd, f), { recursive: true, retries: 1 })
+ .catch(() => {}); // ignore "does not exist errors"
+ }
+ }
+}
+
+module.exports = {
+ testUnsafe,
+ emacsVersion,
+ TestContext,
+ getTimeout,
+ CommandOutput,
+};
diff --git a/test/jest/helpers.test.js b/test/jest/helpers.test.js
new file mode 100644
index 00000000..888017a7
--- /dev/null
+++ b/test/jest/helpers.test.js
@@ -0,0 +1,36 @@
+const { CommandOutput } = require("./helpers");
+const path = require("node:path");
+
+describe("CommandOutput", () => {
+ describe("sanitizeString", () => {
+ let out = new CommandOutput({}, "./test/jest");
+
+ it("replaces relative paths", () => {
+ let res = out.sanitizeString("look at ./test/jest/foo.js");
+ expect(res).toBe("look at ~/foo.js");
+ });
+
+ it("replaces relative path literally", () => {
+ let res = out.sanitizeString("look at a/test/jest/foo.js");
+ expect(res).toBe("look at a/test/jest/foo.js");
+ });
+
+ it("replaces absolute paths", () => {
+ let res = out.sanitizeString(
+ `look at ${path.resolve("./test/jest", "foo.js")}`,
+ );
+ expect(res).toBe(`look at ${path.join("~", "foo.js")}`);
+ });
+
+ it("replaces windows formatted paths", () => {
+ let out = new CommandOutput({}, "./test/jest/options");
+ // force a windows style path
+ out.cwdAbsolute = "D:\\a\\cli\\cli\\test/jest\\options";
+ // when on windows Eask translates those paths like
+ let res = out.sanitizeString(
+ "d:/a/cli/cli/test/jest/options/Eask:7:18 Error: Multiple definition of `package'",
+ );
+ expect(res).toBe("~/Eask:7:18 Error: Multiple definition of `package'");
+ });
+ });
+});
diff --git a/test/jest/install.test.js b/test/jest/install.test.js
new file mode 100644
index 00000000..8883da4b
--- /dev/null
+++ b/test/jest/install.test.js
@@ -0,0 +1,63 @@
+const { TestContext } = require("./helpers");
+
+describe("install and uninstall", () => {
+ describe("in ./install", () => {
+ const ctx = new TestContext("./test/jest/install/");
+ const packageName = "mini.pkg.1";
+
+ beforeAll(async () => {
+ await ctx.runEask("clean all");
+ await ctx.runEask("install-deps");
+ });
+
+ afterAll(() => ctx.cleanUp());
+
+ it("installs project package", async () => {
+ await ctx.runEask("package"); // creates dist/.tar
+ await ctx.runEask("install"); // installs dependencies and generated package
+ const { stderr } = await ctx.runEask("list");
+ expect(stderr).toMatch(packageName);
+ });
+
+ it("installs specific packages", async () => {
+ const { stderr } = await ctx.runEask(
+ "install beacon company-fuzzy transwin",
+ );
+ expect(stderr).toMatch("beacon");
+ expect(stderr).toMatch("company-fuzzy");
+ expect(stderr).toMatch("transwin");
+ });
+
+ it("uninstalls specific packages", async () => {
+ await ctx.runEask("install beacon transwin");
+ await ctx.runEask("uninstall beacon transwin");
+ const { stderr } = await ctx.runEask("list");
+ expect(stderr).not.toMatch("beacon");
+ expect(stderr).not.toMatch("transwin");
+ });
+
+ it("uninstalls project package", async () => {
+ await ctx.runEask("uninstall");
+ const { stderr } = await ctx.runEask("list");
+ expect(stderr).not.toMatch(packageName);
+ });
+ });
+
+ describe("in an empty project", () => {
+ const ctx = new TestContext("./test/jest/empty");
+ beforeAll(async () => await ctx.runEask("clean all"));
+ afterAll(() => ctx.cleanUp());
+
+ it("errors on install", async () => {
+ await expect(ctx.runEask("install")).rejects.toThrow();
+ });
+
+ it("errors on uninstall", async () => {
+ await expect(ctx.runEask("uninstall")).rejects.toThrow();
+ });
+
+ it("errors on reinstall", async () => {
+ await expect(ctx.runEask("reinstall")).rejects.toThrow();
+ });
+ });
+});
diff --git a/test/jest/install/Eask b/test/jest/install/Eask
new file mode 100644
index 00000000..aa3c6aeb
--- /dev/null
+++ b/test/jest/install/Eask
@@ -0,0 +1,37 @@
+(package "mini.pkg.1"
+ "0.0.1"
+ "Minimal test package")
+
+(website-url "https://github.com/emacs-eask/cli/tree/master/test/fixtures/mini.pkg.1")
+(keywords "test" "local")
+
+(package-file "mini.pkg.1.el")
+
+(files "files/*.el")
+
+(script "test" "echo \"Have a nice day!~ ;)\"")
+(script "extra" "echo :")
+(script "info" "eask info")
+
+(eask-defcommand mini-test-1 "Test command 1." (message "Test 1"))
+(eask-defcommand mini-test-2 "Test command 2." (message "Test 2"))
+(eask-defcommand mini-test-3
+ "Test command 3."
+ (message "Test 3: %s" eask-rest))
+
+(source 'gnu)
+(source 'melpa)
+;; (source 'jcs-elpa)
+
+(depends-on "emacs" "26.1")
+(depends-on "f")
+(depends-on "s")
+;; (depends-on "fringe-helper")
+;; (depends-on "watch-cursor"
+;; :repo "jcs-elpa/watch-cursor" :fetcher 'github)
+;; (depends-on "organize-imports-java"
+;; :repo "jcs-elpa/organize-imports-java"
+;; :fetcher 'github
+;; :files '(:defaults "sdk" "default"))
+
+(setq network-security-level 'low) ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432
diff --git a/test/jest/install/RADME.md b/test/jest/install/RADME.md
new file mode 100644
index 00000000..441cfd06
--- /dev/null
+++ b/test/jest/install/RADME.md
@@ -0,0 +1 @@
+Minimal Emacs package to simulate development environment; only for testing purposes!
diff --git a/test/jest/install/files/mini.pkg.1-1.el b/test/jest/install/files/mini.pkg.1-1.el
new file mode 100644
index 00000000..1c7e7c73
--- /dev/null
+++ b/test/jest/install/files/mini.pkg.1-1.el
@@ -0,0 +1,32 @@
+;;; mini.pkg.1-1.el --- Extern file 1 -*- lexical-binding: t; -*-
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; files/mini.pkg.1-1.el
+;;
+
+;;; Code:
+
+
+(defun mini.pkg.1-1 ()
+ "Test function 1."
+ (interactive)
+ )
+
+(provide 'mini.pkg.1-1)
+;;; mini.pkg.1-1.el ends here
diff --git a/test/jest/install/files/mini.pkg.1-2.el b/test/jest/install/files/mini.pkg.1-2.el
new file mode 100644
index 00000000..09d7eb8c
--- /dev/null
+++ b/test/jest/install/files/mini.pkg.1-2.el
@@ -0,0 +1,31 @@
+;;; mini.pkg.1-2.el --- Extern file 2 -*- lexical-binding: t; -*-
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; files/mini.pkg.1-2.el
+;;
+
+;;; Code:
+
+(defun mini.pkg.1-2 ()
+ "Test function 2."
+ (interactive)
+ )
+
+(provide 'mini.pkg.1-2)
+;;; mini.pkg.1-2.el ends here
diff --git a/test/jest/install/mini.pkg.1.el b/test/jest/install/mini.pkg.1.el
new file mode 100644
index 00000000..1db1a166
--- /dev/null
+++ b/test/jest/install/mini.pkg.1.el
@@ -0,0 +1,39 @@
+;;; mini.pkg.1.el --- Minimal test package -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022-2025 the Eask authors.
+;; Created date 2022-03-29 01:52:58
+
+;; Author: Shen, Jen-Chieh
+;; URL: https://github.com/emacs-eask/cli/tree/master/test/fixtures/mini.pkg.1
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "24.3") (s "1.12.0") (fringe-helper "1.0.1"))
+;; Keywords: test local
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; Minimal Emacs package to simulate development environment; only for testing
+;; purposes!
+;;
+
+;;; Code:
+
+(require 's)
+(require 'fringe-helper)
+
+(provide 'mini.pkg.1)
+;;; mini.pkg.1.el ends here
diff --git a/test/jest/link.test.js b/test/jest/link.test.js
new file mode 100644
index 00000000..04633991
--- /dev/null
+++ b/test/jest/link.test.js
@@ -0,0 +1,134 @@
+const { TestContext } = require("./helpers");
+
+describe("link", () => {
+ describe("in ./link", () => {
+ const ctx = new TestContext("./test/jest/link");
+
+ beforeAll(async () => {
+ await ctx.runEask("clean workspace");
+ await ctx.runEask("refresh");
+ });
+
+ // check list command first since it is used in later tests
+ it("eask link list", async () => {
+ await ctx.runEask("link list");
+ });
+
+ const linkName = "link-to";
+ const linkPath = "./link-to/";
+
+ describe("eask link add", () => {
+ let addResult; // undefined if the first test fails
+
+ it("adds a link", async () => {
+ addResult = await ctx.runEask(`link add "${linkName}" "${linkPath}"`);
+ expect(addResult.stderr).toMatch("Created link");
+ });
+
+ it("should show the new link", async () => {
+ expect(addResult).toBeTruthy(); // fail if previous test failed
+ const { stdout, stderr } = await ctx.runEask("link list");
+ // the name of the linked package should be included
+ // FIXME: Some output is on stderr, some is on stdout
+ const output = stderr + "/n" + stdout;
+ expect(output).toMatch(linkName);
+ });
+
+ // side effects of linking
+ it(`installs dependencies of ${linkName}`, async () => {
+ const { stderr } = await ctx.runEask("list");
+ expect(stderr).toMatch("json-mode");
+ });
+
+ it("generates a pkg.el in linked package", async () => {
+ expect(await ctx.fileExists(`${linkPath}/${linkName}-pkg.el`)).toBe(
+ true,
+ );
+ });
+
+ it("can add the same link again", async () => {
+ await ctx.runEask(`link add "${linkName}" "${linkPath}"`);
+ });
+
+ // FIXME: bug
+ // - fails when there is a pkg-file in link-fail
+ // - succeeds when no pkg-file
+ // this means: 1st run it adds link-fail, generates new pkg.el
+ // 2nd run it fails to add link-fail!
+ it.skip("fails to add a link to uninstallable package", async () => {
+ // mini.pkg.1 contains dependencies from melpa, but this package only has gnu
+ await expect(
+ ctx.runEask('link add "mini.pkg.1" "./link-fail/"'),
+ ).rejects.toMatchObject({
+ stderr: expect.stringContaining("Package not installable"),
+ });
+ });
+ });
+
+ describe("eask link delete", () => {
+ beforeAll(async () => {
+ await ctx.runEask("clean workspace");
+ // this was tested in a previous command
+ // redo it here so that this test will fail if no link was added
+ await ctx.runEask(`link add "${linkName}" "${linkPath}"`);
+ });
+
+ it("deletes an added link", async () => {
+ const { stderr } = await ctx.runEask(`link delete ${linkName}-1.0.0`);
+ expect(stderr).toMatch("Package `link-to-1.0.0` unlinked");
+ });
+
+ it("should show no links", async () => {
+ const { stderr } = await ctx.runEask("link list");
+ expect(stderr).toMatch("No linked packages");
+ });
+ });
+ });
+
+ describe("in an empty directory", () => {
+ const ctx = new TestContext("./test/jest/empty");
+
+ beforeAll(async () => {
+ await ctx.runEask("clean all");
+ });
+
+ it("eask link list", async () => {
+ const { stderr } = await ctx.runEask("link list");
+ expect(stderr).toMatch("No linked packages");
+ });
+
+ describe("eask link add", () => {
+ it("should error when called with no arguments", async () => {
+ await expect(ctx.runEask("link add")).rejects.toMatchObject({
+ code: 1,
+ });
+ });
+
+ it("should error when linking a folder with no package file", async () => {
+ await expect(ctx.runEask("link add foo .")).rejects.toThrow();
+ });
+
+ // FIXME: update this test when this bug is fixed
+ test.failing(
+ "should error when linking a non-existing folder",
+ async () => {
+ // currently this prints an error message but does not exit with a code
+ await expect(
+ ctx.runEask('link add bar "./nothing"'),
+ ).rejects.toThrow();
+ },
+ );
+ });
+
+ describe("eask link delete", () => {
+ it("should error when called with no arguments", async () => {
+ await expect(ctx.runEask("link delete")).rejects.toThrow();
+ });
+
+ it("should do nothing when deleting an unknown package", async () => {
+ const { stderr } = await ctx.runEask("link delete foo");
+ expect(stderr).toMatch("No links present");
+ });
+ });
+ });
+});
diff --git a/test/jest/link/.gitkeep b/test/jest/link/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/test/jest/link/Eask b/test/jest/link/Eask
new file mode 100644
index 00000000..29876c88
--- /dev/null
+++ b/test/jest/link/Eask
@@ -0,0 +1,14 @@
+(package "link"
+ "1.0.0"
+ "")
+
+(website-url "")
+(keywords )
+
+(package-file "link.el")
+
+(script "test" "echo \"Error: no test specified\" && exit 1")
+
+(source "gnu")
+
+(depends-on "emacs" "26.1")
diff --git a/test/jest/link/link-fail/Eask b/test/jest/link/link-fail/Eask
new file mode 100644
index 00000000..480eef12
--- /dev/null
+++ b/test/jest/link/link-fail/Eask
@@ -0,0 +1,37 @@
+(package "mini.pkg.1"
+ "0.0.1"
+ "Minimal test package")
+
+(website-url "https://github.com/emacs-eask/cli/tree/master/test/fixtures/mini.pkg.1")
+(keywords "test" "local")
+
+(package-file "mini.pkg.1.el")
+
+(files "files/*.el")
+
+(script "test" "echo \"Have a nice day!~ ;)\"")
+(script "extra" "echo :")
+(script "info" "eask info")
+
+(eask-defcommand mini-test-1 "Test command 1." (message "Test 1"))
+(eask-defcommand mini-test-2 "Test command 2." (message "Test 2"))
+(eask-defcommand mini-test-3
+ "Test command 3."
+ (message "Test 3: %s" eask-rest))
+
+(source 'gnu)
+(source 'melpa)
+(source 'jcs-elpa)
+
+(depends-on "emacs" "26.1")
+(depends-on "f")
+(depends-on "s")
+(depends-on "fringe-helper")
+(depends-on "watch-cursor"
+ :repo "jcs-elpa/watch-cursor" :fetcher 'github)
+(depends-on "organize-imports-java"
+ :repo "jcs-elpa/organize-imports-java"
+ :fetcher 'github
+ :files '(:defaults "sdk" "default"))
+
+(setq network-security-level 'low) ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432
diff --git a/test/jest/link/link-fail/RADME.md b/test/jest/link/link-fail/RADME.md
new file mode 100644
index 00000000..441cfd06
--- /dev/null
+++ b/test/jest/link/link-fail/RADME.md
@@ -0,0 +1 @@
+Minimal Emacs package to simulate development environment; only for testing purposes!
diff --git a/test/jest/link/link-fail/files/mini.pkg.1-1.el b/test/jest/link/link-fail/files/mini.pkg.1-1.el
new file mode 100644
index 00000000..1c7e7c73
--- /dev/null
+++ b/test/jest/link/link-fail/files/mini.pkg.1-1.el
@@ -0,0 +1,32 @@
+;;; mini.pkg.1-1.el --- Extern file 1 -*- lexical-binding: t; -*-
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; files/mini.pkg.1-1.el
+;;
+
+;;; Code:
+
+
+(defun mini.pkg.1-1 ()
+ "Test function 1."
+ (interactive)
+ )
+
+(provide 'mini.pkg.1-1)
+;;; mini.pkg.1-1.el ends here
diff --git a/test/jest/link/link-fail/files/mini.pkg.1-2.el b/test/jest/link/link-fail/files/mini.pkg.1-2.el
new file mode 100644
index 00000000..09d7eb8c
--- /dev/null
+++ b/test/jest/link/link-fail/files/mini.pkg.1-2.el
@@ -0,0 +1,31 @@
+;;; mini.pkg.1-2.el --- Extern file 2 -*- lexical-binding: t; -*-
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; files/mini.pkg.1-2.el
+;;
+
+;;; Code:
+
+(defun mini.pkg.1-2 ()
+ "Test function 2."
+ (interactive)
+ )
+
+(provide 'mini.pkg.1-2)
+;;; mini.pkg.1-2.el ends here
diff --git a/test/jest/link/link-fail/mini.pkg.1.el b/test/jest/link/link-fail/mini.pkg.1.el
new file mode 100644
index 00000000..1db1a166
--- /dev/null
+++ b/test/jest/link/link-fail/mini.pkg.1.el
@@ -0,0 +1,39 @@
+;;; mini.pkg.1.el --- Minimal test package -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022-2025 the Eask authors.
+;; Created date 2022-03-29 01:52:58
+
+;; Author: Shen, Jen-Chieh
+;; URL: https://github.com/emacs-eask/cli/tree/master/test/fixtures/mini.pkg.1
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "24.3") (s "1.12.0") (fringe-helper "1.0.1"))
+;; Keywords: test local
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; Minimal Emacs package to simulate development environment; only for testing
+;; purposes!
+;;
+
+;;; Code:
+
+(require 's)
+(require 'fringe-helper)
+
+(provide 'mini.pkg.1)
+;;; mini.pkg.1.el ends here
diff --git a/test/jest/link/link-to/Eask b/test/jest/link/link-to/Eask
new file mode 100644
index 00000000..29507781
--- /dev/null
+++ b/test/jest/link/link-to/Eask
@@ -0,0 +1,15 @@
+(package "link-to"
+ "1.0.0"
+ "simple package to link")
+
+(website-url "https://example.org")
+(keywords "test")
+
+(package-file "link-to.el")
+
+(script "test" "echo \"Error: no test specified\" && exit 1")
+
+(source "gnu")
+
+(depends-on "emacs" "26.1")
+(depends-on "json-mode")
diff --git a/test/jest/link/link-to/link-to.el b/test/jest/link/link-to/link-to.el
new file mode 100644
index 00000000..e3b2188a
--- /dev/null
+++ b/test/jest/link/link-to/link-to.el
@@ -0,0 +1,33 @@
+;;; link-to.el --- summary -*- lexical-binding: t -*-
+
+;; Version: 1.0.0
+;; Package-Requires: ((emacs "26.2") (json-mode))
+;; Keywords: test
+
+;; This file is not part of GNU Emacs
+
+;; This program is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+
+;;; Commentary:
+
+;; commentary
+
+;;; Code:
+
+(message "Hello World!")
+
+(provide 'link-to)
+
+;;; link-to.el ends here
diff --git a/test/jest/local.test.js b/test/jest/local.test.js
new file mode 100644
index 00000000..d8de59aa
--- /dev/null
+++ b/test/jest/local.test.js
@@ -0,0 +1,277 @@
+// Here we test all local (workspace) commands by simulating a Emacs
+// pacakge development environment!
+
+// Notice, below we clone a random package (repo) that uses Eask as the
+// dependencies management tool.
+
+const { emacsVersion, TestContext } = require("./helpers");
+
+jest.setTimeout(60000);
+
+describe("local", () => {
+ const cwd = "./test/jest/local";
+ const ctx = new TestContext(cwd);
+
+ // NOTE: install-deps takes a long time in this package
+ // this is because of recipe dependencies triggering
+ // "temporary archives" build.
+ beforeAll(async () => await ctx.runEask("install-deps", { timeout: 40000 }));
+
+ afterAll(() => ctx.cleanUp());
+
+ describe("info commands", () => {
+ it("info", async () => {
+ await ctx.runEask("info");
+ });
+ it("status", async () => {
+ await ctx.runEask("status");
+ });
+ it("archives", async () => {
+ await ctx.runEask("archives");
+ });
+ it("archives --all", async () => {
+ await ctx.runEask("archives --all");
+ });
+ it("list --depth=0", async () => {
+ await ctx.runEask("list --depth=0");
+ });
+ // this alters the eask file
+ it("bump", async () => {
+ await ctx.runEask("bump major minor patch");
+ });
+ // NOTE: eask cat is a long running command
+ it("cat", async () => {
+ // cat requires e2ansi, installing it takes a while
+ await ctx.runEask("cat package.json --insecure");
+ await ctx.runEask("cat package.json --number --insecure");
+ });
+ it("concat", async () => {
+ await ctx.runEask("concat");
+ });
+ // NOTE: eask loc is a long running command
+ it("loc", async () => {
+ // installs markdown mode -- depends on emacs 28.1
+ if ((await emacsVersion()) >= "28.1") {
+ await ctx.runEask("loc");
+ await ctx.runEask("loc Eask");
+ }
+ });
+ });
+
+ describe("PATH environment", () => {
+ it("path", async () => {
+ await ctx.runEask("path");
+ await ctx.runEask("path bin");
+ });
+ it("load-path", async () => {
+ await ctx.runEask("load-path");
+ await ctx.runEask("load-path bin");
+ });
+ });
+
+ describe("Preparation", () => {
+ beforeAll(async () => await ctx.runEask("prepare --dev"));
+ afterAll(async () => await ctx.runEask("clean dist"));
+
+ it("package", async () => {
+ await ctx.runEask("package");
+ });
+ });
+
+ describe("Development", () => {
+ beforeAll(async () => await ctx.runEask("install-deps"));
+ // this requires install-deps
+ it("compile", async () => {
+ await ctx.runEask("compile");
+ await ctx.runEask("compile --clean");
+ await ctx.runEask("recompile");
+ await ctx.runEask("recompile --clean");
+ });
+
+ it("recipe", async () => {
+ await ctx.runEask("recipe");
+ });
+
+ it("keywords", async () => {
+ await ctx.runEask("keywords");
+ });
+
+ it("run script", async () => {
+ await ctx.runEask("run script");
+ await ctx.runEask("run script test");
+ await ctx.runEask("run script extra -- Extra arguments!");
+ await ctx.runEask("run script --all");
+ });
+
+ it("run command", async () => {
+ await ctx.runEask("run command");
+ await ctx.runEask("run command test");
+ await ctx.runEask("run command mini-test-3 -- Extra arguments!");
+ await ctx.runEask("run command --all");
+ });
+ });
+
+ describe("Execution", () => {
+ beforeAll(async () => await ctx.runEask("install-deps"));
+
+ test("eval", async () => {
+ await ctx.runEask('eval "(progn (require \'mini.pkg.1))"');
+ });
+ });
+
+ describe("Generating", () => {
+ beforeAll(async () => {
+ // from generate ignore elisp
+ await ctx.removeFiles(".gitignore");
+ });
+
+ afterAll(async () => {
+ await ctx.runEask("clean autoloads").catch(() => {});
+ await ctx.runEask("clean pkg-file").catch(() => {});
+
+ await ctx.removeFiles(
+ "recipes", // from generate recipes
+ ".gitignore", // from generate ignore elisp
+ );
+ });
+
+ it.each([
+ "generate autoloads",
+ "generate pkg-file",
+ "generate recipe -y",
+ "generate ignore elisp",
+ ])("eask %s", async (cmd) => {
+ await ctx.runEask(cmd);
+ });
+
+ it.skip("eask generate license", async () => {
+ // XXX: Avoid API rate limit exceeded error
+ await ctx.runEask("generate license gpl-3.0");
+ });
+ });
+
+ describe("Generating tests", () => {
+ // some tests fail if ./test already exists
+ beforeEach(async () => await ctx.removeFiles("features", "test", "tests"));
+ afterAll(async () => await ctx.removeFiles("features", "test", "tests"));
+
+ it.each([
+ "generate test ert",
+ "generate test ert-runner",
+ "generate test buttercup",
+ "generate test ecukes",
+ ])("eask %s", async (cmd) => {
+ await ctx.runEask(cmd);
+ });
+ });
+
+ describe("Generating workflow", () => {
+ beforeEach(
+ async () =>
+ await ctx.removeFiles(
+ ".circleci",
+ ".gitlab-ci.yml",
+ ".github",
+ ".travis.yml",
+ ),
+ );
+ afterAll(
+ async () =>
+ await ctx.removeFiles(
+ ".circleci",
+ ".gitlab-ci.yml",
+ ".github",
+ ".travis.yml",
+ ),
+ );
+
+ it.each([
+ "generate workflow circle-ci",
+ "generate workflow github",
+ "generate workflow gitlab",
+ "generate workflow travis-ci",
+ ])("eask %s", async (cmd) => {
+ await ctx.runEask(cmd);
+ });
+ });
+
+ describe("Linting", () => {
+ // some lint commands may fail if packages are missing
+ beforeAll(async () => await ctx.runEask("install-deps"));
+ it.each([
+ "lint checkdoc",
+ "lint declare",
+ "lint elint",
+ "lint elisp-lint",
+ "lint indent",
+ "lint keywords",
+ "lint license",
+ "lint package",
+ ])("eask %s", async (cmd) => {
+ await ctx.runEask(cmd);
+ });
+ it("lint regexps", async () => {
+ if ((await emacsVersion()) > "27.1") {
+ await ctx.runEask("lint regexps");
+ }
+ });
+ // XXX: Elsa is not stable, ignore it for now
+ test.skip("lint elsa", async () => {
+ await ctx.runEask("lint elsa");
+ });
+ });
+
+ describe("Testing", () => {
+ it("test activate", async () => {
+ await ctx.runEask("test activate");
+ });
+ });
+
+ describe("Formatting", () => {
+ // installs elisp-autofmt
+ it("format elisp-autofmt", async () => {
+ if ((await emacsVersion()) > "29.1") {
+ await ctx.runEask("format elisp-autofmt");
+ }
+ });
+
+ it("format elfmt", async () => {
+ await ctx.runEask("format elfmt");
+ });
+ });
+
+ describe("Cleaning", () => {
+ it.each([
+ "clean .eask",
+ "clean elc",
+ "clean dist",
+ "clean autoloads",
+ "clean pkg-file",
+ "clean log-file",
+ "clean all",
+ ])("eask %s", async (cmd) => {
+ await ctx.runEask(cmd);
+ });
+ });
+
+ describe("Control DSL", () => {
+ it("source add", async () => {
+ await ctx.runEask('source add test "https://test.elpa.com"');
+ });
+ it("source delete test", async () => {
+ await ctx.runEask("source delete test");
+ });
+ it("source list", async () => {
+ await ctx.runEask("source list");
+ });
+ });
+
+ describe("Util", () => {
+ it("locate", async () => {
+ await ctx.runEask("locate");
+ });
+ it("refresh", async () => {
+ await ctx.runEask("refresh");
+ });
+ });
+});
diff --git a/test/jest/local/Eask b/test/jest/local/Eask
new file mode 100644
index 00000000..bacb363d
--- /dev/null
+++ b/test/jest/local/Eask
@@ -0,0 +1,39 @@
+(package "mini.pkg.1"
+ "0.0.1"
+ "Minimal test package")
+
+(website-url "https://github.com/emacs-eask/cli/tree/master/test/fixtures/mini.pkg.1")
+(keywords "test" "local")
+
+(package-file "mini.pkg.1.el")
+
+(files "files/*.el")
+
+(script "test" "echo \"Have a nice day!~ ;)\"")
+(script "extra" "echo :")
+(script "info" "eask info")
+
+(eask-defcommand mini-test-1 "Test command 1." (message "Test 1"))
+(eask-defcommand mini-test-2 "Test command 2." (message "Test 2"))
+(eask-defcommand mini-test-3
+ "Test command 3."
+ (message "Test 3: %s" eask-rest))
+
+(source 'gnu)
+(source 'melpa)
+(source 'jcs-elpa)
+
+(depends-on "emacs" "26.1")
+(depends-on "f")
+(depends-on "s")
+(depends-on "fringe-helper")
+;; FIXME: including these takes a really long time
+;; perhaps move to a dedicated test file
+(depends-on "watch-cursor"
+ :repo "jcs-elpa/watch-cursor" :fetcher 'github)
+(depends-on "organize-imports-java"
+ :repo "jcs-elpa/organize-imports-java"
+ :fetcher 'github
+ :files '(:defaults "sdk" "default"))
+
+(setq network-security-level 'low) ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432
diff --git a/test/jest/local/RADME.md b/test/jest/local/RADME.md
new file mode 100644
index 00000000..441cfd06
--- /dev/null
+++ b/test/jest/local/RADME.md
@@ -0,0 +1 @@
+Minimal Emacs package to simulate development environment; only for testing purposes!
diff --git a/test/jest/local/files/mini.pkg.1-1.el b/test/jest/local/files/mini.pkg.1-1.el
new file mode 100644
index 00000000..1c7e7c73
--- /dev/null
+++ b/test/jest/local/files/mini.pkg.1-1.el
@@ -0,0 +1,32 @@
+;;; mini.pkg.1-1.el --- Extern file 1 -*- lexical-binding: t; -*-
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; files/mini.pkg.1-1.el
+;;
+
+;;; Code:
+
+
+(defun mini.pkg.1-1 ()
+ "Test function 1."
+ (interactive)
+ )
+
+(provide 'mini.pkg.1-1)
+;;; mini.pkg.1-1.el ends here
diff --git a/test/jest/local/files/mini.pkg.1-2.el b/test/jest/local/files/mini.pkg.1-2.el
new file mode 100644
index 00000000..09d7eb8c
--- /dev/null
+++ b/test/jest/local/files/mini.pkg.1-2.el
@@ -0,0 +1,31 @@
+;;; mini.pkg.1-2.el --- Extern file 2 -*- lexical-binding: t; -*-
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; files/mini.pkg.1-2.el
+;;
+
+;;; Code:
+
+(defun mini.pkg.1-2 ()
+ "Test function 2."
+ (interactive)
+ )
+
+(provide 'mini.pkg.1-2)
+;;; mini.pkg.1-2.el ends here
diff --git a/test/jest/local/mini.pkg.1.el b/test/jest/local/mini.pkg.1.el
new file mode 100644
index 00000000..1db1a166
--- /dev/null
+++ b/test/jest/local/mini.pkg.1.el
@@ -0,0 +1,39 @@
+;;; mini.pkg.1.el --- Minimal test package -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022-2025 the Eask authors.
+;; Created date 2022-03-29 01:52:58
+
+;; Author: Shen, Jen-Chieh
+;; URL: https://github.com/emacs-eask/cli/tree/master/test/fixtures/mini.pkg.1
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "24.3") (s "1.12.0") (fringe-helper "1.0.1"))
+;; Keywords: test local
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see .
+
+;;; Commentary:
+;;
+;; Minimal Emacs package to simulate development environment; only for testing
+;; purposes!
+;;
+
+;;; Code:
+
+(require 's)
+(require 'fringe-helper)
+
+(provide 'mini.pkg.1)
+;;; mini.pkg.1.el ends here
diff --git a/test/commands/test/buttercup/.gitignore b/test/jest/metadata/.gitignore
similarity index 100%
rename from test/commands/test/buttercup/.gitignore
rename to test/jest/metadata/.gitignore
diff --git a/test/commands/analyze/metadata/Eask b/test/jest/metadata/Eask
similarity index 100%
rename from test/commands/analyze/metadata/Eask
rename to test/jest/metadata/Eask
diff --git a/test/commands/analyze/metadata/check-metadata.el b/test/jest/metadata/check-metadata.el
similarity index 100%
rename from test/commands/analyze/metadata/check-metadata.el
rename to test/jest/metadata/check-metadata.el
diff --git a/test/jest/options.test.js b/test/jest/options.test.js
new file mode 100644
index 00000000..bcc97e0b
--- /dev/null
+++ b/test/jest/options.test.js
@@ -0,0 +1,46 @@
+const { TestContext } = require("./helpers");
+
+describe("options", () => {
+ const ctx = new TestContext("./test/jest/options");
+
+ describe("eask info errors", () => {
+ const ctx = new TestContext(process.env.HOME);
+ test("eask info should error without an Easkfile", async () => {
+ const hasGlobal =
+ (await ctx.fileExists("Eask").catch(() => false)) ||
+ (await ctx.fileExists("Easkfile").catch(() => false));
+ // If there is a global Easkfile then just skip testing
+ // Better to not test than to raise false errors
+ if (!hasGlobal) {
+ await expect(ctx.runEask("info -g")).rejects.toThrow();
+ await expect(ctx.runEask("info --global")).rejects.toThrow();
+ }
+ });
+ });
+
+ test.each([
+ "-a",
+ "--all",
+ "-q",
+ "--quick",
+ "-f",
+ "--force",
+ "--debug",
+ "--strict",
+ "--allow-error",
+ "--insecure",
+ "--timestamps",
+ "--log-level",
+ "--elapsed-time",
+ "--et",
+ "--no-color",
+ "--proxy localhost:8080",
+ "--http-proxy localhost:8080",
+ "--https-proxy localhost:8080",
+ "--no-proxy localhost:8080",
+ "-v 4",
+ "--verbose 4",
+ ])("eask info %s", async (opt) => {
+ await ctx.runEask(`info ${opt}`);
+ });
+});
diff --git a/test/commands/test/ert-runner/.gitignore b/test/jest/options/.gitignore
similarity index 100%
rename from test/commands/test/ert-runner/.gitignore
rename to test/jest/options/.gitignore
diff --git a/test/options/Eask b/test/jest/options/Eask
similarity index 100%
rename from test/options/Eask
rename to test/jest/options/Eask
diff --git a/test/jest/outdated-upgrade.test.js b/test/jest/outdated-upgrade.test.js
new file mode 100644
index 00000000..660545ed
--- /dev/null
+++ b/test/jest/outdated-upgrade.test.js
@@ -0,0 +1,23 @@
+const { TestContext } = require("./helpers");
+
+describe("outdated and upgrade", () => {
+ const ctx = new TestContext("./test/jest/outdated-upgrade");
+
+ beforeAll(async () => {
+ await ctx.runEask("install-deps");
+ await ctx.runEask("load make-outdate.el");
+ });
+
+ // these will run in sequence
+ afterAll(async () => await ctx.runEask("clean all"));
+ afterAll(() => ctx.cleanUp());
+
+ test("list outdated", async () => {
+ await ctx.runEask("outdated");
+ await ctx.runEask("outdated --depth 0");
+ });
+
+ test("upgrade", async () => {
+ await ctx.runEask("upgrade");
+ });
+});
diff --git a/test/commands/test/ert/.gitignore b/test/jest/outdated-upgrade/.gitignore
similarity index 100%
rename from test/commands/test/ert/.gitignore
rename to test/jest/outdated-upgrade/.gitignore
diff --git a/test/commands/outdated_upgrade/Eask b/test/jest/outdated-upgrade/Eask
similarity index 100%
rename from test/commands/outdated_upgrade/Eask
rename to test/jest/outdated-upgrade/Eask
diff --git a/test/commands/outdated_upgrade/make-outdate.el b/test/jest/outdated-upgrade/make-outdate.el
similarity index 100%
rename from test/commands/outdated_upgrade/make-outdate.el
rename to test/jest/outdated-upgrade/make-outdate.el
diff --git a/test/jest/search.test.js b/test/jest/search.test.js
new file mode 100644
index 00000000..b1a158e9
--- /dev/null
+++ b/test/jest/search.test.js
@@ -0,0 +1,22 @@
+const { TestContext } = require("./helpers");
+
+describe("search", () => {
+ const cwd = "./test/jest/search";
+ const ctx = new TestContext(cwd);
+
+ test("eask search company", async () => {
+ await ctx.runEask("search company");
+ });
+
+ test("eask search company dash --depth 0", async () => {
+ await ctx.runEask("search company dash --depth 0");
+ });
+
+ test("eask search company dash f s --depth 0 -g", async () => {
+ await ctx.runEask("search company dash f s --depth 0 -g");
+ });
+
+ test("eask search should error", async () => {
+ await expect(ctx.runEask("search")).rejects.toThrow();
+ });
+});
diff --git a/test/options/.gitignore b/test/jest/search/.gitignore
similarity index 100%
rename from test/options/.gitignore
rename to test/jest/search/.gitignore
diff --git a/test/commands/search/Eask b/test/jest/search/Eask
similarity index 100%
rename from test/commands/search/Eask
rename to test/jest/search/Eask
diff --git a/test/jest/test-buttercup.test.js b/test/jest/test-buttercup.test.js
new file mode 100644
index 00000000..7b7293de
--- /dev/null
+++ b/test/jest/test-buttercup.test.js
@@ -0,0 +1,33 @@
+const { TestContext } = require("./helpers");
+
+describe("buttercup", () => {
+ const ctx = new TestContext("./test/jest/buttercup");
+
+ beforeAll(async () => await ctx.runEask("install-deps --dev"));
+
+ test("run all tests", async () => {
+ // this runs all tests, so should error
+ await expect(ctx.runEask("test buttercup")).rejects.toThrow();
+ });
+
+ // buttercup takes directories as arguments
+ test("run succeeding tests", async () => {
+ await ctx.runEask("test buttercup ./test-ok");
+ });
+
+ test("run all tests explicitly", async () => {
+ await expect(
+ ctx.runEask("test buttercup ./test-ok ./test-fail"),
+ ).rejects.toThrow();
+ });
+
+ test("does not take options", async () => {
+ await ctx.runEask("test buttercup --no-color ./test-ok");
+ });
+
+ // Because load-path is manually set, cannot refer to parent directories.
+ // Note this does work if you do ../buttercup/test-ok/, but not for any other directory.
+ test("running paths in parent dir", async () => {
+ await expect(ctx.runEask("test buttercup ../bin")).rejects.toThrow();
+ });
+});
diff --git a/test/jest/test-ecukes.test.js b/test/jest/test-ecukes.test.js
new file mode 100644
index 00000000..4a525b2f
--- /dev/null
+++ b/test/jest/test-ecukes.test.js
@@ -0,0 +1,16 @@
+const { TestContext } = require("./helpers");
+
+describe("test_ecukes", () => {
+ const ctx = new TestContext("./test/jest/ecukes");
+
+ beforeAll(async () => await ctx.runEask("install-deps --dev"));
+ afterAll(() => ctx.cleanUp());
+
+ test("eask test ecukes", async () => {
+ await ctx.runEask("test ecukes");
+ });
+
+ test("eask test ecukes ./features/foo.feature", async () => {
+ await ctx.runEask("test ecukes ./features/foo.feature");
+ });
+});
diff --git a/test/jest/test-ert-runner.test.js b/test/jest/test-ert-runner.test.js
new file mode 100644
index 00000000..c40486b0
--- /dev/null
+++ b/test/jest/test-ert-runner.test.js
@@ -0,0 +1,13 @@
+const { TestContext } = require("./helpers");
+
+describe("test ert-runner", () => {
+ const ctx = new TestContext("./test/jest/ert-runner");
+
+ beforeAll(async () => await ctx.runEask("install-deps --dev"));
+
+ afterAll(() => ctx.cleanUp());
+
+ test("eask test ert-runner ./test/*.el", async () => {
+ await ctx.runEask("test ert-runner ./test/*.el");
+ });
+});
diff --git a/test/jest/test-ert.test.js b/test/jest/test-ert.test.js
new file mode 100644
index 00000000..c44a8697
--- /dev/null
+++ b/test/jest/test-ert.test.js
@@ -0,0 +1,19 @@
+const { TestContext } = require("./helpers");
+
+describe("test-ert", () => {
+ const ctx = new TestContext("./test/jest/ert");
+
+ afterAll(() => ctx.cleanUp());
+
+ test("eask test ert ./test/*.el", async () => {
+ await ctx.runEask("test ert ./test/*.el");
+ });
+
+ test("nil message", async () => {
+ await ctx.runEask("test ert ./test-nil-message/*.el");
+ });
+
+ test("no files", async () => {
+ await expect(ctx.runEask("test ert")).rejects.toThrow();
+ });
+});
diff --git a/test/jest/upgrade-eask.test.js b/test/jest/upgrade-eask.test.js
new file mode 100644
index 00000000..10c2b9a8
--- /dev/null
+++ b/test/jest/upgrade-eask.test.js
@@ -0,0 +1,8 @@
+const { testUnsafe, TestContext } = require("./helpers");
+
+describe("upgrade-eask", () => {
+ const ctx = new TestContext();
+ testUnsafe("eask upgrade-eask", async () => {
+ await ctx.runEask("upgrade-eask");
+ });
+});
diff --git a/test/options/run.sh b/test/options/run.sh
deleted file mode 100755
index 6eb8911e..00000000
--- a/test/options/run.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2022-2025 the Eask authors.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-## Commentary:
-#
-# Test all options flag
-#
-
-set -e
-
-source ./test/fixtures/home/scripts/testing.sh
-
-echo "Test all options flag"
-cd $(dirname "$0")
-
-# Please have these flags in order, see `eask` file in the project root!
-should_error eask info -g
-should_error eask info --global
-eask info -a
-eask info --all
-eask info -q
-eask info --quick
-eask info -f
-eask info --force
-eask info --debug
-eask info --strict
-eask info --allow-error
-eask info --insecure
-eask info --timestamps
-eask info --log-level
-eask info --elapsed-time
-eask info --et
-eask info --no-color
-eask info --proxy localhost:8080
-eask info --http-proxy localhost:8080
-eask info --https-proxy localhost:8080
-eask info --no-proxy localhost:8080
-eask info -v 4
-eask info --verbose 4