From 74fa0e3f90a4f9fb58afc8e2a234f5afb6cd3f9d Mon Sep 17 00:00:00 2001 From: Sergey Kupletsky Date: Mon, 11 Nov 2024 13:34:55 +0100 Subject: [PATCH] feat: change building system to rollup, compiling linter into a binary --- .dockerignore | 49 + .eslintrc.cjs | 2 +- .github/workflows/main.yml | 173 +- .gitignore | 6 + .markdownlint.cjs | 11 +- CONTRIBUTING.md | 158 +- Dockerfile | 51 +- Makefile | 48 + README.md | 36 +- bin/dclint.js | 2 - package-lock.json | 3529 ++++++++++++++--- package.json | 27 +- release.config.js | 17 +- rollup.base.config.js | 41 + rollup.config.cli.js | 18 + rollup.config.lib.js | 15 + rollup.config.pkg.js | 13 + scripts/generate-sea.sh | 15 + sea-config.json | 7 + src/cli/cli.ts | 204 +- src/cli/cli.types.ts | 2 +- src/config/config.ts | 10 +- src/formatters/codeclimate.ts | 2 +- src/formatters/compact.ts | 2 +- src/formatters/index.ts | 13 + src/formatters/json.ts | 2 +- src/formatters/junit.ts | 2 +- src/formatters/stylish.ts | 27 +- src/index.ts | 2 +- src/linter/linter.ts | 34 +- src/rules/index.ts | 33 + src/rules/no-build-and-image-rule.ts | 4 +- .../no-duplicate-container-names-rule.ts | 4 +- src/rules/no-duplicate-exported-ports-rule.ts | 6 +- src/rules/no-quotes-in-volumes-rule.ts | 4 +- src/rules/no-unbound-port-interfaces-rule.ts | 6 +- src/rules/no-version-field-rule.ts | 4 +- src/rules/require-project-name-field-rule.ts | 2 +- src/rules/require-quotes-in-ports-rule.ts | 4 +- .../service-container-name-regex-rule.ts | 4 +- ...ce-dependencies-alphabetical-order-rule.ts | 4 +- ...service-image-require-explicit-tag-rule.ts | 4 +- src/rules/service-keys-order-rule.ts | 4 +- .../service-ports-alphabetical-order-rule.ts | 6 +- src/rules/services-alphabetical-order-rule.ts | 4 +- src/rules/top-level-properties-order-rule.ts | 4 +- src/util/compose-validation.ts | 6 +- src/util/files-finder.ts | 4 +- src/util/formatter-loader.ts | 26 +- src/util/load-schema.ts | 11 - src/util/logger.ts | 10 +- src/util/rules-loader.ts | 95 +- src/util/schema-loader.ts | 15 + tests/linter.spec.ts | 24 +- tests/mocks/docker-compose.correct.yml | 63 + tests/rules/no-build-and-image-rule.spec.ts | 4 +- .../no-duplicate-container-names-rule.spec.ts | 4 +- .../no-duplicate-exported-ports-rule.spec.ts | 4 +- tests/rules/no-quotes-in-volumes-rule.spec.ts | 4 +- .../no-unbound-port-interfaces-rule.spec.ts | 4 +- tests/rules/no-version-field-rule.spec.ts | 4 +- .../require-project-name-field-rule.spec.ts | 4 +- .../require-quotes-in-ports-rule.spec.ts | 9 +- .../service-container-name-regex-rule.spec.ts | 4 +- ...pendencies-alphabetical-order-rule.spec.ts | 4 +- ...ce-image-require-explicit-tag-rule.spec.ts | 4 +- tests/rules/service-keys-order-rule.spec.ts | 4 +- ...vice-ports-alphabetical-order-rule.spec.ts | 4 +- .../services-alphabetical-order-rule.spec.ts | 4 +- .../top-level-properties-order-rule.spec.ts | 4 +- tests/util/files-finder.spec.ts | 16 +- tests/util/line-finder.spec.ts | 2 +- tests/util/service-ports-parser.spec.ts | 2 +- tsconfig.json | 4 +- 74 files changed, 4106 insertions(+), 852 deletions(-) create mode 100644 .dockerignore create mode 100644 Makefile delete mode 100755 bin/dclint.js create mode 100644 rollup.base.config.js create mode 100644 rollup.config.cli.js create mode 100644 rollup.config.lib.js create mode 100644 rollup.config.pkg.js create mode 100755 scripts/generate-sea.sh create mode 100644 sea-config.json create mode 100644 src/formatters/index.ts create mode 100644 src/rules/index.ts delete mode 100644 src/util/load-schema.ts create mode 100644 src/util/schema-loader.ts create mode 100644 tests/mocks/docker-compose.correct.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..bc87cf1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,49 @@ +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# OS +.DS_Store + +# Git +.git/ +.gitignore + +# Github +.github/ + +# Docker +Dockerfile + +# Documentation +/documentation +/docs + +# Dependencies +/node_modules + +# Compiled output and runtime +/dist +/bin +/pkg +/.tsimp +/sea-prep.blob +/dclint + +# Tests +/coverage + +# Other +Makefile diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 802886b..2aba164 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -92,5 +92,5 @@ module.exports = { 'unicorn/switch-case-braces': [2, 'avoid'], 'unicorn/import-style': [2, {"styles": {"node:path": {"named": true, "default": false}}}] }, - 'ignorePatterns': ['node_modules', 'dist', '.tsimp', 'coverage', 'bin'], + 'ignorePatterns': ['node_modules', 'dist', '.tsimp', 'coverage', 'bin', 'rollup*config*js'], }; diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d7118c8..2b6a5d9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,17 +9,17 @@ on: - '**' jobs: - build: + tests: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: '20.17.0' + node-version: '20.18.0' - name: Install dependencies run: npm ci @@ -27,6 +27,9 @@ jobs: - name: Build the project run: npm run build + - name: Build SEA + run: docker run --rm -v "$PWD":/app -w /app node:20.18.0-alpine ./scripts/generate-sea.sh ./pkg/dclint + - name: Run linter run: npm run lint @@ -39,12 +42,96 @@ jobs: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} run: wget -qO - https://coverage.codacy.com/get.sh | bash -s -- report -r ./coverage/cobertura-coverage.xml + - name: Upload tests artifacts + uses: actions/upload-artifact@v4 + with: + name: tests-artifacts + path: | + ./dist + ./bin + + debug: + runs-on: ubuntu-latest + needs: tests + strategy: + matrix: + node-version: [18, 20, 22, 23] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: tests-artifacts + path: ./ + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Install dependencies + run: npm ci --omit=dev + + - name: Run debug:bin + run: npm run debug:bin + + build: + runs-on: ubuntu-latest + needs: + - tests + - debug +# if: github.ref == 'refs/heads/main' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.18.0' + + - name: Install dependencies + run: npm ci + + - name: Generate new version + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + run: npx semantic-release --dry-run --no-ci + + - name: Build the project + run: | + export VERSION=$(cat .VERSION) + npm run build + + - name: Set up QEMU for multi-arch + uses: docker/setup-qemu-action@v3 + with: + platforms: linux/arm64 + + - name: Build SEA for Alpine amd64 + run: docker run --rm --platform linux/amd64 -v "$PWD":/app -w /app node:20.18.0-alpine ./scripts/generate-sea.sh ./pkg/dclint-alpine-amd64 + + - name: Build SEA for Bullseye amd64 + run: docker run --rm --platform linux/amd64 -v "$PWD":/app -w /app node:20.18.0-bullseye ./scripts/generate-sea.sh ./pkg/dclint-bullseye-amd64 + + - name: Build SEA for Alpine arm64 + run: docker run --rm --platform linux/arm64 -v "$PWD":/app -w /app node:20.18.0-alpine ./scripts/generate-sea.sh ./pkg/dclint-alpine-arm64 + + - name: Build SEA for Bullseye arm64 + run: docker run --rm --platform linux/arm64 -v "$PWD":/app -w /app node:20.18.0-bullseye ./scripts/generate-sea.sh ./pkg/dclint-bullseye-arm64 + - name: Upload build artifacts uses: actions/upload-artifact@v4 - if: github.ref == 'refs/heads/main' with: name: build-artifacts - path: ./dist + path: | + ./dist + ./bin + ./pkg release: runs-on: ubuntu-latest @@ -53,18 +140,18 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: build-artifacts - path: ./dist + path: ./ - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: '20.17.0' + node-version: '20.18.0' - name: Install dependencies run: npm ci @@ -75,6 +162,43 @@ jobs: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} run: npx semantic-release + # Upload binary files to GitHub Release + - name: Upload Alpine Binary + uses: actions/upload-release-asset@v1 + if: steps.release.outputs.new_release == 'true' + with: + upload_url: ${{ steps.release.outputs.upload_url }} + asset_path: ./pkg/dclint-alpine-amd64 + asset_name: dclint-alpine-amd64 + asset_content_type: application/octet-stream + + - name: Upload Bullseye Binary + uses: actions/upload-release-asset@v1 + if: steps.release.outputs.new_release == 'true' + with: + upload_url: ${{ steps.release.outputs.upload_url }} + asset_path: ./pkg/dclint-bullseye-amd64 + asset_name: dclint-bullseye-amd64 + asset_content_type: application/octet-stream + + - name: Upload Alpine ARM64 Binary + uses: actions/upload-release-asset@v1 + if: steps.release.outputs.new_release == 'true' + with: + upload_url: ${{ steps.release.outputs.upload_url }} + asset_path: ./pkg/dclint-alpine-arm64 + asset_name: dclint-alpine-arm64 + asset_content_type: application/octet-stream + + - name: Upload Bullseye ARM64 Binary + uses: actions/upload-release-asset@v1 + if: steps.release.outputs.new_release == 'true' + with: + upload_url: ${{ steps.release.outputs.upload_url }} + asset_path: ./pkg/dclint-bullseye-arm64 + asset_name: dclint-bullseye-arm64 + asset_content_type: application/octet-stream + - name: Upload release artifacts uses: actions/upload-artifact@v4 with: @@ -91,7 +215,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Download release artifacts uses: actions/download-artifact@v4 @@ -111,18 +235,36 @@ jobs: echo "BUILD_REVISION=$BUILD_REVISION" >> $GITHUB_ENV - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 with: install: true - name: Log in to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push Docker image - uses: docker/build-push-action@v5 + # Build and push the Alpine version + - name: Build and push Alpine version + uses: docker/build-push-action@v6 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + ${{ secrets.DOCKERHUB_USERNAME }}/dclint:alpine + ${{ secrets.DOCKERHUB_USERNAME }}/dclint:latest-alpine + ${{ secrets.DOCKERHUB_USERNAME }}/dclint:${{ env.BUILD_VERSION }}-alpine + build-args: | + BUILD_DATE=${{ env.BUILD_DATE }} + BUILD_VERSION=${{ env.BUILD_VERSION }} + BUILD_REVISION=${{ env.BUILD_REVISION }} + target: alpine-version + + # Build and push the Scratch version + - name: Build and push Scratch version + uses: docker/build-push-action@v6 with: context: . push: true @@ -134,3 +276,4 @@ jobs: BUILD_DATE=${{ env.BUILD_DATE }} BUILD_VERSION=${{ env.BUILD_VERSION }} BUILD_REVISION=${{ env.BUILD_REVISION }} + target: scratch-version diff --git a/.gitignore b/.gitignore index 04e47b7..18b9d44 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,12 @@ # Build /dist +/bin +/pkg # Runtime /.tsimp + +# Generated files +/sea-prep.blob +/.VERSION diff --git a/.markdownlint.cjs b/.markdownlint.cjs index 4642f0c..caf4955 100644 --- a/.markdownlint.cjs +++ b/.markdownlint.cjs @@ -1,12 +1,19 @@ module.exports = { 'default': true, + 'no-hard-tabs': false, + 'whitespace': false, + 'MD003': { + 'style': 'atx', + }, 'MD004': { 'style': 'dash', }, + 'MD007': { + 'indent': 2, + }, 'MD013': { 'line_length': 120, - 'ignore_code_blocks': true, - 'ignore_urls': true, + 'code_blocks': false, 'tables': false, }, 'MD024': { diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 459ce9c..5524885 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,6 +57,160 @@ fixable, this method can return the content unchanged. 2. Create a markdown file describing your new rule (for example `new-check-rule.md`) based on [template](./docs/rules/__TEMPLATE__.md) +## How to Build the Project + +The project has several Rollup configurations designed for specific build outputs. You can use the provided npm scripts +to build each configuration individually or all at once. + +1. **CLI Build (`rollup.config.cli.js`)** + + This configuration builds the CLI, producing a minified CommonJS file (`bin/dclint.cjs`) for command-line use. The + minification keeps the output compact for efficient distribution. + + **How to Run:** + + ```shell + npm run build:cli + ``` + +2. **PKG Build for SEA (`rollup.config.pkg.js`)** + + This configuration bundles the entire project, including dependencies, into a single file (`pkg/dclint.cjs`). It is + useful for creating a Single Executable Application (SEA) with Node.js, as all dependencies are embedded in the + output. + + **How to Run:** + + ```shell + npm run build:pkg + ``` + +3. **Library Build (`rollup.config.lib.js`)** + + This configuration generates the main library with outputs in both CommonJS and ESM formats, along with TypeScript + declaration files. This is ideal for distributing the library to be used in various module systems. + + **How to Run:** + + ```shell + npm run build:lib + ``` + +Each configuration has its specific purpose, helping you generate optimized builds for different parts of the project. +Use the `pkg` build when you need to create a single executable, the `cli` build for compact CLI usage, and the `lib` +build for general library distribution. To run all builds at once, use: + +```shell +npm run build +``` + +## How to Build SEA + +Single Executable Applications (SEA) allow you to bundle your Node.js application into a single executable file. This +approach is especially useful for distributing CLI tools, as it removes the need for users to install Node.js or other +dependencies. In this project, the `pkg` build configuration is designed specifically for SEA, bundling all dependencies +into a single file. + +### MacOS + +The following commands are specific to macOS for building a SEA. + +```shell +# Create package build +npm run build:pkg + +# Clean previous build artifacts +rm -rf dclint sea-prep.blob + +# Generate SEA Blob using the Node.js SEA configuration file +node --experimental-sea-config sea-config.json + +# Copy the Node.js binary to create the executable +cp $(command -v node) dclint + +# Remove signature to run on macOS +codesign --remove-signature dclint + +# Inject SEA Blob into the executable using postject +sudo npx postject dclint NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 --macho-segment-name NODE_SEA + +# Sign the executable to allow it to run on macOS +codesign --sign - dclint +``` + +### Linux + +```shell +# Create package build +npm run build:pkg + +# Clean previous build artifacts +rm -rf dclint sea-prep.blob + +# Generate SEA Blob using the Node.js SEA configuration file +node --experimental-sea-config sea-config.json + +# Copy the Node.js binary to create the executable +cp $(command -v node) dclint + +# Inject SEA Blob into the executable using postject +npx postject dclint NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 --macho-segment-name NODE_SEA +``` + +Also, you can use Docker to compile it: + +```bash +docker run --rm -v "$PWD":/app -w /app node:20.18.0-alpine ./scripts/generate-sea.sh ./pkg/dclint-alpine +docker run --rm -v "$PWD":/app -w /app node:20.18.0-bullseye ./scripts/generate-sea.sh ./pkg/dclint-bullseye +``` + +After running these commands, you will have a standalone `dclint` executable, ready for distribution and use. This SEA +version simplifies deployment, allowing users to run the CLI tool without any external dependencies. + +To verify that everything is working correctly, run the following command: + +```shell +./dclint ./tests/mocks/docker-compose.yml -c ./tests/mocks/.dclintrc +./dclint -v +``` + +To suppress the experimental feature warning: + +```text +(node:99747) ExperimentalWarning: Single executable application is an experimental feature and might change at any time +(Use `dclint --trace-warnings ...` to show where the warning was created) +``` + +set the environment variable `NODE_NO_WARNINGS=1`: + +```bash +NODE_NO_WARNINGS=1 ./dclint ./tests/mocks/docker-compose.yml -c ./tests/mocks/.dclintrc +``` + +Note that this SEA still need some dependencies to run: + +```text +For Ubuntu +ldd /bin/dclint + linux-vdso.so.1 + libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 + libstdc++.so.6 => /usr/lib/aarch64-linux-gnu/libstdc++.so.6 + libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 + libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 + libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 + libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 + /lib/ld-linux-aarch64.so.1 +``` + +```text +For Alpine +ldd /bin/dclint + /lib/ld-musl-aarch64.so.1 + libstdc++.so.6 => /usr/lib/libstdc++.so.6 + libc.musl-aarch64.so.1 => /lib/ld-musl-aarch64.so.1 + libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 +``` + ## Build Docker File Locally ```shell @@ -98,8 +252,8 @@ You can do this by running the linter on a Docker Compose file: npm run debug ``` -If no errors occur, and the linter correctly identifies new fields or deprecated ones, then the schema has been updated -successfully. +If no errors occur during execution, and the linter correctly identifies all errors and warnings, then the schema has +been updated successfully. After updating the schema, it's also important to run the project's unit tests to confirm that nothing was broken by the schema update: diff --git a/Dockerfile b/Dockerfile index 48d8cfe..7e5889d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.17.0-alpine3.19 +FROM node:20.18.0-alpine3.19 AS builder WORKDIR /dclint @@ -6,11 +6,56 @@ COPY package*.json ./ RUN npm ci COPY . . -RUN npm run build + +# SEA Builder +RUN npm run build:pkg && ./scripts/generate-sea.sh /bin/dclint + +FROM alpine:3.19 AS alpine-version + +ENV NODE_NO_WARNINGS=1 + +RUN apk update && apk upgrade && \ + apk add --no-cache \ + libstdc++ \ + && rm -rf /tmp/* /var/cache/apk/* + +COPY --from=builder /bin/dclint /bin/dclint + +WORKDIR /app + +ENTRYPOINT ["/bin/dclint"] + +ARG BUILD_DATE="0000-00-00T00:00:00+0000" +ARG BUILD_VERSION="0.0.0" +ARG BUILD_REVISION="0000000" + +LABEL \ + org.opencontainers.image.title="Docker Compose Linter (Alpine)" \ + org.opencontainers.image.description="A command-line tool for validating and enforcing best practices in Docker Compose files." \ + org.opencontainers.image.created="${BUILD_DATE}" \ + org.opencontainers.image.authors="Sergey Kupletsky " \ + org.opencontainers.image.url="https://github.com/zavoloklom/docker-compose-linter" \ + org.opencontainers.image.documentation="https://github.com/zavoloklom/docker-compose-linter" \ + org.opencontainers.image.source="https://github.com/zavoloklom/docker-compose-linter.git" \ + org.opencontainers.image.version="${BUILD_VERSION}" \ + org.opencontainers.image.revision="${BUILD_REVISION}" \ + org.opencontainers.image.vendor="Sergey Kupletsky" \ + org.opencontainers.image.licenses="MIT" + +FROM scratch AS scratch-version + +ENV NODE_NO_WARNINGS=1 + +COPY --from=builder "/usr/lib/libstdc++.so.6" "/usr/lib/libstdc++.so.6" +COPY --from=builder /usr/lib/libgcc_s.so.1 /usr/lib/libgcc_s.so.1 +COPY --from=builder /lib/ld-musl-aarch64.so.1 /lib/ld-musl-aarch64.so.1 +COPY --from=builder /lib/libc.musl-aarch64.so.1 /lib/libc.musl-aarch64.so.1 + +COPY --from=builder /bin/dclint /bin/dclint WORKDIR /app -ENTRYPOINT ["node", "--no-warnings", "/dclint/bin/dclint.js"] +ENTRYPOINT ["/bin/dclint"] ARG BUILD_DATE="0000-00-00T00:00:00+0000" ARG BUILD_VERSION="0.0.0" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f47bab4 --- /dev/null +++ b/Makefile @@ -0,0 +1,48 @@ +.DEFAULT_GOAL := help +.PHONY: help docker dev dev-sync check-version + +%: + @true + +help: ## Show this help. + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(firstword $(MAKEFILE_LIST)) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +###### +# CONFIGURATION +###### + +MSYS_NO_PATHCONV:=1 # Fix for Windows +ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) + +IMAGE_NAME=zavoloklom/dclint +IMAGE_TAG=dev + +BUILD_VERSION=$(shell awk -F\" '/"version":/ {print $$4}' package.json) +BUILD_DATE=$(shell date +%Y-%m-%dT%T%z) +BUILD_REVISION=$(shell git rev-parse --short HEAD) + +###### +# MAIN SCRIPTS +###### + +docker: ## Build docker image. + docker build --file Dockerfile . --tag ${IMAGE_NAME}:${IMAGE_TAG} \ + --pull \ + --build-arg BUILD_DATE=${BUILD_DATE} \ + --build-arg BUILD_VERSION=${BUILD_VERSION} \ + --build-arg BUILD_REVISION=${BUILD_REVISION} + +dev: docker ## Start development inside container. Note: node_modules, bin, pkg and dist are not synced. + docker run --rm -it --ipc=host \ + -v ${PWD}:/var/www/app \ + --mount type=volume,dst=/var/www/app/node_modules \ + --mount type=volume,dst=/var/www/app/dist \ + --mount type=volume,dst=/var/www/app/bin \ + --mount type=volume,dst=/var/www/app/pkg \ + ${IMAGE_NAME}:${IMAGE_TAG} /bin/sh + +dev-sync: docker ## Start development inside container. Note: all files are synced. + docker run --rm -it --ipc=host -v ${PWD}:/var/www/app ${IMAGE_NAME}:${IMAGE_TAG} /bin/sh + +check-version: docker ## Check version in docker container. Note: all files are not synced. + docker run --rm -it --ipc=host ${IMAGE_NAME}:${IMAGE_TAG} -v diff --git a/README.md b/README.md index 2772306..e9e2b49 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,40 @@ docker run -t --rm -v ${PWD}:/app zavoloklom/dclint -h For more information about available options and formatters, please refer to the [CLI Reference](./docs/cli.md) and [Formatters Reference](./docs/formatters.md). +## Usage as a Library + +The `dclint` library can be integrated directly into your code, allowing you to run linting checks programmatically and +format the results as desired. Below are examples of how to use `dclint` as a library in both CommonJS and ES module +formats. + +### Example with CommonJS + +```javascript +const { DCLinter } = require('dclint'); + +(async () => { + const linter = new DCLinter(); + + const lintResults = await linter.lintFiles(['.'], true); + const formattedResults = await linter.formatResults(lintResults, 'stylish'); + + console.log(formattedResults); +})(); +``` + +### Example with ES Module + +```javascript +import { DCLinter } from 'dclint'; + +const linter = new DCLinter(); + +const lintResults = await linter.lintFiles(['.'], true); +const formattedResults = await linter.formatResults(lintResults, 'stylish'); + +console.log(formattedResults); +``` + ## Rules and Errors Docker Compose Linter includes set of rules to ensure your Docker Compose files adhere to best practices. Detailed @@ -250,7 +284,7 @@ lint-docker-compose: name: zavoloklom/dclint entrypoint: [ "" ] script: - - node --no-warnings /dclint/bin/dclint.js . -r -f codeclimate -o gl-codequality.json + - /bin/dclint . -r -f codeclimate -o gl-codequality.json artifacts: reports: codequality: gl-codequality.json diff --git a/bin/dclint.js b/bin/dclint.js deleted file mode 100755 index 221b6e0..0000000 --- a/bin/dclint.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -import cli from '../dist/cli/cli.js'; diff --git a/package-lock.json b/package-lock.json index b8b4444..07d74bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,16 +10,23 @@ "license": "MIT", "dependencies": { "ajv": "^8.17.1", - "chalk": "^5.3.0", "cosmiconfig": "^9.0.0", + "picocolors": "^1.1.1", "yaml": "^2.6.0", "yargs": "^17.7.2" }, "bin": { - "dclint": "bin/dclint.js", - "docker-compose-linter": "bin/dclint.js" + "dclint": "bin/dclint.cjs" }, "devDependencies": { + "@babel/preset-env": "7.26.0", + "@rollup/plugin-babel": "6.0.4", + "@rollup/plugin-commonjs": "28.0.1", + "@rollup/plugin-json": "6.1.0", + "@rollup/plugin-node-resolve": "15.3.0", + "@rollup/plugin-replace": "6.0.1", + "@rollup/plugin-terser": "0.4.4", + "@rollup/plugin-typescript": "12.1.1", "@semantic-release/changelog": "6.0.3", "@semantic-release/commit-analyzer": "13.0.0", "@semantic-release/exec": "6.0.3", @@ -47,6 +54,7 @@ "eslint-plugin-unicorn": "56.0.0", "esmock": "2.6.9", "markdownlint-cli2": "0.14.0", + "rollup": "4.25.0", "semantic-release": "24.2.0", "tap-xunit": "2.4.1", "tsimp": "2.0.12", @@ -61,731 +69,2888 @@ "url": "https://github.com/zavoloklom#how-to-support" } }, + "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": "Apache-2.0", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "node_modules/@babel/compat-data": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "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": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" + "node_modules/@babel/core/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", + "peer": true, + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "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 + "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": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "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, - "optional": true, - "engines": { - "node": ">=0.1.90" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "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-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "node_modules/@babel/helper-create-class-features-plugin/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, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@babel/helper-create-regexp-features-plugin/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-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@eslint/eslintrc/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==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "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, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "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": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/types": "^7.25.9" }, "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@humanwhocodes/config-array/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==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/helper-simple-access": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, - "engines": { - "node": ">=12.22" + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@isaacs/cached": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/cached/-/cached-1.0.1.tgz", - "integrity": "sha512-7kGcJ9Hc1f4qpTApWz3swxbF9Qv1NF/GxuPtXeTptbsgvJIoufSd0h854Nq/2bw80F5C1onsFgEI05l+q0e4vw==", + "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, - "dependencies": { - "@isaacs/catcher": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@isaacs/catcher": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@isaacs/catcher/-/catcher-1.0.4.tgz", - "integrity": "sha512-g2klMwbnguClWNnCeQ1zYaDJsvPbIbnjdJPDE0z09MqoejJDZSLK5vIKiClq2Bkg5ubuI8vaN6wfIUi5GYzMVA==", - "dev": true - }, - "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, - "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" - }, + "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==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "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 - }, - "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/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, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=6.9.0" } }, - "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==", + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.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/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "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/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, + "license": "MIT", "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" + "@babel/helper-plugin-utils": "^7.25.9" }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@mapbox/node-pre-gyp/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-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "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" } }, - "node_modules/@mapbox/node-pre-gyp/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/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { - "node": ">= 6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "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-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=12.4.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", - "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@octokit/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", - "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/endpoint": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", - "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0", - "universal-user-agent": "^7.0.2" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/graphql": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", - "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^7.0.0" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "dev": true + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.3.tgz", - "integrity": "sha512-o4WRoOJZlKqEEgj+i9CpcmnByvtzoUYC6I8PD2SA95M+BJ2x8h7oLcVOg9qcowWXBOdcTRsMZiwvM3EyLm9AfA==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^13.5.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" }, "peerDependencies": { - "@octokit/core": ">=6" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/plugin-retry": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.1.tgz", - "integrity": "sha512-G9Ue+x2odcb8E1XIPhaFBnTTIrrUDfXN05iFXiqhR+SeeeDMMILcAnysOsxUpEWcQp2e5Ft397FCXTcPkiPkLw==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/request-error": "^6.0.0", - "@octokit/types": "^13.0.0", - "bottleneck": "^2.15.3" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" }, "peerDependencies": { - "@octokit/core": ">=6" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/plugin-throttling": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.1.tgz", - "integrity": "sha512-Qd91H4liUBhwLB2h6jZ99bsxoQdhgPk6TdwnClPyTBSDAdviGPceViEgUwj+pcQDmB/rfAXAXK7MTochpHM3yQ==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0", - "bottleneck": "^2.15.3" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" }, "peerDependencies": { - "@octokit/core": "^6.0.0" + "@babel/core": "^7.12.0" } }, - "node_modules/@octokit/request": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", - "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^7.0.2" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/request-error": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.4.tgz", - "integrity": "sha512-VpAhIUxwhWZQImo/dWAN/NpPqqojR6PSLgLYAituLM6U+ddx9hCioFGwBr5Mi+oi5CLeJkcAs3gJ0PYYzU6wUg==", + "node_modules/@babel/plugin-transform-classes/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/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^13.0.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@octokit/types": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", - "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^22.2.0" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, - "optional": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://opencollective.com/unts" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, "engines": { - "node": ">=12.22.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "4.2.10" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=12.22.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, + "license": "MIT", "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/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/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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 + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cached": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/cached/-/cached-1.0.1.tgz", + "integrity": "sha512-7kGcJ9Hc1f4qpTApWz3swxbF9Qv1NF/GxuPtXeTptbsgvJIoufSd0h854Nq/2bw80F5C1onsFgEI05l+q0e4vw==", + "dev": true, + "dependencies": { + "@isaacs/catcher": "^1.0.0" + } + }, + "node_modules/@isaacs/catcher": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@isaacs/catcher/-/catcher-1.0.4.tgz", + "integrity": "sha512-g2klMwbnguClWNnCeQ1zYaDJsvPbIbnjdJPDE0z09MqoejJDZSLK5vIKiClq2Bkg5ubuI8vaN6wfIUi5GYzMVA==", + "dev": true + }, + "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, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@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 + }, + "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, + "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/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, + "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/@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, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "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/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/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, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@octokit/auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", + "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", + "dev": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", + "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.0.0", + "@octokit/request": "^9.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", + "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", + "dev": true, + "dependencies": { + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", + "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", + "dev": true, + "dependencies": { + "@octokit/request": "^9.0.0", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.3.tgz", + "integrity": "sha512-o4WRoOJZlKqEEgj+i9CpcmnByvtzoUYC6I8PD2SA95M+BJ2x8h7oLcVOg9qcowWXBOdcTRsMZiwvM3EyLm9AfA==", + "dev": true, + "dependencies": { + "@octokit/types": "^13.5.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.1.tgz", + "integrity": "sha512-G9Ue+x2odcb8E1XIPhaFBnTTIrrUDfXN05iFXiqhR+SeeeDMMILcAnysOsxUpEWcQp2e5Ft397FCXTcPkiPkLw==", + "dev": true, + "dependencies": { + "@octokit/request-error": "^6.0.0", + "@octokit/types": "^13.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.3.1.tgz", + "integrity": "sha512-Qd91H4liUBhwLB2h6jZ99bsxoQdhgPk6TdwnClPyTBSDAdviGPceViEgUwj+pcQDmB/rfAXAXK7MTochpHM3yQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^13.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^6.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", + "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^10.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.4.tgz", + "integrity": "sha512-VpAhIUxwhWZQImo/dWAN/NpPqqojR6PSLgLYAituLM6U+ddx9hCioFGwBr5Mi+oi5CLeJkcAs3gJ0PYYzU6wUg==", + "dev": true, + "dependencies": { + "@octokit/types": "^13.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^22.2.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==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", + "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.1.tgz", + "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json/node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.1.tgz", + "integrity": "sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.1.tgz", + "integrity": "sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript/node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.25.0.tgz", + "integrity": "sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.25.0.tgz", + "integrity": "sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.25.0.tgz", + "integrity": "sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.25.0.tgz", + "integrity": "sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.25.0.tgz", + "integrity": "sha512-xpEIXhiP27EAylEpreCozozsxWQ2TJbOLSivGfXhU4G1TBVEYtUPi2pOZBnvGXHyOdLAUUhPnJzH3ah5cqF01g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.25.0.tgz", + "integrity": "sha512-sC5FsmZGlJv5dOcURrsnIK7ngc3Kirnx3as2XU9uER+zjfyqIjdcMVgzy4cOawhsssqzoAX19qmxgJ8a14Qrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.25.0.tgz", + "integrity": "sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.25.0.tgz", + "integrity": "sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.25.0.tgz", + "integrity": "sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.25.0.tgz", + "integrity": "sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.25.0.tgz", + "integrity": "sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.25.0.tgz", + "integrity": "sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.25.0.tgz", + "integrity": "sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.25.0.tgz", + "integrity": "sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.25.0.tgz", + "integrity": "sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.25.0.tgz", + "integrity": "sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.25.0.tgz", + "integrity": "sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.25.0.tgz", + "integrity": "sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@rtsao/scc": { "version": "1.1.0", @@ -1268,6 +3433,13 @@ "eslint": ">=8.40.0" } }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, "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", @@ -1295,6 +3467,13 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -2137,6 +4316,58 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/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-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2192,9 +4423,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -2210,11 +4441,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -2223,6 +4455,13 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "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/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -2300,9 +4539,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001660", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", - "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "dev": true, "funding": [ { @@ -2317,7 +4556,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/cbor": { "version": "9.0.2", @@ -2335,6 +4575,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -2730,6 +4971,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -2737,7 +4979,8 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/color-support": { "version": "1.1.3", @@ -2748,12 +4991,26 @@ "color-support": "bin.js" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -3097,6 +5354,16 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "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/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -3204,10 +5471,11 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.23", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.23.tgz", - "integrity": "sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==", - "dev": true + "version": "1.5.55", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.55.tgz", + "integrity": "sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==", + "dev": true, + "license": "ISC" }, "node_modules/emittery": { "version": "1.0.3", @@ -4416,6 +6684,21 @@ "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", @@ -4616,6 +6899,21 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "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", @@ -4735,6 +7033,17 @@ "node": ">=8" } }, + "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", + "peer": true, + "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", @@ -5485,6 +7794,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -5566,6 +7882,16 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "dev": true }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5793,7 +8119,8 @@ "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -5957,6 +8284,13 @@ "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", "dev": true }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", @@ -5993,6 +8327,16 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, + "node_modules/magic-string": { + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -9464,9 +11808,10 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.2", @@ -9745,6 +12090,16 @@ } ] }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -9999,6 +12354,43 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -10026,6 +12418,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core/node_modules/regjsparser": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", + "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/registry-auth-token": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", @@ -10038,6 +12461,13 @@ "node": ">=14" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, "node_modules/regjsparser": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", @@ -10148,6 +12578,44 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.25.0.tgz", + "integrity": "sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.25.0", + "@rollup/rollup-android-arm64": "4.25.0", + "@rollup/rollup-darwin-arm64": "4.25.0", + "@rollup/rollup-darwin-x64": "4.25.0", + "@rollup/rollup-freebsd-arm64": "4.25.0", + "@rollup/rollup-freebsd-x64": "4.25.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.25.0", + "@rollup/rollup-linux-arm-musleabihf": "4.25.0", + "@rollup/rollup-linux-arm64-gnu": "4.25.0", + "@rollup/rollup-linux-arm64-musl": "4.25.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.25.0", + "@rollup/rollup-linux-riscv64-gnu": "4.25.0", + "@rollup/rollup-linux-s390x-gnu": "4.25.0", + "@rollup/rollup-linux-x64-gnu": "4.25.0", + "@rollup/rollup-linux-x64-musl": "4.25.0", + "@rollup/rollup-win32-arm64-msvc": "4.25.0", + "@rollup/rollup-win32-ia32-msvc": "4.25.0", + "@rollup/rollup-win32-x64-msvc": "4.25.0", + "fsevents": "~2.3.2" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -10553,6 +13021,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -10758,6 +13236,13 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, "node_modules/sock-daemon": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/sock-daemon/-/sock-daemon-1.4.2.tgz", @@ -10843,6 +13328,17 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/spawn-error-forwarder": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", @@ -11387,6 +13883,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/terser": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -11812,6 +14327,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11860,6 +14376,16 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", @@ -11869,6 +14395,40 @@ "node": ">=4" } }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/unicorn-magic": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", @@ -11912,9 +14472,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -11930,9 +14490,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" diff --git a/package.json b/package.json index 7bef5e8..38274dc 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,11 @@ "license": "MIT", "author": "Sergey Kupletsky (https://github.com/zavoloklom)", "type": "module", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "dist/index.cjs", + "module": "dist/index.esm.js", + "types": "dist/types/src/index.d.ts", "bin": { - "dclint": "./bin/dclint.js", - "docker-compose-linter": "./bin/dclint.js" + "dclint": "./bin/dclint.cjs" }, "directories": { "test": "tests" @@ -35,9 +35,12 @@ "schemas" ], "scripts": { - "prebuild": "rimraf dist", - "build": "tsc", + "build": "npm run build:lib & npm run build:cli & npm run build:pkg", + "build:cli": "rimraf bin && rollup -c rollup.config.cli.js", + "build:lib": "rimraf dist && rollup -c rollup.config.lib.js", + "build:pkg": "rimraf pkg && rollup -c rollup.config.pkg.js", "debug": "tsc && node --import=tsimp/import --no-warnings --inspect ./src/cli/cli.ts ./tests/mocks/docker-compose.yml -c ./tests/mocks/.dclintrc", + "debug:bin": "node ./bin/dclint.cjs ./tests/mocks/docker-compose.correct.yml --fix", "eslint": "eslint .", "eslint:fix": "eslint . --fix", "lint": "npm run eslint && npm run markdownlint", @@ -47,16 +50,25 @@ "prettier": "prettier --write \"**/*.md\"", "test": "ava --verbose", "test:coverage": "rimraf coverage && mkdir -p coverage && c8 ava --tap | tap-xunit --package='dclint' > ./coverage/junit.xml", + "tsc": "tsc", "update-compose-schema": "node ./scripts/download-compose-schema.cjs" }, "dependencies": { "ajv": "^8.17.1", - "chalk": "^5.3.0", "cosmiconfig": "^9.0.0", + "picocolors": "^1.1.1", "yaml": "^2.6.0", "yargs": "^17.7.2" }, "devDependencies": { + "@babel/preset-env": "7.26.0", + "@rollup/plugin-babel": "6.0.4", + "@rollup/plugin-commonjs": "28.0.1", + "@rollup/plugin-json": "6.1.0", + "@rollup/plugin-node-resolve": "15.3.0", + "@rollup/plugin-replace": "6.0.1", + "@rollup/plugin-terser": "0.4.4", + "@rollup/plugin-typescript": "12.1.1", "@semantic-release/changelog": "6.0.3", "@semantic-release/commit-analyzer": "13.0.0", "@semantic-release/exec": "6.0.3", @@ -84,6 +96,7 @@ "eslint-plugin-unicorn": "56.0.0", "esmock": "2.6.9", "markdownlint-cli2": "0.14.0", + "rollup": "4.25.0", "semantic-release": "24.2.0", "tap-xunit": "2.4.1", "tsimp": "2.0.12", diff --git a/release.config.js b/release.config.js index 8ceae62..28dbf0a 100644 --- a/release.config.js +++ b/release.config.js @@ -1,5 +1,5 @@ export default { - branches: ['main'], + branches: ['main', { name: 'beta', prerelease: true }], plugins: [ '@semantic-release/commit-analyzer', '@semantic-release/release-notes-generator', @@ -17,6 +17,13 @@ export default { prepareCmd: 'npm run markdownlint:fix-changelog || true', }, ], + [ + '@semantic-release/exec', + { + // eslint-disable-next-line no-template-curly-in-string + verifyReleaseCmd: 'echo ${nextRelease.version} > .VERSION', + }, + ], '@semantic-release/npm', [ '@semantic-release/git', @@ -38,6 +45,14 @@ export default { path: 'CHANGELOG.md', label: 'Changelog', }, + { + path: 'pkg/dclint-alpine', + label: 'DClint Linux Binary', + }, + { + path: 'pkg/dclint-bullseye', + label: 'DClint Ubuntu Binary', + }, ], }, ], diff --git a/rollup.base.config.js b/rollup.base.config.js new file mode 100644 index 0000000..1b92629 --- /dev/null +++ b/rollup.base.config.js @@ -0,0 +1,41 @@ +import fs from 'node:fs'; +import nodeResolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import json from '@rollup/plugin-json'; +import typescript from '@rollup/plugin-typescript'; +import { babel } from '@rollup/plugin-babel'; +import replace from '@rollup/plugin-replace'; +import terser from '@rollup/plugin-terser'; + +const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')); +const version = process.env.VERSION ?? packageJson?.version; + +export default (outDir, declaration = false, minify = false) => { + const plugins = [ + json(), + commonjs(), + nodeResolve({ preferBuiltins: true }), + typescript({ + tsconfig: './tsconfig.json', + outDir, + declaration, + declarationDir: declaration ? `${outDir}/types` : null, + include: ['src/**/*.ts', 'schemas/*.json'], + }), + babel({ + babelHelpers: 'bundled', + presets: ['@babel/preset-env'], + exclude: 'node_modules/**', + }), + replace({ + preventAssignment: true, + 'process.env.VERSION': JSON.stringify(version), + }), + ]; + + if (minify) { + plugins.push(terser()); + } + + return { plugins }; +}; diff --git a/rollup.config.cli.js b/rollup.config.cli.js new file mode 100644 index 0000000..45df5de --- /dev/null +++ b/rollup.config.cli.js @@ -0,0 +1,18 @@ +import baseConfig from './rollup.base.config.js'; +import fs from 'node:fs'; + +const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')); +const dependencies = Object.keys(packageJson.dependencies || {}); + +export default { + ...baseConfig('bin', false, true), + input: 'src/cli/cli.ts', + output: { + file: 'bin/dclint.cjs', + format: 'cjs', + inlineDynamicImports: true, + exports: 'auto', + }, + context: 'globalThis', + external: dependencies, +}; diff --git a/rollup.config.lib.js b/rollup.config.lib.js new file mode 100644 index 0000000..739b81b --- /dev/null +++ b/rollup.config.lib.js @@ -0,0 +1,15 @@ +import baseConfig from './rollup.base.config.js'; +import fs from 'node:fs'; + +const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')); +const dependencies = Object.keys(packageJson.dependencies || {}); + +export default { + ...baseConfig('dist', true, true), + input: 'src/index.ts', + output: [ + { dir: 'dist', format: 'cjs', entryFileNames: '[name].cjs', exports: 'auto' }, + { dir: 'dist', format: 'esm', entryFileNames: '[name].esm.js', inlineDynamicImports: true }, + ], + external: dependencies, +}; diff --git a/rollup.config.pkg.js b/rollup.config.pkg.js new file mode 100644 index 0000000..fb9dabe --- /dev/null +++ b/rollup.config.pkg.js @@ -0,0 +1,13 @@ +import baseConfig from './rollup.base.config.js'; + +export default { + ...baseConfig('pkg', false, false), + input: 'src/cli/cli.ts', + output: { + file: 'pkg/dclint.cjs', + format: 'cjs', + inlineDynamicImports: true, + exports: 'auto', + }, + context: 'globalThis', +}; diff --git a/scripts/generate-sea.sh b/scripts/generate-sea.sh new file mode 100755 index 0000000..e055389 --- /dev/null +++ b/scripts/generate-sea.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +# Проверка, что путь к файлу генерации передан как аргумент +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +GENERATION_PATH="$1" + +# Выполнение команд +rm -rf "$GENERATION_PATH" && rm -rf sea-prep.blob && \ +node --experimental-sea-config sea-config.json && \ +cp "$(command -v node)" "$GENERATION_PATH" && \ +npx -y postject "$GENERATION_PATH" NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 diff --git a/sea-config.json b/sea-config.json new file mode 100644 index 0000000..10b7560 --- /dev/null +++ b/sea-config.json @@ -0,0 +1,7 @@ +{ + "main": "./pkg/dclint.cjs", + "output": "sea-prep.blob", + "files": [ + "./pkg/dclint.cjs" + ] +} \ No newline at end of file diff --git a/src/cli/cli.ts b/src/cli/cli.ts index 99925e2..aefebbd 100644 --- a/src/cli/cli.ts +++ b/src/cli/cli.ts @@ -1,97 +1,90 @@ #!/usr/bin/env node -import { readFileSync, writeFileSync } from 'node:fs'; -import { resolve, dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { writeFileSync } from 'node:fs'; import yargsLib from 'yargs'; import { hideBin } from 'yargs/helpers'; -import { loadConfig } from '../config/config.js'; -import { DCLinter } from '../linter/linter.js'; -import type { CLIConfig } from './cli.types.js'; -import { Logger, LOG_SOURCE } from '../util/logger.js'; -import { loadFormatter } from '../util/formatter-loader.js'; - -const packageJson = JSON.parse( - readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '../../package.json'), 'utf8'), -) as Record; - -const { argv } = yargsLib(hideBin(process.argv)) - .usage('Usage: $0 [options]') - .version((packageJson?.version as string) || 'unknown') - .command('$0 ', 'Check the files', (yargs) => { - yargs.positional('files', { - describe: 'Files to check', +import { loadConfig } from '../config/config'; +import { DCLinter } from '../linter/linter'; +import type { CLIConfig } from './cli.types'; +import { Logger, LOG_SOURCE } from '../util/logger'; + +async function main() { + process.env.NODE_NO_WARNINGS = '1'; + const { argv } = yargsLib(hideBin(process.argv)) + .usage('Usage: $0 [options]') + .version(process.env.VERSION ?? 'unknown') + .command('$0 ', 'Check the files', (yargs) => { + yargs.positional('files', { + describe: 'Files to check', + type: 'string', + array: true, + demandOption: true, + }); + }) + .option('recursive', { + alias: 'r', + type: 'boolean', + description: 'Recursively search directories for Docker Compose files', + default: false, + }) + .option('fix', { + type: 'boolean', + description: 'Automatically fix problems', + default: false, + }) + .option('fix-dry-run', { + type: 'boolean', + description: 'Automatically fix problems without saving the changes to the file system', + default: false, + }) + .option('formatter', { + alias: 'f', type: 'string', - array: true, - demandOption: true, - }); - }) - .option('recursive', { - alias: 'r', - type: 'boolean', - description: 'Recursively search directories for Docker Compose files', - default: false, - }) - .option('fix', { - type: 'boolean', - description: 'Automatically fix problems', - default: false, - }) - .option('fix-dry-run', { - type: 'boolean', - description: 'Automatically fix problems without saving the changes to the file system', - default: false, - }) - .option('formatter', { - alias: 'f', - type: 'string', - description: 'Use a specific output format - default: stylish', - default: 'stylish', - }) - .option('config', { - alias: 'c', - type: 'string', - description: 'Path to config file', - }) - .option('quiet', { - alias: 'q', - type: 'boolean', - description: 'Report errors only', - default: false, - }) - .option('output-file', { - alias: 'o', - type: 'string', - description: 'Specify file to write report to', - }) - .option('color', { - type: 'boolean', - description: 'Force enabling/disabling of color', - default: true, - }) - .option('debug', { - type: 'boolean', - description: 'Output debugging information', - default: undefined, - }) - .option('exclude', { - alias: 'e', - type: 'array', - description: 'Files or directories to exclude from the search', - default: [], - }) - .option('max-warnings', { - type: 'number', - description: 'Number of warnings to trigger nonzero exit code', - default: -1, - }) - .help() - .alias('version', 'v'); - -export default async function cli() { - const cliArguments = (await argv) as unknown as CLIConfig; - - // Initialize the logger with the final debug and color options + description: 'Use a specific output format - default: stylish', + default: 'stylish', + }) + .option('config', { + alias: 'c', + type: 'string', + description: 'Path to config file', + }) + .option('quiet', { + alias: 'q', + type: 'boolean', + description: 'Report errors only', + default: false, + }) + .option('output-file', { + alias: 'o', + type: 'string', + description: 'Specify file to write report to', + }) + .option('color', { + type: 'boolean', + description: 'Force enabling/disabling of color', + default: true, + }) + .option('debug', { + type: 'boolean', + description: 'Output debugging information', + default: false, + }) + .option('exclude', { + alias: 'e', + type: 'array', + description: 'Files or directories to exclude from the search', + default: [], + }) + .option('max-warnings', { + type: 'number', + description: 'Number of warnings to trigger nonzero exit code', + default: -1, + }) + .help() + .alias('version', 'v'); + + const cliArguments = argv as unknown as CLIConfig; + Logger.init(cliArguments.debug); const logger = Logger.getInstance(); @@ -102,31 +95,21 @@ export default async function cli() { process.exit(1); }); - // Override config values with CLI arguments if they are provided - if (cliArguments.quiet) { - config.quiet = cliArguments.quiet; - } - if (cliArguments.debug) { - config.debug = cliArguments.debug; - } - if (cliArguments.exclude.length > 0) { - config.exclude = cliArguments.exclude; - } + if (cliArguments.quiet) config.quiet = cliArguments.quiet; + if (cliArguments.debug) config.debug = cliArguments.debug; + if (cliArguments.exclude.length > 0) config.exclude = cliArguments.exclude; + logger.debug(LOG_SOURCE.CLI, 'Final config:', config); const linter = new DCLinter(config); - // Handle the `fix` and `fix-dry-run` flags if (cliArguments.fix || cliArguments.fixDryRun) { await linter.fixFiles(cliArguments.files, cliArguments.recursive, cliArguments.fixDryRun); } - // Always run the linter after attempting to fix issues let lintResults = await linter.lintFiles(cliArguments.files, cliArguments.recursive); - // Filter out warnings if `--quiet` is enabled if (cliArguments.quiet) { - // Keep only files with errors lintResults = lintResults .map((result) => ({ ...result, @@ -137,26 +120,21 @@ export default async function cli() { .filter((result) => result.messages.length > 0); } - // Count errors and warnings const totalErrors = lintResults.reduce((count, result) => count + result.errorCount, 0); const totalWarnings = lintResults.reduce((count, result) => count + result.warningCount, 0); - // Choose and apply the formatter - const formatter = await loadFormatter(cliArguments.formatter); - const formattedResults = formatter(lintResults); + const formattedResults = await linter.formatResults(lintResults, cliArguments.formatter); - // Output results if (cliArguments.outputFile) { writeFileSync(cliArguments.outputFile, formattedResults); } else { console.log(formattedResults); } - // Determine exit code based on errors and warnings if (totalErrors > 0) { logger.debug(LOG_SOURCE.CLI, `${totalErrors} errors found`); process.exit(1); - } else if (cliArguments.maxWarnings && cliArguments.maxWarnings >= 0 && totalWarnings > cliArguments.maxWarnings) { + } else if (cliArguments.maxWarnings >= 0 && totalWarnings > cliArguments.maxWarnings) { logger.debug( LOG_SOURCE.CLI, `Warning threshold exceeded: ${totalWarnings} warnings (max allowed: ${cliArguments.maxWarnings})`, @@ -168,4 +146,8 @@ export default async function cli() { process.exit(0); } -await cli(); +// eslint-disable-next-line unicorn/prefer-top-level-await +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/src/cli/cli.types.ts b/src/cli/cli.types.ts index a098bea..a965758 100644 --- a/src/cli/cli.types.ts +++ b/src/cli/cli.types.ts @@ -6,7 +6,7 @@ interface CLIConfig { formatter: string; config?: string; quiet: boolean; - maxWarnings?: number; + maxWarnings: number; outputFile?: string; color: boolean; debug: boolean; diff --git a/src/config/config.ts b/src/config/config.ts index 7ba3167..0aa1d24 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -1,9 +1,9 @@ import { cosmiconfig } from 'cosmiconfig'; import { Ajv } from 'ajv'; -import type { Config } from './config.types.js'; -import { Logger, LOG_SOURCE } from '../util/logger.js'; -import { loadSchema } from '../util/load-schema.js'; -import { ConfigValidationError } from '../errors/config-validation-error.js'; +import type { Config } from './config.types'; +import { Logger, LOG_SOURCE } from '../util/logger'; +import { schemaLoader } from '../util/schema-loader'; +import { ConfigValidationError } from '../errors/config-validation-error'; function getDefaultConfig(): Config { return { @@ -19,7 +19,7 @@ async function validateConfig(config: Config): Promise { logger.debug(LOG_SOURCE.CONFIG, 'Starting config validation'); const ajv = new Ajv(); - const schema = loadSchema('linter-config'); + const schema = schemaLoader('linter-config'); const validate = ajv.compile(schema); if (!validate(config)) { diff --git a/src/formatters/codeclimate.ts b/src/formatters/codeclimate.ts index 8ae67ce..24dd836 100644 --- a/src/formatters/codeclimate.ts +++ b/src/formatters/codeclimate.ts @@ -1,5 +1,5 @@ import { createHash } from 'node:crypto'; -import type { LintResult } from '../linter/linter.types.js'; +import type { LintResult } from '../linter/linter.types'; const generateFingerprint = (data: (string | null)[], hashes: Set): string => { const hash = createHash('md5'); diff --git a/src/formatters/compact.ts b/src/formatters/compact.ts index 58c8d97..d2af3cb 100644 --- a/src/formatters/compact.ts +++ b/src/formatters/compact.ts @@ -1,4 +1,4 @@ -import type { LintResult } from '../linter/linter.types.js'; +import type { LintResult } from '../linter/linter.types'; export default function compactFormatter(results: LintResult[]): string { return results diff --git a/src/formatters/index.ts b/src/formatters/index.ts new file mode 100644 index 0000000..63154fe --- /dev/null +++ b/src/formatters/index.ts @@ -0,0 +1,13 @@ +import codeclimateFormatter from './codeclimate'; +import compactFormatter from './compact'; +import jsonFormatter from './json'; +import junitFormatter from './junit'; +import stylishFormatter from './stylish'; + +export default { + codeclimateFormatter, + compactFormatter, + jsonFormatter, + junitFormatter, + stylishFormatter, +}; diff --git a/src/formatters/json.ts b/src/formatters/json.ts index d24f319..2c6d83d 100644 --- a/src/formatters/json.ts +++ b/src/formatters/json.ts @@ -1,4 +1,4 @@ -import type { LintResult } from '../linter/linter.types.js'; +import type { LintResult } from '../linter/linter.types'; export default function jsonFormatter(results: LintResult[]): string { // eslint-disable-next-line unicorn/no-null diff --git a/src/formatters/junit.ts b/src/formatters/junit.ts index c1d1593..70b2e58 100644 --- a/src/formatters/junit.ts +++ b/src/formatters/junit.ts @@ -1,4 +1,4 @@ -import type { LintResult } from '../linter/linter.types.js'; +import type { LintResult } from '../linter/linter.types'; function escapeXml(unsafe: string): string { return unsafe.replaceAll(/[<>&'"]/g, (c) => { diff --git a/src/formatters/stylish.ts b/src/formatters/stylish.ts index 0723313..7d63e37 100644 --- a/src/formatters/stylish.ts +++ b/src/formatters/stylish.ts @@ -1,6 +1,6 @@ import { resolve } from 'node:path'; -import chalk from 'chalk'; -import type { LintResult } from '../linter/linter.types.js'; +import pc from 'picocolors'; +import type { LintResult } from '../linter/linter.types'; export default function stylishFormatter(results: LintResult[]): string { let output = ''; @@ -14,24 +14,21 @@ export default function stylishFormatter(results: LintResult[]): string { return; } - // Format the file path header without nested template literals - const filePath = chalk.underline(resolve(result.filePath)); + const filePath = pc.underline(resolve(result.filePath)); output += `\n${filePath}\n`; result.messages.forEach((message) => { const { type } = message; - const color = type === 'error' ? chalk.red : chalk.yellow; + const color = type === 'error' ? pc.red : pc.yellow; const line = message.line.toString().padStart(4, ' '); const column = message.column.toString().padEnd(4, ' '); - // Break down message formatting into separate parts - const position = chalk.dim(`${line}:${column}`); + const position = pc.dim(`${line}:${column}`); const formattedType = color(type); - const ruleInfo = chalk.dim(message.rule); + const ruleInfo = pc.dim(message.rule); output += `${position} ${formattedType} ${message.message} ${ruleInfo}\n`; - // Increment counts without using the ++ operator if (type === 'error') { errorCount += 1; if (message.fixable) { @@ -48,15 +45,17 @@ export default function stylishFormatter(results: LintResult[]): string { const totalProblems = errorCount + warningCount; if (totalProblems > 0) { - const problemSummary = chalk.red.bold(`✖ ${totalProblems} problems`); - const errorSummary = chalk.red.bold(`${errorCount} errors`); - const warningSummary = chalk.yellow.bold(`${warningCount} warnings`); + const problemSummary = pc.red(pc.bold(`✖ ${totalProblems} problems`)); + const errorSummary = pc.red(pc.bold(`${errorCount} errors`)); + const warningSummary = pc.yellow(pc.bold(`${warningCount} warnings`)); output += `\n${problemSummary} (${errorSummary}, ${warningSummary})\n`; } if (fixableErrorCount > 0 || fixableWarningCount > 0) { - const fixableSummary = chalk.green.bold( - `${fixableErrorCount} errors and ${fixableWarningCount} warnings potentially fixable with the \`--fix\` option.`, + const fixableSummary = pc.green( + pc.bold( + `${fixableErrorCount} errors and ${fixableWarningCount} warnings potentially fixable with the \`--fix\` option.`, + ), ); output += `${fixableSummary}\n`; } diff --git a/src/index.ts b/src/index.ts index 5062148..ddd9767 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1 @@ -export { DCLinter } from './linter/linter.js'; +export { DCLinter } from './linter/linter'; diff --git a/src/linter/linter.ts b/src/linter/linter.ts index 100e4a2..cb6f234 100644 --- a/src/linter/linter.ts +++ b/src/linter/linter.ts @@ -1,22 +1,30 @@ import fs from 'node:fs'; import { parseDocument, YAMLError } from 'yaml'; -import type { Config } from '../config/config.types.js'; -import type { LintRule, LintMessage, LintResult, LintContext } from './linter.types.js'; -import { findFilesForLinting } from '../util/files-finder.js'; -import { loadLintRules } from '../util/rules-loader.js'; -import { Logger, LOG_SOURCE } from '../util/logger.js'; -import { validationComposeSchema } from '../util/compose-validation.js'; -import { ComposeValidationError } from '../errors/compose-validation-error.js'; +import type { Config } from '../config/config.types'; +import type { LintRule, LintMessage, LintResult, LintContext } from './linter.types'; +import { findFilesForLinting } from '../util/files-finder'; +import { loadLintRules } from '../util/rules-loader'; +import { Logger, LOG_SOURCE } from '../util/logger'; +import { validationComposeSchema } from '../util/compose-validation'; +import { ComposeValidationError } from '../errors/compose-validation-error'; +import { loadFormatter } from '../util/formatter-loader'; + +const DEFAULT_CONFIG: Config = { + debug: false, + exclude: [], + rules: {}, + quiet: false, +}; class DCLinter { private readonly config: Config; private rules: LintRule[]; - constructor(config: Config) { - this.config = config; + constructor(config?: Config) { + this.config = { ...DEFAULT_CONFIG, ...config }; this.rules = []; - Logger.init(this.config.debug); + Logger.init(this.config?.debug); } private async loadRules() { @@ -168,6 +176,12 @@ class DCLinter { } }); } + + // eslint-disable-next-line class-methods-use-this + public async formatResults(lintResults: LintResult[], formatterName: string) { + const formatter = await loadFormatter(formatterName); + return formatter(lintResults); + } } export { DCLinter }; diff --git a/src/rules/index.ts b/src/rules/index.ts new file mode 100644 index 0000000..765a827 --- /dev/null +++ b/src/rules/index.ts @@ -0,0 +1,33 @@ +import NoBuildAndImageRule from './no-build-and-image-rule'; +import NoDuplicateContainerNamesRule from './no-duplicate-container-names-rule'; +import NoDuplicateExportedPortsRule from './no-duplicate-exported-ports-rule'; +import NoQuotesInVolumesRule from './no-quotes-in-volumes-rule'; +import NoUnboundPortInterfacesRule from './no-unbound-port-interfaces-rule'; +import NoVersionFieldRule from './no-version-field-rule'; +import RequireProjectNameFieldRule from './require-project-name-field-rule'; +import RequireQuotesInPortsRule from './require-quotes-in-ports-rule'; +import ServiceContainerNameRegexRule from './service-container-name-regex-rule'; +import ServiceDependenciesAlphabeticalOrderRule from './service-dependencies-alphabetical-order-rule'; +import ServiceImageRequireExplicitTagRule from './service-image-require-explicit-tag-rule'; +import ServiceKeysOrderRule from './service-keys-order-rule'; +import ServicePortsAlphabeticalOrderRule from './service-ports-alphabetical-order-rule'; +import ServicesAlphabeticalOrderRule from './services-alphabetical-order-rule'; +import TopLevelPropertiesOrderRule from './top-level-properties-order-rule'; + +export default { + NoBuildAndImageRule, + NoDuplicateContainerNamesRule, + NoDuplicateExportedPortsRule, + NoQuotesInVolumesRule, + NoUnboundPortInterfacesRule, + NoVersionFieldRule, + RequireProjectNameFieldRule, + RequireQuotesInPortsRule, + ServiceContainerNameRegexRule, + ServiceDependenciesAlphabeticalOrderRule, + ServiceImageRequireExplicitTagRule, + ServiceKeysOrderRule, + ServicePortsAlphabeticalOrderRule, + ServicesAlphabeticalOrderRule, + TopLevelPropertiesOrderRule, +}; diff --git a/src/rules/no-build-and-image-rule.ts b/src/rules/no-build-and-image-rule.ts index 07cad8a..8d20774 100644 --- a/src/rules/no-build-and-image-rule.ts +++ b/src/rules/no-build-and-image-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; interface NoBuildAndImageRuleOptions { checkPullPolicy?: boolean; diff --git a/src/rules/no-duplicate-container-names-rule.ts b/src/rules/no-duplicate-container-names-rule.ts index d589f6b..a00e148 100644 --- a/src/rules/no-duplicate-container-names-rule.ts +++ b/src/rules/no-duplicate-container-names-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; export default class NoDuplicateContainerNamesRule implements LintRule { public name = 'no-duplicate-container-names'; diff --git a/src/rules/no-duplicate-exported-ports-rule.ts b/src/rules/no-duplicate-exported-ports-rule.ts index 447cfa0..f2b59e7 100644 --- a/src/rules/no-duplicate-exported-ports-rule.ts +++ b/src/rules/no-duplicate-exported-ports-rule.ts @@ -7,9 +7,9 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; -import { extractPublishedPortValue, parsePortsRange } from '../util/service-ports-parser.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; +import { extractPublishedPortValue, parsePortsRange } from '../util/service-ports-parser'; export default class NoDuplicateExportedPortsRule implements LintRule { public name = 'no-duplicate-exported-ports'; diff --git a/src/rules/no-quotes-in-volumes-rule.ts b/src/rules/no-quotes-in-volumes-rule.ts index dcd614b..ae8277c 100644 --- a/src/rules/no-quotes-in-volumes-rule.ts +++ b/src/rules/no-quotes-in-volumes-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberByValue } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberByValue } from '../util/line-finder'; export default class NoQuotesInVolumesRule implements LintRule { public name = 'no-quotes-in-volumes'; diff --git a/src/rules/no-unbound-port-interfaces-rule.ts b/src/rules/no-unbound-port-interfaces-rule.ts index 247ffce..099ff00 100644 --- a/src/rules/no-unbound-port-interfaces-rule.ts +++ b/src/rules/no-unbound-port-interfaces-rule.ts @@ -7,9 +7,9 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; -import { extractPublishedPortInterfaceValue } from '../util/service-ports-parser.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; +import { extractPublishedPortInterfaceValue } from '../util/service-ports-parser'; export default class NoUnboundPortInterfacesRule implements LintRule { public name = 'no-unbound-port-interfaces'; diff --git a/src/rules/no-version-field-rule.ts b/src/rules/no-version-field-rule.ts index fd84644..c4e73af 100644 --- a/src/rules/no-version-field-rule.ts +++ b/src/rules/no-version-field-rule.ts @@ -6,8 +6,8 @@ import type { LintRuleSeverity, LintMessageType, LintContext, -} from '../linter/linter.types.js'; -import { findLineNumberByKey } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberByKey } from '../util/line-finder'; export default class NoVersionFieldRule implements LintRule { public name = 'no-version-field'; diff --git a/src/rules/require-project-name-field-rule.ts b/src/rules/require-project-name-field-rule.ts index b382752..a997dd7 100644 --- a/src/rules/require-project-name-field-rule.ts +++ b/src/rules/require-project-name-field-rule.ts @@ -6,7 +6,7 @@ import type { LintRuleSeverity, LintMessageType, LintContext, -} from '../linter/linter.types.js'; +} from '../linter/linter.types'; export default class RequireProjectNameFieldRule implements LintRule { public name = 'require-project-name-field'; diff --git a/src/rules/require-quotes-in-ports-rule.ts b/src/rules/require-quotes-in-ports-rule.ts index 941a1ee..8877d51 100644 --- a/src/rules/require-quotes-in-ports-rule.ts +++ b/src/rules/require-quotes-in-ports-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; interface RequireQuotesInPortsRuleOptions { quoteType: 'single' | 'double'; diff --git a/src/rules/service-container-name-regex-rule.ts b/src/rules/service-container-name-regex-rule.ts index ac2c273..b245986 100644 --- a/src/rules/service-container-name-regex-rule.ts +++ b/src/rules/service-container-name-regex-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; export default class ServiceContainerNameRegexRule implements LintRule { public name = 'service-container-name-regex'; diff --git a/src/rules/service-dependencies-alphabetical-order-rule.ts b/src/rules/service-dependencies-alphabetical-order-rule.ts index 1cfe09b..03b5f11 100644 --- a/src/rules/service-dependencies-alphabetical-order-rule.ts +++ b/src/rules/service-dependencies-alphabetical-order-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; export default class ServiceDependenciesAlphabeticalOrderRule implements LintRule { public name = 'service-dependencies-alphabetical-order'; diff --git a/src/rules/service-image-require-explicit-tag-rule.ts b/src/rules/service-image-require-explicit-tag-rule.ts index 7d7ff9a..9a3a8de 100644 --- a/src/rules/service-image-require-explicit-tag-rule.ts +++ b/src/rules/service-image-require-explicit-tag-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; interface ServiceImageRequireExplicitTagRuleOptions { prohibitedTags?: string[]; diff --git a/src/rules/service-keys-order-rule.ts b/src/rules/service-keys-order-rule.ts index d614736..99df89e 100644 --- a/src/rules/service-keys-order-rule.ts +++ b/src/rules/service-keys-order-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; interface ServiceKeysOrderRuleOptions { groupOrder?: GroupOrderEnum[]; diff --git a/src/rules/service-ports-alphabetical-order-rule.ts b/src/rules/service-ports-alphabetical-order-rule.ts index a62b4d0..bf67a5b 100644 --- a/src/rules/service-ports-alphabetical-order-rule.ts +++ b/src/rules/service-ports-alphabetical-order-rule.ts @@ -7,9 +7,9 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; -import { extractPublishedPortValue } from '../util/service-ports-parser.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; +import { extractPublishedPortValue } from '../util/service-ports-parser'; export default class ServicePortsAlphabeticalOrderRule implements LintRule { public name = 'service-ports-alphabetical-order'; diff --git a/src/rules/services-alphabetical-order-rule.ts b/src/rules/services-alphabetical-order-rule.ts index f4abe38..5c2508c 100644 --- a/src/rules/services-alphabetical-order-rule.ts +++ b/src/rules/services-alphabetical-order-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberForService } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberForService } from '../util/line-finder'; export default class ServicesAlphabeticalOrderRule implements LintRule { public name = 'services-alphabetical-order'; diff --git a/src/rules/top-level-properties-order-rule.ts b/src/rules/top-level-properties-order-rule.ts index f628cbb..24cb5c4 100644 --- a/src/rules/top-level-properties-order-rule.ts +++ b/src/rules/top-level-properties-order-rule.ts @@ -7,8 +7,8 @@ import type { LintRuleCategory, LintRuleSeverity, RuleMeta, -} from '../linter/linter.types.js'; -import { findLineNumberByKey } from '../util/line-finder.js'; +} from '../linter/linter.types'; +import { findLineNumberByKey } from '../util/line-finder'; interface TopLevelPropertiesOrderRuleOptions { customOrder?: TopLevelKeys[]; diff --git a/src/util/compose-validation.ts b/src/util/compose-validation.ts index dad5a9d..fe4987e 100644 --- a/src/util/compose-validation.ts +++ b/src/util/compose-validation.ts @@ -1,7 +1,7 @@ import { Ajv2019 } from 'ajv/dist/2019.js'; import { ErrorObject } from 'ajv'; -import { ComposeValidationError } from '../errors/compose-validation-error.js'; -import { loadSchema } from './load-schema.js'; +import { ComposeValidationError } from '../errors/compose-validation-error'; +import { schemaLoader } from './schema-loader'; type Schema = Record; @@ -32,7 +32,7 @@ function validationComposeSchema(content: object) { logger: false, }); - const composeSchema = loadSchema('compose'); + const composeSchema = schemaLoader('compose'); const validate = ajv.compile(updateSchema(composeSchema)); const valid = validate(content); diff --git a/src/util/files-finder.ts b/src/util/files-finder.ts index cc199f5..7cb50f6 100644 --- a/src/util/files-finder.ts +++ b/src/util/files-finder.ts @@ -1,7 +1,7 @@ import fs from 'node:fs'; import { basename, join, resolve } from 'node:path'; -import { Logger } from './logger.js'; -import { FileNotFoundError } from '../errors/file-not-found-error.js'; +import { Logger } from './logger'; +import { FileNotFoundError } from '../errors/file-not-found-error'; export function findFilesForLinting(paths: string[], recursive: boolean, excludePaths: string[]): string[] { const logger = Logger.getInstance(); diff --git a/src/util/formatter-loader.ts b/src/util/formatter-loader.ts index 036b465..7a5de91 100644 --- a/src/util/formatter-loader.ts +++ b/src/util/formatter-loader.ts @@ -1,6 +1,7 @@ import { resolve } from 'node:path'; -import type { LintResult } from '../linter/linter.types.js'; -import { Logger } from './logger.js'; +import type { LintResult } from '../linter/linter.types'; +import { Logger } from './logger'; +import Formatters from '../formatters/index'; type FormatterFunction = (results: LintResult[]) => string; @@ -30,21 +31,12 @@ export async function loadFormatter(formatterName: string): Promise Promise> = { - json: async () => (await import('../formatters/json.js')).default as FormatterFunction, - compact: async () => (await import('../formatters/compact.js')).default as FormatterFunction, - stylish: async () => (await import('../formatters/stylish.js')).default as FormatterFunction, - junit: async () => (await import('../formatters/junit.js')).default as FormatterFunction, - codeclimate: async () => (await import('../formatters/codeclimate.js')).default as FormatterFunction, - }; - - let formatterLoader = builtinFormatters[formatterName]; - if (!formatterLoader) { - logger.warn(`Unknown formatter: ${formatterName}. Using default - stylish.`); - formatterLoader = builtinFormatters.stylish; + const formatterFunction = Formatters[`${formatterName}Formatter` as keyof typeof Formatters]; + if (formatterFunction) { + logger.debug('UTIL', `Using built-in formatter: ${formatterName}`); + return formatterFunction as FormatterFunction; } - logger.debug('UTIL', `Load formatter: ${formatterName}`); - - return formatterLoader(); + logger.warn(`Unknown formatter: ${formatterName}. Using default - stylish.`); + return Formatters.stylishFormatter; } diff --git a/src/util/load-schema.ts b/src/util/load-schema.ts deleted file mode 100644 index 96fc4cf..0000000 --- a/src/util/load-schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { readFileSync } from 'node:fs'; -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -function loadSchema(name: string): Record { - return JSON.parse( - readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), `../../schemas/${name}.schema.json`), 'utf8'), - ) as Record; -} - -export { loadSchema }; diff --git a/src/util/logger.ts b/src/util/logger.ts index e00472f..7211a9c 100644 --- a/src/util/logger.ts +++ b/src/util/logger.ts @@ -1,4 +1,4 @@ -import chalk from 'chalk'; +import pc from 'picocolors'; // Exported constants for log sources export const LOG_SOURCE = { @@ -43,13 +43,13 @@ class Logger { private static getColoredLevel(level: string): string { switch (level) { case 'DEBUG': - return chalk.blue('[DEBUG]'); + return pc.blue('[DEBUG]'); case 'INFO': - return chalk.green('[INFO]'); + return pc.green('[INFO]'); case 'WARN': - return chalk.yellow('[WARN]'); + return pc.yellow('[WARN]'); case 'ERROR': - return chalk.red('[ERROR]'); + return pc.red('[ERROR]'); default: return `[${level}]`; } diff --git a/src/util/rules-loader.ts b/src/util/rules-loader.ts index 73ecf1c..e9b59c9 100644 --- a/src/util/rules-loader.ts +++ b/src/util/rules-loader.ts @@ -1,68 +1,43 @@ -import { join, resolve, dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import fs from 'node:fs'; -import type { LintRule, LintMessageType } from '../linter/linter.types.js'; -import type { Config, ConfigRuleLevel, ConfigRule } from '../config/config.types.js'; -import { Logger } from './logger.js'; - -async function importRule(file: string, rulesDirectory: string): Promise { - const logger = Logger.getInstance(); - try { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access - const RuleClass = (await import(join(rulesDirectory, file))).default; - - if (typeof RuleClass === 'function') { - return new (RuleClass as new () => LintRule)(); - } - return null; - } catch (error) { - logger.error(`Error importing rule from file: ${file}`, error); - return null; - } -} +import type { LintRule, LintMessageType } from '../linter/linter.types'; +import type { Config, ConfigRuleLevel, ConfigRule } from '../config/config.types'; +import { Logger } from './logger'; +import Rules from '../rules/index'; async function loadLintRules(config: Config): Promise { - const rulesDirectory = resolve(dirname(fileURLToPath(import.meta.url)), '../rules'); - - const ruleFiles = fs - .readdirSync(rulesDirectory) - .filter((file) => file.endsWith('.js') || (file.endsWith('.ts') && !file.endsWith('d.ts'))); - - // Parallel import with Promise.all - const ruleInstances: (LintRule | null)[] = await Promise.all( - ruleFiles.map(async (file) => importRule(file, rulesDirectory)), - ); - + const logger = Logger.getInstance(); const activeRules: LintRule[] = []; - ruleInstances.forEach((ruleInstance) => { - if (!ruleInstance) return; - - const ruleConfig: ConfigRule = config.rules[ruleInstance.name]; - - let ruleLevel: ConfigRuleLevel; - let ruleOptions: Record | undefined; - - if (Array.isArray(ruleConfig)) { - [ruleLevel, ruleOptions] = ruleConfig; - } else { - ruleLevel = ruleConfig; + for (const RuleClass of Object.values(Rules)) { + try { + const ruleInstance = new (RuleClass as new () => LintRule)(); + const ruleConfig: ConfigRule = config.rules[ruleInstance.name]; + + let ruleLevel: ConfigRuleLevel; + let ruleOptions: Record | undefined; + + if (Array.isArray(ruleConfig)) { + [ruleLevel, ruleOptions] = ruleConfig; + } else { + ruleLevel = ruleConfig; + } + + if (ruleLevel !== 0) { + const instance = ruleOptions + ? new (RuleClass as new (options?: Record) => LintRule)(ruleOptions) + : ruleInstance; + + const typeMap: { [key: number]: LintMessageType } = { + 1: 'warning', + 2: 'error', + }; + + instance.type = typeMap[ruleLevel] || instance.type; + activeRules.push(instance); + } + } catch (error) { + logger.error(`Error loading rule: ${RuleClass?.name}`, error); } - - if (ruleLevel === 0) return; - - const RuleClass = ruleInstance.constructor as new (options?: Record) => LintRule; - const instance = ruleOptions ? new RuleClass(ruleOptions) : new RuleClass(); - - const typeMap: { [key: number]: LintMessageType } = { - 1: 'warning', - 2: 'error', - }; - - instance.type = typeMap[ruleLevel] || instance.type; - - activeRules.push(instance); - }); + } return activeRules; } diff --git a/src/util/schema-loader.ts b/src/util/schema-loader.ts new file mode 100644 index 0000000..89c8dfe --- /dev/null +++ b/src/util/schema-loader.ts @@ -0,0 +1,15 @@ +import composeSchema from '../../schemas/compose.schema.json' with { type: 'json' }; +import linterConfigSchema from '../../schemas/linter-config.schema.json' with { type: 'json' }; + +function schemaLoader(schemaName: string): Record { + switch (schemaName) { + case 'compose': + return composeSchema; + case 'linter-config': + return linterConfigSchema; + default: + return {}; + } +} + +export { schemaLoader }; diff --git a/tests/linter.spec.ts b/tests/linter.spec.ts index 9a40e93..3517923 100644 --- a/tests/linter.spec.ts +++ b/tests/linter.spec.ts @@ -1,9 +1,9 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import esmock from 'esmock'; -import { Logger } from '../src/util/logger.js'; -import type { Config } from '../src/config/config.types.js'; -import type { LintResult, LintRule } from '../src/linter/linter.types.js'; +import { Logger } from '../src/util/logger'; +import type { Config } from '../src/config/config.types'; +import type { LintResult, LintRule } from '../src/linter/linter.types'; // Sample configuration const config: Config = { @@ -65,9 +65,9 @@ test('DCLinter: should lint files correctly', async (t: ExecutionContext) => { // Use esmock to mock both rules-loader and files-finder modules // eslint-disable-next-line sonarjs/no-duplicate-string - const { DCLinter } = await esmock('../src/linter/linter.js', { - '../src/util/rules-loader.js': { loadLintRules: mockLoadLintRules }, - '../src/util/files-finder.js': { findFilesForLinting: mockFindFiles }, + const { DCLinter } = await esmock('../src/linter/linter', { + '../src/util/rules-loader': { loadLintRules: mockLoadLintRules }, + '../src/util/files-finder': { findFilesForLinting: mockFindFiles }, 'node:fs': { readFileSync: mockReadFileSync }, }); @@ -94,9 +94,9 @@ test('DCLinter: should lint multiple files correctly', async (t: ExecutionContex // Use esmock to mock both rules-loader and files-finder modules // eslint-disable-next-line sonarjs/no-duplicate-string - const { DCLinter } = await esmock('../src/linter/linter.js', { - '../src/util/rules-loader.js': { loadLintRules: mockLoadLintRules }, - '../src/util/files-finder.js': { findFilesForLinting: mockFindFiles }, + const { DCLinter } = await esmock('../src/linter/linter', { + '../src/util/rules-loader': { loadLintRules: mockLoadLintRules }, + '../src/util/files-finder': { findFilesForLinting: mockFindFiles }, 'node:fs': { readFileSync: mockReadFileSync }, }); @@ -122,9 +122,9 @@ test('DCLinter: should fix files', async (t: ExecutionContext) => { // Use esmock to mock both rules-loader and files-finder modules // eslint-disable-next-line sonarjs/no-duplicate-string - const { DCLinter } = await esmock('../src/linter/linter.js', { - '../src/util/rules-loader.js': { loadLintRules: mockLoadLintRules }, - '../src/util/files-finder.js': { findFilesForLinting: mockFindFiles }, + const { DCLinter } = await esmock('../src/linter/linter', { + '../src/util/rules-loader': { loadLintRules: mockLoadLintRules }, + '../src/util/files-finder': { findFilesForLinting: mockFindFiles }, 'node:fs': { readFileSync: mockReadFileSync, writeFileSync: mockWriteFileSync }, }); diff --git a/tests/mocks/docker-compose.correct.yml b/tests/mocks/docker-compose.correct.yml new file mode 100644 index 0000000..766a7a6 --- /dev/null +++ b/tests/mocks/docker-compose.correct.yml @@ -0,0 +1,63 @@ +name: "test" +services: + a-service: + build: + context: ../../tests/a-service + dockerfile: Dockerfile + args: + - TEST=${TEST} + container_name: a-service + depends_on: + b-service: + condition: service_healthy + c-service: + condition: service_started + volumes: + - ../../app/a-service/:/var/www/app + - /var/www/app/node_modules + environment: + - TEST=${TEST} + env_file: ./envs/.env.a-service + ports: + - '127.0.0.1:3001' + - '127.0.0.1:11032:3000' + - '127.0.0.1:11150:3000' + # command: sh -c "npm run start" + command: sh -c "tail -f /dev/null" + expose: + - '3000' + b-service: + build: + context: ../../app/b-service + dockerfile: Dockerfile + target: builder + args: + - TEST1=${TEST} + - TEST2=${TEST} + container_name: b-service + depends_on: + - c-service + - kafka + volumes: + - ../../app/flexible-forms-client/:/var/www/app + - data:/var/www/app/node_modules + env_file: ./envs/.env.b-service + ports: + - '127.0.0.1:11131:3000' + command: sh -c "npm run start" + c-service: + build: + context: ../../tests/c-service + dockerfile: Dockerfile + args: + - TEST=${TEST} + environment: + - TEST='HQTb_=d.4*FPN@^;w2)UZ%' + test: + image: node:20 + build: "" + container_name: a2-service + pull_policy: always +volumes: + data: + driver: local diff --git a/tests/rules/no-build-and-image-rule.spec.ts b/tests/rules/no-build-and-image-rule.spec.ts index 73606d6..3c07397 100644 --- a/tests/rules/no-build-and-image-rule.spec.ts +++ b/tests/rules/no-build-and-image-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import NoBuildAndImageRule from '../../src/rules/no-build-and-image-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import NoBuildAndImageRule from '../../src/rules/no-build-and-image-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // YAML with services using both build and image const yamlWithBuildAndImage = ` diff --git a/tests/rules/no-duplicate-container-names-rule.spec.ts b/tests/rules/no-duplicate-container-names-rule.spec.ts index 9c7c382..e634983 100644 --- a/tests/rules/no-duplicate-container-names-rule.spec.ts +++ b/tests/rules/no-duplicate-container-names-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import NoDuplicateContainerNamesRule from '../../src/rules/no-duplicate-container-names-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import NoDuplicateContainerNamesRule from '../../src/rules/no-duplicate-container-names-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // YAML с дублирующимися именами контейнеров const yamlWithDuplicateContainerNames = ` diff --git a/tests/rules/no-duplicate-exported-ports-rule.spec.ts b/tests/rules/no-duplicate-exported-ports-rule.spec.ts index 4b01ce3..336f5d1 100644 --- a/tests/rules/no-duplicate-exported-ports-rule.spec.ts +++ b/tests/rules/no-duplicate-exported-ports-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import NoDuplicateExportedPortsRule from '../../src/rules/no-duplicate-exported-ports-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import NoDuplicateExportedPortsRule from '../../src/rules/no-duplicate-exported-ports-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // YAML with multiple duplicate exported ports const yamlWithDuplicatePorts = ` diff --git a/tests/rules/no-quotes-in-volumes-rule.spec.ts b/tests/rules/no-quotes-in-volumes-rule.spec.ts index 6b42030..9c77660 100644 --- a/tests/rules/no-quotes-in-volumes-rule.spec.ts +++ b/tests/rules/no-quotes-in-volumes-rule.spec.ts @@ -1,7 +1,7 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; -import NoQuotesInVolumesRule from '../../src/rules/no-quotes-in-volumes-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import NoQuotesInVolumesRule from '../../src/rules/no-quotes-in-volumes-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // Sample YAML for tests const correctYAML = ` diff --git a/tests/rules/no-unbound-port-interfaces-rule.spec.ts b/tests/rules/no-unbound-port-interfaces-rule.spec.ts index e29841b..f89e194 100644 --- a/tests/rules/no-unbound-port-interfaces-rule.spec.ts +++ b/tests/rules/no-unbound-port-interfaces-rule.spec.ts @@ -1,7 +1,7 @@ import test from 'ava'; import { parseDocument } from 'yaml'; -import NoUnboundPortInterfacesRule from '../../src/rules/no-unbound-port-interfaces-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import NoUnboundPortInterfacesRule from '../../src/rules/no-unbound-port-interfaces-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // YAML with multiple duplicate exported ports const yamlWithImplicitListenEverywherePorts = ` diff --git a/tests/rules/no-version-field-rule.spec.ts b/tests/rules/no-version-field-rule.spec.ts index e5c9537..6172fb8 100644 --- a/tests/rules/no-version-field-rule.spec.ts +++ b/tests/rules/no-version-field-rule.spec.ts @@ -1,7 +1,7 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; -import NoVersionFieldRule from '../../src/rules/no-version-field-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import NoVersionFieldRule from '../../src/rules/no-version-field-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // Sample YAML for tests const yamlWithVersion = ` diff --git a/tests/rules/require-project-name-field-rule.spec.ts b/tests/rules/require-project-name-field-rule.spec.ts index 7b8e725..b4bcf61 100644 --- a/tests/rules/require-project-name-field-rule.spec.ts +++ b/tests/rules/require-project-name-field-rule.spec.ts @@ -1,7 +1,7 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; -import RequireProjectNameFieldRule from '../../src/rules/require-project-name-field-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import RequireProjectNameFieldRule from '../../src/rules/require-project-name-field-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // Sample YAML for tests const yamlWithName = ` diff --git a/tests/rules/require-quotes-in-ports-rule.spec.ts b/tests/rules/require-quotes-in-ports-rule.spec.ts index 24f6b18..95d5ae5 100644 --- a/tests/rules/require-quotes-in-ports-rule.spec.ts +++ b/tests/rules/require-quotes-in-ports-rule.spec.ts @@ -1,7 +1,7 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; -import RequireQuotesInPortsRule from '../../src/rules/require-quotes-in-ports-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import RequireQuotesInPortsRule from '../../src/rules/require-quotes-in-ports-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // Sample YAML for tests const yamlWithoutQuotes = ` @@ -38,10 +38,7 @@ test('RequireQuotesInPortsRule: should return a warning when ports are not quote const errors = rule.check(context); t.is(errors.length, 1, 'There should be one warning when ports are not quoted.'); - t.is( - errors[0].message, - 'Ports in `ports` and `expose` sections should be enclosed in quotes.', - ); + t.is(errors[0].message, 'Ports in `ports` and `expose` sections should be enclosed in quotes.'); t.is(errors[0].rule, 'require-quotes-in-ports'); t.is(errors[0].severity, 'minor'); }); diff --git a/tests/rules/service-container-name-regex-rule.spec.ts b/tests/rules/service-container-name-regex-rule.spec.ts index 2668d31..5f840dc 100644 --- a/tests/rules/service-container-name-regex-rule.spec.ts +++ b/tests/rules/service-container-name-regex-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import ServiceContainerNameRegexRule from '../../src/rules/service-container-name-regex-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import ServiceContainerNameRegexRule from '../../src/rules/service-container-name-regex-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // YAML with incorrect syntax const yamlWithInvalidContainerName = ` diff --git a/tests/rules/service-dependencies-alphabetical-order-rule.spec.ts b/tests/rules/service-dependencies-alphabetical-order-rule.spec.ts index da75ebd..b7b9440 100644 --- a/tests/rules/service-dependencies-alphabetical-order-rule.spec.ts +++ b/tests/rules/service-dependencies-alphabetical-order-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import ServiceDependenciesAlphabeticalOrderRule from '../../src/rules/service-dependencies-alphabetical-order-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import ServiceDependenciesAlphabeticalOrderRule from '../../src/rules/service-dependencies-alphabetical-order-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // YAML with short syntax (incorrect order) const yamlWithIncorrectShortSyntax = ` diff --git a/tests/rules/service-image-require-explicit-tag-rule.spec.ts b/tests/rules/service-image-require-explicit-tag-rule.spec.ts index 3155c48..d427526 100644 --- a/tests/rules/service-image-require-explicit-tag-rule.spec.ts +++ b/tests/rules/service-image-require-explicit-tag-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import ServiceImageRequireExplicitTagRule from '../../src/rules/service-image-require-explicit-tag-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import ServiceImageRequireExplicitTagRule from '../../src/rules/service-image-require-explicit-tag-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // YAML with services using no tag, but valid image formats const yamlWithoutTag = ` diff --git a/tests/rules/service-keys-order-rule.spec.ts b/tests/rules/service-keys-order-rule.spec.ts index 54f2860..b6da044 100644 --- a/tests/rules/service-keys-order-rule.spec.ts +++ b/tests/rules/service-keys-order-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import ServiceKeysOrderRule from '../../src/rules/service-keys-order-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import ServiceKeysOrderRule from '../../src/rules/service-keys-order-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // Sample YAML for tests const yamlWithIncorrectOrder = ` diff --git a/tests/rules/service-ports-alphabetical-order-rule.spec.ts b/tests/rules/service-ports-alphabetical-order-rule.spec.ts index e91804f..657c979 100644 --- a/tests/rules/service-ports-alphabetical-order-rule.spec.ts +++ b/tests/rules/service-ports-alphabetical-order-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import ServicePortsAlphabeticalOrderRule from '../../src/rules/service-ports-alphabetical-order-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import ServicePortsAlphabeticalOrderRule from '../../src/rules/service-ports-alphabetical-order-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // Sample YAML for tests const yamlWithIncorrectPortOrder = ` diff --git a/tests/rules/services-alphabetical-order-rule.spec.ts b/tests/rules/services-alphabetical-order-rule.spec.ts index 3298cdc..c8892df 100644 --- a/tests/rules/services-alphabetical-order-rule.spec.ts +++ b/tests/rules/services-alphabetical-order-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import ServicesAlphabeticalOrderRule from '../../src/rules/services-alphabetical-order-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import ServicesAlphabeticalOrderRule from '../../src/rules/services-alphabetical-order-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // Sample YAML for tests const yamlWithIncorrectOrder = ` diff --git a/tests/rules/top-level-properties-order-rule.spec.ts b/tests/rules/top-level-properties-order-rule.spec.ts index cef34dd..e44b3dc 100644 --- a/tests/rules/top-level-properties-order-rule.spec.ts +++ b/tests/rules/top-level-properties-order-rule.spec.ts @@ -1,8 +1,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import { parseDocument } from 'yaml'; -import TopLevelPropertiesOrderRule, { TopLevelKeys } from '../../src/rules/top-level-properties-order-rule.js'; -import type { LintContext } from '../../src/linter/linter.types.js'; +import TopLevelPropertiesOrderRule, { TopLevelKeys } from '../../src/rules/top-level-properties-order-rule'; +import type { LintContext } from '../../src/linter/linter.types'; // Sample YAML content with incorrect order of top-level properties const yamlWithIncorrectOrder = ` diff --git a/tests/util/files-finder.spec.ts b/tests/util/files-finder.spec.ts index d92f0e1..b1a9a86 100644 --- a/tests/util/files-finder.spec.ts +++ b/tests/util/files-finder.spec.ts @@ -3,8 +3,8 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; import esmock from 'esmock'; -import { Logger } from '../../src/util/logger.js'; -import { FileNotFoundError } from '../../src/errors/file-not-found-error.js'; +import { Logger } from '../../src/util/logger'; +import { FileNotFoundError } from '../../src/errors/file-not-found-error'; const mockDirectory = '/path/to/directory'; const mockNodeModulesDirectory = '/path/to/directory/node_modules'; @@ -48,8 +48,8 @@ const mockExistsSync = () => true; // @ts-ignore TS2349 test('findFilesForLinting: should handle recursive search and find only compose files in directory and exclude node_modules', async (t: ExecutionContext) => { // Use esmock to mock fs module - const { findFilesForLinting } = await esmock( - '../../src/util/files-finder.js', + const { findFilesForLinting } = await esmock( + '../../src/util/files-finder', { 'node:fs': { existsSync: mockExistsSync, readdirSync: mockReaddirSync, statSync: mockStatSync }, }, @@ -71,8 +71,8 @@ test('findFilesForLinting: should handle recursive search and find only compose // @ts-ignore TS2349 test('findFilesForLinting: should return file directly if file is passed and search only compose in directory', async (t: ExecutionContext) => { // Use esmock to mock fs module - const { findFilesForLinting } = await esmock( - '../../src/util/files-finder.js', + const { findFilesForLinting } = await esmock( + '../../src/util/files-finder', { 'node:fs': { existsSync: mockExistsSync, statSync: mockStatSync, readdirSync: mockReaddirSync }, }, @@ -94,8 +94,8 @@ test('findFilesForLinting: should return file directly if file is passed and sea // @ts-ignore TS2349 test('findFilesForLinting: should throw error if path does not exist', async (t: ExecutionContext) => { // Use esmock to mock fs module - const { findFilesForLinting } = await esmock( - '../../src/util/files-finder.js', + const { findFilesForLinting } = await esmock( + '../../src/util/files-finder', { 'node:fs': { existsSync: () => false }, }, diff --git a/tests/util/line-finder.spec.ts b/tests/util/line-finder.spec.ts index 2cfc1ad..f2750f2 100644 --- a/tests/util/line-finder.spec.ts +++ b/tests/util/line-finder.spec.ts @@ -1,6 +1,6 @@ import test from 'ava'; import type { ExecutionContext } from 'ava'; -import { findLineNumberByKey, findLineNumberByValue } from '../../src/util/line-finder.js'; +import { findLineNumberByKey, findLineNumberByValue } from '../../src/util/line-finder'; // @ts-ignore TS2349 test('findLineNumberByKey: should return the correct line number when the key exists', (t: ExecutionContext) => { diff --git a/tests/util/service-ports-parser.spec.ts b/tests/util/service-ports-parser.spec.ts index 4926c7d..7ed6111 100644 --- a/tests/util/service-ports-parser.spec.ts +++ b/tests/util/service-ports-parser.spec.ts @@ -5,7 +5,7 @@ import { extractPublishedPortValue, extractPublishedPortInterfaceValue, parsePortsRange, -} from '../../src/util/service-ports-parser.js'; +} from '../../src/util/service-ports-parser'; // @ts-ignore TS2349 test('extractPublishedPortValue should return port from scalar value with no IP', (t: ExecutionContext) => { diff --git a/tsconfig.json b/tsconfig.json index 3bb58fa..915b078 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,14 +6,14 @@ "declaration": true, "outDir": "./dist", "strict": true, - "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "importHelpers": true, "noEmitHelpers": true, + "esModuleInterop": true, "resolveJsonModule": true, }, - "include": ["src/**/*.ts"], + "include": ["src/**/*.ts", "schemas/*.json"], "exclude": [ "node_modules", "dist"